Mail sunucunuzda binlerce e-posta biriktiğinde, kullanıcıların “o eki içeren maili bul” ya da “geçen ay gelen fatura neredeydi” gibi istekleri kaçınılmaz hale gelir. Standart IMAP arama, sadece başlık alanlarına (konu, gönderen, tarih) bakar ve büyük posta kutularında son derece yavaş çalışır. İşte bu noktada Dovecot’un Full Text Search (FTS) özelliği devreye girer. Bu yazıda, Dovecot üzerinde FTS yapılandırmasını sıfırdan nasıl kuracağınızı, Solr ve Xapian gibi backend seçeneklerini, performans tuning ipuçlarını ve gerçek dünya senaryolarını ele alacağız.
Full Text Search Neden Önemli?
Diyelim ki bir muhasebe departmanı var ve her çalışanın posta kutusunda 50.000 ile 100.000 arası e-posta bulunuyor. Thunderbird veya Outlook üzerinden “KDV faturası” diye arama yapıldığında, FTS olmadan Dovecot tüm mesajları tek tek tarayacak ve bu işlem dakikalarca sürebilir, sunucu I/O’sunu da yerle bir edecektir. FTS ile bu arama milisaniyeler içinde tamamlanır çünkü indeks önceden oluşturulmuştur.
Dovecot FTS iki ana yaklaşımla çalışır:
- fts_squat: Dovecot’un yerleşik, hafif FTS motoru. Küçük kurulumlar için yeterli ama büyük posta kutularında yetersiz kalır.
- fts_solr: Apache Solr tabanlı, enterprise seviyesi full text arama. Yüksek kullanıcı sayısı için tercih edilir.
- fts_xapian: Solr’a göre daha basit kurulum, tek sunucu senaryoları için idealdir. Dovecot 2.3+ ile birlikte gelir.
Bu yazıda hem Xapian hem de Solr kurulumunu ele alacağız, ancak ağırlığı Xapian üzerinde tutacağız çünkü çoğu orta ölçekli kurulum için gereksiz karmaşıklıktan kaçınmak mantıklıdır.
Ortam Bilgileri ve Ön Gereksinimler
Örneklerde kullandığımız ortam:
- Ubuntu 22.04 LTS
- Dovecot 2.3.x (paket yöneticisinden)
- Maildir formatı (mbox için ayarlar farklılaşır)
- Kullanıcı başına ortalama 20.000 – 80.000 e-posta
Başlamadan önce Dovecot versiyonunuzu kontrol edin:
dovecot --version
doveconf -n | grep mail_location
mail_location satırının maildir: ile başladığından emin olun. Ayrıca mevcut Dovecot eklentilerini listeleyin:
dovecot --build-options | grep -i fts
Xapian Backend ile FTS Kurulumu
Gerekli Paketlerin Yüklenmesi
Ubuntu/Debian üzerinde dovecot-fts-xapian paketi resmi Dovecot depolarından gelir. Önce Dovecot resmi repo’sunu ekleyelim:
apt-get install apt-transport-https ca-certificates
wget -qO- https://repo.dovecot.org/DOVECOT-REPO-GPG | gpg --dearmor > /etc/apt/trusted.gpg.d/dovecot.gpg
echo "deb https://repo.dovecot.org/ce-2.3-latest/ubuntu/jammy jammy main" > /etc/apt/sources.list.d/dovecot.list
apt-get update
apt-get install dovecot-fts-xapian
Paketi doğrulayın:
dpkg -l | grep dovecot-fts
ls -la /usr/lib/dovecot/modules/ | grep fts
Dovecot FTS Yapılandırması
Dovecot yapılandırma dosyalarını düzenleyelim. Genellikle /etc/dovecot/conf.d/ altında parçalı yapı kullanılır. FTS için ayrı bir dosya oluşturalım:
cat > /etc/dovecot/conf.d/90-fts.conf << 'EOF'
# Full Text Search Yapılandirmasi
mail_plugins = $mail_plugins fts fts_xapian
plugin {
# FTS motor secimi
fts = xapian
# Xapian ozel ayarlari
fts_xapian = partial=80 full=100
# Arama zamanlari
fts_autoindex = yes
fts_autoindex_exclude = Trash
fts_autoindex_exclude2 = Junk
fts_autoindex_exclude3 = INBOX.Trash
fts_autoindex_exclude4 = INBOX.Spam
# Indeks guncelleme gecikmesi (saniye)
fts_index_timeout = 60
# En fazla kac mesaj indexlenecek (0 = sinir yok)
fts_message_max_size = 10M
# Hangi alanlar indexlenecek
fts_decoder = decode2text
}
EOF
Ardından protokol tanımına mail_plugins’i ekleyin. /etc/dovecot/conf.d/20-imap.conf dosyasını düzenleyin:
# Mevcut mail_plugins satirini bulun ve duzenleyin
grep -n "mail_plugins" /etc/dovecot/conf.d/20-imap.conf
# Genellikle su sekilde gorunu:
# mail_plugins = $mail_plugins imap_sieve
# FTS ekledikten sonra:
# mail_plugins = $mail_plugins imap_sieve fts fts_xapian
Ya da doğrudan sed ile değiştirin:
sed -i 's/mail_plugins = $mail_plugins imap_sieve/mail_plugins = $mail_plugins imap_sieve fts fts_xapian/'
/etc/dovecot/conf.d/20-imap.conf
decode2text Servisi Yapılandırması
Ekli dosyaların (PDF, DOCX, vs.) içeriklerinin de aranabilmesi için decode2text servisini yapılandırmak gerekir. Bu özellik harika çünkü muhasebe departmanının “PDF fatura” içindeki metni de arayabilmesini sağlar.
apt-get install catdoc antiword poppler-utils odt2txt
# decode2text script'ini olusturun
cat > /usr/lib/dovecot/decode2text.sh << 'EOF'
#!/bin/bash
# Dovecot decode2text helper
CONTENT_TYPE="$1"
INPUT_FILE="$2"
case "$CONTENT_TYPE" in
application/pdf)
pdftotext "$INPUT_FILE" - 2>/dev/null
;;
application/msword)
catdoc "$INPUT_FILE" 2>/dev/null
;;
application/vnd.openxmlformats-officedocument.wordprocessingml.document)
docx2txt "$INPUT_FILE" - 2>/dev/null
;;
application/vnd.oasis.opendocument.text)
odt2txt "$INPUT_FILE" 2>/dev/null
;;
text/*)
cat "$INPUT_FILE"
;;
esac
EOF
chmod +x /usr/lib/dovecot/decode2text.sh
/etc/dovecot/conf.d/90-plugin.conf dosyasına decode servisi ekleyin:
service decode2text {
executable = script /usr/lib/dovecot/decode2text.sh
user = dovecot
unix_listener decode2text {
mode = 0666
}
}
Apache Solr Backend Kurulumu
Büyük kurulumlar (1000+ kullanıcı, milyonlarca e-posta) için Solr çok daha güçlü bir seçenektir. Solr’u ayrı bir sunucuya kurmak en iyi pratiktir.
Solr Kurulumu
# Java gereksinimi
apt-get install default-jre-headless
# Solr indirme ve kurulum
SOLR_VERSION="9.4.0"
wget https://archive.apache.org/dist/solr/solr/${SOLR_VERSION}/solr-${SOLR_VERSION}.tgz
tar xzf solr-${SOLR_VERSION}.tgz solr-${SOLR_VERSION}/bin/install_solr_service.sh --strip-components=2
bash ./install_solr_service.sh solr-${SOLR_VERSION}.tgz
# Servis kontrolu
systemctl status solr
# Dovecot core olusturma
sudo -u solr /opt/solr/bin/solr create_core -c dovecot
Dovecot Solr schema dosyasını kopyalayın:
# Dovecot kaynak kodundan veya paketinden schema al
cp /usr/share/dovecot/solr-schema.xml /var/solr/data/dovecot/conf/managed-schema.xml
systemctl restart solr
# Solr FTS yapilandirmasi
cat >> /etc/dovecot/conf.d/90-fts.conf << 'EOF'
# Solr ayarlari (Xapian yerine Solr kullanmak isterseniz)
# fts = solr
# fts_solr = break-imap-search url=http://solr-server:8983/solr/dovecot/
EOF
İlk İndeksleme ve Mevcut Postaların Taranması
Yapılandırma tamamlandıktan sonra Dovecot’u yeniden başlatın ve mevcut postaları indeksleyin:
# Dovecot'u yeniden baslat
systemctl restart dovecot
# Yapilandirma hatalarini kontrol et
doveconf -n 2>&1 | head -20
dovecot -n 2>&1 | grep -i error
# Tum kullanicilarin posta kutularini indeksle
doveadm fts rescan -A
# Belirli bir kullanicinin posta kutusunu indeksle
doveadm fts rescan -u [email protected]
# Indeksleme durumunu izle
tail -f /var/log/mail.log | grep -i fts
Büyük posta kutularında ilk indeksleme saatler alabilir. Bunu arka planda çalıştırabilirsiniz:
# Tum kullanicilari sirali indeksle (yuk kontrolu icin)
for user in $(doveadm user '*'); do
echo "Indexing: $user"
doveadm fts rescan -u "$user"
sleep 2
done
İndeks Yönetimi ve Sorun Giderme
İndeks Durumu Kontrolü
# Kullanici bazli indeks istatistikleri
doveadm fts lookup -u [email protected] BODY "fatura"
# Indeks boyutunu kontrol et (Xapian icin)
du -sh /var/vmail/*/Maildir/.fts.xapian/ 2>/dev/null
# FTS ile ilgili log satirlarini izle
grep -i "fts" /var/log/mail.log | tail -50
# Indeks optimizasyonu
doveadm fts optimize -A
# Bozuk indeksleri yeniden olustur
doveadm fts rescan -u [email protected]
Yaygın Sorunlar ve Çözümleri
Sorun 1: “fts: Backend fts_xapian not found”
Bu hata modülün yüklenmediğini gösterir:
# Modul var mi kontrol et
find /usr/lib/dovecot -name "*xapian*"
# Eksikse paketi yeniden yukle
apt-get install --reinstall dovecot-fts-xapian
# Dovecot modul yolunu kontrol et
doveconf -n | grep mail_plugin_dir
Sorun 2: İndeks boyutu çok büyüyor
Xapian indeksleri zamanla büyür ve optimizasyon gerektirir. Bunun için cron job oluşturun:
cat > /etc/cron.d/dovecot-fts << 'EOF'
# Her gece saat 03:00'te FTS optimizasyonu
0 3 * * * root doveadm fts optimize -A >> /var/log/dovecot-fts-optimize.log 2>&1
# Her hafta Pazar gunu indeks boyutu raporu
0 8 * * 0 root du -sh /var/vmail/*/Maildir/.fts.xapian/ 2>/dev/null >> /var/log/dovecot-fts-size.log
EOF
Sorun 3: Arama sonuçları tutarsız
Bu genellikle bozuk indeksten kaynaklanır:
# Tum FTS indekslerini sil ve yeniden olustur
doveadm fts rescan -A
# Sadece belirli klasoru yeniden indeksle
doveadm index -u [email protected] INBOX
Performans Optimizasyonu
Xapian için Bellek ve I/O Ayarları
Yüksek yük altında FTS performansını artırmak için birkaç kritik ayar:
# /etc/dovecot/conf.d/90-fts.conf dosyasini genislet
cat >> /etc/dovecot/conf.d/90-fts.conf << 'EOF'
plugin {
# Eş zamanli indeksleme limiti
fts_autoindex_max_recent_msgs = 200
# Arama zaman asimi
fts_search_timeout = 30
# Xapian veritabani icin I/O scheduler ipucu
# (tmpfs kullaniyorsaniz buyuk fayda saglar)
# fts_xapian = partial=80 full=100 verbose=0
}
EOF
Xapian indeks dosyalarını tmpfs üzerine taşımak performansı dramatik biçimde artırabilir ancak dikkatli olun – yeniden başlatmada indeks kaybolur:
# Sadece kucuk kurulumlar veya test icin
# Prod ortaminda SSD tercih edin
mount -t tmpfs -o size=2G tmpfs /var/vmail-fts-cache
# Buyuk kurulumlar icin SSD disk yolunu kullanin
# ve fts indexlerini oraya yonlendirin
Dovecot Worker Process Ayarları
# /etc/dovecot/conf.d/10-master.conf dosyasini duzenle
service indexer {
# Eslesme yuki
process_limit = 10
}
service indexer-worker {
# Her worker ne kadar RAM kullanabilir
vsz_limit = 1024M
process_limit = 10
}
Gerçek Dünya Senaryosu: Kurumsal E-posta Ortamı
Senaryo: 500 Kullanıcılı Şirkette FTS Devreye Alma
Bir müşteri projesinde 500 kullanıcısı olan, Dovecot + Postfix kullanan bir şirkette FTS devreye almak zorunda kaldık. Her kullanıcının posta kutusunda ortalama 40.000 e-posta vardı. Toplam 20 milyon e-postayı indeksleyecektik.
Önce mevcut durumu ölçtük:
# Toplam posta sayisi
find /var/vmail -name "*.dovecot.index" | wc -l
# Toplam maildir boyutu
du -sh /var/vmail/
# Ortalama posta kutusu boyutu
for d in /var/vmail/example.com/*/Maildir/; do
du -s "$d" 2>/dev/null
done | awk '{sum+=$1; count++} END {print "Ortalama:", sum/count, "KB"}'
İlk indekslemeyi gece saatlerinde, sunucu yükü düşükken başlattık:
# ionice ile dusuk I/O onceligi ile indeksle
ionice -c 3 nice -n 19 doveadm fts rescan -A
# Paralel ama kontrollü indeksleme (max 4 eş zamanli kullanici)
doveadm user '*' | xargs -P 4 -I{} doveadm fts rescan -u {}
İndeksleme tamamlandıktan sonra kullanıcı geri bildirimleri inanılmazdı. “İçinde KDV yazan tüm mailleri bul” sorgusu eskiden 3-4 dakika sürerken artık 2-3 saniyede tamamlanıyordu.
Senaryo: Felaket Kurtarma Planı
FTS indekslerini backup kapsamına almak önemlidir. Ancak e-posta backup’ından önce indeksleri almak gereksiz boyut şişirir. Şöyle bir strateji uyguladık:
#!/bin/bash
# /usr/local/bin/fts-backup-helper.sh
ACTION="$1"
BACKUP_DIR="/backup/dovecot-fts"
MAIL_DIR="/var/vmail"
case "$ACTION" in
pre-backup)
# Backup oncesi FTS optimize et
doveadm fts optimize -A
echo "FTS optimize edildi"
;;
post-restore)
# Restore sonrasi indeksleri yeniden olustur
find "$MAIL_DIR" -name ".fts.xapian" -type d -exec rm -rf {} + 2>/dev/null
doveadm fts rescan -A
echo "FTS yeniden indeksleme basladi"
;;
size-report)
echo "FTS Indeks Boyutlari:"
find "$MAIL_DIR" -name ".fts.xapian" -type d | while read d; do
user=$(echo "$d" | awk -F'/' '{print $(NF-2)}')
size=$(du -sh "$d" 2>/dev/null | cut -f1)
echo " $user: $size"
done
;;
esac
Monitoring ve Alerting
FTS sağlığını izlemek için basit bir script:
#!/bin/bash
# /usr/local/bin/fts-health-check.sh
LOG_FILE="/var/log/dovecot-fts-health.log"
ALERT_THRESHOLD=90 # CPU % esigi
check_fts_errors() {
ERROR_COUNT=$(grep -c "fts.*error" /var/log/mail.log 2>/dev/null)
if [ "$ERROR_COUNT" -gt 10 ]; then
echo "UYARI: Son log dosyasinda $ERROR_COUNT FTS hatasi bulundu" |
mail -s "Dovecot FTS Uyarisi" [email protected]
fi
}
check_index_freshness() {
# Son 24 saatte guncellenmemis buyuk indeksler sorunlu olabilir
OLD_INDEXES=$(find /var/vmail -name "*.glass" -mtime +1 | wc -l)
echo "$(date): Eski indeks dosyasi sayisi: $OLD_INDEXES" >> "$LOG_FILE"
}
test_fts_search() {
# Test kullanicisiyla arama yap ve sure ol
START=$(date +%s%N)
doveadm fts lookup -u [email protected] BODY "test" > /dev/null 2>&1
END=$(date +%s%N)
ELAPSED=$(( (END - START) / 1000000 ))
echo "$(date): FTS test aramasi: ${ELAPSED}ms" >> "$LOG_FILE"
if [ "$ELAPSED" -gt 5000 ]; then
echo "UYARI: FTS arama 5 saniyeyi asti (${ELAPSED}ms)" |
mail -s "Dovecot FTS Yavas" [email protected]
fi
}
check_fts_errors
check_index_freshness
test_fts_search
Bunu cron’a ekleyin:
echo "*/30 * * * * root /usr/local/bin/fts-health-check.sh" > /etc/cron.d/fts-health
chmod +x /usr/local/bin/fts-health-check.sh
Güvenlik Konuları
FTS indeksleri e-postaların içeriğini barındırır, bu yüzden güvenlik önemlidir:
- Dosya izinleri: Xapian indeks dosyaları
vmail:vmailsahipliğinde olmalı, 700 izinli olmalıdır. - Solr güvenliği: Solr yalnızca localhost veya özel ağdan erişilebilir olmalıdır, internete açık bırakmayın.
- Şifreleme: Disk şifreleme kullanıyorsanız FTS indeksleri de otomatik olarak korunur.
- Yedekleme: FTS indekslerini ana posta verisinden ayrı yedekleyin, gerekmesi halinde sıfırdan oluşturulabilir.
# Izinleri kontrol et ve duzelt
find /var/vmail -name ".fts.xapian" -exec chown -R vmail:vmail {} ;
find /var/vmail -name ".fts.xapian" -exec chmod 700 {} ;
Sonuç
Dovecot FTS, özellikle büyük posta kutularına sahip kurumsal ortamlarda kullanıcı deneyimini kökten değiştiren bir özelliktir. Xapian backend, orta ölçekli kurulumlar (1-500 kullanıcı) için kurulumu kolay ve bakımı düşük bir seçenektir. 500 kullanıcının üzerinde ve yoğun arama kullanımı varsa Solr’a geçmeyi değerlendirmek gerekir.
En kritik noktaları özetlersek:
- İlk indeksleme‘yi düşük yük döneminde, ionice ile çalıştırın.
- Otomatik optimizasyon için haftalık cron job mutlaka kurulmalıdır.
- Ek dosya araması için decode2text servisi poppler-utils ve catdoc ile desteklenmelidir.
- İndeks boyutunu düzenli izleyin, beklenmedik büyümeler bozuk indeks sinyali verebilir.
- FTS indekslerini felaket kurtarma planınıza dahil edin ama yeniden oluşturulabilir oldukları için backup önceliği düşük tutulabilir.
Kullanıcılarınızın “mail sunucusunda arama çalışmıyor” şikayetleri geldikten sonra değil, onlar gelmeden bu yapılandırmayı devreye alın. Önleyici yaklaşım her zaman kazandırır.