Zabbix Docker ile Hızlı Kurulum ve Yapılandırma
Üretim ortamına Zabbix kurmak zorunda kaldığınızda, klasik RPM/DEB kurulum yolunu tercih ederseniz kendinizi saatlerce bağımlılık çözme, PHP sürüm uyumsuzluğu ve Apache/Nginx konfigürasyonu uğraşının içinde bulabilirsiniz. Docker ile bu süreç dramatik biçimde kısalıyor. Geçen ay bir müşterimizin altyapısında sıfırdan Zabbix kurulumu yapmam gerekti, elimde sadece iki saat vardı ve “şimdi sihir yap” bakışlarıyla bekliyorlardı. Docker Compose açtım, kırk dakika sonra dashboard açıktı. Bu yazıda o süreci adım adım aktarıyorum.
Neden Docker ile Zabbix?
Klasik kurulumun baş ağrısı genellikle şu üç noktadan geliyor: veritabanı sürüm uyumluluğu, PHP bağımlılıkları ve Zabbix bileşenleri arasındaki versiyon kilitleri. Docker bu üçünü de izole ediyor. Her bileşen kendi container’ında çalışıyor, güncelleme yapmak istediğinizde sadece image tag’ini değiştiriyorsunuz, test ortamında deniyorsunuz, sorunsuzsa üretime alıyorsunuz.
Bir diğer avantaj taşınabilirlik. Zabbix stack’inizi başka bir sunucuya taşımak istediğinizde docker-compose.yml dosyanız ve volume’larınız yeterli. Bütün konfigürasyon orada.
Dezavantajları da görmezden gelmeyeyim: Container overhead’i var, network katmanı bazen troubleshoot’u zorlaştırıyor ve bazı kurumsal ortamlarda Docker kullanımına kısıtlamalar getirilebiliyor. Bunları bilerek devam edelim.
Ön Hazırlık ve Sistem Gereksinimleri
Ortamımı netleştireyim: Ubuntu 22.04 LTS üzerinde çalışıyorum, Docker Engine 24.x ve Docker Compose v2 kurulu. Zabbix 6.4 LTS kullanacağım çünkü üretim ortamında LTS sürümleri tercih etmek gerekiyor, her altı ayda bir büyük güncelleme stresi yaşamak istemiyorum.
Minimum kaynak olarak şunlara bakıyorum:
- CPU: 2 vCPU (50-100 host izleme için yeterli, büyük ortamlar için 4+ vCPU)
- RAM: 4 GB (Zabbix server, frontend ve PostgreSQL birlikte rahat çalışsın diye)
- Disk: 50 GB (history verileri birikince şişiyor, bunu hafife almayın)
Docker kurulu değilse hızlıca hazırlayalım:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
newgrp docker
docker --version
docker compose version
Dizin Yapısını Oluşturmak
Her şeyi düzenli tutmak için bir dizin hiyerarşisi kuruyorum. İlerleyen süreçte nerede ne var bilmek hayat kurtarıyor:
mkdir -p /opt/zabbix/{postgres-data,zabbix-server,alertscripts,externalscripts,snmptraps,export,modules,enc,ssh_keys,mibs}
cd /opt/zabbix
Volume mount noktaları bu dizinlere bağlanacak. Özellikle alertscripts ve externalscripts dizinleri çok işinize yarayacak, özel bildirim scriptlerinizi buraya atacaksınız.
Docker Compose Dosyasını Hazırlamak
Şimdi asıl işe geliyoruz. PostgreSQL tercih ediyorum çünkü MySQL’e göre Zabbix ile daha iyi performans gösteriyor, özellikle yüksek veri hacimlerinde sorgu performansı belirgin şekilde daha iyi. TimescaleDB extension’ı da eklersek history tablosu yönetimi çok kolaylaşıyor ama bunu ilerleyen bölümde ele alacağım.
version: '3.8'
networks:
zabbix-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
volumes:
postgres-data:
driver: local
driver_opts:
type: none
o: bind
device: /opt/zabbix/postgres-data
services:
zabbix-postgres:
image: postgres:15-alpine
container_name: zabbix-postgres
restart: unless-stopped
environment:
POSTGRES_USER: zabbix
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: zabbixdb
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
zabbix-net:
ipv4_address: 172.20.0.10
healthcheck:
test: ["CMD-SHELL", "pg_isready -U zabbix -d zabbixdb"]
interval: 10s
timeout: 5s
retries: 5
zabbix-server:
image: zabbix/zabbix-server-pgsql:ubuntu-6.4-latest
container_name: zabbix-server
restart: unless-stopped
depends_on:
zabbix-postgres:
condition: service_healthy
environment:
DB_SERVER_HOST: zabbix-postgres
DB_SERVER_PORT: 5432
POSTGRES_USER: zabbix
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: zabbixdb
ZBX_STARTPOLLERS: 10
ZBX_STARTPOLLERSUNREACHABLE: 2
ZBX_STARTTRAPPERS: 5
ZBX_STARTPINGERS: 3
ZBX_STARTHTTPPOLLERS: 3
ZBX_CACHESIZE: 128M
ZBX_HISTORYCACHESIZE: 64M
ZBX_HISTORYINDEXCACHESIZE: 32M
ZBX_TRENDCACHESIZE: 32M
ZBX_VALUECACHESIZE: 128M
volumes:
- /opt/zabbix/alertscripts:/usr/lib/zabbix/alertscripts
- /opt/zabbix/externalscripts:/usr/lib/zabbix/externalscripts
- /opt/zabbix/snmptraps:/var/lib/zabbix/snmptraps
- /opt/zabbix/export:/var/lib/zabbix/export
- /opt/zabbix/modules:/var/lib/zabbix/modules
- /opt/zabbix/enc:/var/lib/zabbix/enc
- /opt/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys
- /opt/zabbix/mibs:/var/lib/zabbix/mibs
ports:
- "10051:10051"
networks:
zabbix-net:
ipv4_address: 172.20.0.20
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
zabbix-frontend:
image: zabbix/zabbix-web-nginx-pgsql:ubuntu-6.4-latest
container_name: zabbix-frontend
restart: unless-stopped
depends_on:
- zabbix-postgres
- zabbix-server
environment:
ZBX_SERVER_HOST: zabbix-server
ZBX_SERVER_PORT: 10051
DB_SERVER_HOST: zabbix-postgres
DB_SERVER_PORT: 5432
POSTGRES_USER: zabbix
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: zabbixdb
PHP_TZ: Europe/Istanbul
ZBX_SERVER_NAME: "Uretim Izleme"
volumes:
- /opt/zabbix/modules:/usr/share/zabbix/modules
ports:
- "8080:8080"
- "8443:8443"
networks:
zabbix-net:
ipv4_address: 172.20.0.30
zabbix-agent2:
image: zabbix/zabbix-agent2:ubuntu-6.4-latest
container_name: zabbix-agent2
restart: unless-stopped
depends_on:
- zabbix-server
environment:
ZBX_HOSTNAME: "zabbix-docker-host"
ZBX_SERVER_HOST: zabbix-server
ZBX_SERVER_PORT: 10051
ZBX_PASSIVE_ALLOW: "true"
ZBX_ACTIVESERVERS: "zabbix-server"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /dev:/dev:ro
privileged: true
pid: "host"
networks:
zabbix-net:
ipv4_address: 172.20.0.40
Environment Değişkenlerini Güvenli Tutmak
Şifreyi doğrudan compose dosyasına yazmıyorum. .env dosyası kullanıyorum ve bunu asla Git’e push etmiyorum:
cat > /opt/zabbix/.env << 'EOF'
POSTGRES_PASSWORD=GucluBirSifreBuraya2024!
EOF
chmod 600 /opt/zabbix/.env
echo ".env" >> /opt/zabbix/.gitignore
Stack’i Başlatmak
Her şey hazır, başlatıyoruz:
cd /opt/zabbix
docker compose up -d
# Logları takip et
docker compose logs -f zabbix-server
# Tüm container'ların durumunu kontrol et
docker compose ps
İlk başlatmada Zabbix server biraz bekletebilir, veritabanı şemasını oluşturuyor. docker compose logs -f zabbix-server ile izlediğinizde “server #0 started” mesajını görünce hazır demektir. Bu genellikle 2-3 dakika sürüyor.
Tarayıcıdan http://sunucu-ip:8080 adresine gidin. Varsayılan kullanıcı adı Admin, şifre zabbix. İlk giriş sonrası bu şifreyi hemen değiştirin.
İlk Yapılandırma Adımları
Giriş yaptıktan sonra birkaç kritik ayar var, bunları atlamayın.
Saat dilimi kontrolü: Administration > General > GUI bölümünden “Default time zone” değerini “Europe/Istanbul” olarak ayarlayın. Compose dosyasında PHP_TZ verdik ama frontend’den de teyit edin. Saat kayması alarm korelasyonunu berbat ediyor.
Housekeeping ayarları: Administration > General > Housekeeping bölümü. History verilerini varsayılan 90 gün yerine 30 gün, trend verilerini 365 gün olarak ayarlıyorum. PostgreSQL diskinizin şişmesini istemiyorsanız bu değerleri ihtiyacınıza göre düzenleyin.
Media type – E-posta bildirimi: Administration > Media types > Email. SMTP ayarlarınızı girin. Sonra Users > Admin kullanıcısı > Media sekmesinden e-posta adresi ekleyin. Trigger action olmadan bildirim gelmiyor, bunu da Configuration > Actions > Trigger actions altında aktif hale getirin.
Zabbix Agent Kurulumu – İzlenecek Sunuculara
Docker host’unuzu izlemeye aldık ama asıl amaç uzak sunucuları izlemek. Uzak Linux sunuculara agent kurmak için:
# Ubuntu/Debian icin
wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1+ubuntu22.04_all.deb
dpkg -i zabbix-release_6.4-1+ubuntu22.04_all.deb
apt update && apt install zabbix-agent2 -y
# Konfigurasyonu düzenle
cat > /etc/zabbix/zabbix_agent2.conf << 'EOF'
Server=ZABBIX_SERVER_IP
ServerActive=ZABBIX_SERVER_IP
Hostname=sunucu-adi.domain.com
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=10
PidFile=/run/zabbix/zabbix_agent2.pid
SocketDir=/run/zabbix
Include=/etc/zabbix/zabbix_agent2.d/*.conf
EOF
systemctl enable --now zabbix-agent2
systemctl status zabbix-agent2
Agent kurulduktan sonra Zabbix frontend’den Configuration > Hosts > Create host ile sunucuyu ekliyorsunuz. Host name alanına zabbix_agent2.conf içindeki Hostname değerini yazın, aksi halde aktif kontroller çalışmaz.
Firewall Kuralları
Genellikle gözden kaçan nokta bu. Zabbix server ile agent arasında port açık olması gerekiyor:
# Zabbix server üzerinde (Docker host)
ufw allow 10051/tcp comment "Zabbix Server - Agent trapdoor"
ufw allow 8080/tcp comment "Zabbix Frontend HTTP"
# Agent kurulu sunucular üzerinde
ufw allow from ZABBIX_SERVER_IP to any port 10050 proto tcp comment "Zabbix Agent passive"
Passive check için Zabbix server agent’a bağlanır (port 10050), active check için agent Zabbix server’a bağlanır (port 10051). İkisi de gerekiyorsa ikisini de açın.
Performans Tuning – Cachesize Değerleri Neden Önemli?
Compose dosyasında cache değerleri verdim ama neden önemli olduklarını anlatayım. Küçük ortamlarda fark etmez ama 200+ host izlemeye başlayınca Zabbix server “not enough free space in value cache” hataları vermeye başlar.
# Zabbix server loglarında cache doluluğunu takip edin
docker exec zabbix-server grep "cache" /var/log/zabbix/zabbix_server.log | tail -20
# Cache kullanımını internal check ile izleyin
# zabbix[wcache,values,pfree] - Value cache doluluk yüzdesi
# zabbix[rcache,buffer,pfree] - Configuration cache doluluk yüzdesi
Cache %75 üzerine çıkmaya başlarsa .env dosyasını güncelleyip docker compose up -d yapın, container restart oluyor ve yeni değerler alınıyor. Downtime minimal.
TimescaleDB ile History Yönetimi (Opsiyonel ama Önerilir)
Büyük ortamlarda PostgreSQL’in history tablosunda partitioning yapmak şart. TimescaleDB bunu otomatize ediyor. Eğer başlangıçtan itibaren kullanmak isterseniz PostgreSQL image’ını değiştirin:
zabbix-postgres:
image: timescale/timescaledb:latest-pg15
container_name: zabbix-postgres
environment:
POSTGRES_USER: zabbix
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: zabbixdb
TS_TUNE_MAX_BG_WORKERS: 8
Sonra Zabbix veritabanı şeması oluşturulduktan sonra TimescaleDB extension’ını aktif edin:
docker exec -it zabbix-postgres psql -U zabbix -d zabbixdb -c "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;"
# Zabbix'in TimescaleDB migration scriptini çalıştırın
docker exec zabbix-server zabbix_server -R config_cache_reload
Frontend’de Administration > General > Database kısmında “TimescaleDB” yazıyorsa başarılı demektir.
Stack Yönetimi ve Güncelleme
Günlük operasyonda kullanacağınız komutlar:
# Stack'i durdur
docker compose down
# Sadece bir servisi yeniden başlat
docker compose restart zabbix-server
# Logları belirli bir süreden itibaren görüntüle
docker compose logs --since="1h" zabbix-server
# Image güncelleme (önce test ortamında deneyin!)
docker compose pull
docker compose up -d
# Veritabanı yedeği
docker exec zabbix-postgres pg_dump -U zabbix zabbixdb | gzip > /backup/zabbix-$(date +%Y%m%d).sql.gz
# Disk kullanımını kontrol et
docker system df
docker volume ls
Otomatik Yedekleme Script’i
Bunu cron’a eklemeden ortamı bırakmıyorum:
cat > /opt/zabbix/backup.sh << 'SCRIPT'
#!/bin/bash
BACKUP_DIR="/backup/zabbix"
DATE=$(date +%Y%m%d_%H%M)
RETENTION_DAYS=7
mkdir -p $BACKUP_DIR
# Veritabanı yedeği
docker exec zabbix-postgres pg_dump -U zabbix zabbixdb |
gzip > "$BACKUP_DIR/zabbixdb_$DATE.sql.gz"
# Compose dosyası ve env yedeği (env icindeki sifreye dikkat)
cp /opt/zabbix/docker-compose.yml "$BACKUP_DIR/compose_$DATE.yml"
# Eski yedekleri temizle
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "Yedek tamamlandi: $BACKUP_DIR/zabbixdb_$DATE.sql.gz"
SCRIPT
chmod +x /opt/zabbix/backup.sh
# Cron'a ekle - her gece 02:00'de
(crontab -l 2>/dev/null; echo "0 2 * * * /opt/zabbix/backup.sh >> /var/log/zabbix-backup.log 2>&1") | crontab -
Sık Karşılaşılan Sorunlar
Problem: Frontend “Cannot connect to the database” hatası veriyor ama PostgreSQL ayakta.
Bunun sebebi genellikle container başlangıç sırası. depends_on ile healthcheck kombinasyonu çözüyor, compose dosyasında zaten var. Ama bazen ilk kurulumda PostgreSQL şema oluşturma uzun sürebilir. docker compose logs zabbix-server içinde “waiting for database” görüyorsanız bekleyin, 5 dakikaya kadar sürebilir.
Problem: Zabbix agent “active checks are not allowed” hatası.
ZBX_PASSIVE_ALLOW: "true" ve ZBX_ACTIVESERVERS değerlerini kontrol edin. Agent container’ının Zabbix server container adını DNS olarak çözebildiğinden emin olun. Aynı network’te olmaları gerekiyor.
Problem: Grafikler boş, veri gelmiyor.
Host eklendi ama template atanmadıysa veri toplanamaz. Configuration > Hosts > ilgili host > Templates sekmesinden “Linux by Zabbix agent” template’ini atayın. Sonra veri görünmesi 1-2 polling cycle bekliyor.
Sonuç
Docker ile Zabbix kurulumu gerçekten bu kadar. Kırk dakikada dashboard açık, bir saat sonra ilk hostlarınız izleniyor. Klasik kuruluma göre bakım da kolaylaşıyor: güncelleme, yedekleme ve taşıma işlemleri çok daha az sürtüşmeyle halloluyor.
Önemli olan nokta şu: Bu kurulumu doğrudan üretime almadan önce bir test ortamında bir hafta çalıştırın. Disk büyümesini, bellek kullanımını ve cache değerlerini gözlemleyin. 100 host izleyecekseniz bu parametreler yeterli, 500+ host için Zabbix Proxy mimarisine geçmeyi düşünmeye başlamanız gerekiyor, o da ayrı bir yazı konusu.
Sorularınızı yorumlarda beklerim, özellikle TimescaleDB migration ve Zabbix Proxy konfigürasyonu hakkında çok soru geliyor, sıradaki yazılarda ele alacağım.
