Mail sunucularını öldüren şey nadiren CPU ya da RAM olur; neredeyse her zaman dolan disktir. Ve dolmanın sebebi genelde tek bir kullanıcıdır: on yıldır hiçbir şey silmeyen, her eki saklayan, gelen kutusunda 80 GB veri biriktiren biri. Disk dolduğunda ise yalnızca o kullanıcı etkilenmez — Dovecot indeks yazamaz, Postfix kuyruğa alamaz, log dönmez ve sunucunun tamamı durur. Dovecot kota yönetimi, tam olarak bu tek noktadan çöküşü engellemek için vardır.
Bu rehberde Dovecot'un quota eklentisini uçtan uca kurmayı anlatacağım: hangi backend'i neden seçmen gerektiği, kural sözdiziminin nasıl okunacağı, Çöp ve Junk klasörlerinin kotadan nasıl muaf tutulacağı, Postfix'in mesajı kabul etmeden önce kotayı sorgulaması için gereken policy servisi ve kullanıcıya doluluk uyarısı gönderen betik. Sonunda kotanın yanlış görünmesine yol açan sebepleri ve yeniden hesaplama komutlarını da göstereceğim.
Kota Olmadan Ne Oluyor#
Kotasız bir sunucuda disk doluluğu doğrusal değil, ani bir sorundur. Aylarca %60'ta gezinir, sonra bir kullanıcı büyük bir arşivi IMAP ile yükler ve bir gecede %98'e çıkar. O noktadan sonra sırayla şunlar bozulur:
- Dovecot indeks dosyalarını güncelleyemez, IMAP oturumları hata verir.
- Postfix kuyruğa yazamaz ve gelen mailleri geçici hatayla reddetmeye başlar.
- Log dosyaları yazılamaz, yani sorunun kaydı bile tutulmaz.
- Yedekleme işi başarısız olur ve genelde sessizce.
Kota koymak bu zinciri kırar: sınırı aşan kullanıcı mail alamaz, ama sunucunun geri kalanı çalışmaya devam eder. Yani kota bir kısıtlama aracı değil, hasarı tek kullanıcıya hapseden bir yalıtım aracıdır.
| Kota yok | Kota var |
|---|---|
| Bir kullanıcı tüm sunucuyu durdurur | Sadece o kullanıcı etkilenir |
| Sorun fark edildiğinde iş işten geçmiştir | Kullanıcı %80'de uyarı alır |
| Disk büyütmek tek çare | Planlı kapasite yönetimi mümkün |
| Yedekleme boyutu öngörülemez | Üst sınır bellidir |
Dovecot Kota Mimarisi ve Backend Seçimi#
Dovecot'ta kota bir eklentidir ve iki ayrı parçası vardır. quota eklentisi kullanımı hesaplar ve sınırı uygular; quota-status servisi ise Postfix'in "bu alıcının yeri var mı?" sorusunu cevaplar. İkisini birden kurmadan sistem yarım kalır — sınır uygulanır ama mesaj zaten kabul edilmiş olduğu için sunucu bounce üretmek zorunda kalır.
Kullanımı hesaplamak için birkaç backend vardır ve seçim performansı doğrudan etkiler:
| Backend | Nasıl çalışır | Ne zaman uygun |
|---|---|---|
count | Dovecot indeksinden okur | Modern kurulumlarda varsayılan tercih |
maildir | Maildir'deki maildirsize dosyasını okur | Klasik Maildir kurulumları |
fs | İşletim sisteminin dosya sistemi kotasını okur | Kullanıcı başına ayrı sistem hesabı varsa |
dict | Harici bir veritabanında tutar | Çok sunuculu, paylaşımlı kurulumlar |
Yeni kurulumlarda count backend'i tercih edilir çünkü kullanım bilgisini Dovecot'un kendi indeksinden okur; her seferinde dizini taramaz. Karşılığında indeks dosyalarının sağlıklı olmasına bağımlıdır — indeks bozulursa kota yanlış görünür ve yeniden hesaplaman gerekir. maildir backend'i ise her posta kutusundaki maildirsize dosyasını kullanır; daha basittir ama çok sayıda dosya olan kutularda yavaşlar.
Bir de ölçüm birimi kararı var: quota_vsizes = yes ayarı, kotayı diskteki fiziksel boyut yerine mesajın RFC 822 boyutu üzerinden hesaplar. Kullanıcının gördüğü mesaj boyutuyla kotanın tuttuğu boyut böylece uyuşur; aksi hâlde "10 MB'lık mail gönderdim ama kotam 11 MB düştü" tarzı açıklaması zor durumlar çıkar.
Yapılandırma: Satır Satır#
Önce eklentiyi etkinleştir. Kota üç yerde bildirilmelidir: genel mail eklentileri, IMAP protokolü (kullanıcının kotasını görebilmesi için) ve LMTP (teslimat sırasında sınırın uygulanması için).
# /etc/dovecot/conf.d/10-mail.conf
mail_plugins = $mail_plugins quota
# /etc/dovecot/conf.d/20-imap.conf
protocol imap {
mail_plugins = $mail_plugins imap_quota
}
# /etc/dovecot/conf.d/20-lmtp.conf
protocol lmtp {
mail_plugins = $mail_plugins quota sieve
}
Asıl kurallar 90-quota.conf içindedir. Aşağıdaki yapılandırma üretimde doğrudan kullanabileceğin bir başlangıç noktasıdır:
# /etc/dovecot/conf.d/90-quota.conf
plugin {
# Backend ve kullanıcıya gösterilecek ad
quota = count:User quota
quota_vsizes = yes
# Varsayılan sınır: tüm klasörler toplamı 2 GB
quota_rule = *:storage=2G
# Çöp kutusuna 200 MB EK alan tanı (+ işareti "ekle" demek)
quota_rule2 = Trash:storage=+200M
# Junk klasörünü kotadan tamamen muaf tut
quota_rule3 = Junk:ignore
# Sınırı aşan tek bir mesaja %5 tolerans (mesajın yarıda kesilmemesi için)
quota_grace = 5%%
# Uyarı eşikleri — yüzde işareti ÇİFT yazılır
quota_warning = storage=95%% quota-warning 95 %u
quota_warning2 = storage=85%% quota-warning 85 %u
# Postfix policy servisinin döneceği cevaplar
quota_status_success = DUNNO
quota_status_nouser = DUNNO
quota_status_overquota = "552 5.2.2 Posta kutusu dolu"
}
Birkaç ayrıntıyı özellikle vurgulayayım. Yüzde işareti çift yazılır (95%%); tek yazarsan Dovecot bunu değişken genişletme olarak yorumlar ve yapılandırma beklediğin gibi çalışmaz. quota_rule2 içindeki + işareti kritiktir: Trash:storage=+200M "Çöp kutusuna toplam kotanın üstüne 200 MB daha ver" demektir, + olmadan yazarsan "Çöp kutusu en fazla 200 MB olsun" anlamına gelir ve bu bambaşka bir davranıştır. Junk:ignore ise spam klasörünün kullanıcının kotasını yemesini engeller — spam'in kotayı doldurması, kullanıcının kendi hatası olmayan bir cezadır.
Kotayı kullanıcı bazında farklılaştırmak istiyorsan, kullanıcı veritabanından (SQL/LDAP) quota_rule alanı döndürebilirsin:
-- Sanal kullanıcı tablosunda kota alanı
ALTER TABLE mail_kullanicilar ADD COLUMN kota_mb INT DEFAULT 2048;
-- Dovecot userdb sorgusu bu alanı quota_rule olarak döner
SELECT
CONCAT('*:storage=', kota_mb, 'M') AS quota_rule,
'/var/vmail/%d/%n' AS home,
5000 AS uid,
5000 AS gid
FROM mail_kullanicilar
WHERE eposta = '%u' AND aktif = 1;
Bu yaklaşımla her hesaba farklı sınır verirsin ve değişiklik için Dovecot'u yeniden başlatmana gerek kalmaz.
Postfix Entegrasyonu: Kabul Etmeden Önce Reddet#
Kotayı yalnızca Dovecot tarafında kurarsan şu olur: Postfix mesajı kabul eder, kuyruğa alır, Dovecot'a teslim etmeye çalışır, Dovecot "kota dolu" der ve Postfix gönderene bir bounce mesajı üretir. Bu, gereksiz kaynak harcamasının yanında bir de itibar riski taşır — özellikle spam'e cevap olarak üretilen bounce mesajları seni geri saçılım (backscatter) kaynağı hâline getirebilir.
Doğru davranış, mesajı SMTP oturumu sırasında reddetmektir. Böylece gönderen tarafındaki sunucu durumu kendisi bildirir, sen bounce üretmezsin. Bunun için Dovecot'un quota-status servisini açar ve Postfix'i ona bağlarsın:
# /etc/dovecot/conf.d/90-quota.conf — dosyanın sonuna
service quota-status {
executable = quota-status -p postfix
inet_listener {
port = 12340
address = 127.0.0.1
}
client_limit = 1
}
# /etc/postfix/main.cf
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_service inet:127.0.0.1:12340
check_policy_service satırının en sonda durması önemlidir: önceki kurallar zaten reddedecekse boşuna kota sorgusu yapılmaz. Servisi yalnızca 127.0.0.1 üzerinde dinlet; dışarıya açık bir kota sorgu servisi, hangi adreslerin var olduğunu sızdıran bir bilgi kaynağına dönüşür.
Yapılandırmayı yükleyip test et:
systemctl restart dovecot
systemctl reload postfix
# Policy servisinin çalıştığını doğrula
ss -tlnp | grep 12340
# Bir hesabın kotasını sorgula
doveadm quota get -u [email protected]
# Quota name Type Value Limit %
# User quota STORAGE 1048576 2097152 50
# User quota MESSAGE - - 0
Kullanıcıya Doluluk Uyarısı Gönderme#
Kotanın en değerli parçası, sınıra çarpmadan önce kullanıcıyı uyarmaktır. Kullanıcı %85'te bir mail alırsa temizlik yapar; %100'de mail alamaz hâle gelirse destek talebi açar. Dovecot bu uyarıyı bir betikle tetikler:
# /usr/local/bin/quota-warning.sh
cat > /usr/local/bin/quota-warning.sh <<'EOF'
#!/bin/bash
YUZDE=$1
KULLANICI=$2
cat <<MESAJ | /usr/lib/dovecot/dovecot-lda -d "$KULLANICI" -o "plugin/quota=count:User quota:noenforcing"
From: [email protected]
Subject: Posta kutunuz %$YUZDE doluluga ulasti
Content-Type: text/plain; charset=UTF-8
Merhaba,
Posta kutunuz %$YUZDE doluluk seviyesine ulasti. Kota dolarsa
yeni gelen mailler teslim edilemez.
Yapabilecekleriniz:
- Buyuk ekli eski mailleri silin
- Cop kutusunu bosaltin
- Gerekirse kota artisi icin destek talebi acin
Iyi calismalar.
MESAJ
EOF
chmod +x /usr/local/bin/quota-warning.sh
# /etc/dovecot/conf.d/90-quota.conf — servisi tanımla
service quota-warning {
executable = script /usr/local/bin/quota-warning.sh
user = vmail
unix_listener quota-warning {
user = vmail
group = vmail
mode = 0660
}
}
Betikteki noenforcing parametresi hayati önemdedir: uyarı mailini teslim ederken kota kontrolü devre dışı bırakılır. Bu olmadan, kotası dolmuş bir kullanıcıya "kotanız doldu" maili teslim edilemez — tam da ihtiyaç duyulduğu anda çalışmayan bir uyarı sistemi elde edersin.
Uyarı maillerinin kullanıcının Sieve kurallarına takılıp yanlış klasöre düşmemesi için betiği -o ile doğrudan LDA'ya vermek ya da Sieve tarafında postmaster@ adresinden gelenleri INBOX'ta bırakan bir kural yazmak iyi bir fikirdir. Sieve kuralı yazımı için Sieve filtreleri ile otomatik mail kuralları yazısına bakabilirsin.
İzleme, Yeniden Hesaplama ve Sık Yapılan Hatalar#
Kota bilgisi bazen gerçekle uyuşmaz: indeks bozulur, dosyalar dışarıdan taşınır ya da backend değiştirilir. Bu durumda Dovecot'a yeniden saydırırsın:
# Tek kullanıcı için yeniden hesapla
doveadm quota recalc -u [email protected]
# Tüm kullanıcılar için
doveadm quota recalc -A
# Kim ne kadar kullanıyor — en dolu kutuları bul
for u in $(doveadm user '*' 2>/dev/null); do
printf "%-35s %s\n" "$u" "$(doveadm quota get -u "$u" | awk '/STORAGE/{print $5"%"}')"
done | sort -k2 -rn | head -20
# Disk tarafındaki gerçek durum
du -sh /var/vmail/* | sort -rh | head -10
df -h /var/vmail
Son iki komut, kota sisteminden bağımsız bir gerçeklik kontrolüdür ve düzenli olarak bakılması gereken yerdir. Kota kurmuş olman diski izlemeyi bırakman anlamına gelmez; paylaşılan klasörler, indeks dosyaları ve kuyruk da yer kaplar.
Şimdi sahada en sık gördüğüm hatalar. Birincisi, kotayı yalnızca Dovecot'ta kurup Postfix policy servisini bağlamamak; sunucu mesajı kabul edip sonra bounce üretir ve geri saçılım kaynağı hâline gelir. İkincisi, yüzde işaretini tek yazmak (90% yerine 90%% olmalı); uyarılar hiç tetiklenmez ve sorunu fark etmen aylar alır. Üçüncüsü, Trash kuralında + işaretini unutmak; çöp kutusuna kota tanımak yerine onu 200 MB'a hapsetmiş olursun. Dördüncüsü, uyarı betiğinde noenforcing kullanmamak; kotası dolan kullanıcıya uyarı maili teslim edilemez. Beşincisi, Junk klasörünü muaf tutmamak; spam kullanıcının kotasını doldurur ve kullanıcı hiçbir şey yapmadan mail alamaz hâle gelir. Altıncısı, kotayı çok düşük ayarlayıp kullanıcı eğitimi yapmamak; sonuç, sürekli açılan destek talepleri olur. Yedincisi, kota koyduktan sonra yedekleme boyutunu güncellememek — kota üst sınırı × kullanıcı sayısı, yedek deponun büyümesi gereken tavanı verir; bunun planlamasını mail sunucusu yedekleme stratejisi yazısında ele aldım.
Paylaşımlı hosting tarafında kotalar cPanel gibi paneller üzerinden yönetilir ve mantık benzerdir; oradaki karşılığı için cPanel e-posta kotası yazısına göz atabilirsin.
Sıkça Sorulan Sorular#
Dovecot kotası nasıl kontrol edilir#
Komut satırında doveadm quota get -u [email protected] komutu kullanılan alanı, sınırı ve yüzdeyi gösterir. Tüm kullanıcıları taramak için doveadm quota get -A kullanabilirsin. Kullanıcı tarafında ise imap_quota eklentisi etkinse modern IMAP istemcileri ve webmail arayüzleri doluluk bilgisini kendileri gösterir.
Kota dolduğunda gelen maile ne olur#
Doğru kurulmuş bir sistemde mesaj SMTP oturumu sırasında 552 5.2.2 koduyla reddedilir; gönderen tarafındaki sunucu durumu kendisi bildirir ve senin sunucun bounce üretmez. Policy servisini bağlamadıysan mesaj önce kabul edilir, teslim edilemez ve sunucun gönderene bir bounce mesajı üretmek zorunda kalır — bu hem kaynak israfıdır hem de itibar riski taşır.
Kotayı kullanıcı bazında nasıl farklılaştırırım#
Kullanıcı veritabanından (SQL ya da LDAP) quota_rule alanını döndürmek en pratik yöntemdir. Sorguda CONCAT('*:storage=', kota_mb, 'M') biçiminde bir değer üretirsen her hesap kendi sınırıyla çalışır ve kota değiştirmek için Dovecot'u yeniden başlatmana gerek kalmaz. Dosya tabanlı kurulumlarda ise kullanıcıya özel quota_rule tanımını userdb extra alanı olarak verebilirsin.
Çöp kutusu kotaya dahil mi olmalı#
Genel yaklaşım, Çöp kutusuna toplam kotanın üstünde ek bir alan tanımaktır (Trash:storage=+200M). Böylece kullanıcı yer açmak için sildiği mailler yüzünden hemen kotaya çarpmaz ve silme işlemi gerçekten yer açar. Junk klasörünü ise tamamen muaf tutmak (Junk:ignore) daha adildir; spam'in kullanıcı kotasını doldurması onun kontrolünde olmayan bir cezadır.
Kota rakamı yanlış görünüyor, nasıl düzeltirim#
doveadm quota recalc -u [email protected] komutu o hesabın kullanımını sıfırdan yeniden hesaplar; tüm kullanıcılar için -A bayrağını kullanabilirsin. Yanlışlığın sebebi genelde bozulan indeks dosyaları, dosyaların Dovecot dışından taşınması ya da backend değişikliğidir. Yeniden hesaplama büyük kutularda zaman alabilir, bu yüzden yoğun saatler dışında çalıştır.
Kota koymak yerine ne yapabilirim#
Kotayı hiç koymamak yerine, yüksek bir üst sınır koyup uyarı eşiklerini erken tutmak çok daha güvenlidir; amaç kullanıcıyı kısıtlamak değil, sunucuyu tek bir kutunun taşmasından korumaktır. Buna ek olarak eski mailleri otomatik arşivleyen bir politika (belirli yaştan eskileri ayrı bir klasöre ya da arşiv deposuna taşımak) kotayı çok daha az hissedilir hâle getirir.
Kapanış#
Kota, mail sunucusunda "bir gün lazım olur" diye ertelenen ama ertelendiği için pahalıya patlayan ayarların başında gelir. Aklında tutman gereken dört alışkanlık şunlar: kotayı mutlaka Postfix policy servisiyle birlikte kur ki mesaj kabul edilmeden reddedilsin, uyarı eşiklerini %85 ve %95 gibi erken noktalara koy ve uyarı betiğinde noenforcing kullan, Junk klasörünü muaf tutup Çöp kutusuna + ile ek alan tanı, ve kota kurmuş olsan bile df -h ile diski izlemeyi bırakma. Kota bir sınır değil, hasar yalıtım katmanıdır.
Kendi Dovecot sunucunu kurup bu yapılandırmayı uçtan uca uygulamak istiyorsan tam root erişimli VDS ve sanal sunucu paketlerimiz uygun bir zemin sunar. Postfix, Dovecot ve DKIM kurulu hâlde teslim edilen bir sistemle başlamak istersen SMTP sunucu paketimiz bu adımları hazır getirir; kota, izleme ve bakım yükünü devretmek istersen sunucu yönetimi hizmetimiz devreye girer. Kutuların büyümesine karşılık gelecek yedek alanı için yedekleme çözümlerimize de göz atabilirsin.