Mail sunucularında ne olup bittiğini bilmek, sorunları önceden yakalamak ve kapasite planlaması yapabilmek için metrik izleme vazgeçilmez bir ihtiyaç. Dovecot, uzun süredir production ortamlarında güvenilir şekilde çalışan bir IMAP/POP3 sunucusu olsa da varsayılan kurulumda metrik görünürlüğü oldukça sınırlı. Bu yazıda Dovecot’u Prometheus ile entegre ederek mail sunucunuzu gerçek anlamda izlenebilir hale getireceğiz.
Neden Prometheus ile Dovecot İzleme?
Klasik log analizi reactive bir yaklaşım. Bir şeyler patladıktan sonra log dosyalarına bakıyorsunuz. Prometheus ise size proactive bir izleme imkanı tanıyor. Bağlantı sayıları anormal yükseliyor mu? Kimlik doğrulama hataları artıyor mu? Belirli bir kullanıcı sunucuyu kasıyor mu? Bunları gerçek zamanlı görmek, uyarı almak ve Grafana ile görselleştirmek mail yönetimini bambaşka bir seviyeye taşıyor.
Dovecot’un built-in statistics sistemi oldukça güçlü. dovecot_exporter ya da Dovecot’un kendi HTTP stats endpoint’i üzerinden bu verileri Prometheus’a taşımak mümkün. Her iki yaklaşımı da ele alacağız.
Ön Gereksinimler
Başlamadan önce ortamınızın hazır olduğundan emin olun:
- Dovecot 2.3.x veya üzeri (tercihen 2.3.14+)
- Prometheus 2.x
- Linux sunucu (Debian/Ubuntu veya RHEL/CentOS)
- Temel Dovecot yapılandırması çalışır durumda
Dovecot sürümünüzü kontrol etmek için:
dovecot --version
# Çıktı örneği: 2.3.21 (9b044b2f8)
# Servis durumunu da kontrol edelim
systemctl status dovecot
doveadm stats dump
doveadm stats dump komutu boş veya hatalı çıktı veriyorsa stats modülü aktif değil demektir. Bunu düzelteceğiz.
Dovecot Stats Modülünü Aktifleştirme
Dovecot 2.3 ile birlikte gelen stats modülü, mail sunucusunun iç durumunu ayrıntılı şekilde ortaya koyuyor. Bu modülü yapılandırmak için önce ilgili konfigürasyon dosyasını oluşturun.
# Stats konfigürasyon dosyasını oluşturun
cat > /etc/dovecot/conf.d/10-stats.conf << 'EOF'
service stats {
net_listener http-stats {
port = 9900
inet_listener http {
port = 9900
}
}
}
metric auth_successes {
event_name = auth_request_finished
filter {
success = yes
}
}
metric auth_failures {
event_name = auth_request_finished
filter {
success = no
}
}
metric imap_commands {
event_name = imap_command_finished
group_by = cmd_name tagged_reply_state
}
metric imap_connections {
event_name = imap_connected
}
metric mail_deliveries {
event_name = mail_delivery_finished
}
metric lmtp_commands {
event_name = lmtp_command_finished
group_by = cmd_name tagged_reply_state
}
EOF
Dovecot’u yeniden başlatmadan önce konfigürasyonu doğrulayın:
doveconf -n 2>&1 | grep -i stats
dovecot -n | grep stats
# Syntax kontrolü
dovecot --config-file=/etc/dovecot/dovecot.conf -n
Konfigürasyon geçerliyse servisi yeniden başlatın:
systemctl restart dovecot
systemctl status dovecot
# HTTP endpoint'in ayakta olup olmadığını kontrol edin
curl -s http://localhost:9900/metrics | head -50
Eğer endpoint çalışıyorsa Prometheus formatında metrikler görmeye başlarsınız.
Dovecot Exporter ile Gelişmiş Metrik Toplama
Dovecot’un yerleşik HTTP endpoint’i temel metrikleri sağlıyor ancak dovecot_exporter daha zengin ve Prometheus ekosistemine daha iyi entegre metrikler sunuyor. Bu exporter’ı Dovecot’un Unix socket’i üzerinden iletişim kurarak çalışıyor.
# Go ortamı yoksa önce kurun
apt install golang-go -y # Debian/Ubuntu
# veya
yum install golang -y # RHEL/CentOS
# Exporter'ı kaynak koddan derleyin
cd /opt
git clone https://github.com/dovecot/dovecot_exporter.git
cd dovecot_exporter
go build -o dovecot_exporter .
# Binary'yi uygun yere taşıyın
cp dovecot_exporter /usr/local/bin/
chmod +x /usr/local/bin/dovecot_exporter
# Test çalıştırması
/usr/local/bin/dovecot_exporter --help
Alternatif olarak önceden derlenmiş binary’yi kullanabilirsiniz:
# GitHub releases sayfasından binary indirin
EXPORTER_VERSION="0.1.4"
wget https://github.com/dovecot/dovecot_exporter/releases/download/v${EXPORTER_VERSION}/dovecot_exporter_linux_amd64
mv dovecot_exporter_linux_amd64 /usr/local/bin/dovecot_exporter
chmod +x /usr/local/bin/dovecot_exporter
Exporter’ı systemd servisi olarak kaydedin:
cat > /etc/systemd/system/dovecot-exporter.service << 'EOF'
[Unit]
Description=Dovecot Prometheus Exporter
After=network.target dovecot.service
Requires=dovecot.service
[Service]
Type=simple
User=nobody
Group=nogroup
ExecStart=/usr/local/bin/dovecot_exporter
--dovecot.socket-path=/var/run/dovecot/stats-writer
--web.listen-address=:9166
--web.telemetry-path=/metrics
Restart=on-failure
RestartSec=5s
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now dovecot-exporter
systemctl status dovecot-exporter
Dovecot Unix Socket İzinlerini Ayarlama
Exporter’ın Dovecot stats socket’ine erişebilmesi için socket izinlerini doğru ayarlamak şart:
# Mevcut socket durumunu kontrol edin
ls -la /var/run/dovecot/
stat /var/run/dovecot/stats-writer
# Dovecot konfigürasyonunda socket izinlerini ayarlayın
cat >> /etc/dovecot/conf.d/10-stats.conf << 'EOF'
service stats {
unix_listener stats-reader {
user = nobody
group = nogroup
mode = 0660
}
unix_listener stats-writer {
user = nobody
group = nogroup
mode = 0660
}
}
EOF
systemctl restart dovecot
# Socket'e erişimi test edin
sudo -u nobody doveadm stats dump
Prometheus Konfigürasyonu
Prometheus’un Dovecot metriklerini toplaması için scrape konfigürasyonunu ekleyin:
# /etc/prometheus/prometheus.yml dosyasına ekleyin
scrape_configs:
# Mevcut konfigürasyonlarınızın altına ekleyin
- job_name: 'dovecot'
static_configs:
- targets: ['localhost:9166']
scrape_interval: 30s
scrape_timeout: 10s
relabel_configs:
- source_labels: [__address__]
target_label: instance
replacement: 'mail-server-01'
metric_relabel_configs:
- source_labels: [__name__]
regex: 'dovecot_(auth|imap|lmtp|mail).*'
action: keep
# Dovecot'un yerleşik HTTP stats endpoint'i için (opsiyonel)
- job_name: 'dovecot-native'
static_configs:
- targets: ['localhost:9900']
scrape_interval: 60s
metrics_path: /metrics
Prometheus’u yeniden yükleyin ve hedefleri kontrol edin:
# Konfigürasyonu doğrulayın
promtool check config /etc/prometheus/prometheus.yml
# Prometheus'u yeniden yükleyin (restart gerekmez)
systemctl reload prometheus
# veya
curl -X POST http://localhost:9090/-/reload
# Hedeflerin aktif olduğunu kontrol edin
curl -s http://localhost:9090/api/v1/targets | python3 -m json.tool | grep -A5 dovecot
Temel Prometheus Sorguları (PromQL)
Dovecot metriklerini anlamlı şekilde sorgulamak için bazı temel PromQL örnekleri:
# Aktif IMAP bağlantı sayısı
dovecot_imap_connections_total
# Son 5 dakikadaki kimlik doğrulama başarı oranı
rate(dovecot_auth_successes_total[5m])
# Kimlik doğrulama başarısızlık oranı (dakika başına)
rate(dovecot_auth_failures_total[5m]) * 60
# Toplam kimlik doğrulama başarı oranı (%)
(
rate(dovecot_auth_successes_total[5m])
/
(rate(dovecot_auth_successes_total[5m]) + rate(dovecot_auth_failures_total[5m]))
) * 100
# IMAP komut latency (95. persentil)
histogram_quantile(0.95, rate(dovecot_imap_command_duration_seconds_bucket[5m]))
# Kullanıcı başına bağlantı sayısı (eğer user label varsa)
topk(10, dovecot_imap_connections_total by (user))
Alertmanager ile Uyarı Kuralları
Production ortamında sadece metrik toplamak yeterli değil. Kritik durumlar için uyarı kuralları tanımlamak gerekiyor:
# Dovecot uyarı kuralları dosyası oluşturun
cat > /etc/prometheus/rules/dovecot-alerts.yml << 'EOF'
groups:
- name: dovecot_alerts
interval: 30s
rules:
# Yüksek kimlik doğrulama başarısızlık oranı
- alert: DovecotHighAuthFailureRate
expr: |
rate(dovecot_auth_failures_total[5m]) > 10
for: 2m
labels:
severity: warning
service: dovecot
annotations:
summary: "Dovecot yüksek auth hatası"
description: "Dakikada {{ $value | humanize }} auth hatası var. Brute force saldırısı olabilir."
# Dovecot servisi down
- alert: DovecotDown
expr: up{job="dovecot"} == 0
for: 1m
labels:
severity: critical
service: dovecot
annotations:
summary: "Dovecot servisi erişilemiyor"
description: "Dovecot exporter {{ $labels.instance }} hedefine ulaşılamıyor."
# Çok yüksek bağlantı sayısı
- alert: DovecotTooManyConnections
expr: |
dovecot_imap_connections_total > 500
for: 5m
labels:
severity: warning
service: dovecot
annotations:
summary: "Dovecot aşırı bağlantı yükü"
description: "Aktif IMAP bağlantı sayısı {{ $value }}'ye ulaştı."
# Auth başarı oranı düşük
- alert: DovecotLowAuthSuccessRate
expr: |
(
rate(dovecot_auth_successes_total[10m])
/
(rate(dovecot_auth_successes_total[10m]) + rate(dovecot_auth_failures_total[10m]))
) < 0.7
for: 5m
labels:
severity: critical
service: dovecot
annotations:
summary: "Dovecot auth başarı oranı kritik seviyede"
description: "Auth başarı oranı %{{ $value | humanizePercentage }}'ye düştü."
EOF
Uyarı kuralını Prometheus’a dahil edin:
# prometheus.yml dosyasına rule_files ekleyin
# rule_files:
# - "rules/*.yml"
# Kural dosyasını doğrulayın
promtool check rules /etc/prometheus/rules/dovecot-alerts.yml
# Prometheus'u yeniden yükleyin
systemctl reload prometheus
Grafana Dashboard Hazırlama
Prometheus verilerini görselleştirmek için Grafana’ya bağlanın ve bir dashboard oluşturun. Dovecot için temel panel sorgularını aşağıda bulabilirsiniz.
Grafana’da yeni dashboard oluştururken şu panelleri ekleyin:
- Auth Başarı/Başarısızlık Oranı:
rate(dovecot_auth_successes_total[5m])verate(dovecot_auth_failures_total[5m])karşılaştırması - Aktif IMAP Bağlantıları:
dovecot_imap_connections_totalzaman serisi - IMAP Komut Latency: Histogram quantile sorgusu
- Mail Teslimat Hızı:
rate(dovecot_mail_deliveries_total[5m])
Grafana Dovecot dashboard’unu JSON olarak import etmek için Grafana Marketplace’de “Dovecot” araması yapabilir, hazır dashboard template’lerinden yararlanabilirsiniz (Dashboard ID: 7961 iyi bir başlangıç noktası).
Gerçek Dünya Senaryosu: Brute Force Tespiti
Production ortamında karşılaşılan en yaygın sorunlardan biri IMAP brute force saldırıları. Prometheus metrikleri ile bunu gerçek zamanlı tespit edebilirsiniz.
# Gerçek zamanlı auth hata oranını izleyin
watch -n 5 'curl -s http://localhost:9166/metrics | grep auth_failures'
# Yüksek hata üreten IP'leri Dovecot loglarından çekin
tail -f /var/log/dovecot.log | grep "auth failed" |
awk '{print $NF}' | sort | uniq -c | sort -rn | head -20
# Fail2ban ile entegrasyon - Prometheus alert geldiğinde Fail2ban'ı tetikleyin
# /etc/fail2ban/filter.d/dovecot-auth.conf dosyasına bakın
fail2ban-client status dovecot
Prometheus uyarısı geldiğinde çalışacak bir script yazabilirsiniz:
#!/bin/bash
# /usr/local/bin/dovecot-auth-check.sh
THRESHOLD=20
CURRENT_RATE=$(curl -s http://localhost:9166/metrics |
grep 'dovecot_auth_failures_total' |
awk '{print $2}')
LOG_FILE="/var/log/dovecot-monitor.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "${TIMESTAMP} - Auth failure total: ${CURRENT_RATE}" >> ${LOG_FILE}
# Dovecot stats özeti
doveadm stats dump global | while read line; do
echo "${TIMESTAMP} - STATS: ${line}" >> ${LOG_FILE}
done
# Aktif bağlantıları listele
doveadm who | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn >> ${LOG_FILE}
Dovecot Director ve Cluster İzleme
Birden fazla backend sunucusu olan Dovecot Director kurulumlarında her backend’i ayrı ayrı izlemek gerekiyor:
# Çoklu backend için prometheus.yml konfigürasyonu
scrape_configs:
- job_name: 'dovecot-backends'
static_configs:
- targets:
- 'backend-01.example.com:9166'
- 'backend-02.example.com:9166'
- 'backend-03.example.com:9166'
relabel_configs:
- source_labels: [__address__]
regex: '([^:]+):.*'
target_label: hostname
replacement: '$1'
Backend’ler arası yük dengesini kontrol etmek için:
# Backend başına bağlantı dağılımı
sum by (hostname) (dovecot_imap_connections_total)
# En yüklü backend
topk(1, sum by (hostname) (dovecot_imap_connections_total))
# Backend başına auth hata oranı
sum by (hostname) (rate(dovecot_auth_failures_total[5m]))
Sorun Giderme
Exporter’ın metrik üretmediği durumda şu adımları izleyin:
# Exporter loglarını kontrol edin
journalctl -u dovecot-exporter -n 50 --no-pager
# Manuel test
curl -v http://localhost:9166/metrics 2>&1 | head -30
# Dovecot stats socket'inin varlığını kontrol edin
ls -la /var/run/dovecot/stats*
# Socket izinlerini test edin
sudo -u nobody nc -U /var/run/dovecot/stats-writer << 'EOF'
EXPORTtglobaln
EOF
# Dovecot event sistemi çalışıyor mu?
doveadm log reopen
doveadm stats reset
sleep 5
doveadm stats dump global
# Port çakışması var mı kontrol edin
ss -tlnp | grep -E '9166|9900'
netstat -tlnp | grep -E '9166|9900'
Yaygın hata ve çözümleri:
- “connection refused” hatası: Dovecot’un stats socket’i oluşturmadığını gösterir.
10-stats.confkonfigürasyonunu ve Dovecot log’larını kontrol edin. - “permission denied” hatası: Socket izinleri yanlış ayarlanmış.
stats-writersocket’ininnobodykullanıcısı tarafından okunabilir olduğundan emin olun. - Boş metrik listesi:
doveadm stats dumpkomutu ile stats modülünün aktif olduğunu doğrulayın. - Prometheus’ta “up” metriği 0: Exporter çalışıyor ama Prometheus’un ona ulaşamadığını gösterir. Firewall kurallarını ve port erişimini kontrol edin.
Kapasite Planlaması için Metrik Kullanımı
Uzun vadede toplanan Dovecot metrikleri kapasite planlaması için çok değerli. Prometheus’un uzun süreli veri saklama özelliği ile aylık trendleri analiz edebilirsiniz:
# Günlük ortalama bağlantı sayısı (son 30 gün)
avg_over_time(dovecot_imap_connections_total[30d])
# Haftalık auth işlem hacmi
increase(dovecot_auth_successes_total[7d])
# Büyüme oranı tahmini (linear regression)
predict_linear(dovecot_imap_connections_total[14d], 86400 * 30)
Bu sorgular sayesinde “önümüzdeki 30 günde bağlantı kapasitemiz dolacak mı?” sorusuna veri odaklı yanıt verebilirsiniz.
Sonuç
Dovecot ile Prometheus entegrasyonu, mail sunucunuzu reaktif yönetimden proaktif yönetime geçirmenin en etkili yolu. Bu yazıda ele aldığımız temel adımlar şunlardı:
- Dovecot stats modülünü aktifleştirme ve HTTP endpoint yapılandırması
dovecot_exporterkurulumu ve systemd entegrasyonu- Socket izinlerinin doğru ayarlanması
- Prometheus scrape konfigürasyonu
- Kritik uyarı kurallarının tanımlanması
- Brute force tespiti gibi gerçek dünya senaryolarının ele alınması
- Çoklu backend ortamlarında izleme
Production’a almadan önce bir test ortamında tüm bu adımları denemenizi, özellikle uyarı eşik değerlerini kendi trafik profilinize göre ayarlamanızı öneririm. Her mail sunucusu farklı yük altında çalışır; 10 auth hatası/dakika bir kurumsal sunucu için normal olabilirken küçük bir hosting ortamında alarm zili çalmalıdır. Metriklerinizi birkaç hafta izleyin, baseline değerleri belirleyin ve uyarı kurallarınızı buna göre fine-tune edin. İyi izlemeler!