docker-mailserver mit Docker installieren: Vollständiger eigener Mailserver (SMTP/IMAP/DKIM)
docker-mailserver bündelt Postfix, Dovecot, DKIM, Rspamd und Fail2Ban in einem einzigen Docker-Container – ohne externe Datenbank. Diese Anleitung führt dich Schritt für Schritt durch Installation, DNS-Konfiguration und DKIM-Einrichtung bis zu einem produktionsreifen Mailserver.

Wer seine E-Mails selbst hosten möchte, steht vor einer Wahl: entweder ein komplexer Multi-Container-Stack aus vielen Einzelkomponenten oder ein Projekt, das alles in einem einzigen Container bündelt. docker-mailserver geht den zweiten Weg – und macht ihn erstaunlich gut. Mit über 18.000 GitHub-Stars ist es das meistgenutzte Projekt seiner Art: Postfix für SMTP, Dovecot für IMAP, OpenDKIM, OpenDMARC, Rspamd als modernen Spam-Filter sowie Fail2Ban gegen Brute-Force-Angriffe – alles ohne externe Datenbank, ohne Redis, ohne PostgreSQL. Konfiguration läuft dateibasiert. Diese Anleitung richtet sich an Systemadministratoren und technisch versierte Selfhoster, die einen vollständigen, produktionsbereiten E-Mail-Server für eigene Domains auf einem Linux-Server betreiben möchten.
Voraussetzungen
- Linux-Server (Ubuntu 22.04/24.04 oder Debian 12 empfohlen) mit statischer öffentlicher IP-Adresse
- Docker Engine 20.10+ und Docker Compose v2 (Plugin, nicht das veraltete
docker-composev1) – falls noch nicht installiert, siehe Docker und Docker Compose auf Linux installieren - RAM: mindestens 1 GB ohne ClamAV, mindestens 2 GB mit ClamAV (
ENABLE_CLAMAV=1) - Eigene Domain mit Zugriff auf die DNS-Verwaltung (für MX, SPF, DKIM, DMARC und PTR-Record)
- Offene Ports 25, 465, 587 und 993 – sowohl in der Server-Firewall als auch beim Hoster freigeschaltet
- TLS-Zertifikat für die Mail-Domain, z. B. via Let's Encrypt/Certbot – Anleitung: Let's Encrypt mit certbot
- Reverse-DNS-Eintrag (PTR) der Server-IP auf den FQDN des Mailservers – beim Hoster beantragen
wgetodercurlsowie ein Texteditor (nano,vimoder VS Code) auf dem Server
Schritt 1: Eckdaten und Projektordner anlegen
Verschaffe dir zunächst einen Überblick über das Image und die wichtigsten Ports. docker-mailserver nutzt als primäre Registry GitHub Container Registry (ghcr.io), Docker Hub ist als Spiegel verfügbar.
| Eigenschaft | Wert |
|---|---|
| Image | ghcr.io/docker-mailserver/docker-mailserver:latest |
| Aktueller stabiler Release | v15.1.0 (August 2025) |
| Architektur | amd64 (x86_64) und arm64 |
| Externe Datenbank | nicht erforderlich |
| Lizenz | MIT |
| Port | Protokoll | Zweck |
|---|---|---|
| 25 | SMTP | Eingehende Mails von anderen Mailservern (MX-Ziel, muss extern erreichbar sein) |
| 465 | SMTPS | Implicit TLS – Postausgang für Mail-Clients |
| 587 | Submission | STARTTLS – empfohlener Postausgangsport für Endnutzer |
| 993 | IMAPS | IMAP mit Implicit TLS – verschlüsselter Posteingang (empfohlen) |
| 143 | IMAP4 | IMAP mit STARTTLS – optional, in compose.yaml auskommentiert |
Lege nun den Projektordner an. Alle Datenpfade liegen unterhalb von ./docker-data/dms/ – Docker legt sie beim ersten Start automatisch an:
sudo mkdir -p /opt/mailserver
cd /opt/mailserverVerifizieren: Der Ordner existiert und du befindest dich darin:
pwd
# Erwartete Ausgabe: /opt/mailserverSchritt 2: Konfigurationsdatei mailserver.env anlegen
docker-mailserver wird primär über eine mailserver.env-Datei konfiguriert. Lade die offizielle Vorlage herunter und passe sie anschließend an deine Domain an:
wget https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/mailserver.envÖffne die Datei mit einem Editor und passe die folgenden Schlüsselwerte an. Die meisten Einstellungen bleiben auf den sicheren Standardwerten – ändere nur, was du bewusst aktivieren möchtest:
# Zeitzone (AREA/ZONE-Format)
TZ=Europe/Berlin
# TLS-Methode: letsencrypt für Produktion (Pflicht!)
SSL_TYPE=letsencrypt
# Postmaster-Adresse für Systemmeldungen
POSTMASTER_ADDRESS=postmaster@example.com
# Spam-Filter: Rspamd ist der moderne Weg (ersetzt SpamAssassin)
ENABLE_RSPAMD=1
# Antivirus – benötigt ~850 MB RAM; bei < 1,5 GB freiem RAM auf 0 setzen
ENABLE_CLAMAV=1
# Brute-Force-Schutz – erfordert cap_add: NET_ADMIN in compose.yaml
ENABLE_FAIL2BAN=1
# DKIM und DMARC bleiben aktiv (Standard: 1)
ENABLE_OPENDKIM=1
ENABLE_OPENDMARC=1
# Relay-Verhalten: none = nur authentifizierte Clients (sicher, Standard)
# ACHTUNG: jeden anderen Wert nur bewusst setzen – falsch konfiguriert = Open Relay!
PERMIT_DOCKER=none
# Log-Verbosität
LOG_LEVEL=infoWichtig: Ersetze example.com überall durch deine echte Domain. Setze ENABLE_CLAMAV=0, wenn dein Server weniger als 1,5 GB freien RAM hat.
Verifizieren:
grep -E "^SSL_TYPE|^ENABLE_RSPAMD|^PERMIT_DOCKER" mailserver.env
# Erwartete Ausgabe:
# SSL_TYPE=letsencrypt
# ENABLE_RSPAMD=1
# PERMIT_DOCKER=noneSchritt 3: compose.yaml erstellen
Erstelle die compose.yaml im Projektordner. Der hostname-Wert ist kritisch: Er muss exakt mit dem FQDN übereinstimmen, den du später als MX-Record einträgst – abweichende Werte führen dazu, dass Mails abgelehnt werden.
services:
mailserver:
image: ghcr.io/docker-mailserver/docker-mailserver:latest
container_name: mailserver
# FQDN muss exakt dem MX-DNS-Record entsprechen
hostname: mail.example.com
ports:
- "25:25" # SMTP (eingehend, MX-Ziel)
- "465:465" # SMTPS Implicit TLS
- "587:587" # Submission STARTTLS
- "993:993" # IMAPS Implicit TLS
# - "143:143" # IMAP4 optional
volumes:
- ./docker-data/dms/mail-data/:/var/mail/
- ./docker-data/dms/mail-state/:/var/mail-state/
- ./docker-data/dms/mail-logs/:/var/log/mail/
- ./docker-data/dms/config/:/tmp/docker-mailserver/
- /etc/localtime:/etc/localtime:ro
# Gesamten /etc/letsencrypt-Ordner mounten – Symlinks zeigen auf archive/!
- /etc/letsencrypt:/etc/letsencrypt:ro
env_file:
- mailserver.env
# Fail2Ban benötigt NET_ADMIN zum Schreiben von iptables-Regeln
cap_add:
- NET_ADMIN
restart: always
stop_grace_period: 1m
healthcheck:
test: ["CMD", "ss", "-lntp", "|", "grep", "-q", "smtp"]
interval: 60s
timeout: 10s
retries: 3
start_period: 90sPasse mail.example.com auf deinen tatsächlichen FQDN an. Falls du noch kein Let's-Encrypt-Zertifikat hast, setze vorübergehend SSL_TYPE=self-signed in der mailserver.env zum Testen – für den Produktionsbetrieb ist letsencrypt Pflicht.
Verifizieren: Prüfe die YAML-Syntax mit:
docker compose config --quiet && echo "YAML gültig"
# Erwartete Ausgabe: YAML gültigSchritt 4: DNS-Records konfigurieren
Bevor du den Container startest, müssen die notwendigen DNS-Records gesetzt sein – zumindest MX und SPF. Ohne korrekten DNS-Aufbau werden Mails von anderen Servern abgewiesen oder landen im Spam.
| Record-Typ | Name | Wert / Ziel | Pflicht? |
|---|---|---|---|
| MX | example.com | mail.example.com (Priorität 10) | Pflicht |
| A | mail.example.com | IP-Adresse des Servers | Pflicht |
| TXT (SPF) | example.com | v=spf1 mx -all | Pflicht |
| TXT (DKIM) | mail._domainkey.example.com | Inhalt aus mail.txt nach Setup (Schritt 6) | Pflicht |
| TXT (DMARC) | _dmarc.example.com | v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com | Empfohlen |
| PTR (Reverse DNS) | Server-IP | mail.example.com (beim Hoster beantragen) | Pflicht |
Den PTR/Reverse-DNS-Record musst du bei deinem Hosting-Anbieter oder Rechenzentrum beantragen – er lässt sich nicht selbst in der Domain-DNS-Verwaltung eintragen. Hintergründe dazu findest du in der Anleitung Reverse DNS (PTR) und IPv6 für Mailserver korrekt einrichten.
Verifizieren: Prüfe MX- und SPF-Record mit MXToolbox oder direkt per Kommandozeile (nach DNS-Propagation, kann bis zu 24 h dauern):
dig MX example.com +short
# Erwartete Ausgabe: 10 mail.example.com.
dig TXT example.com +short
# Erwartete Ausgabe (unter anderem): "v=spf1 mx -all"Schritt 5: Container starten
Starte den Mailserver-Container im Hintergrund:
cd /opt/mailserver
docker compose up -dDer erste Start dauert länger – ClamAV lädt seine Signaturdatenbank herunter (ca. 850 MB), und alle Dienste initialisieren sich. Beobachte den Startprozess mit:
docker compose logs -f mailserverWarte, bis Postfix, Dovecot und – sofern aktiviert – ClamAV und Rspamd vollständig gestartet sind. Abbruch mit Strg+C.
Verifizieren:
docker compose ps
# Erwartete Ausgabe (nach ca. 90 Sekunden):
# NAME IMAGE STATUS
# mailserver ghcr.io/docker-mailserver/docker-mailserver Up (healthy)
# Prüfe, ob SMTP-Port lauscht:
ss -lntp | grep :25
# Erwartete Ausgabe: LISTEN 0 ... *:25 ...Schritt 6: E-Mail-Konto anlegen und DKIM einrichten
Nach dem Start muss sofort mindestens ein E-Mail-Konto angelegt werden – der Container ist ohne Konten betriebsbereit, aber nicht funktional für den Empfang.
E-Mail-Konto anlegen:
docker exec -it mailserver setup email add nutzer@example.com SICHERESPASSWORTAlias für Postmaster anlegen (empfohlen, viele Server verlangen diesen):
docker exec -it mailserver setup alias add postmaster@example.com nutzer@example.comDKIM-Schlüsselpaar generieren:
docker exec -it mailserver setup config dkimDer generierte öffentliche Schlüssel liegt anschließend unter:
cat /opt/mailserver/docker-data/dms/config/opendkim/keys/example.com/mail.txtDen kompletten Inhalt dieser Datei trägst du als DNS-TXT-Record unter mail._domainkey.example.com ein (siehe Schritt 4, Tabelle). Beachte: DNS-Propagation kann bis zu 48 Stunden dauern – DKIM-Validierung funktioniert erst danach zuverlässig. Details zur DKIM-Konfiguration mit Postfix findest du in der Anleitung OpenDKIM mit Postfix einrichten.
Verifizieren:
# Kontenliste prüfen:
docker exec -it mailserver setup email list
# Erwartete Ausgabe: nutzer@example.com
# DKIM-Key-Datei vorhanden:
ls /opt/mailserver/docker-data/dms/config/opendkim/keys/example.com/
# Erwartete Ausgabe: mail.private mail.txtSchritt 7: Mailkonfiguration testen
Nach DNS-Propagation (MX, SPF, DKIM, PTR) testest du die Gesamtkonfiguration mit dem Online-Werkzeug mail-tester.com: Sende eine Testmail von deinem neuen Mailserver an die angezeigte Einmal-Adresse und prüfe den Score. Ein Score von 8/10 oder besser zeigt eine korrekte Konfiguration an. Ergänzend kannst du MXToolbox.com für eine vollständige DNS-Record-Prüfung nutzen.
Verbinde dich probeweise mit einem IMAP-Client (z. B. Thunderbird) mit diesen Einstellungen:
| Einstellung | Wert |
|---|---|
| IMAP-Server | mail.example.com, Port 993, SSL/TLS |
| SMTP-Server | mail.example.com, Port 587, STARTTLS |
| Benutzername | vollständige E-Mail-Adresse (nutzer@example.com) |
| Passwort | wie in Schritt 6 gesetzt |
Verifizieren:
# IMAPS-Port von außen erreichbar:
curl -v imaps://mail.example.com --ssl-reqd -u nutzer@example.com:PASSWORT 2>&1 | head -20
# Erwartete Ausgabe: Verbindungsaufbau, TLS-Handshake, Zertifikatsdaten
# SMTP-Submission prüfen:
curl -v smtp://mail.example.com:587 2>&1 | head -10
# Erwartete Ausgabe: 220 mail.example.com ESMTP PostfixSchritt 8: Updates durchführen
docker-mailserver wird aktiv gepflegt – regelmäßige Updates schließen Sicherheitslücken in Postfix, ClamAV-Signaturen und allen integrierten Diensten. Das Standard-Update-Vorgehen mit Docker Compose:
cd /opt/mailserver
docker compose pull
docker compose up -d
# Alte Images aufräumen:
docker image prune -fFür automatische Update-Benachrichtigungen kannst du Diun oder WUD nutzen – diese informieren dich, wenn ein neues Image verfügbar ist, ohne automatisch zu deployen.
Verifizieren:
docker compose ps
# STATUS-Spalte: Up (healthy)
docker compose logs --tail=20 mailserver
# Keine Fehler zu Image/Port/VolumeTroubleshooting / Typische Fehler
- Port 25 nicht erreichbar: Viele Cloud-Anbieter (Hetzner, AWS, DigitalOcean) blockieren Port 25 standardmäßig. Lösung: Entsperrung beim Support beantragen oder einen SMTP-Relay-Dienst (Mailgun, SendGrid) als Ausgangsgateway konfigurieren.
- Falscher Hostname / Mails werden abgelehnt: Der
hostname-Wert incompose.yamlweicht vom MX-Record ab. Prüfe mitdocker exec mailserver hostname– der Wert muss exaktmail.example.comlauten. - ClamAV-Prozess stirbt nach dem Start: Zu wenig RAM. ClamAV benötigt ca. 850 MB für die Signaturdatenbank. Setze
ENABLE_CLAMAV=0bei weniger als 1,5 GB freiem Arbeitsspeicher. - Fail2Ban: „Operation not permitted" im Log:
cap_add: - NET_ADMINfehlt in dercompose.yaml. Fail2Ban muss iptables-Regeln schreiben können – die Capability ist Pflicht. - SSL_TYPE=letsencrypt, Zertifikat nicht gefunden: Nur
/etc/letsencrypt/live/gemountet, aber Let's-Encrypt-Zertifikate sind Symlinks auf/etc/letsencrypt/archive/. Immer den gesamten/etc/letsencrypt-Ordner mounten. - Fehler „do not list domain in BOTH mydestination and virtual_mailbox_domains": Ein Alias oder Account hat denselben Wert wie der Hostname. Passe
$myhostnamein einerpostfix-main.cf-Override-Datei an. - DKIM schlägt fehl / Score niedrig: Der DNS-TXT-Record für
mail._domainkey.example.comfehlt oder ist noch nicht propagiert. DNS-Propagation kann bis zu 48 Stunden dauern. - Kein PTR-Record / Mails landen im Spam: Reverse-DNS-Eintrag fehlt. Beim Hoster beantragen, dass die Server-IP auf
mail.example.comzeigt. - Open Relay:
PERMIT_DOCKERwurde aufhostodernetworkgesetzt ohne konkreten Bedarf. Standardnonebeibehalten – jeder andere Wert öffnet potentiell ein Open Relay.
Häufige Fragen
Brauche ich eine externe Datenbank (MySQL/PostgreSQL)?
Nein. docker-mailserver ist bewusst datenbanklos gestaltet. Alle Konfigurationsdaten – Konten, Aliasse, DKIM-Schlüssel, Postfix-Overrides – werden als Textdateien im Config-Volume (/tmp/docker-mailserver/) gespeichert. Das vereinfacht Backups erheblich: Sichere einfach den gesamten ./docker-data/dms/-Ordner.
Wie lege ich weitere E-Mail-Konten und Aliasse an?
Neue Konten werden jederzeit per docker exec angelegt, ohne den Container neu zu starten: docker exec -it mailserver setup email add weitere@example.com PASSWORT. Aliasse funktionieren analog: docker exec -it mailserver setup alias add info@example.com nutzer@example.com.
Rspamd oder SpamAssassin – welchen Spam-Filter wählen?
Für neue Installationen ist Rspamd (ENABLE_RSPAMD=1) die klare Empfehlung. Rspamd ist der moderne Nachfolger, ressourceneffizienter und in neuen docker-mailserver-Setups der Standard. SpamAssassin ist das ältere System und für Migrationen von Bestandsinstallationen gedacht. Beide gleichzeitig aktivieren ist nicht vorgesehen und nicht sinnvoll.
Kann ich den Server ohne Let's Encrypt testen?
Ja. Setze SSL_TYPE=self-signed in der mailserver.env für lokale Tests – docker-mailserver generiert dann ein selbst signiertes Zertifikat. Für den Produktionsbetrieb ist SSL_TYPE=letsencrypt Pflicht: Andere Mailserver lehnen Verbindungen ohne gültiges Zertifikat ab oder stufen sie als unsicher ein.
Wie überprüfe ich die Gesamtkonfiguration meines Mailservers?
Das einfachste Werkzeug ist mail-tester.com: Sende eine Testmail an die angezeigte Adresse und prüfe den Score – 8/10 oder besser ist das Ziel. Für DNS-Records nutze MXToolbox.com (MX, SPF, DKIM, DMARC, Blacklists). Für SPF- und DMARC-Auswertung empfiehlt sich zusätzlich DMARC-Reports regelmäßig auszuwerten und schrittweise von p=none auf p=reject zu wechseln.
Wie läuft das Backup ab?
Sichere regelmäßig den gesamten Ordner /opt/mailserver/docker-data/dms/ – er enthält Postfächer, Konfiguration, DKIM-Schlüssel und Logs. Da keine externe Datenbank existiert, genügt ein einfaches Dateisystem-Backup (z. B. mit restic). Eine strukturierte Backup-Strategie findest du in der Anleitung 3-2-1-Backup-Strategie umsetzen.
Fazit
docker-mailserver ist der direkteste Weg zu einem vollständigen, produktionsbereiten Mailserver im eigenen Docker-Stack. Die Stärke liegt in der Einfachheit: ein Container, keine externe Datenbank, dateibasierte Konfiguration. Das macht Betrieb und Backup überschaubar. Die Kehrseite ist, dass ein eigener Mailserver DNS-Disziplin verlangt – PTR-Record, SPF, DKIM und DMARC müssen stimmen, sonst landen Mails beim Empfänger im Spam oder werden abgewiesen. Wer diese DNS-Hausaufgaben sorgfältig erledigt, bekommt mit docker-mailserver einen ernstzunehmenden Mail-Stack, der auch unter Last zuverlässig läuft. Für größere Teams oder Installations mit Web-Oberfläche lohnt ein Blick auf den schwergewichtigeren Mailcow-Stack – der bietet ein vollständiges Admin-Panel, ist aber deutlich komplexer im Aufbau.
Weiterführende Anleitungen und Quellen
- OpenDKIM mit Postfix einrichten: DKIM-Signatur korrekt konfigurieren
- Reverse DNS (PTR) und IPv6 für Mailserver korrekt einrichten
- DMARC-Reports verstehen und auswerten: von p=none sicher zu p=reject
- Mailcow komplett aufsetzen – eigener Mailserver mit Docker
- Let's Encrypt mit certbot – TLS-Zertifikate ohne Reverse-Proxy
- Docker und Docker Compose auf Linux installieren (Ubuntu/Debian)
- VPS absichern und härten: Anleitung mit UFW, SSH-Keys und Fail2Ban
Quellen: Docker Mailserver – Offizielle Dokumentation (latest): docker-mailserver.github.io | GitHub Repository v15.1.0: github.com/docker-mailserver