← Wszystkie artykuły

Własny serwer pocztowy krok po kroku — Debian 12, Mailcow i panel www

· 5 min czytania · Paweł Burzyński
LinuxPocztaMailcowDebianBezpieczeństwo

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ą

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ć

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.