Compare commits

...

34 Commits

Author SHA1 Message Date
Gitea Action
868b78f476 AUTO: Update Zabbix to version 7.4.4 [ci skip] 2025-10-30 06:01:15 +00:00
066033a4d6 change: removed interface and trapper item
Some checks failed
Zabbix APK Builder / check-version (push) Successful in 21s
Zabbix APK Builder / update-version (push) Failing after 8s
Zabbix APK Builder / build-packages (push) Has been skipped
Zabbix APK Builder / deploy-test (push) Has been skipped
2025-10-23 12:11:08 +02:00
e4726a478e fix: replaced ambiguous Unicode characters 2025-10-23 12:05:59 +02:00
3668563736 change: added docker compose file to deploy the test server with the proxies 2025-10-23 12:02:11 +02:00
d750ad84a5 change: added host creation and removal scripts to test the loaded server 2025-10-23 12:02:11 +02:00
Gitea Action
ae4e83dafe AUTO: Update Zabbix to version 7.4.3 [ci skip] 2025-10-02 06:01:06 +00:00
fcbd2c5452 chage: revorked README
Some checks failed
Zabbix APK Builder / check-version (push) Successful in 4s
Zabbix APK Builder / update-version (push) Failing after 3s
Zabbix APK Builder / build-packages (push) Has been skipped
Zabbix APK Builder / deploy-test (push) Has been skipped
2025-09-12 10:41:56 +02:00
039531ce7b change: revorked and simplified workflow 2025-09-12 10:41:29 +02:00
91fe69a0a2 FIX: Changed workflow to use run_id 2025-09-04 21:49:15 +02:00
81af16cedf TEST: Uniq ID generation
All checks were successful
Zabbix APK Builder / check-version (push) Successful in 11s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Successful in 5m13s
Zabbix APK Builder / deploy-test (push) Successful in 6s
2025-09-04 21:06:40 +02:00
03be79d149 TEST: Run with docker cp instead of mounting
All checks were successful
Zabbix APK Builder / check-version (push) Successful in 13s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Has been skipped
Zabbix APK Builder / deploy-test (push) Has been skipped
2025-09-04 18:20:53 +02:00
1112e15d80 TEST: One more run
All checks were successful
Zabbix APK Builder / check-version (push) Successful in 10s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Successful in 5m12s
Zabbix APK Builder / deploy-test (push) Successful in 7s
2025-09-04 18:08:26 +02:00
0c86b453a6 TEST: One more time :D
All checks were successful
Zabbix APK Builder / check-version (push) Successful in 11s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Successful in 5m19s
Zabbix APK Builder / deploy-test (push) Successful in 6s
2025-09-04 17:55:19 +02:00
882755ffc8 FIX: Remove last line
All checks were successful
Zabbix APK Builder / check-version (push) Successful in 10s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Successful in 5m15s
Zabbix APK Builder / deploy-test (push) Successful in 8s
2025-09-04 17:44:51 +02:00
2854955c74 TEST: Adjusted workflow
Some checks failed
Zabbix APK Builder / check-version (push) Successful in 10s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Failing after 13s
Zabbix APK Builder / deploy-test (push) Has been skipped
2025-09-04 17:42:30 +02:00
fa06beefdd TEST: Older artifacts
All checks were successful
Zabbix APK Builder / check-version (push) Successful in 11s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Successful in 5m46s
Zabbix APK Builder / deploy-test (push) Successful in 12s
2025-09-04 17:29:48 +02:00
d7f1052305 TEST: Full Claude reword
Some checks failed
Zabbix APK Builder / check-version (push) Successful in 11s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Failing after 5m9s
Zabbix APK Builder / deploy-test (push) Has been skipped
2025-09-04 17:04:47 +02:00
8ab7ff54b9 FIX: Typo
Some checks failed
Zabbix APK Builder / check-version (push) Successful in 11s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Successful in 5m15s
Zabbix APK Builder / deploy-test (push) Failing after 3s
2025-09-04 16:13:59 +02:00
993104e122 FIX: Typo 2025-09-04 16:13:39 +02:00
44a3bc1cf4 TEST: Adjusted script
Some checks failed
Zabbix APK Builder / check-version (push) Successful in 12s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Failing after 14s
Zabbix APK Builder / deploy-test (push) Has been skipped
2025-09-04 16:10:42 +02:00
44b4aa9e7a TEST: Testing permissions change
Some checks failed
Zabbix APK Builder / check-version (push) Successful in 12s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Successful in 5m12s
Zabbix APK Builder / deploy-test (push) Failing after 3s
2025-09-04 15:46:48 +02:00
7986278926 TEST: Build script is now in Dockerfile
Some checks failed
Zabbix APK Builder / check-version (push) Successful in 13s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Successful in 5m15s
Zabbix APK Builder / deploy-test (push) Failing after 2s
2025-09-04 14:50:19 +02:00
a1752e68c7 FIX+TES: Fixed checksum problem
Some checks failed
Zabbix APK Builder / check-version (push) Successful in 27s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Successful in 5m13s
Zabbix APK Builder / deploy-test (push) Failing after 13s
2025-09-04 14:27:23 +02:00
f3ac36a139 FIX+TEST: Adjusted build.sh to use the correct user and workdir
Some checks failed
Zabbix APK Builder / check-version (push) Successful in 13s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Failing after 11s
Zabbix APK Builder / deploy-test (push) Has been skipped
2025-09-04 14:08:57 +02:00
f95de88005 TEST: Action testing
Some checks failed
Zabbix APK Builder / check-version (push) Successful in 20s
Zabbix APK Builder / update-version (push) Has been skipped
Zabbix APK Builder / build-packages (push) Failing after 1m21s
Zabbix APK Builder / deploy-test (push) Has been skipped
2025-09-04 13:44:37 +02:00
9f2e966662 TEST: Replaced condition to not trigger the job if commit done by Gitea bot 2025-09-04 13:43:29 +02:00
baf814e0e5 TEST: Change into the workflow 2025-09-04 12:36:41 +02:00
Gitea Action
0722d1942f CHANGE: Update Zabbix to version 7.4.2 [ci skip] 2025-09-03 18:13:10 +00:00
1119a38496 TEST: Action test
All checks were successful
Zabbix APK Builder / check-version (push) Successful in 10s
Zabbix APK Builder / update-version (push) Successful in 3s
Zabbix APK Builder / build-packages (push) Has been skipped
Zabbix APK Builder / deploy-test (push) Has been skipped
2025-09-03 20:12:51 +02:00
91afa98d6b FIX: Changed syntax. IF: statement cannot be used in push. Also ! should be enclosed in {{}} 2025-09-03 20:12:13 +02:00
f3ce93f8b1 TEST: Actual test 2025-09-03 19:58:44 +02:00
7bb7bfc3a5 FIX: Addes ci skip stamement to not cancel the workflow during the version change 2025-09-03 19:50:57 +02:00
5e70da801f FIX: Addes ci skip stamement to not cancel the workflow during the version change 2025-09-03 19:50:13 +02:00
7b0392a98c FIX: Addes ci skip stamement to not cancel the workflow during the version change 2025-09-03 19:50:13 +02:00
10 changed files with 580 additions and 183 deletions

