Własny serwer pocztowy krok po kroku — Debian 12, Mailcow i panel www
Własny serwer pocztowy to nie jest projekt na jedno popołudnie, ale też nie czarna magia. Największe kłopoty nie biorą się z instalacji, tylko z DNS-u i reputacji adresu IP. Dlatego ten poradnik zaczyna się od tego, co trzeba przygotować, zanim wpiszesz pierwsze apt install. Stawiamy Mailcow: kompletny zestaw Postfix, Dovecot, Rspamd i webmail SOGo z panelem administracyjnym w przeglądarce, uruchamiany z Dockera. Po drodze robimy wszystko to, czego wymaga Gmail i Microsoft, żeby nasza poczta nie lądowała w spamie.
Co przygotować przed instalacją
- Serwer: Debian 12, minimum 2 vCPU, 4 GB RAM (Mailcow z antyspamem i antywirusem chce 6 GB, przy ClamAV wyłączonym starczy 4), 40 GB dysku plus miejsce na skrzynki. W Proxmox to zwykła VM, najlepiej z dyskiem na ZFS i codziennym backupem vzdump.
- Publiczny adres IP z możliwością ustawienia rekordu odwrotnego (PTR). Bez PTR odpadasz na starcie. Adresy z hostingów domowych i wielu tanich VPS-ów są na czarnych listach, sprawdź swój na mxtoolbox.com przed zakupem.
- Otwarty port 25 na wyjściu. Część dostawców (OVH, Hetzner dla nowych kont, Azure) blokuje go domyślnie. Bez tego wyślesz pocztę tylko do siebie.
- Nazwa hosta: np.
mail.firma.pl, taka sama w PTR, w rekordzie A i w nazwie serwera.
Ustaw nazwę i zaktualizuj system:
hostnamectl set-hostname mail.firma.pl
apt update && apt full-upgrade -y
apt install -y curl git ca-certificates gnupg
timedatectl set-timezone Europe/Warsaw
DNS: rekordy, bez których poczta nie działa
Dodaj w strefie firma.pl (TTL 3600, zanim serwer ruszy, żeby zdążyło się rozpropagować):
mail.firma.pl. A 203.0.113.25
firma.pl. MX 10 mail.firma.pl.
autodiscover.firma.pl CNAME mail.firma.pl.
autoconfig.firma.pl CNAME mail.firma.pl.
firma.pl. TXT "v=spf1 mx -all"
_dmarc.firma.pl. TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@firma.pl; adkim=s; aspf=s"
PTR ustawiasz w panelu dostawcy serwera, nie w swojej strefie: 203.0.113.25 → mail.firma.pl. Rekord DKIM dodasz po instalacji, bo klucz generuje Mailcow.
Sprawdzenie:
dig +short MX firma.pl
dig +short TXT firma.pl
dig +short -x 203.0.113.25
Trzy odpowiedzi muszą się zgadzać z tym, co wpisałeś. Jeśli PTR zwraca nazwę hostingodawcy, wróć do jego panelu.
Firewall
Zanim postawisz usługi, otwórz tylko to, co potrzebne:
apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow from 203.0.113.0/24 to any port 22 proto tcp # SSH tylko z biura lub VPN
ufw allow 25,465,587/tcp # SMTP, SMTPS, submission
ufw allow 143,993/tcp # IMAP, IMAPS
ufw allow 110,995/tcp # POP3 (jeśli ktoś jeszcze używa)
ufw allow 80,443/tcp # panel, webmail, Let's Encrypt
ufw allow 4190/tcp # Sieve (filtry po stronie serwera)
ufw enable
Port 22 ograniczony do zaufanych adresów to najprostsza ochrona przed botami. Uwaga na jedną pułapkę: Docker publikuje porty kontenerów bezpośrednio w iptables, z pominięciem ufw, więc ufw chroni tu usługi hosta (SSH), a porty poczty i tak będą otwarte. Fail2ban dla SMTP, IMAP i panelu Mailcow ma wbudowany (kontener netfilter), osobno go nie instalujesz.
Docker i instalacja Mailcow
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
./generate_config.sh
Skrypt zapyta o nazwę hosta (mail.firma.pl), strefę czasową i gałąź (wybierz master, czyli stabilną). Powstaje plik mailcow.conf. Kilka ustawień, które warto zmienić przed pierwszym startem:
# mailcow.conf
SKIP_CLAMD=y # na 4 GB RAM; przy 6 GB i więcej zostaw n
ACME_CONTACT=admin@firma.pl
ADDITIONAL_SAN=autodiscover.firma.pl,autoconfig.firma.pl
Certyfikat Let's Encrypt Mailcow wystawi sam, warunek to działający rekord A i otwarty port 80. Uruchomienie:
docker compose pull
docker compose up -d
docker compose ps
Po minucie wszystkie kontenery powinny być w stanie running lub healthy. Panel jest pod https://mail.firma.pl, login admin, hasło moohoo. Pierwsza rzecz po zalogowaniu: zmiana hasła i włączenie dwuskładnikowego logowania w menu użytkownika.
Panel: domena, DKIM, skrzynki
W panelu: E-Mail → Configuration → Domains → Add domain. Podajesz firma.pl, limity rozmiaru i liczby skrzynek. Mailcow od razu generuje klucz DKIM (2048 bitów, selektor dkim). Skopiuj go z zakładki ARC/DKIM keys i dodaj do DNS:
dkim._domainkey.firma.pl. TXT "v=DKIM1; k=rsa; t=s; s=email; p=MIIBIjANBg..."
Potem Mailboxes → Add mailbox: nazwa, hasło, limit miejsca. Dla działów zamiast skrzynek współdzielonych używaj aliasów (biuro@ → kilka osób) albo skrzynek z uprawnieniami ACL w Dovecot, które ustawia się w tym samym panelu.
To samo z linii poleceń, jeśli wolisz skrypt niż klikanie (API włączasz w panelu, Access → API):
curl -s -X POST https://mail.firma.pl/api/v1/add/mailbox \
-H "X-API-Key: TWÓJ_KLUCZ" -H "Content-Type: application/json" \
-d '{"local_part":"jan.kowalski","domain":"firma.pl","name":"Jan Kowalski","password":"...","password2":"...","quota":"5120","active":"1"}'
Test dostarczalności
Zanim przeniesiesz użytkowników, wyślij wiadomość na adres z mail-tester.com i celuj w 10/10. Najczęstsze potrącenia: brak PTR, DKIM nieopublikowany, SPF z ~all zamiast -all, brak rekordu DMARC. Drugi test: wyślij do Gmaila i w wiadomości wybierz „Pokaż oryginał". Trzy pozycje SPF, DKIM i DMARC mają mieć status PASS.
# szybki podgląd, czy Rspamd podpisuje wychodzącą pocztę
docker compose logs --tail=50 rspamd-mailcow | grep -i dkim
Klienci pocztowi
Dzięki rekordom autodiscover i autoconfig Outlook, Thunderbird i telefony konfigurują się same po podaniu adresu i hasła. Ręcznie: IMAP mail.firma.pl port 993 SSL, SMTP mail.firma.pl port 587 STARTTLS, login to pełny adres e-mail. Webmail SOGo jest pod https://mail.firma.pl/SOGo; ma też kalendarz i kontakty z synchronizacją ActiveSync i CalDAV, co dla małej firmy zastępuje Exchange.
Backup i aktualizacje
Mailcow ma własny skrypt kopii, który zrzuca skrzynki, bazę i konfigurację do katalogu:
# /etc/cron.d/mailcow-backup
30 2 * * * root MAILCOW_BACKUP_LOCATION=/var/backups/mailcow /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all --delete-days 14
Ten katalog wysyłaj poza serwer: rsync na drugi host, Proxmox Backup Server albo, najprościej, cały VM przez vzdump z harmonogramem w Proxmox. Raz na kwartał zrób testowe odtworzenie na osobnej maszynie. Kopia, której nikt nie odtworzył, to nadzieja, nie backup.
Aktualizacje Mailcow to jedno polecenie, najlepiej w oknie serwisowym po backupie:
cd /opt/mailcow-dockerized && ./update.sh
Co jeszcze warto zrobić
- Monitoring: kolejka Postfixa (
docker compose exec postfix-mailcow mailq), miejsce na dysku, ważność certyfikatu. W Zabbix wystarczą trzy elementy i jeden wyzwalacz namailq > 50. - Limity wysyłki dla użytkowników w panelu (Rate limit) chronią reputację, gdy komuś wycieknie hasło.
- Logi:
docker compose logs -f postfix-mailcowpokazuje każdą sesję SMTP; przy odbiciach od Gmaila czy Microsoftu treść komunikatu mówi wprost, czego brakuje. - Migracja z poprzedniego serwera:
imapsyncprzenosi skrzynki bez udziału użytkowników, a Mailcow ma do tego gotową zakładkę Sync jobs.
Po tym przepisie masz serwer, który przechodzi testy dostarczalności, ma panel do codziennej administracji i backup, który da się odtworzyć. Reszta to pilnowanie reputacji: bez otwartego relayu, bez słabych haseł i bez masowych wysyłek z tego samego adresu.