Dovecot ile Full Text Search Yapılandırması

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:vmail sahipliğ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.

Yorum yapın