View File

@@ -1,22 +1,25 @@
name: Zabbix APK Builder
on:
# Trigger on pushes to main/test branch
# Trigger on pushes to main/test branch into the zabbix-apk-builder directory
push:
branches: [ main, test ]
paths: [ 'zabbix-apk-builder/**' ]
# Scheduled check for new versions (daily at 6 AM UTC)
# Scheduled runs at 06:00 UTC daily
schedule:
- cron: '0 6 * * *'
jobs:
check-version:
runs-on: ubuntu-latest
# Skip the execution if the commit author is the bot itself to prevent loops
if: ${{ gitea.event.head_commit.author.name != 'Gitea Action' }}
outputs:
should_build: ${{ steps.version-check.outputs.should_build }}
latest_version: ${{ steps.version-check.outputs.latest_version }}
current_version: ${{ steps.version-check.outputs.current_version }}
is_push_trigger: ${{ steps.version-check.outputs.is_push_trigger }}
steps:
- name: Checkout repository
@@ -27,37 +30,34 @@ jobs:
run: |
set -euo pipefail
# Install jq for JSON parsing
sudo apt-get update && sudo apt-get install -y jq
# Remove jq installation
# apt-get update && apt-get install -y jq
# Get current version from APKBUILD
# Detect trigger type
IS_PUSH="${{ gitea.event_name == 'push' }}"
echo "is_push_trigger=${IS_PUSH}" >> "${GITHUB_OUTPUT}"
# Get versions
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" | \
jq -r '.values[].displayId' | \
grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | \
grep -v 'rc\|beta\|alpha' | \
sort -V | \
tail -1)
grep -o '"displayId":"[^"]*"' | cut -d'"' -f4 | \
grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | grep -v 'rc\|beta\|alpha' | \
sort -V | tail -1)
echo "latest_version=$LATEST_VERSION" >> $GITHUB_OUTPUT
echo "Latest version: $LATEST_VERSION"
echo "current_version=${CURRENT_VERSION}" >> "${GITHUB_OUTPUT}"
echo "latest_version=${LATEST_VERSION}" >> "${GITHUB_OUTPUT}"
# Determine if we should build
if [ "$CURRENT_VERSION" != "$LATEST_VERSION" ]; then
echo "should_build=true" >> $GITHUB_OUTPUT
echo "Build required: Version changed"
# Always build on push, build on schedule if versions differ
if [[ "${IS_PUSH}" == "true" || "${CURRENT_VERSION}" != "${LATEST_VERSION}" ]]; then
echo "should_build=true" >> "${GITHUB_OUTPUT}"
else
echo "should_build=false" >> $GITHUB_OUTPUT
echo "No build required: Version unchanged"
echo "should_build=false" >> "${GITHUB_OUTPUT}"
fi
update-version:
needs: [check-version]
if: needs.check-version.outputs.should_build == 'true' && needs.check-version.outputs.current_version != needs.check-version.outputs.latest_version
needs: check-version
# Only update version during scheduled runs when new version is available
if: ${{ needs.check-version.outputs.should_build == 'true' && needs.check-version.outputs.is_push_trigger == 'false' && needs.check-version.outputs.current_version != needs.check-version.outputs.latest_version }}
runs-on: ubuntu-latest
steps:
@@ -73,10 +73,10 @@ jobs:
LATEST_VERSION="${{ needs.check-version.outputs.latest_version }}"
CURRENT_VERSION="${{ needs.check-version.outputs.current_version }}"
echo "Updating APKBUILD from $CURRENT_VERSION to $LATEST_VERSION"
echo "Updating APKBUILD from ${CURRENT_VERSION} to ${LATEST_VERSION}"
# Update pkgver
sed -i "s/^pkgver=.*/pkgver=$LATEST_VERSION/" zabbix-apk-builder/APKBUILD
sed -i "s/^pkgver=.*/pkgver=${LATEST_VERSION}/" zabbix-apk-builder/APKBUILD
# Reset pkgrel to 0 for new version
sed -i "s/^pkgrel=.*/pkgrel=0/" zabbix-apk-builder/APKBUILD
@@ -84,28 +84,44 @@ jobs:
# Clear checksums (will be regenerated during build)
sed -i 's/^sha512sums=.*/sha512sums="SKIP"/' zabbix-apk-builder/APKBUILD
# Commit changes
# Commit changes with [ci skip] to prevent recursive triggers
git config --local user.email "action@gitea.com"
git config --local user.name "Gitea Action"
git add zabbix-apk-builder/APKBUILD
git commit -m "CHANGE: Update Zabbix to version $LATEST_VERSION" || exit 0
git commit -m "AUTO: Update Zabbix to version ${LATEST_VERSION} [ci skip]" || exit 0
git push
build-packages:
needs: [update-version]
if: needs.check-version.outputs.should_build == 'true'
# Build packages after version update (for scheduled runs) or immediately (for push runs)
needs: [check-version, update-version]
# Run if should_build=true AND either update-version ran successfully OR it was skipped due to push trigger
if: ${{ needs.check-version.outputs.should_build == 'true' && (success() || needs.check-version.outputs.is_push_trigger == 'true') }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ gitea.head_ref }}
# Use token to ensure we get the latest version if it was updated
token: ${{ secrets.ACCESS_TOKEN }}
ref: ${{ gitea.ref }}
- name: Verify build environment
run: |
set -euo pipefail
echo "=== Build Environment ==="
echo "Trigger type: ${{ gitea.event_name }}"
echo "Current branch: $(git branch --show-current)"
echo "APKBUILD version: $(grep '^pkgver=' zabbix-apk-builder/APKBUILD | cut -d'=' -f2)"
echo "Target version: ${{ needs.check-version.outputs.latest_version }}"
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Zabbix packages
env:
CI_RUN_ID: ${{ gitea.run_id }}
run: |
set -euo pipefail
@@ -113,53 +129,75 @@ jobs:
chmod +x build.sh
./build.sh
- name: List built packages
- name: Verify and list built packages
run: |
set -euo pipefail
cd zabbix-apk-builder
echo "Built packages:"
ls -la zabbix-apk-builder/packages/
# Verify packages exist somewhere
PACKAGE_COUNT=$(find packages -name "*.apk" | wc -l)
echo "Package sizes:"
du -h zabbix-apk-builder/packages/*.apk || echo "No packages found"
if [[ $PACKAGE_COUNT -eq 0 ]]; then
echo "ERROR: No packages found"
find packages -type f 2>/dev/null || echo "packages directory is empty"
exit 1
fi
echo "Found $PACKAGE_COUNT packages:"
find packages -name "*.apk" -exec ls -lh {} \;
- name: Upload packages as artifacts
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v3
with:
name: zabbix-apk-packages
path: zabbix-apk-builder/packages/*.apk
name: zabbix-apk-packages-${{ gitea.run_number }}
path: zabbix-apk-builder/packages/**/*.apk
retention-days: 30
if-no-files-found: error
deploy-test:
needs: [build-packages]
if: needs.check-version.outputs.should_build == 'true' && gitea.ref == 'refs/heads/test'
needs: [check-version, build-packages]
if: ${{ needs.check-version.outputs.should_build == 'true' && contains(gitea.ref, 'test') }}
runs-on: ubuntu-latest
steps:
- name: Download packages
uses: actions/download-artifact@v4
uses: actions/download-artifact@v3
with:
name: zabbix-apk-packages
name: zabbix-apk-packages-${{ gitea.run_number }}
path: packages/
- name: Test deployment in Alpine container
run: |
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)
# Test agent package
docker run --rm -v $PWD/packages:/packages alpine:latest sh -c "
apk add --allow-untrusted /packages/zabbix-agent-*.apk
which zabbix_agentd
zabbix_agentd --version
" || echo "Agent test failed"
# Test function
test_package() {
local pkg="$1"
local binary="$2"
if [[ -f "$pkg" ]]; then
echo "Testing $(basename "$pkg")..."
CONTAINER_ID=$(docker run -d alpine:latest sleep 30)
docker cp "$pkg" "$CONTAINER_ID:/$(basename "$pkg")"
if docker exec "$CONTAINER_ID" sh -c "
apk add --allow-untrusted /$(basename "$pkg") >/dev/null 2>&1
which $binary >/dev/null 2>&1
$binary --version >/dev/null 2>&1
"; then
echo "SUCCESS: $(basename "$pkg") test passed"
else
echo "FAIL: $(basename "$pkg") test failed"
fi
docker rm -f "$CONTAINER_ID" >/dev/null
else
echo "ERROR: Package not found: $pkg"
fi
}
# Test 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 failed"
echo "✅ Package deployment test completed"
test_package "$AGENT_PKG" "zabbix_agentd"
test_package "$PROXY_PKG" "zabbix_proxy"

