Mail sunucunuzdaki e-postalar, organizasyonunuzun en kritik verilerinden biridir. Dovecot ile çalışan bir mail altyapısında replikasyon ve yedekleme konularını ihmal etmek, bir gün gelip ciddi veri kaybıyla yüzleşmek anlamına gelebilir. Bu yazıda Dovecot’un yerleşik replikasyon mekanizmasını, pratik yedekleme stratejilerini ve gerçek dünya senaryolarında karşılaşılan sorunları ele alacağız.
Dovecot Replikasyonu Nedir ve Neden Önemlidir?
Dovecot, 2.x serisinden itibaren dsync adı verilen yerleşik bir senkronizasyon aracıyla birlikte gelir. Bu araç sayesinde iki Dovecot sunucusu arasında mail verilerini gerçek zamanlı veya periyodik olarak senkronize edebilirsiniz. Tek sunuculu bir kurulumda disk arızası, donanım problemi veya işletim sistemi çökmesi yaşandığında tüm mail verilerini kaybedebilirsiniz. Replikasyon ise bu riski ortadan kaldırarak ikinci bir sunucuda güncel kopyanızı hazır tutar.
Replikasyon ile klasik yedeklemeyi birbirine karıştırmamak gerekir. Replikasyon, canlı bir kopya sağlar ve failover senaryolarında devreye girer. Yedekleme ise belirli bir zaman noktasına geri dönme imkanı sunar. İkisi birbirini tamamlar, birinin yerini tutmaz.
Dovecot Replikasyon Mimarisi
Dovecot replikasyonu master-master modelde çalışır. Yani her iki sunucu da aktif olarak mail alıp gönderebilir ve değişiklikler karşılıklı olarak senkronize edilir. Bu yapı şu bileşenlerden oluşur:
- replication plugin: Değişiklikleri takip eden çekirdek bileşen
- dsync: Senkronizasyonu gerçekleştiren komut satırı aracı
- doveadm: Dovecot yönetim aracı, replikasyon komutlarını çalıştırır
- replicator process: Arka planda çalışarak kuyruktaki replikasyon işlerini yönetir
Tipik bir senaryo şöyle işler: Kullanıcı mail1.example.com’a bağlanır ve bir e-posta okur. Bu değişiklik (mesajın okundu işaretlenmesi) replication plugin tarafından yakalanır ve kısa süre içinde mail2.example.com’a iletilir.
Replikasyon Kurulumu: Adım Adım
Ön Hazırlık
İki sunucunuz olduğunu varsayalım:
- mail1.example.com (192.168.1.10)
- mail2.example.com (192.168.1.11)
Her iki sunucuda da Dovecot kurulu ve çalışıyor olmalıdır. Önce SSH key tabanlı iletişim kuruyoruz çünkü dsync, sunucular arasında SSH tüneli kullanır.
# mail1 üzerinde dovecot kullanıcısı için SSH key oluştur
sudo -u dovecot ssh-keygen -t ed25519 -f /var/lib/dovecot/.ssh/id_ed25519 -N ""
# Public key'i mail2'ye kopyala
sudo -u dovecot ssh-copy-id -i /var/lib/dovecot/.ssh/id_ed25519.pub [email protected]
# Bağlantıyı test et
sudo -u dovecot ssh [email protected] echo "Baglanti basarili"
Dovecot Konfigürasyonu
Her iki sunucuda /etc/dovecot/conf.d/90-replication.conf dosyasını oluşturuyoruz:
# /etc/dovecot/conf.d/90-replication.conf
# Her iki sunucuda da ayni konfigurasyonu kullaniyoruz
mail_plugins = $mail_plugins notify replication
service replicator {
process_min_avail = 1
unix_listener replicator-doveadm {
mode = 0600
user = dovecot
}
}
service doveadm {
inet_listener {
port = 12345
}
}
plugin {
mail_replica = remote:[email protected] # mail1 icin
# mail1 icin mail2'nin adresini, mail2 icin mail1'in adresini yaz
replication_sync_timeout = 2
replication_full_sync_interval = 1 day
}
doveadm_password = gizli_sifreniz_buraya
Not: mail2.example.com üzerinde mail_replica satırını remote:[email protected] olarak değiştirmeyi unutmayın.
Replikasyonu Aktifleştirme
# Konfigurasyonu dogrula
dovecot -n | grep -i replic
# Dovecot'u yeniden baslat
systemctl restart dovecot
# Replicator servisinin calistigini kontrol et
doveadm replicator status
# Belirli bir kullanicinin replikasyon durumunu goster
doveadm replicator status [email protected]
İlk Tam Senkronizasyon
Replikasyonu kurduğunuzda mevcut verilerin senkronize edilmesi için bir kez tam sync çalıştırmanız gerekir:
# Tum kullanicilari senkronize et (mail1 uzerinde calistir)
doveadm replicator replicate -p high '*'
# Sadece belirli bir kullaniciyi senkronize et
doveadm replicator replicate -p high [email protected]
# Sync durumunu takip et
watch -n 5 'doveadm replicator status'
dsync ile Manuel Senkronizasyon
Bazen replikasyon mekanizması dışında manuel müdahale etmeniz gerekebilir. Disk değiştirme sonrası, büyük veri göçleri veya replikasyonun bir süre durduğu durumlarda dsync’i doğrudan kullanırsınız.
# Tek kullanicinin mailbox'ini remote sunucuyla senkronize et
doveadm sync -u [email protected] -d ssh [email protected] dsync-server
# Tum kullanicilari senkronize et (dikkatli kullanin, agir islem)
for user in $(doveadm user '*'); do
echo "Syncing: $user"
doveadm sync -u "$user" -d ssh [email protected] dsync-server
sleep 1
done
# Sadece belirli bir klasoru senkronize et
doveadm sync -u [email protected] -d ssh [email protected] dsync-server INBOX
Uyarı: -d (delete) parametresi silinmiş mesajları karşı tarafta da siler. Eğer yedekten geri yükleme yapıyorsanız bu parametreyi dikkatli kullanın.
Pratik Yedekleme Stratejileri
Replikasyon tek başına yeterli değildir. Kullanıcı yanlışlıkla önemli bir e-postayı silerse replikasyon bu silme işlemini de karşı tarafa yansıtır. Bu yüzden geleneksel yedeklemeye ihtiyaç duyarsınız.
Maildir Formatında Dosya Sistemi Yedeklemesi
Dovecot Maildir formatı kullanıyorsa her kullanıcının maili ayrı bir dizinde durur, bu da yedeklemeyi oldukça kolaylaştırır.
#!/bin/bash
# /usr/local/bin/dovecot-backup.sh
BACKUP_DIR="/backup/dovecot"
MAIL_DIR="/var/mail/vhosts"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30
LOG_FILE="/var/log/dovecot-backup.log"
echo "[$DATE] Yedekleme basliyor..." >> "$LOG_FILE"
# Incremental yedek al (rsync ile)
rsync -avz --delete
--link-dest="$BACKUP_DIR/latest"
--exclude="*.lock"
--exclude="dovecot.index.log*"
"$MAIL_DIR/"
"$BACKUP_DIR/$DATE/" >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
# Latest symlink'i guncelle
rm -f "$BACKUP_DIR/latest"
ln -s "$BACKUP_DIR/$DATE" "$BACKUP_DIR/latest"
echo "[$DATE] Yedekleme basarili." >> "$LOG_FILE"
else
echo "[$DATE] HATA: Yedekleme basarisiz!" >> "$LOG_FILE"
# Uyari e-postasi gonder
echo "Dovecot yedekleme basarisiz: $DATE" | mail -s "ALARM: Mail Yedek Hatasi" [email protected]
fi
# Eski yedekleri temizle
find "$BACKUP_DIR" -maxdepth 1 -type d -mtime +$RETENTION_DAYS -exec rm -rf {} ;
echo "[$DATE] Yedekleme tamamlandi." >> "$LOG_FILE"
Bu scripti cron’a ekleyin:
# crontab -e
# Her gece 02:00'de calistir
0 2 * * * /usr/local/bin/dovecot-backup.sh
doveadm backup Komutu ile Yedekleme
Dovecot’un kendi araçlarını kullanarak daha tutarlı bir yedek almak da mümkündür:
# Belirli bir kullanicinin mailbox'ini yerel dizine yedekle
doveadm backup -u [email protected] sdbox:/backup/users/[email protected]
# Tum kullanicilari yedekle
for user in $(doveadm user '*'); do
SAFE_USER=$(echo "$user" | tr '@' '_')
doveadm backup -u "$user" sdbox:/backup/users/"$SAFE_USER"
echo "Yedeklendi: $user"
done
mbox Formatı için Özel Dikkat
Eğer eski mbox formatı kullanıyorsanız, yedekleme sırasında dosya tutarlılığı için Dovecot’u kısa süreliğine durdurmanız veya fsfreeze kullanmanız önerilir:
# LVM snapshot ile tutarli yedek (production icin onerilen)
lvcreate -L5G -s -n mail_snapshot /dev/vg0/mail_lv
# Snapshot'i mount et ve yedekle
mkdir -p /mnt/mail_snapshot
mount /dev/vg0/mail_snapshot /mnt/mail_snapshot -o ro
rsync -avz /mnt/mail_snapshot/ /backup/dovecot/$(date +%Y%m%d)/
# Snapshot'i temizle
umount /mnt/mail_snapshot
lvremove -f /dev/vg0/mail_snapshot
Geri Yükleme Senaryoları
Yedek almak kadar önemli olan şey, o yedeği doğru şekilde geri yükleyebilmektir. Birkaç gerçek dünya senaryosuna bakalım.
Senaryo 1: Kullanıcı Yanlışlıkla Mailbox’ı Sildi
Bu en sık karşılaşılan durumlardan biridir. Kullanıcı “Tüm Postaları Sil” veya benzeri bir işlem yaptı ve önemli e-postalar gitti.
# 1. Adim: Hangi yedegin kullanilacagina karar ver
ls -la /backup/dovecot/ | tail -10
# 2. Adim: Yedekten ilgili kullanicinin verilerini geri yukle
# Once mevcut durumu farkli bir konuma tasi
mv /var/mail/vhosts/example.com/username
/var/mail/vhosts/example.com/username.broken.$(date +%Y%m%d)
# 3. Adim: Yedekten geri yukle
rsync -avz /backup/dovecot/20241215_020000/example.com/username/
/var/mail/vhosts/example.com/username/
# 4. Adim: Izinleri duzelt
chown -R vmail:vmail /var/mail/vhosts/example.com/username/
# 5. Adim: Dovecot index'lerini yeniden olustur
doveadm force-resync -u [email protected] '*'
Senaryo 2: Sunucu Tamamen Çöktü, Yeni Sunucuya Geçiş
# Yeni sunucuda Dovecot kurulduktan sonra
# Yedek sunucudan (veya backup storage'dan) veri aktar
rsync -avz --progress
backup-storage:/backup/dovecot/latest/
/var/mail/vhosts/
# Tum kullanicilar icin izinleri duzelt
chown -R vmail:vmail /var/mail/vhosts/
find /var/mail/vhosts -type d -exec chmod 700 {} ;
find /var/mail/vhosts -type f -exec chmod 600 {} ;
# Index'leri yeniden olustur (buyuk mailbox'lar icin zaman alabilir)
doveadm force-resync -A '*'
# Dovecot'u baslat ve test et
systemctl start dovecot
doveadm mailbox list -u [email protected]
Replikasyon İzleme ve Sorun Giderme
Replikasyonun düzgün çalışıp çalışmadığını düzenli olarak kontrol etmeniz gerekir. Sessiz sedasız çalışan ama aslında hiçbir şey senkronize etmeyen bir replikasyon, sizi asıl kritik anda mahveder.
#!/bin/bash
# /usr/local/bin/check-replication.sh
# Bu scripti cron ile saatlik calistirin
ALERT_EMAIL="[email protected]"
MAX_LAG=3600 # 1 saat maksimum gecikme
# Replikasyon durumunu al
REPL_STATUS=$(doveadm replicator status 2>&1)
# Fail durumundaki kullanici sayisini bul
FAIL_COUNT=$(echo "$REPL_STATUS" | grep -c "fail")
if [ "$FAIL_COUNT" -gt 0 ]; then
echo "UYARI: $FAIL_COUNT kullanici icin replikasyon basarisiz!" |
mail -s "Dovecot Replikasyon Alarmı" "$ALERT_EMAIL"
fi
# Replicator process calisyor mu kontrol et
if ! doveadm replicator status > /dev/null 2>&1; then
echo "KRITIK: Replicator servisi cevap vermiyor!" |
mail -s "Dovecot Replicator DOWN" "$ALERT_EMAIL"
fi
echo "Replikasyon kontrolu tamamlandi: $(date)"
Sık Karşılaşılan Replikasyon Sorunları
SSH bağlantı hataları: Dovecot servis kullanıcısının home dizinindeki .ssh klasörü izinleri yanlış olduğunda replikasyon sessizce durabilir.
# Izinleri kontrol et ve duzelt
ls -la /var/lib/dovecot/.ssh/
chmod 700 /var/lib/dovecot/.ssh/
chmod 600 /var/lib/dovecot/.ssh/id_ed25519
chmod 644 /var/lib/dovecot/.ssh/id_ed25519.pub
chmod 600 /var/lib/dovecot/.ssh/authorized_keys
# Manuel baglanti testi
sudo -u dovecot ssh -i /var/lib/dovecot/.ssh/id_ed25519 [email protected]
"doveadm --version"
GUID çakışmaları: İki sunucuda aynı anda yapılan değişiklikler çakışma yaratabilir. Dovecot bunu genellikle otomatik çözer ama bazen manuel müdahale gerekir:
# Replikasyon hatalarini logdan incele
grep "replication" /var/log/mail.log | grep -i error | tail -20
# Sorunlu kullanicinin replikasyonunu sifirla ve yeniden baslat
doveadm replicator remove [email protected]
doveadm replicator add [email protected]
doveadm replicator replicate -p high [email protected]
Yedekleme Doğrulama
Aldığınız yedeklerin gerçekten işe yaradığını test etmeden, yedek almamakla aynı şeydir. Bunu düzenli aralıklarla yapmak iyi bir alışkanlıktır.
#!/bin/bash
# /usr/local/bin/verify-backup.sh
# Ayda bir calistirin
BACKUP_DIR="/backup/dovecot/latest"
TEST_USER="[email protected]"
VERIFY_DIR="/tmp/backup-verify-$$"
echo "Yedek dogrulama basliyor: $(date)"
# Yedek dizini var mi?
if [ ! -d "$BACKUP_DIR" ]; then
echo "HATA: Yedek dizini bulunamadi: $BACKUP_DIR"
exit 1
fi
# Yedek ne kadar eski?
BACKUP_AGE=$(find "$BACKUP_DIR" -maxdepth 0 -mtime +1)
if [ -n "$BACKUP_AGE" ]; then
echo "UYARI: Yedek 24 saatten eski!"
fi
# Test kullanicisini geri yukle ve kontrol et
mkdir -p "$VERIFY_DIR"
rsync -az "$BACKUP_DIR/example.com/$TEST_USER/" "$VERIFY_DIR/"
# Dosya sayisini kontrol et
FILE_COUNT=$(find "$VERIFY_DIR" -type f | wc -l)
if [ "$FILE_COUNT" -lt 1 ]; then
echo "HATA: Yedekte hic dosya yok!"
exit 1
fi
echo "Dogrulama basarili: $FILE_COUNT dosya kontrol edildi"
rm -rf "$VERIFY_DIR"
Uzak Konuma Yedekleme (Offsite Backup)
Aynı veri merkezindeki yedekler, yangın veya büyük donanım arızası gibi senaryolarda işe yaramaz. Kritik mail verilerini uzak bir konuma da yedeklemeniz gerekir.
# Rclone ile bulut depolama alanina sifreli yedek
# Ornek: S3 uyumlu depolama
# Rclone konfigurasyonu (bir kez yapilir)
# rclone config -> s3 backend kurulumu
# Gunluk artimsal yedek
rclone sync /backup/dovecot/latest
s3:my-company-backups/dovecot/
--transfers 4
--checksum
--log-file /var/log/rclone-dovecot.log
# Ya da restic ile deduplicated, sifrelenmis yedek
export RESTIC_REPOSITORY="s3:s3.amazonaws.com/my-backups/dovecot"
export RESTIC_PASSWORD="guclu_bir_sifre"
restic backup /var/mail/vhosts/
--exclude="*.lock"
--exclude="*.log"
--tag dovecot
--verbose
# Eski snapshot'lari temizle (son 30 gunu tut)
restic forget --keep-daily 30 --prune
Replikasyon ile Yüksek Erişilebilirlik
Replikasyonu gerçek anlamda yüksek erişilebilirlik (HA) için kullanmak istiyorsanız, önüne bir load balancer koymanız ve her iki sunucunun da aktif olarak çalışması gerekir. Bu senaryoda HAProxy ile basit bir mail yük dengeleme yapısı kurmak mantıklıdır.
Dikkat edilmesi gereken kritik nokta şudur: IMAP oturumları durumsal (stateful) olduğu için aynı kullanıcının her zaman aynı sunucuya yönlendirilmesi, yani sticky session kullanılması gerekir. Aksi takdirde bir kullanıcı bir sunucuda klasör oluşturur, diğer sunucuya bağlandığında göremez ve bu durum replikasyon gecikmesi sırasında tutarsızlık yaratır.
Sonuç
Dovecot replikasyonu ve yedeklemesi, kurulumu bir kez yapıp bırakacağınız bir şey değildir. Düzenli olarak replikasyon durumunu izlemek, yedeklerin alındığını doğrulamak ve zaman zaman geri yükleme testleri yapmak, gerçek bir olayda sakin kalmanızı sağlar.
Özetleyecek olursak:
- Replikasyon size yüksek erişilebilirlik ve anlık failover sağlar, dsync ile master-master modelde kurulur
- Dosya sistemi yedeklemesi (rsync/LVM snapshot) günlük operasyonlar için temel ihtiyacı karşılar
- doveadm backup Dovecot’a özgü tutarlı yedekler için tercih edilebilir
- Offsite yedekleme (restic, rclone) felaket kurtarma için zorunludur
- İzleme scriptleri replikasyonun sessizce durmasını engeller
- Geri yükleme testleri olmadan yedekleme sistemine güvenemezsiniz
Mail verilerini kaybetmek, kullanıcıların güvenini sarsmak ve ciddi iş kayıplarına yol açmak demektir. Bu rehberdeki adımları uygulayarak Dovecot altyapınızı hem anlık arızalara hem de felaket senaryolarına karşı hazırlıklı hale getirebilirsiniz.