Mailu, Postfix, Dovecot, Rspamd, bir yönetim arayüzü ve webmail'i birbirine bağlanmış Docker konteynerleri olarak paketleyen bir mail sunucusu dağıtımıdır. Klasik kurulumdan farkı şudur: sistem paketleriyle uğraşmaz, her bileşen kendi konteynerinde çalışır ve tüm yapılandırma tek bir mailu.env dosyasıyla docker-compose.yml içinde toplanır. Sunucuyu taşımak, sürüm yükseltmek ya da sıfırdan yeniden kurmak bu yüzden çok daha öngörülebilir hale gelir.
Bu yazıda Docker üzerinde mail sunucusu kurmanın ne kazandırdığını ve neyi zorlaştırdığını, kurulum öncesi hazırlığı, mailu.env içindeki kritik ayarları, ilk yönetici hesabının nasıl oluşturulacağını, veri kalıcılığı ve yedekleme düzenini, sürüm yükseltmenin doğru sırasını ve konteyner ortamına özgü tuzakları anlatacağım. Docker'ı temel düzeyde bildiğinizi varsayıyorum; bilmiyorsanız kurulum öncesi docker ve docker compose komutlarına aşina olmanız işinizi çok kolaylaştırır.
Konteyner Yaklaşımı Ne Kazandırır, Neyi Zorlaştırır#
Mail sunucusunun konteynerde çalışmasının en büyük getirisi tekrarlanabilirliktir. docker-compose.yml, mailu.env ve veri dizininiz elinizdeyse aynı sunucuyu başka bir makinede dakikalar içinde ayağa kaldırabilirsiniz. Sürüm yükseltmesi imaj etiketini değiştirip yeniden başlatmaya indirgenir; beğenmezseniz eski etikete geri dönersiniz. Bileşenler birbirinden yalıtıldığı için bir servisin bağımlılığı diğerini bozmaz.
Zorlaştırdığı taraf ise hata ayıklamadır. Klasik bir kurulumda postconf -e yazıp servisi yeniden yüklersiniz; Mailu'da yapılandırma şablonlardan üretilir ve konteyner içinde elle yaptığınız değişiklik bir sonraki yeniden başlatmada kaybolur. Ayrıca ağ katmanı bir soyutlama daha ekler: konteyner IP'leri, port eşleştirmeleri ve gerçek istemci IP'sinin loglara doğru yansıması ayrıca dikkat ister.
| Konu | Klasik kurulum (iRedMail) | Konteyner (Mailu) |
|---|---|---|
| Kurulum süresi | Orta, tek script | Kısa, imaj indirme |
| Yapılandırma | Doğrudan dosyalar | mailu.env + şablon |
| Elle müdahale | Serbest, kalıcı | Sınırlı, geçici |
| Sürüm yükseltme | Paket yükseltme, riskli | Etiket değişimi, geri dönülebilir |
| Taşınabilirlik | Düşük | Yüksek |
| Öğrenme eğrisi | Linux servis bilgisi | Docker bilgisi |
İki dağıtımı yan yana değerlendirmek isterseniz iRedMail kurulumu yazısı klasik yaklaşımın adımlarını aynı ayrıntıda anlatıyor.
Kurulum Öncesi Hazırlık#
Konteyner kullanmak, mail sunucusunun temel gereksinimlerini ortadan kaldırmaz. Aşağıdaki üç şey olmadan kurulum çalışsa bile mektuplarınız teslim edilmez.
- Statik IP ve PTR kaydı. Sağlayıcı panelinden IP'nizin
mail.firmaniz.comadına çözümlenmesini talep edin. - 25 portunun dışa açık olması. Kapalıysa sağlayıcıdan açılmasını isteyin.
- Tam nitelikli hostname ve DNS kayıtları.
Sunucu tarafında Docker ve Compose eklentisinin kurulu olması gerekir. Ayrıca 25, 465, 587, 993 ve 443 portlarını başka bir servis (örneğin sistemde çalışan bir Postfix ya da Nginx) tutuyorsa Mailu ayağa kalkamaz:
# Portları başka bir servis tutuyor mu
sudo ss -tlnp | grep -E ':(25|80|443|465|587|993|995)\b'
# Sistemde çalışan bir MTA varsa devre dışı bırakın
sudo systemctl disable --now postfix exim4 2>/dev/null
# Docker sürümlerini doğrulayın
docker --version && docker compose version
DNS tarafında asgari kayıtlar şunlardır:
mail.firmaniz.com. 3600 IN A 185.12.34.56
firmaniz.com. 3600 IN MX 10 mail.firmaniz.com.
firmaniz.com. 3600 IN TXT "v=spf1 mx ip4:185.12.34.56 ~all"
_dmarc.firmaniz.com. 3600 IN TXT "v=DMARC1; p=none; rua=mailto:[email protected]"
; PTR: 185.12.34.56 -> mail.firmaniz.com (sağlayıcı panelinden)
SPF mekanizmalarını doğru seçmek ve 10 sorgu limitine takılmamak için SPF kaydı yazma rehberi yazısına göz atın. DKIM kaydını kurulumdan sonra Mailu üreteceği için şimdilik eklemiyoruz.
Kurulum: docker-compose.yml ve mailu.env#
Mailu, resmi sitesindeki kurulum sihirbazından size özel bir docker-compose.yml ve mailu.env çifti üretir. Sihirbazda cevaplayacağınız temel sorular şunlardır: ana alan adı, hostname, hangi bileşenlerin (webmail, antivirüs, webdav) kurulacağı, TLS'in nasıl yönetileceği ve veri dizininin yolu.
Dosyaları sunucuda ayrı bir dizinde tutun ve sürüm kontrolüne alın (şifreler hariç):
sudo mkdir -p /opt/mailu
cd /opt/mailu
# Sihirbazın verdiği docker-compose.yml ve mailu.env dosyalarını buraya koyun
# İzinleri sıkılaştırın: mailu.env gizli anahtar içerir
sudo chmod 600 mailu.env
mailu.env içindeki kritik anahtarlar ve ne işe yaradıkları:
# Kimlik ve alan adı
SECRET_KEY=32-karakterlik-rastgele-deger
DOMAIN=firmaniz.com
HOSTNAMES=mail.firmaniz.com
# Veri kalıcılığı — bu dizin yedeklenmesi gereken tek yerdir
ROOT=/mailu
# TLS yönetimi: letsencrypt, cert (kendi sertifikanız) veya notls
TLS_FLAVOR=letsencrypt
# Yönetim arayüzü ve webmail
ADMIN=true
WEBMAIL=roundcube
# Giden mektup boyutu ve mesaj boyut sınırı (bayt)
MESSAGE_SIZE_LIMIT=50000000
# Gerçek istemci IP'sinin loglara yansıması için ters proxy arkasındaysanız
REAL_IP_HEADER=X-Forwarded-For
REAL_IP_FROM=172.16.0.0/12
SECRET_KEY değerini rastgele üretin ve hiçbir zaman değiştirmeyin; oturumlar ve bazı türetilmiş değerler buna bağlıdır. Değer üretmek için şifre üretici aracını kullanabilirsiniz.
TLS_FLAVOR=letsencrypt seçtiğinizde Mailu sertifikayı kendisi alır ve yeniler; bunun çalışması için 80 ve 443 portlarının dışarıdan erişilebilir olması ve HOSTNAMES değerinin A kaydıyla eşleşmesi gerekir. Zaten bir ters proxy kullanıyorsanız TLS_FLAVOR=cert seçip sertifikaları kendiniz sağlarsınız.
Kurulumu başlatın:
cd /opt/mailu
sudo docker compose pull
sudo docker compose up -d
# Konteynerlerin durumu
sudo docker compose ps
# Canlı log takibi
sudo docker compose logs -f --tail=100
İlk yönetici hesabını konteyner içinden oluşturursunuz:
sudo docker compose exec admin flask mailu admin \
postmaster firmaniz.com 'guclu-bir-sifre'
Ardından https://mail.firmaniz.com/admin adresinden panele girip alan adınızı, kullanıcılarınızı ve alias'larınızı tanımlarsınız.
DKIM, Kullanıcılar ve İlk Testler#
Mailu'da DKIM anahtarı alan adı bazında yönetim panelinden üretilir: Mail domains → firmaniz.com → Regenerate keys adımıyla anahtar oluşturulur ve aynı ekranda DNS'e eklemeniz gereken TXT kaydı gösterilir. Kaydı yayınladıktan sonra doğrulayın:
# Mailu'nun kullandığı varsayılan seçici genellikle dkim'dir
dig dkim._domainkey.firmaniz.com TXT +short
# Kendinize test mektubu gönderip başlıkları inceleyin
swaks --to [email protected] --from [email protected] \
--server mail.firmaniz.com --port 587 --tls --auth
Alıcı taraftaki Authentication-Results başlığında spf=pass ve dkim=pass görmelisiniz. dkim=fail alıyorsanız genellikle DNS'e eklenen kayıt bölünmüş ya da eksik kopyalanmıştır; bu sorunun tipik sebeplerini DKIM doğrulaması başarısız yazısında topladım.
Kullanıcı oluşturmayı panelden yapabilirsiniz, ancak toplu işlemler için komut satırı daha pratiktir:
# Tek kullanıcı ekle
sudo docker compose exec admin flask mailu user \
kullanici1 firmaniz.com 'kullanici-sifresi'
# Alias tanımla (abuse ve postmaster mutlaka bir yere düşmeli)
sudo docker compose exec admin flask mailu alias \
abuse firmaniz.com [email protected]
Kullanıcı istemci ayarları klasik kurulumla aynıdır: IMAP için 993, gönderim için 587, kullanıcı adı olarak tam e-posta adresi. Ayrıntılı istemci yapılandırması için e-posta istemci kurulumu (Outlook) yazısına bakabilirsiniz.
Veri Kalıcılığı, Yedekleme ve Yükseltme#
Konteynerler geçicidir; kalıcı olan tek şey ROOT altındaki dizindir. Yedekleme planınızın kapsaması gerekenler şunlardır:
| Yol | İçeriği | Kritiklik |
|---|---|---|
${ROOT}/mail | Kullanıcı posta kutuları | En yüksek |
${ROOT}/data | Kullanıcı veritabanı, alan adları | En yüksek |
${ROOT}/dkim | DKIM özel anahtarları | Yüksek |
${ROOT}/certs | TLS sertifikaları | Orta (yeniden alınabilir) |
mailu.env | Yapılandırma ve SECRET_KEY | En yüksek |
docker-compose.yml | Servis tanımı | Yüksek |
DKIM anahtarlarını yedeklemeyi atlarsanız, yeniden kurulumda yeni anahtar üretmek ve DNS'i güncellemek zorunda kalırsınız; bu arada eski imzalı mektuplar doğrulanamaz. Basit bir yedekleme düzeni:
# Servisleri durdurmadan tutarlı bir kopya için önce durdurun
cd /opt/mailu
sudo docker compose stop
sudo tar czf /yedek/mailu-$(date +%F).tar.gz \
/mailu mailu.env docker-compose.yml
sudo docker compose start
# Uzak hedefe kopyalayın
rsync -aH /yedek/ [email protected]:/yedek/mailu/
Yedekleri sunucu dışına almak istemiyorsanız yedekleme hizmetimiz bu işi dış bir hedefte üstlenir.
Sürüm yükseltmenin doğru sırası şudur:
- Sürüm notlarını okuyun. Mailu ara sürümlerde
mailu.envanahtarlarını değiştirebilir. - Tam yedek alın (yukarıdaki tar dosyası).
docker-compose.ymliçindeki imaj etiketini yeni sürüme güncelleyin.sudo docker compose pullile imajları indirin.sudo docker compose up -dile ayağa kaldırın.- Logları izleyin, test mektubu gönderip alın.
- Sorun çıkarsa etiketi eski sürüme çevirip yedeği geri yükleyin.
Etiket olarak latest kullanmayın; bir yeniden başlatma sizi habersizce yeni bir ana sürüme taşıyabilir. Her zaman sabit bir sürüm etiketi yazın.
Konteyner Ortamına Özgü Tuzaklar#
Konteyner içinde yapılan değişikliklerin kaybolması. docker compose exec ile girip bir yapılandırma dosyasını düzenlerseniz, konteyner yeniden oluşturulduğunda değişiklik gider. Kalıcı ayarlar mailu.env üzerinden ya da Mailu'nun sunduğu override mekanizmalarıyla yapılmalıdır.
Gerçek istemci IP'sinin görünmemesi. Ters proxy arkasındaysanız loglarda tüm bağlantılar konteyner ağının IP'sinden geliyor gibi görünür; bu hem Fail2ban kurallarını hem de spam filtresinin IP itibarı değerlendirmesini bozar. REAL_IP_HEADER ve REAL_IP_FROM ayarlarını doğru yapın.
Portların ana makinede çakışması. Sistemde çalışan bir Postfix ya da Nginx 25 veya 443 portunu tutuyorsa konteyner başlamaz. Kurulumdan önce portları temizleyin.
IPv6 yapılandırmasını yarım bırakmak. Docker'ın IPv6 desteği ayrıca yapılandırma ister. Sunucunuzun IPv6 adresi varsa ama konteyner ağı yapılandırılmamışsa, giden bağlantılarda beklenmedik davranışlar ve SPF eşleşmeme sorunları görebilirsiniz. Sorun yaşamamak için ya IPv6'yı düzgün yapılandırın ya da tamamen kapatın.
Log takibini unutmak. Konteyner logları varsayılan olarak Docker'ın günlük sürücüsünde tutulur ve döndürme ayarlanmazsa disk doldurabilir. docker compose logs ile inceleyin, uzun süreli saklama için bir log sürücüsü yapılandırın. Log satırlarını yorumlamak için mail loglarını okuma yazısındaki alan açıklamaları Mailu için de geçerlidir.
Yeni IP'yi ısıtmadan toplu gönderime başlamak. Kurulum yöntemi ne olursa olsun IP'nizin geçmişi yoktur; kademeli plan için mail IP ısıtma (warm-up) planı yazısına bakın.
Sıkça Sorulan Sorular#
Mailu için ne kadar kaynak gerekir#
Antivirüs bileşeni (ClamAV) olmadan 2 GB RAM ile çalışabilirsiniz; ClamAV'ı etkinleştirdiğinizde tek başına yaklaşık 1 GB daha ister, dolayısıyla 4 GB rahat bir başlangıçtır. Disk ihtiyacı tamamen posta hacminize bağlıdır; kutu başına kota belirleyip posta dizinini ayrı bir bölümde tutmak, disk dolduğunda sistemin tamamının kilitlenmesini önler.
Mailu ile iRedMail arasındaki fark nedir#
Mailu bileşenleri Docker konteynerlerinde çalıştırır ve yapılandırmayı tek bir env dosyasında toplar; taşınabilirliği ve sürüm yükseltmesi kolaydır ama konteyner içinde elle müdahale kalıcı olmaz. iRedMail bileşenleri doğrudan işletim sistemine kurar; her dosyaya müdahale edebilirsiniz ama yükseltme ve taşıma daha zahmetlidir. Docker biliyorsanız Mailu, klasik Linux yönetimini tercih ediyorsanız iRedMail daha rahat gelir.
Mailu kurulumundan sonra hangi portları açmalıyım#
Sunucular arası teslimat için 25, kullanıcı gönderimi için 587 ve 465, posta okuma için 993 ve 995, webmail ve yönetim paneli için 443, Let's Encrypt doğrulaması için 80 açık olmalıdır. Şifresiz 110 ve 143 portlarını kapalı tutun. SSH portunu ise yalnızca yönetim ağınıza sınırlayın ve kaba kuvvet için hız sınırı uygulayın.
DKIM anahtarını nasıl üretirim#
Yönetim panelinde ilgili alan adını açıp anahtar üretme seçeneğini kullanırsınız; Mailu anahtar çiftini oluşturur ve DNS'e eklemeniz gereken TXT kaydını ekranda gösterir. Kaydı yayınladıktan sonra dig dkim._domainkey.firmaniz.com TXT +short ile göründüğünü ve bir test mektubunun dkim=pass aldığını doğrulayın. Anahtarları yedeklemeyi unutmayın; kaybederseniz yeniden üretip DNS'i güncellemeniz gerekir.
Mailu sürüm yükseltmesi güvenli mi#
Doğru sırayla yapıldığında evet: önce sürüm notlarını okuyun, tam yedek alın, imaj etiketini değiştirin ve ayağa kaldırın. Konteyner yaklaşımının avantajı geri dönüşün kolay olmasıdır — sorun çıkarsa eski etikete dönüp yedeği geri yüklersiniz. Ana sürüm atlamalarında veritabanı şeması değişebileceği için ara sürümleri sırayla geçmek en güvenlisidir.
Docker mail sunucusu üretim ortamı için uygun mu#
Evet, doğru kurulduğu sürece. Belirleyici olan konteyner olması değil, mail sunucusunun temel gereksinimlerinin karşılanmasıdır: statik IP, doğru PTR kaydı, açık 25 portu, geçerli TLS, SPF/DKIM/DMARC kayıtları, düzenli yedek ve izleme. Bunlar tamamsa konteyner tabanlı bir kurulum klasik kurulum kadar sağlam çalışır; eksikse hiçbir kurulum yöntemi sizi kurtarmaz.
Kapanış#
Mailu, mail sunucusunu tekrarlanabilir bir yapıya dönüştürür: yapılandırma tek dosyada, veri tek dizinde, yükseltme tek etiket değişiminde toplanır. Aklınızda dört alışkanlık kalsın: mailu.env ve ROOT dizinini birlikte yedekleyin (DKIM anahtarları dahil), imaj etiketini asla latest bırakmayın, konteyner içinde yaptığınız değişikliklerin kalıcı olmadığını unutmayın ve ters proxy arkasındaysanız gerçek istemci IP'sinin loglara doğru yansıdığından emin olun. Kurulum yöntemi ne olursa olsun PTR, SPF, DKIM ve DMARC dörtlüsü teslimatın ön koşuludur.
Docker çalıştırabileceğiniz tam root erişimli bir zemin için VDS ve sanal sunucu paketlerimize, ölçeklenebilir bir altyapı için bulut sunucu seçeneğimize bakabilirsiniz. Kurulumla hiç uğraşmadan gönderime başlamak isterseniz hazır yapılandırılmış SMTP sunucu paketlerimiz, kurumsal posta kutuları için e-posta çözümlerimiz var; konteyner bakımını, yedeklemeyi ve izlemeyi devretmek isterseniz sunucu yönetimi hizmetimiz bunları üstlenir.