View File

@@ -9,6 +9,7 @@ src/
# Backup files
*.backup
*.bak
*~
# OS files

View File

@@ -1,7 +1,7 @@
# Contributor: Maksym Buz <maksym.buz@zabbix.com>
# Maintainer: Maksym Buz <maksym.buz@zabbix.com>
pkgname=zabbix
pkgver=7.4.2
pkgver=7.4.4
pkgrel=0
pkgdesc="Enterprise-class open source distributed monitoring solution"
url="https://www.zabbix.com/"
@@ -138,11 +138,11 @@ proxy() {
install -dm755 "$subpkgdir"/var/log/zabbix
install -dm755 "$subpkgdir"/var/run/zabbix
}
# --- TEST ---
sha512sums="SKIP"
3bf1f915c2cd5a59f1dd3afc10dd1a6e596840e576013839d6eae057cd327893f87cc5cec1d32b6a8ca8bd00735c0070327084aae01dc8d3399202f5a3e365c1 zabbix-7.4.2.tar.gz
SKIP
SKIP
SKIP
SKIP
"
SKIP
"

View File

@@ -36,5 +36,32 @@ COPY --chown=builder:builder . /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
CMD ["abuild", "-r"]
CMD ["/usr/local/bin/build-packages.sh"]

View File

@@ -4,8 +4,7 @@ Automated Alpine Linux package builder for Zabbix Agent and Proxy with CI/CD pip
## Features
- 🔄 **Automatic Version Detection**: Monitors Zabbix releases using official Bitbucket API
- 🏗️ **Docker-based Building**: Consistent, reproducible builds in isolated environment
- 🔄 **Automatic Version Detection**: Monitors Zabbix releases using Bitbucket API
- 🚀 **CI/CD Pipeline**: Full automation from version detection to package deployment
- 📦 **Multi-package Support**: Builds agent and proxy packages
- 🧪 **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
### 1. Repository Setup
### Prerequisites
- Docker installed
- Gitea repository with Actions enabled
### Manual Build
```bash
# Clone this repository
git clone https://git.mbuz.uk/mbuz/Zabbix.git
# Clone the repository
git clone <your-gitea-repo>
cd zabbix-apk-builder
# Make build script executable
chmod +x build.sh
```
### 2. Manual Build
```bash
# Build packages locally
chmod +x build.sh
./build.sh
# Packages will be in ./packages/
ls -la packages/
```
### 3. CI/CD Setup
```bash
# Run the setup script
./setup-cicd.sh
# Follow the prompts to configure GitHub secrets
# Check built packages
ls -la packages/builder/x86_64/
```
## Package Information
@@ -51,19 +40,12 @@ ls -la packages/
2. **zabbix-proxy** - Zabbix Proxy
3. **zabbix** - Meta package
### Current Version
- **Zabbix Version**: 7.4.2
- **Alpine Base**: latest
- **Architecture**: all
## CI/CD Pipeline
### Automatic Triggers
- **Daily**: Checks for new Zabbix versions at 6 AM UTC
- **Push**: Builds when code changes in main/test branches
- **Manual**: Force builds via Gitea Actions
### Version Detection
@@ -91,48 +73,22 @@ GITEA_SSH_KEY # SSH private key for Gitea access
### File Structure
```
.
└── zabbix-git
── zabbix-apk-builder
── .gitea/workflows # Workflows for Gitea actions
├── .gitignore # Ignore files
├── APKBUILD # APKBUILD file for Zabbix
├── Dockerfile # Dockerfile for building packages
├── README.md # Project description
├── build.sh # Script for manual builds
├── packages/ # Directory for built packages
├── zabbix-agent.* # Agent configuration files
── zabbix-proxy.* # Proxy configuration files
```
## Usage
### 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
zabbix-git/
└── zabbix-apk-builder/
── .gitea/
── workflows/
└── build.yaml # Main CI/CD pipeline
├── APKBUILD # Alpine package definition
├── Dockerfile # Build environment container
├── README.md # This file
├── build.sh # Local build script
├── packages/ # Generated packages (gitignored)
├── zabbix-agent.confd # Agent configuration
── zabbix-agent.initd # Agent init script
├── zabbix-agent.pre-install # Agent pre-install script
├── zabbix-proxy.confd # Proxy configuration
├── zabbix-proxy.initd # Proxy init script
└── zabbix-proxy.pre-install # Proxy pre-install script
```
## Development
@@ -154,28 +110,16 @@ docker run --rm -it \
### Branch Strategy
- **main**: Production releases, auto-deployed
- **test**: Testing and validation, no auto-deploy
- **main**: Production releases, merge only
- **test**: Testing and validation
### Making Changes
1. Create feature branch from `test`
1. Create feature branch from `main`
2. Test changes thoroughly
3. Merge to `test` for CI validation
4. Merge to `main` for production release
3. Validate CI
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

View File

@@ -3,52 +3,57 @@
set -e
# Configuration
PROJECT_DIR="$(pwd)"
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
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"
echo "=== Zabbix APK Builder ==="
echo "Project directory: $PROJECT_DIR"
echo "Output directory: $OUTPUT_DIR"
# Clean up any existing containers
# Clean up function
cleanup() {
echo "Cleaning up..."
docker rm -f "$CONTAINER_NAME" 2>/dev/null || true
echo "Cleaning up container..."
docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true
}
trap cleanup EXIT
# Create output directory
# Clean and create output directory
rm -rf "$OUTPUT_DIR"
mkdir -p "$OUTPUT_DIR"
# Build Docker image
echo "Building Docker image..."
docker build -t "$IMAGE_NAME" "$PROJECT_DIR"
# Run the build in container
echo "Running package build..."
docker run --rm \
--name "$CONTAINER_NAME" \
-v "$OUTPUT_DIR:/output" \
"$IMAGE_NAME" \
sh -c "
set -e
echo 'Starting package build...'
# Generate checksums for APKBUILD
echo 'Generating checksums for APKBUILD...'
abuild checksum
# Build packages
abuild -r
# Copy packages to output
echo 'Copying packages to output directory...'
find /home/builder/packages -name '*.apk' -exec cp {} /output/ \;
"
echo "Build completed successfully!"
echo "To install packages:"
echo " apk add --allow-untrusted $OUTPUT_DIR/zabbix-agent-*.apk"
echo " apk add --allow-untrusted $OUTPUT_DIR/zabbix-proxy-*.apk"
# Run the build in the container
echo "Running package build in container..."
docker run --name "$CONTAINER_NAME" "$IMAGE_NAME"
# Copy packages from container to host
echo "Copying packages from container..."
if docker cp "$CONTAINER_NAME:/home/builder/packages/." "$OUTPUT_DIR/"; then
echo "✅ Packages copied successfully"
# Remove APKINDEX files (we only want the .apk packages)
echo "Removing repository index files..."
find "$OUTPUT_DIR" -name "APKINDEX.tar.gz" -delete 2>/dev/null || true
# Fix permissions on copied files
echo "Fixing file permissions..."
find "$OUTPUT_DIR" -name "*.apk" -exec chmod 644 {} \; 2>/dev/null || true
echo "Build completed successfully!"
echo "Packages are in $OUTPUT_DIR:"
find "$OUTPUT_DIR" -name "*.apk" -exec ls -la {} \;
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
View 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
View 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}")

View 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

View 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