Compare commits
	
		
			25 Commits
		
	
	
		
			9f2e966662
			...
			main
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					868b78f476 | ||
| 066033a4d6 | |||
| e4726a478e | |||
| 3668563736 | |||
| d750ad84a5 | |||
| 
						 | 
					ae4e83dafe | ||
| fcbd2c5452 | |||
| 039531ce7b | |||
| 91fe69a0a2 | |||
| 81af16cedf | |||
| 03be79d149 | |||
| 1112e15d80 | |||
| 0c86b453a6 | |||
| 882755ffc8 | |||
| 2854955c74 | |||
| fa06beefdd | |||
| d7f1052305 | |||
| 8ab7ff54b9 | |||
| 993104e122 | |||
| 44a3bc1cf4 | |||
| 44b4aa9e7a | |||
| 7986278926 | |||
| a1752e68c7 | |||
| f3ac36a139 | |||
| f95de88005 | 
@@ -1,19 +1,19 @@
 | 
				
			|||||||
name: Zabbix APK Builder
 | 
					name: Zabbix APK Builder
 | 
				
			||||||
 | 
					
 | 
				
			||||||
on:
 | 
					on:
 | 
				
			||||||
  # Trigger on pushes to main/test branch
 | 
					  # Trigger on pushes to main/test branch into the zabbix-apk-builder directory
 | 
				
			||||||
  push:
 | 
					  push:
 | 
				
			||||||
    branches: [ main, test ]
 | 
					    branches: [ main, test ]
 | 
				
			||||||
    paths: [ 'zabbix-apk-builder/**' ]
 | 
					    paths: [ 'zabbix-apk-builder/**' ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Scheduled check for new versions (daily at 6 AM UTC)
 | 
					  # Scheduled runs at 06:00 UTC daily
 | 
				
			||||||
  schedule:
 | 
					  schedule:
 | 
				
			||||||
    - cron: '0 6 * * *'
 | 
					    - cron: '0 6 * * *'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  check-version:
 | 
					  check-version:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    # Skip the execution if the commit message contains [ci skip]
 | 
					    # Skip the execution if the commit author is the bot itself to prevent loops
 | 
				
			||||||
    if: ${{ gitea.event.head_commit.author.name != 'Gitea Action' }}
 | 
					    if: ${{ gitea.event.head_commit.author.name != 'Gitea Action' }}
 | 
				
			||||||
    outputs:
 | 
					    outputs:
 | 
				
			||||||
      should_build: ${{ steps.version-check.outputs.should_build }}
 | 
					      should_build: ${{ steps.version-check.outputs.should_build }}
 | 
				
			||||||
@@ -30,47 +30,28 @@ jobs:
 | 
				
			|||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        set -euo pipefail
 | 
					        set -euo pipefail
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Install jq for JSON parsing (remove sudo for container environment)
 | 
					        # Remove jq installation
 | 
				
			||||||
        apt-get update && apt-get install -y jq
 | 
					        # apt-get update && apt-get install -y jq
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Detect trigger type
 | 
					        # Detect trigger type
 | 
				
			||||||
        if [[ "${{ gitea.event_name }}" == "push" ]]; then
 | 
					        IS_PUSH="${{ gitea.event_name == 'push' }}"
 | 
				
			||||||
          echo "is_push_trigger=true" >> "${GITHUB_OUTPUT}"
 | 
					        echo "is_push_trigger=${IS_PUSH}" >> "${GITHUB_OUTPUT}"
 | 
				
			||||||
          echo "Triggered by push event - force build"
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
          echo "is_push_trigger=false" >> "${GITHUB_OUTPUT}"
 | 
					 | 
				
			||||||
          echo "Triggered by schedule - check version"
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Get current version from APKBUILD
 | 
					        # Get versions
 | 
				
			||||||
        CURRENT_VERSION=$(grep '^pkgver=' zabbix-apk-builder/APKBUILD | cut -d'=' -f2)
 | 
					        CURRENT_VERSION=$(grep '^pkgver=' zabbix-apk-builder/APKBUILD | cut -d'=' -f2)
 | 
				
			||||||
        echo "current_version=${CURRENT_VERSION}" >> "${GITHUB_OUTPUT}"
 | 
					 | 
				
			||||||
        echo "Current version: ${CURRENT_VERSION}"
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        # Get latest version from Zabbix API (stable releases only)
 | 
					 | 
				
			||||||
        LATEST_VERSION=$(curl -s "https://git.zabbix.com/rest/api/1.0/projects/ZBX/repos/zabbix/tags?limit=100" | \
 | 
					        LATEST_VERSION=$(curl -s "https://git.zabbix.com/rest/api/1.0/projects/ZBX/repos/zabbix/tags?limit=100" | \
 | 
				
			||||||
          jq -r '.values[].displayId' | \
 | 
					          grep -o '"displayId":"[^"]*"' | cut -d'"' -f4 | \
 | 
				
			||||||
          grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | \
 | 
					          grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | grep -v 'rc\|beta\|alpha' | \
 | 
				
			||||||
          grep -v 'rc\|beta\|alpha' | \
 | 
					          sort -V | tail -1)
 | 
				
			||||||
          sort -V | \
 | 
					 | 
				
			||||||
          tail -1)
 | 
					 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        echo "current_version=${CURRENT_VERSION}" >> "${GITHUB_OUTPUT}"
 | 
				
			||||||
        echo "latest_version=${LATEST_VERSION}" >> "${GITHUB_OUTPUT}"
 | 
					        echo "latest_version=${LATEST_VERSION}" >> "${GITHUB_OUTPUT}"
 | 
				
			||||||
        echo "Latest version: ${LATEST_VERSION}"
 | 
					 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Determine if we should build based on trigger type
 | 
					        # Always build on push, build on schedule if versions differ
 | 
				
			||||||
        if [[ "${{ gitea.event_name }}" == "push" ]]; then
 | 
					        if [[ "${IS_PUSH}" == "true" || "${CURRENT_VERSION}" != "${LATEST_VERSION}" ]]; then
 | 
				
			||||||
          # Push trigger: always build to test changes
 | 
					 | 
				
			||||||
          echo "should_build=true" >> "${GITHUB_OUTPUT}"
 | 
					          echo "should_build=true" >> "${GITHUB_OUTPUT}"
 | 
				
			||||||
          echo "Build required: Push trigger detected"
 | 
					 | 
				
			||||||
        elif [[ "${CURRENT_VERSION}" != "${LATEST_VERSION}" ]]; then
 | 
					 | 
				
			||||||
          # Schedule trigger: only build if version changed
 | 
					 | 
				
			||||||
          echo "should_build=true" >> "${GITHUB_OUTPUT}"
 | 
					 | 
				
			||||||
          echo "Build required: New version ${LATEST_VERSION} available"
 | 
					 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
          # Schedule trigger: no new version
 | 
					 | 
				
			||||||
          echo "should_build=false" >> "${GITHUB_OUTPUT}"
 | 
					          echo "should_build=false" >> "${GITHUB_OUTPUT}"
 | 
				
			||||||
          echo "No build required: Version ${CURRENT_VERSION} is current"
 | 
					 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  update-version:
 | 
					  update-version:
 | 
				
			||||||
@@ -125,18 +106,6 @@ jobs:
 | 
				
			|||||||
        token: ${{ secrets.ACCESS_TOKEN }}
 | 
					        token: ${{ secrets.ACCESS_TOKEN }}
 | 
				
			||||||
        ref: ${{ gitea.ref }}
 | 
					        ref: ${{ gitea.ref }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Pull latest changes if version was updated
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        set -euo pipefail
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        # Pull any version updates that may have been committed
 | 
					 | 
				
			||||||
        if [[ "${{ needs.check-version.outputs.is_push_trigger }}" == "false" ]]; then
 | 
					 | 
				
			||||||
          echo "Scheduled build - pulling latest changes"
 | 
					 | 
				
			||||||
          git pull origin "${GITEA_REF_NAME:-main}" || true
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
          echo "Push build - using current ref"
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - name: Verify build environment
 | 
					    - name: Verify build environment
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        set -euo pipefail
 | 
					        set -euo pipefail
 | 
				
			||||||
@@ -151,6 +120,8 @@ jobs:
 | 
				
			|||||||
      uses: docker/setup-buildx-action@v3
 | 
					      uses: docker/setup-buildx-action@v3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Build Zabbix packages
 | 
					    - name: Build Zabbix packages
 | 
				
			||||||
 | 
					      env:
 | 
				
			||||||
 | 
					        CI_RUN_ID: ${{ gitea.run_id }}
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        set -euo pipefail
 | 
					        set -euo pipefail
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
@@ -158,26 +129,31 @@ jobs:
 | 
				
			|||||||
        chmod +x build.sh
 | 
					        chmod +x build.sh
 | 
				
			||||||
        ./build.sh
 | 
					        ./build.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: List built packages
 | 
					    - name: Verify and list built packages
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        set -euo pipefail
 | 
					        set -euo pipefail
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
        echo "=== Built packages ==="
 | 
					        cd zabbix-apk-builder
 | 
				
			||||||
        if [[ -d "zabbix-apk-builder/packages" ]]; then
 | 
					        
 | 
				
			||||||
          ls -la zabbix-apk-builder/packages/
 | 
					        # Verify packages exist somewhere
 | 
				
			||||||
          echo "=== Package sizes ==="
 | 
					        PACKAGE_COUNT=$(find packages -name "*.apk" | wc -l)
 | 
				
			||||||
          find zabbix-apk-builder/packages/ -name "*.apk" -exec du -h {} \;
 | 
					        
 | 
				
			||||||
        else
 | 
					        if [[ $PACKAGE_COUNT -eq 0 ]]; then
 | 
				
			||||||
          echo "ERROR: No packages directory found"
 | 
					          echo "ERROR: No packages found"
 | 
				
			||||||
 | 
					          find packages -type f 2>/dev/null || echo "packages directory is empty"
 | 
				
			||||||
          exit 1
 | 
					          exit 1
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        echo "Found $PACKAGE_COUNT packages:"
 | 
				
			||||||
 | 
					        find packages -name "*.apk" -exec ls -lh {} \;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Upload packages as artifacts
 | 
					    - name: Upload packages as artifacts
 | 
				
			||||||
      uses: actions/upload-artifact@v4
 | 
					      uses: actions/upload-artifact@v3
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        name: zabbix-apk-packages
 | 
					        name: zabbix-apk-packages-${{ gitea.run_number }}
 | 
				
			||||||
        path: zabbix-apk-builder/packages/*.apk
 | 
					        path: zabbix-apk-builder/packages/**/*.apk
 | 
				
			||||||
        retention-days: 30
 | 
					        retention-days: 30
 | 
				
			||||||
 | 
					        if-no-files-found: error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  deploy-test:
 | 
					  deploy-test:
 | 
				
			||||||
    needs: [check-version, build-packages]
 | 
					    needs: [check-version, build-packages]
 | 
				
			||||||
@@ -186,45 +162,42 @@ jobs:
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - name: Download packages
 | 
					    - name: Download packages
 | 
				
			||||||
      uses: actions/download-artifact@v4
 | 
					      uses: actions/download-artifact@v3
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        name: zabbix-apk-packages
 | 
					        name: zabbix-apk-packages-${{ gitea.run_number }}
 | 
				
			||||||
        path: packages/
 | 
					        path: packages/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Test deployment in Alpine container
 | 
					    - name: Test deployment in Alpine container
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        set -euo pipefail
 | 
					        set -euo pipefail
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        echo "=== Testing package installation ==="
 | 
					        # Find packages
 | 
				
			||||||
 | 
					        AGENT_PKG=$(find packages -name "zabbix-agent-*.apk" | head -1)
 | 
				
			||||||
 | 
					        PROXY_PKG=$(find packages -name "zabbix-proxy-*.apk" | head -1)
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Verify packages were downloaded
 | 
					        # Test function
 | 
				
			||||||
        if [[ ! -d "packages" ]] || [[ -z "$(ls -A packages/ 2>/dev/null)" ]]; then
 | 
					        test_package() {
 | 
				
			||||||
          echo "ERROR: No packages found for testing"
 | 
					          local pkg="$1"
 | 
				
			||||||
          exit 1
 | 
					          local binary="$2"
 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
          
 | 
					          
 | 
				
			||||||
        # Test agent package
 | 
					          if [[ -f "$pkg" ]]; then
 | 
				
			||||||
        if ls packages/zabbix-agent-*.apk >/dev/null 2>&1; then
 | 
					            echo "Testing $(basename "$pkg")..."
 | 
				
			||||||
          echo "Testing agent package..."
 | 
					            CONTAINER_ID=$(docker run -d alpine:latest sleep 30)
 | 
				
			||||||
          docker run --rm -v "${PWD}/packages:/packages" alpine:latest sh -c "
 | 
					            docker cp "$pkg" "$CONTAINER_ID:/$(basename "$pkg")"
 | 
				
			||||||
            apk add --allow-untrusted /packages/zabbix-agent-*.apk
 | 
					            if docker exec "$CONTAINER_ID" sh -c "
 | 
				
			||||||
            which zabbix_agentd
 | 
					              apk add --allow-untrusted /$(basename "$pkg") >/dev/null 2>&1
 | 
				
			||||||
            zabbix_agentd --version
 | 
					              which $binary >/dev/null 2>&1
 | 
				
			||||||
          " && echo "✅ Agent test passed" || echo "❌ Agent test failed"
 | 
					              $binary --version >/dev/null 2>&1
 | 
				
			||||||
 | 
					            "; then
 | 
				
			||||||
 | 
					              echo "SUCCESS: $(basename "$pkg") test passed"
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
          echo "⚠️ No agent package found"
 | 
					              echo "FAIL: $(basename "$pkg") test failed"
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
        
 | 
					            docker rm -f "$CONTAINER_ID" >/dev/null
 | 
				
			||||||
        # Test proxy package  
 | 
					 | 
				
			||||||
        if ls packages/zabbix-proxy-*.apk >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
          echo "Testing proxy package..."
 | 
					 | 
				
			||||||
          docker run --rm -v "${PWD}/packages:/packages" alpine:latest sh -c "
 | 
					 | 
				
			||||||
            apk add --allow-untrusted /packages/zabbix-proxy-*.apk
 | 
					 | 
				
			||||||
            which zabbix_proxy
 | 
					 | 
				
			||||||
            zabbix_proxy --version
 | 
					 | 
				
			||||||
          " && echo "✅ Proxy test passed" || echo "❌ Proxy test failed"
 | 
					 | 
				
			||||||
          else
 | 
					          else
 | 
				
			||||||
          echo "⚠️ No proxy package found"
 | 
					            echo "ERROR: Package not found: $pkg"
 | 
				
			||||||
          fi
 | 
					          fi
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        echo "✅ Package deployment test completed"
 | 
					        test_package "$AGENT_PKG" "zabbix_agentd"
 | 
				
			||||||
 | 
					        test_package "$PROXY_PKG" "zabbix_proxy"
 | 
				
			||||||
							
								
								
									
										1
									
								
								zabbix-apk-builder/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								zabbix-apk-builder/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -9,6 +9,7 @@ src/
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Backup files
 | 
					# Backup files
 | 
				
			||||||
*.backup
 | 
					*.backup
 | 
				
			||||||
 | 
					*.bak
 | 
				
			||||||
*~
 | 
					*~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# OS files
 | 
					# OS files
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
# Contributor: Maksym Buz <maksym.buz@zabbix.com>
 | 
					# Contributor: Maksym Buz <maksym.buz@zabbix.com>
 | 
				
			||||||
# Maintainer: Maksym Buz <maksym.buz@zabbix.com>
 | 
					# Maintainer: Maksym Buz <maksym.buz@zabbix.com>
 | 
				
			||||||
pkgname=zabbix
 | 
					pkgname=zabbix
 | 
				
			||||||
pkgver=7.4.2
 | 
					pkgver=7.4.4
 | 
				
			||||||
pkgrel=0
 | 
					pkgrel=0
 | 
				
			||||||
pkgdesc="Enterprise-class open source distributed monitoring solution"
 | 
					pkgdesc="Enterprise-class open source distributed monitoring solution"
 | 
				
			||||||
url="https://www.zabbix.com/"
 | 
					url="https://www.zabbix.com/"
 | 
				
			||||||
@@ -138,9 +138,9 @@ proxy() {
 | 
				
			|||||||
	install -dm755 "$subpkgdir"/var/log/zabbix
 | 
						install -dm755 "$subpkgdir"/var/log/zabbix
 | 
				
			||||||
	install -dm755 "$subpkgdir"/var/run/zabbix
 | 
						install -dm755 "$subpkgdir"/var/run/zabbix
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					# --- TEST --- 
 | 
				
			||||||
sha512sums="SKIP"
 | 
					sha512sums="SKIP"
 | 
				
			||||||
3bf1f915c2cd5a59f1dd3afc10dd1a6e596840e576013839d6eae057cd327893f87cc5cec1d32b6a8ca8bd00735c0070327084aae01dc8d3399202f5a3e365c1  zabbix-7.4.2.tar.gz
 | 
					SKIP
 | 
				
			||||||
SKIP
 | 
					SKIP
 | 
				
			||||||
SKIP
 | 
					SKIP
 | 
				
			||||||
SKIP
 | 
					SKIP
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,5 +36,32 @@ COPY --chown=builder:builder . /home/builder/zabbix/
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
WORKDIR /home/builder/zabbix
 | 
					WORKDIR /home/builder/zabbix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Create build script that just builds packages
 | 
				
			||||||
 | 
					USER root
 | 
				
			||||||
 | 
					RUN cat > /usr/local/bin/build-packages.sh << 'EOF'
 | 
				
			||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "Building packages as builder user..."
 | 
				
			||||||
 | 
					sudo -u builder sh -c "
 | 
				
			||||||
 | 
					    cd /home/builder/zabbix
 | 
				
			||||||
 | 
					    echo 'Generating checksums...'
 | 
				
			||||||
 | 
					    abuild checksum
 | 
				
			||||||
 | 
					    echo 'Building packages...'
 | 
				
			||||||
 | 
					    abuild -r
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "Build complete! Packages built in /home/builder/packages:"
 | 
				
			||||||
 | 
					find /home/builder/packages -name "*.apk" -exec ls -la {} \;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "Setting proper permissions on packages..."
 | 
				
			||||||
 | 
					chmod 644 /home/builder/packages/*.apk 2>/dev/null || true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "Final package list (excluding APKINDEX):"
 | 
				
			||||||
 | 
					find /home/builder/packages -name "*.apk" -exec ls -la {} \;
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN chmod +x /usr/local/bin/build-packages.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Set build command
 | 
					# Set build command
 | 
				
			||||||
CMD ["abuild", "-r"]
 | 
					CMD ["/usr/local/bin/build-packages.sh"]
 | 
				
			||||||
@@ -4,8 +4,7 @@ Automated Alpine Linux package builder for Zabbix Agent and Proxy with CI/CD pip
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Features
 | 
					## Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- 🔄 **Automatic Version Detection**: Monitors Zabbix releases using official Bitbucket API
 | 
					- 🔄 **Automatic Version Detection**: Monitors Zabbix releases using Bitbucket API
 | 
				
			||||||
- 🏗️ **Docker-based Building**: Consistent, reproducible builds in isolated environment
 | 
					 | 
				
			||||||
- 🚀 **CI/CD Pipeline**: Full automation from version detection to package deployment
 | 
					- 🚀 **CI/CD Pipeline**: Full automation from version detection to package deployment
 | 
				
			||||||
- 📦 **Multi-package Support**: Builds agent and proxy packages
 | 
					- 📦 **Multi-package Support**: Builds agent and proxy packages
 | 
				
			||||||
- 🧪 **Automated Testing**: Tests package installation in Alpine containers
 | 
					- 🧪 **Automated Testing**: Tests package installation in Alpine containers
 | 
				
			||||||
@@ -13,34 +12,24 @@ Automated Alpine Linux package builder for Zabbix Agent and Proxy with CI/CD pip
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Quick Start
 | 
					## Quick Start
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 1. Repository Setup
 | 
					### Prerequisites
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Docker installed
 | 
				
			||||||
 | 
					- Gitea repository with Actions enabled
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Manual Build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
# Clone this repository
 | 
					# Clone the repository
 | 
				
			||||||
git clone https://git.mbuz.uk/mbuz/Zabbix.git
 | 
					git clone <your-gitea-repo>
 | 
				
			||||||
cd zabbix-apk-builder
 | 
					cd zabbix-apk-builder
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Make build script executable
 | 
					 | 
				
			||||||
chmod +x build.sh
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### 2. Manual Build
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```bash
 | 
					 | 
				
			||||||
# Build packages locally
 | 
					# Build packages locally
 | 
				
			||||||
 | 
					chmod +x build.sh
 | 
				
			||||||
./build.sh
 | 
					./build.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Packages will be in ./packages/
 | 
					# Check built packages
 | 
				
			||||||
ls -la packages/
 | 
					ls -la packages/builder/x86_64/
 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### 3. CI/CD Setup
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```bash
 | 
					 | 
				
			||||||
# Run the setup script
 | 
					 | 
				
			||||||
./setup-cicd.sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Follow the prompts to configure GitHub secrets
 | 
					 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Package Information
 | 
					## Package Information
 | 
				
			||||||
@@ -51,19 +40,12 @@ ls -la packages/
 | 
				
			|||||||
2. **zabbix-proxy** - Zabbix Proxy
 | 
					2. **zabbix-proxy** - Zabbix Proxy
 | 
				
			||||||
3. **zabbix** - Meta package
 | 
					3. **zabbix** - Meta package
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Current Version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- **Zabbix Version**: 7.4.2
 | 
					 | 
				
			||||||
- **Alpine Base**: latest
 | 
					 | 
				
			||||||
- **Architecture**: all
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## CI/CD Pipeline
 | 
					## CI/CD Pipeline
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Automatic Triggers
 | 
					### Automatic Triggers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **Daily**: Checks for new Zabbix versions at 6 AM UTC
 | 
					- **Daily**: Checks for new Zabbix versions at 6 AM UTC
 | 
				
			||||||
- **Push**: Builds when code changes in main/test branches
 | 
					- **Push**: Builds when code changes in main/test branches
 | 
				
			||||||
- **Manual**: Force builds via Gitea Actions
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Version Detection
 | 
					### Version Detection
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -91,48 +73,22 @@ GITEA_SSH_KEY  # SSH private key for Gitea access
 | 
				
			|||||||
### File Structure
 | 
					### File Structure
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
.
 | 
					zabbix-git/
 | 
				
			||||||
└── zabbix-git
 | 
					└── zabbix-apk-builder/
 | 
				
			||||||
    └── zabbix-apk-builder
 | 
					    ├── .gitea/
 | 
				
			||||||
        ├── .gitea/workflows   # Workflows for Gitea actions
 | 
					    │   └── workflows/
 | 
				
			||||||
        ├── .gitignore         # Ignore files 
 | 
					    │       └── build.yaml         # Main CI/CD pipeline
 | 
				
			||||||
        ├── APKBUILD           # APKBUILD file for Zabbix
 | 
					    ├── APKBUILD                   # Alpine package definition
 | 
				
			||||||
        ├── Dockerfile         # Dockerfile for building packages
 | 
					    ├── Dockerfile                 # Build environment container
 | 
				
			||||||
        ├── README.md          # Project description
 | 
					    ├── README.md                  # This file
 | 
				
			||||||
        ├── build.sh           # Script for manual builds
 | 
					    ├── build.sh                   # Local build script
 | 
				
			||||||
        ├── packages/          # Directory for built packages
 | 
					    ├── packages/                  # Generated packages (gitignored)
 | 
				
			||||||
        ├── zabbix-agent.*     # Agent configuration files
 | 
					    ├── zabbix-agent.confd         # Agent configuration
 | 
				
			||||||
        └── zabbix-proxy.*     # Proxy configuration files
 | 
					    ├── zabbix-agent.initd         # Agent init script
 | 
				
			||||||
```
 | 
					    ├── zabbix-agent.pre-install   # Agent pre-install script
 | 
				
			||||||
 | 
					    ├── zabbix-proxy.confd         # Proxy configuration  
 | 
				
			||||||
## Usage
 | 
					    ├── zabbix-proxy.initd         # Proxy init script
 | 
				
			||||||
 | 
					    └── zabbix-proxy.pre-install   # Proxy pre-install script
 | 
				
			||||||
### Install Packages
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```bash
 | 
					 | 
				
			||||||
# Add repository
 | 
					 | 
				
			||||||
echo "http://gitea-repo/mbuz/Zabbix/raw/branch/main/alpine/v3.18/main" >> /etc/apk/repositories
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Update and install
 | 
					 | 
				
			||||||
apk update
 | 
					 | 
				
			||||||
apk add zabbix-agent
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Enable and start
 | 
					 | 
				
			||||||
rc-update add zabbix-agent default
 | 
					 | 
				
			||||||
rc-service zabbix-agent start
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Configuration
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```bash
 | 
					 | 
				
			||||||
# Configure agent
 | 
					 | 
				
			||||||
vim /etc/zabbix/zabbix_agentd.conf
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Set server IP
 | 
					 | 
				
			||||||
Server=your.zabbix.server
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Restart service
 | 
					 | 
				
			||||||
rc-service zabbix-agent restart
 | 
					 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Development
 | 
					## Development
 | 
				
			||||||
@@ -154,28 +110,16 @@ docker run --rm -it \
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
### Branch Strategy
 | 
					### Branch Strategy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- **main**: Production releases, auto-deployed
 | 
					- **main**: Production releases, merge only
 | 
				
			||||||
- **test**: Testing and validation, no auto-deploy
 | 
					- **test**: Testing and validation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Making Changes
 | 
					### Making Changes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. Create feature branch from `test`
 | 
					1. Create feature branch from `main`
 | 
				
			||||||
2. Test changes thoroughly
 | 
					2. Test changes thoroughly
 | 
				
			||||||
3. Merge to `test` for CI validation
 | 
					3. Validate CI
 | 
				
			||||||
4. Merge to `main` for production release
 | 
					4. Merge to `main`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Troubleshooting
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Build Issues
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```bash
 | 
					 | 
				
			||||||
# Check build logs
 | 
					 | 
				
			||||||
docker logs $(docker ps -l -q)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Manual build debug
 | 
					 | 
				
			||||||
docker run -it --rm -v $(pwd):/build alpine:3.18 sh
 | 
					 | 
				
			||||||
cd /build && ./build.sh
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Version Detection
 | 
					### Version Detection
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,52 +3,57 @@
 | 
				
			|||||||
set -e
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Configuration
 | 
					# Configuration
 | 
				
			||||||
PROJECT_DIR="$(pwd)"
 | 
					PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 | 
				
			||||||
IMAGE_NAME="zabbix-apk-builder"
 | 
					IMAGE_NAME="zabbix-apk-builder"
 | 
				
			||||||
CONTAINER_NAME="zabbix-build-$$"
 | 
					# Use a unique ID from the CI environment if available, otherwise fall back to PID
 | 
				
			||||||
 | 
					UNIQUE_ID="${CI_RUN_ID:-$$}"
 | 
				
			||||||
 | 
					CONTAINER_NAME="zabbix-build-${UNIQUE_ID}"
 | 
				
			||||||
OUTPUT_DIR="$PROJECT_DIR/packages"
 | 
					OUTPUT_DIR="$PROJECT_DIR/packages"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo "=== Zabbix APK Builder ==="
 | 
					echo "=== Zabbix APK Builder ==="
 | 
				
			||||||
echo "Project directory: $PROJECT_DIR"
 | 
					echo "Project directory: $PROJECT_DIR"
 | 
				
			||||||
echo "Output directory: $OUTPUT_DIR"
 | 
					echo "Output directory: $OUTPUT_DIR"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Clean up any existing containers
 | 
					# Clean up function
 | 
				
			||||||
cleanup() {
 | 
					cleanup() {
 | 
				
			||||||
    echo "Cleaning up..."
 | 
					    echo "Cleaning up container..."
 | 
				
			||||||
    docker rm -f "$CONTAINER_NAME" 2>/dev/null || true
 | 
					    docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
trap cleanup EXIT
 | 
					trap cleanup EXIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Create output directory
 | 
					# Clean and create output directory
 | 
				
			||||||
 | 
					rm -rf "$OUTPUT_DIR"
 | 
				
			||||||
mkdir -p "$OUTPUT_DIR"
 | 
					mkdir -p "$OUTPUT_DIR"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Build Docker image
 | 
					# Build Docker image
 | 
				
			||||||
echo "Building Docker image..."
 | 
					echo "Building Docker image..."
 | 
				
			||||||
docker build -t "$IMAGE_NAME" "$PROJECT_DIR"
 | 
					docker build -t "$IMAGE_NAME" "$PROJECT_DIR"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Run the build in container
 | 
					# Run the build in the container
 | 
				
			||||||
echo "Running package build..."
 | 
					echo "Running package build in container..."
 | 
				
			||||||
docker run --rm \
 | 
					docker run --name "$CONTAINER_NAME" "$IMAGE_NAME"
 | 
				
			||||||
    --name "$CONTAINER_NAME" \
 | 
					 | 
				
			||||||
    -v "$OUTPUT_DIR:/output" \
 | 
					 | 
				
			||||||
    "$IMAGE_NAME" \
 | 
					 | 
				
			||||||
    sh -c "
 | 
					 | 
				
			||||||
        set -e
 | 
					 | 
				
			||||||
        echo 'Starting package build...'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Generate checksums for APKBUILD
 | 
					# Copy packages from container to host
 | 
				
			||||||
        echo 'Generating checksums for APKBUILD...'
 | 
					echo "Copying packages from container..."
 | 
				
			||||||
        abuild checksum
 | 
					if docker cp "$CONTAINER_NAME:/home/builder/packages/." "$OUTPUT_DIR/"; then
 | 
				
			||||||
 | 
					    echo "✅ Packages copied successfully"
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
        # Build packages
 | 
					    # Remove APKINDEX files (we only want the .apk packages)
 | 
				
			||||||
        abuild -r
 | 
					    echo "Removing repository index files..."
 | 
				
			||||||
 | 
					    find "$OUTPUT_DIR" -name "APKINDEX.tar.gz" -delete 2>/dev/null || true
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
        # Copy packages to output
 | 
					    # Fix permissions on copied files
 | 
				
			||||||
        echo 'Copying packages to output directory...'
 | 
					    echo "Fixing file permissions..."
 | 
				
			||||||
        find /home/builder/packages -name '*.apk' -exec cp {} /output/ \;
 | 
					    find "$OUTPUT_DIR" -name "*.apk" -exec chmod 644 {} \; 2>/dev/null || true
 | 
				
			||||||
    "
 | 
					    
 | 
				
			||||||
echo "Build completed successfully!"
 | 
					    echo "Build completed successfully!"
 | 
				
			||||||
echo "To install packages:"
 | 
					    echo "Packages are in $OUTPUT_DIR:"
 | 
				
			||||||
echo "  apk add --allow-untrusted $OUTPUT_DIR/zabbix-agent-*.apk"
 | 
					    find "$OUTPUT_DIR" -name "*.apk" -exec ls -la {} \;
 | 
				
			||||||
echo "  apk add --allow-untrusted $OUTPUT_DIR/zabbix-proxy-*.apk"
 | 
					else
 | 
				
			||||||
 | 
					    echo "❌ Failed to copy packages"
 | 
				
			||||||
 | 
					    echo "Checking what's in the container..."
 | 
				
			||||||
 | 
					    docker exec "$CONTAINER_NAME" find /home/builder -name "*.apk" -exec ls -la {} \; 2>/dev/null || true
 | 
				
			||||||
 | 
					    docker exec "$CONTAINER_NAME" ls -la /home/builder/packages/ 2>/dev/null || true
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
							
								
								
									
										68
									
								
								zabbix-tests/host-cleanup.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										68
									
								
								zabbix-tests/host-cleanup.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,68 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					import requests
 | 
				
			||||||
 | 
					import json
 | 
				
			||||||
 | 
					import time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# === CONFIGURATION ===
 | 
				
			||||||
 | 
					ZABBIX_URL = "http://10.0.0.101:8887/api_jsonrpc.php"
 | 
				
			||||||
 | 
					ZABBIX_TOKEN = "c785634354e760a6843055ba4581bc7b6cd6eb2ec75f7c2a79f251c1719933f7"
 | 
				
			||||||
 | 
					GROUP_ID = "19"
 | 
				
			||||||
 | 
					BATCH_SIZE = 100
 | 
				
			||||||
 | 
					HOST_PATTERN = "dummy-host-"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					HEADERS = {
 | 
				
			||||||
 | 
					    "Content-Type": "application/json-rpc",
 | 
				
			||||||
 | 
					    "Authorization": f"Bearer {ZABBIX_TOKEN}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def zbx_request(method, params):
 | 
				
			||||||
 | 
					    payload = {
 | 
				
			||||||
 | 
					        "jsonrpc": "2.0",
 | 
				
			||||||
 | 
					        "method": method,
 | 
				
			||||||
 | 
					        "params": params,
 | 
				
			||||||
 | 
					        "id": int(time.time())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    r = requests.post(ZABBIX_URL, headers=HEADERS, data=json.dumps(payload))
 | 
				
			||||||
 | 
					    r.raise_for_status()
 | 
				
			||||||
 | 
					    resp = r.json()
 | 
				
			||||||
 | 
					    if "error" in resp:
 | 
				
			||||||
 | 
					        raise Exception(f"API error: {resp['error']}")
 | 
				
			||||||
 | 
					    return resp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def cleanup_hosts():
 | 
				
			||||||
 | 
					    # Get all hosts in the group
 | 
				
			||||||
 | 
					    resp = zbx_request("host.get", {
 | 
				
			||||||
 | 
					        "groupids": [GROUP_ID],
 | 
				
			||||||
 | 
					        "output": ["hostid", "host"]
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Filter hosts that contain the dummy pattern
 | 
				
			||||||
 | 
					    hosts = [h for h in resp.get("result", []) if HOST_PATTERN in h["host"]]
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if not hosts:
 | 
				
			||||||
 | 
					        print("No dummy hosts found")
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    print(f"Deleting {len(hosts)} hosts")
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Delete in batches
 | 
				
			||||||
 | 
					    host_ids = [h["hostid"] for h in hosts]
 | 
				
			||||||
 | 
					    total_deleted = 0
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    for i in range(0, len(host_ids), BATCH_SIZE):
 | 
				
			||||||
 | 
					        batch = host_ids[i:i + BATCH_SIZE]
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            resp = zbx_request("host.delete", batch)
 | 
				
			||||||
 | 
					            deleted = len(resp.get("result", {}).get("hostids", []))
 | 
				
			||||||
 | 
					            total_deleted += deleted
 | 
				
			||||||
 | 
					            print(f"Deleted batch {i//BATCH_SIZE + 1}: {deleted} hosts")
 | 
				
			||||||
 | 
					        except Exception as e:
 | 
				
			||||||
 | 
					            print(f"Error in batch {i//BATCH_SIZE + 1}: {e}")
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if i + BATCH_SIZE < len(host_ids):
 | 
				
			||||||
 | 
					            time.sleep(0.5)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    print(f"Total deleted: {total_deleted}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 | 
					    cleanup_hosts()
 | 
				
			||||||
							
								
								
									
										62
									
								
								zabbix-tests/host-creator.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										62
									
								
								zabbix-tests/host-creator.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,62 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					import requests
 | 
				
			||||||
 | 
					import json
 | 
				
			||||||
 | 
					import time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# === CONFIGURATION ===
 | 
				
			||||||
 | 
					ZABBIX_URL = "http://10.0.0.101:8887/api_jsonrpc.php"
 | 
				
			||||||
 | 
					ZABBIX_TOKEN = "c785634354e760a6843055ba4581bc7b6cd6eb2ec75f7c2a79f251c1719933f7"
 | 
				
			||||||
 | 
					PROXY_GROUP_ID = "1"        # your proxy group ID
 | 
				
			||||||
 | 
					GROUP_ID = "19"              # host group for these hosts
 | 
				
			||||||
 | 
					NUM_HOSTS = 1000            # number of hosts to create
 | 
				
			||||||
 | 
					BATCH_SIZE = 100            # how many to create per call
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					HEADERS = {
 | 
				
			||||||
 | 
					    "Content-Type": "application/json-rpc",
 | 
				
			||||||
 | 
					    "Authorization": f"Bearer {ZABBIX_TOKEN}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def zbx_request(method, params):
 | 
				
			||||||
 | 
					    """Send Zabbix API request using Bearer token authentication."""
 | 
				
			||||||
 | 
					    payload = {
 | 
				
			||||||
 | 
					        "jsonrpc": "2.0",
 | 
				
			||||||
 | 
					        "method": method,
 | 
				
			||||||
 | 
					        "params": params,
 | 
				
			||||||
 | 
					        "id": int(time.time())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    r = requests.post(ZABBIX_URL, headers=HEADERS, data=json.dumps(payload))
 | 
				
			||||||
 | 
					    r.raise_for_status()
 | 
				
			||||||
 | 
					    resp = r.json()
 | 
				
			||||||
 | 
					    if "error" in resp:
 | 
				
			||||||
 | 
					        raise Exception(f"Zabbix API error: {resp['error']}")
 | 
				
			||||||
 | 
					    return resp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def create_hosts():
 | 
				
			||||||
 | 
					    hosts = []
 | 
				
			||||||
 | 
					    for i in range(1, NUM_HOSTS + 1):
 | 
				
			||||||
 | 
					        host_name = f"dummy-host-{i:04d}"
 | 
				
			||||||
 | 
					        host = {
 | 
				
			||||||
 | 
					            "host": host_name,
 | 
				
			||||||
 | 
					            "groups": [{"groupid": GROUP_ID}],
 | 
				
			||||||
 | 
					            "templates": [{"templateid": "10048"}],  # assign Proxy Health template
 | 
				
			||||||
 | 
					            "monitored_by": 2,               # 2 = proxy group
 | 
				
			||||||
 | 
					            "proxy_groupid": PROXY_GROUP_ID  # your proxy group ID
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        hosts.append(host)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for i in range(0, len(hosts), BATCH_SIZE):
 | 
				
			||||||
 | 
					        batch = hosts[i:i + BATCH_SIZE]
 | 
				
			||||||
 | 
					        print(f"Creating hosts {i+1}-{i+len(batch)}...")
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            resp = zbx_request("host.create", batch)
 | 
				
			||||||
 | 
					            created = len(resp.get("result", {}).get("hostids", []))
 | 
				
			||||||
 | 
					            print(f"Created {created} hosts.")
 | 
				
			||||||
 | 
					        except Exception as e:
 | 
				
			||||||
 | 
					            print(f"Error in batch {i+1}-{i+len(batch)}: {e}")
 | 
				
			||||||
 | 
					        time.sleep(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        create_hosts()
 | 
				
			||||||
 | 
					    except Exception as e:
 | 
				
			||||||
 | 
					        print(f"Fatal error: {e}")
 | 
				
			||||||
							
								
								
									
										28
									
								
								zabbix-tests/server-docker/.env
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								zabbix-tests/server-docker/.env
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					# Database Configuration
 | 
				
			||||||
 | 
					MYSQL_DATABASE=zabbix
 | 
				
			||||||
 | 
					MYSQL_USER=zabbix
 | 
				
			||||||
 | 
					MYSQL_PASSWORD=strong-password
 | 
				
			||||||
 | 
					MYSQL_ROOT_PASSWORD=very-strong-password
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Image Versions (uncomment to override defaults)
 | 
				
			||||||
 | 
					ZABBIX_VERSION=latest  
 | 
				
			||||||
 | 
					# MYSQL_VERSION=8.4.0-oraclelinux8  # Keep oraclelinux variant for architecture compatibility
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Port Configuration
 | 
				
			||||||
 | 
					ZABBIX_SERVER_PORT=10051
 | 
				
			||||||
 | 
					ZABBIX_WEB_PORT=8887
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Server Settings
 | 
				
			||||||
 | 
					PHP_TIMEZONE=Europe/Warsaw
 | 
				
			||||||
 | 
					ZBX_STARTSNMPTRAPPER=1
 | 
				
			||||||
 | 
					ZBX_SNMPTRAPPERFILE=/tmp/traps.log
 | 
				
			||||||
 | 
					ZBX_CACHESIZE=128M
 | 
				
			||||||
 | 
					ZBX_VALUECACHESIZE=64M
 | 
				
			||||||
 | 
					ZBX_TRENDCACHESIZE=32M
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Common Proxy Settings (applied to all proxies)
 | 
				
			||||||
 | 
					PROXY_CACHE_SIZE=128M
 | 
				
			||||||
 | 
					PROXY_HISTORY_CACHE_SIZE=32M
 | 
				
			||||||
 | 
					PROXY_HISTORY_INDEX_CACHE_SIZE=16M
 | 
				
			||||||
 | 
					PROXY_BUFFER_MODE=hybrid
 | 
				
			||||||
 | 
					PROXY_MEMORY_BUFFER_SIZE=64M
 | 
				
			||||||
							
								
								
									
										224
									
								
								zabbix-tests/server-docker/docker-compose.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								zabbix-tests/server-docker/docker-compose.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,224 @@
 | 
				
			|||||||
 | 
					### This will create a Zabbix server with six active proxies and a MySQL database.
 | 
				
			||||||
 | 
					### You need to configure proxies in Zabbix frontend after deployment.
 | 
				
			||||||
 | 
					### Adjust .env file for customization.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  mysql-server:
 | 
				
			||||||
 | 
					    image: mysql:${MYSQL_VERSION:-8.4.0-oraclelinux8}
 | 
				
			||||||
 | 
					    container_name: zabbix-mysql-server
 | 
				
			||||||
 | 
					    command:
 | 
				
			||||||
 | 
					      - 'mysqld'
 | 
				
			||||||
 | 
					      - '--character-set-server=utf8mb4'
 | 
				
			||||||
 | 
					      - '--collation-server=utf8mb4_bin'
 | 
				
			||||||
 | 
					      - '--log-bin-trust-function-creators=1'
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - MYSQL_DATABASE=${MYSQL_DATABASE}
 | 
				
			||||||
 | 
					      - MYSQL_USER=${MYSQL_USER}
 | 
				
			||||||
 | 
					      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
 | 
				
			||||||
 | 
					      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - ./zabbix/mysql:/var/lib/mysql
 | 
				
			||||||
 | 
					    restart: unless-stopped
 | 
				
			||||||
 | 
					    networks:
 | 
				
			||||||
 | 
					      - zabbix-net
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  zabbix-server:
 | 
				
			||||||
 | 
					    image: zabbix/zabbix-server-mysql:${ZABBIX_VERSION:-latest}
 | 
				
			||||||
 | 
					    container_name: zabbix-server
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      - mysql-server
 | 
				
			||||||
 | 
					    ports:
 | 
				
			||||||
 | 
					      - "${ZABBIX_SERVER_PORT}:10051"
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - DB_SERVER_HOST=mysql-server
 | 
				
			||||||
 | 
					      - MYSQL_DATABASE=${MYSQL_DATABASE}
 | 
				
			||||||
 | 
					      - MYSQL_USER=${MYSQL_USER}
 | 
				
			||||||
 | 
					      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
 | 
				
			||||||
 | 
					      - ZBX_STARTSNMPTRAPPER=${ZBX_STARTSNMPTRAPPER}
 | 
				
			||||||
 | 
					      - ZBX_SNMPTRAPPERFILE=${ZBX_SNMPTRAPPERFILE}
 | 
				
			||||||
 | 
					      - ZBX_CACHESIZE=${ZBX_CACHESIZE}
 | 
				
			||||||
 | 
					      - ZBX_VALUECACHESIZE=${ZBX_VALUECACHESIZE}
 | 
				
			||||||
 | 
					      - ZBX_TRENDCACHESIZE=${ZBX_TRENDCACHESIZE}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - ./zabbix/alertscripts:/usr/lib/zabbix/alertscripts
 | 
				
			||||||
 | 
					      - ./zabbix/externalscripts:/usr/lib/zabbix/externalscripts
 | 
				
			||||||
 | 
					    restart: unless-stopped
 | 
				
			||||||
 | 
					    networks:
 | 
				
			||||||
 | 
					      - zabbix-net
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  zabbix-web:
 | 
				
			||||||
 | 
					    image: zabbix/zabbix-web-nginx-mysql:${ZABBIX_VERSION:-latest}
 | 
				
			||||||
 | 
					    container_name: zabbix-web
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      - mysql-server
 | 
				
			||||||
 | 
					      - zabbix-server
 | 
				
			||||||
 | 
					    ports:
 | 
				
			||||||
 | 
					      - "${ZABBIX_WEB_PORT}:8080"
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - DB_SERVER_HOST=mysql-server
 | 
				
			||||||
 | 
					      - MYSQL_DATABASE=${MYSQL_DATABASE}
 | 
				
			||||||
 | 
					      - MYSQL_USER=${MYSQL_USER}
 | 
				
			||||||
 | 
					      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
 | 
				
			||||||
 | 
					      - ZBX_SERVER_HOST=zabbix-server
 | 
				
			||||||
 | 
					      - PHP_TZ=${PHP_TIMEZONE}
 | 
				
			||||||
 | 
					    restart: unless-stopped
 | 
				
			||||||
 | 
					    networks:
 | 
				
			||||||
 | 
					      - zabbix-net
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  zabbix-proxy-active-01:
 | 
				
			||||||
 | 
					    image: zabbix/zabbix-proxy-sqlite3:${ZABBIX_VERSION:-latest}
 | 
				
			||||||
 | 
					    container_name: zabbix-proxy-active-01
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      - zabbix-server
 | 
				
			||||||
 | 
					    ports:
 | 
				
			||||||
 | 
					      - "10101:10051"
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - ZBX_HOSTNAME=zabbix-proxy-active-01
 | 
				
			||||||
 | 
					      - ZBX_SERVER_HOST=zabbix-server
 | 
				
			||||||
 | 
					      - ZBX_PROXYMODE=0
 | 
				
			||||||
 | 
					      - ZBX_CACHESIZE=${PROXY_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_HISTORYCACHESIZE=${PROXY_HISTORY_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_HISTORYINDEXCACHESIZE=${PROXY_HISTORY_INDEX_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_PROXYBUFFERMODE=${PROXY_BUFFER_MODE}
 | 
				
			||||||
 | 
					      - ZBX_PROXYMEMORYBUFFERSIZE=${PROXY_MEMORY_BUFFER_SIZE}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - ./zabbix/proxy-01:/var/lib/zabbix/db_data:rw
 | 
				
			||||||
 | 
					    restart: unless-stopped
 | 
				
			||||||
 | 
					    networks:
 | 
				
			||||||
 | 
					      - zabbix-net
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  zabbix-proxy-active-02:
 | 
				
			||||||
 | 
					    image: zabbix/zabbix-proxy-sqlite3:${ZABBIX_VERSION:-latest}
 | 
				
			||||||
 | 
					    container_name: zabbix-proxy-active-02
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      - zabbix-server
 | 
				
			||||||
 | 
					    ports:
 | 
				
			||||||
 | 
					      - "10102:10051"
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - ZBX_HOSTNAME=zabbix-proxy-active-02
 | 
				
			||||||
 | 
					      - ZBX_SERVER_HOST=zabbix-server
 | 
				
			||||||
 | 
					      - ZBX_PROXYMODE=0
 | 
				
			||||||
 | 
					      - ZBX_CACHESIZE=${PROXY_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_HISTORYCACHESIZE=${PROXY_HISTORY_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_HISTORYINDEXCACHESIZE=${PROXY_HISTORY_INDEX_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_PROXYBUFFERMODE=${PROXY_BUFFER_MODE}
 | 
				
			||||||
 | 
					      - ZBX_PROXYMEMORYBUFFERSIZE=${PROXY_MEMORY_BUFFER_SIZE}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - ./zabbix/proxy-02:/var/lib/zabbix/db_data:rw
 | 
				
			||||||
 | 
					    restart: unless-stopped
 | 
				
			||||||
 | 
					    networks:
 | 
				
			||||||
 | 
					      - zabbix-net
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  zabbix-proxy-active-03:
 | 
				
			||||||
 | 
					    image: zabbix/zabbix-proxy-sqlite3:${ZABBIX_VERSION:-latest}
 | 
				
			||||||
 | 
					    container_name: zabbix-proxy-active-03
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      - zabbix-server
 | 
				
			||||||
 | 
					    ports:
 | 
				
			||||||
 | 
					      - "10103:10051"
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - ZBX_HOSTNAME=zabbix-proxy-active-03
 | 
				
			||||||
 | 
					      - ZBX_SERVER_HOST=zabbix-server
 | 
				
			||||||
 | 
					      - ZBX_PROXYMODE=0
 | 
				
			||||||
 | 
					      - ZBX_CACHESIZE=${PROXY_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_HISTORYCACHESIZE=${PROXY_HISTORY_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_HISTORYINDEXCACHESIZE=${PROXY_HISTORY_INDEX_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_PROXYBUFFERMODE=${PROXY_BUFFER_MODE}
 | 
				
			||||||
 | 
					      - ZBX_PROXYMEMORYBUFFERSIZE=${PROXY_MEMORY_BUFFER_SIZE}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - ./zabbix/proxy-03:/var/lib/zabbix/db_data:rw
 | 
				
			||||||
 | 
					    restart: unless-stopped
 | 
				
			||||||
 | 
					    networks:
 | 
				
			||||||
 | 
					      - zabbix-net
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  zabbix-proxy-active-04:
 | 
				
			||||||
 | 
					    image: zabbix/zabbix-proxy-sqlite3:${ZABBIX_VERSION:-latest}
 | 
				
			||||||
 | 
					    container_name: zabbix-proxy-active-04
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      - zabbix-server
 | 
				
			||||||
 | 
					    ports:
 | 
				
			||||||
 | 
					      - "10104:10051"
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - ZBX_HOSTNAME=zabbix-proxy-active-04
 | 
				
			||||||
 | 
					      - ZBX_SERVER_HOST=zabbix-server
 | 
				
			||||||
 | 
					      - ZBX_PROXYMODE=0
 | 
				
			||||||
 | 
					      - ZBX_CACHESIZE=${PROXY_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_HISTORYCACHESIZE=${PROXY_HISTORY_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_HISTORYINDEXCACHESIZE=${PROXY_HISTORY_INDEX_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_PROXYBUFFERMODE=${PROXY_BUFFER_MODE}
 | 
				
			||||||
 | 
					      - ZBX_PROXYMEMORYBUFFERSIZE=${PROXY_MEMORY_BUFFER_SIZE}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - ./zabbix/proxy-04:/var/lib/zabbix/db_data:rw
 | 
				
			||||||
 | 
					    restart: unless-stopped
 | 
				
			||||||
 | 
					    networks:
 | 
				
			||||||
 | 
					      - zabbix-net
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  zabbix-proxy-active-05:
 | 
				
			||||||
 | 
					    image: zabbix/zabbix-proxy-sqlite3:${ZABBIX_VERSION:-latest}
 | 
				
			||||||
 | 
					    container_name: zabbix-proxy-active-05
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      - zabbix-server
 | 
				
			||||||
 | 
					    ports:
 | 
				
			||||||
 | 
					      - "10105:10051"
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - ZBX_HOSTNAME=zabbix-proxy-active-05
 | 
				
			||||||
 | 
					      - ZBX_SERVER_HOST=zabbix-server
 | 
				
			||||||
 | 
					      - ZBX_PROXYMODE=0
 | 
				
			||||||
 | 
					      - ZBX_CACHESIZE=${PROXY_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_HISTORYCACHESIZE=${PROXY_HISTORY_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_HISTORYINDEXCACHESIZE=${PROXY_HISTORY_INDEX_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_PROXYBUFFERMODE=${PROXY_BUFFER_MODE}
 | 
				
			||||||
 | 
					      - ZBX_PROXYMEMORYBUFFERSIZE=${PROXY_MEMORY_BUFFER_SIZE}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - ./zabbix/proxy-05:/var/lib/zabbix/db_data:rw
 | 
				
			||||||
 | 
					    restart: unless-stopped
 | 
				
			||||||
 | 
					    networks:
 | 
				
			||||||
 | 
					      - zabbix-net
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  zabbix-proxy-active-06:
 | 
				
			||||||
 | 
					    image: zabbix/zabbix-proxy-sqlite3:${ZABBIX_VERSION:-latest}
 | 
				
			||||||
 | 
					    container_name: zabbix-proxy-active-06
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      - zabbix-server
 | 
				
			||||||
 | 
					    ports:
 | 
				
			||||||
 | 
					      - "10106:10051"
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - ZBX_HOSTNAME=zabbix-proxy-active-06
 | 
				
			||||||
 | 
					      - ZBX_SERVER_HOST=zabbix-server
 | 
				
			||||||
 | 
					      - ZBX_PROXYMODE=0
 | 
				
			||||||
 | 
					      - ZBX_CACHESIZE=${PROXY_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_HISTORYCACHESIZE=${PROXY_HISTORY_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_HISTORYINDEXCACHESIZE=${PROXY_HISTORY_INDEX_CACHE_SIZE}
 | 
				
			||||||
 | 
					      - ZBX_PROXYBUFFERMODE=${PROXY_BUFFER_MODE}
 | 
				
			||||||
 | 
					      - ZBX_PROXYMEMORYBUFFERSIZE=${PROXY_MEMORY_BUFFER_SIZE}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - ./zabbix/proxy-06:/var/lib/zabbix/db_data:rw
 | 
				
			||||||
 | 
					    restart: unless-stopped
 | 
				
			||||||
 | 
					    networks:
 | 
				
			||||||
 | 
					      - zabbix-net
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # zabbix-proxy-passive-03:
 | 
				
			||||||
 | 
					  #   image: zabbix/zabbix-proxy-sqlite3:${ZABBIX_VERSION:-latest}
 | 
				
			||||||
 | 
					  #   container_name: zabbix-proxy-passive-03
 | 
				
			||||||
 | 
					  #   depends_on:
 | 
				
			||||||
 | 
					  #     - zabbix-server
 | 
				
			||||||
 | 
					  #   ports:
 | 
				
			||||||
 | 
					  #     - "10103:10051"
 | 
				
			||||||
 | 
					  #   environment:
 | 
				
			||||||
 | 
					  #     - ZBX_HOSTNAME=zabbix-proxy-passive-03
 | 
				
			||||||
 | 
					  #     - ZBX_SERVER_HOST=zabbix-server
 | 
				
			||||||
 | 
					  #     - ZBX_PROXYMODE=1
 | 
				
			||||||
 | 
					  #     - ZBX_CACHESIZE=${PROXY_CACHE_SIZE}
 | 
				
			||||||
 | 
					  #     - ZBX_HISTORYCACHESIZE=${PROXY_HISTORY_CACHE_SIZE}
 | 
				
			||||||
 | 
					  #     - ZBX_HISTORYINDEXCACHESIZE=${PROXY_HISTORY_INDEX_CACHE_SIZE}
 | 
				
			||||||
 | 
					  #     - ZBX_PROXYBUFFERMODE=${PROXY_BUFFER_MODE}
 | 
				
			||||||
 | 
					  #     - ZBX_PROXYMEMORYBUFFERSIZE=${PROXY_MEMORY_BUFFER_SIZE}
 | 
				
			||||||
 | 
					  #   volumes:
 | 
				
			||||||
 | 
					  #     - ./zabbix/proxy-03:/var/lib/zabbix/db_data:rw
 | 
				
			||||||
 | 
					  #   restart: unless-stopped
 | 
				
			||||||
 | 
					  #   networks:
 | 
				
			||||||
 | 
					  #     - zabbix-net
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					networks:
 | 
				
			||||||
 | 
					  zabbix-net:
 | 
				
			||||||
 | 
					    driver: bridge
 | 
				
			||||||
		Reference in New Issue
	
	Block a user