docker-mailserver mit Docker installieren: Vollständiger eigener Mailserver (SMTP/IMAP/DKIM)
docker-mailserver bündelt Postfix, Dovecot, DKIM, Rspamd und Fail2Ban in einem Docker-Container ohne externe Datenbank. Die Anleitung führt Sie durch Installation, DNS-Konfiguration und DKIM-Einrichtung bis zum einsatzbereiten Mailserver.
Geprüft am 29.09.2026 · für docker-mailserver 16.0.1
WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Mehr dazu

docker-mailserver bündelt alle Maildienste in einem gepflegten Image: Postfix für SMTP, Dovecot für IMAP, OpenDKIM, OpenDMARC, Rspamd als Spam-Filter und Fail2Ban gegen Brute-Force-Angriffe, ohne externe Datenbank, ohne Redis, ohne PostgreSQL. Die Konfiguration läuft dateibasiert. Die Anleitung richtet sich an Administratoren, die einen produktionsbereiten Mailserver für eigene Domains auf einem Linux-Server betreiben möchten.
Voraussetzungen
- Linux-Server (Ubuntu 22.04/24.04 oder Debian 12/13 empfohlen, x86_64 oder arm64, mindestens 1 CPU-Kern, besser 2) mit statischer öffentlicher IP-Adresse und mindestens 20 GB freiem Speicher für Postfächer und Logs
- 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
docker-mailserver nutzt als primäre Registry die GitHub Container Registry (ghcr.io), Docker Hub dient als Spiegel.
| Eigenschaft | Wert |
|---|---|
| Image | ghcr.io/docker-mailserver/docker-mailserver:16.0.1 |
| Aktueller stabiler Release | v16.0.1 (September 2026, Basis Debian 13, Dovecot 2.4) |
| 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 |
Legen Sie den Projektordner an. Alle Datenpfade liegen unter ./docker-data/dms/, Docker legt sie beim ersten Start an:
sudo mkdir -p /opt/mailserver
cd /opt/mailserverVerifizieren: Der Ordner existiert und Sie befinden sich darin:
pwd
# Erwartete Ausgabe: /opt/mailserverSchritt 2: Konfigurationsdatei mailserver.env anlegen
Laden Sie die offizielle Vorlage der mailserver.env passend zur Image-Version herunter:
wget https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/v16.0.1/mailserver.envPassen Sie die folgenden Schlüsselwerte an. In der Vorlage sind SSL_TYPE leer sowie Rspamd und ClamAV ausgeschaltet. Die übrigen Einstellungen bleiben auf den sicheren Standardwerten:
# 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: Ersetzen Sie example.com überall durch Ihre echte Domain. Setzen Sie ENABLE_CLAMAV=0, wenn Ihr 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
Erstellen Sie die compose.yaml im Projektordner. Der hostname muss exakt dem FQDN (vollständiger Hostname, z. B. mail.example.com) entsprechen, den Sie als MX-Record eintragen, sonst werden Mails abgelehnt.
services:
mailserver:
image: ghcr.io/docker-mailserver/docker-mailserver:16.0.1
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 bringt das Image seit v16 selbst mit (dms-healthcheck)Ohne Let's-Encrypt-Zertifikat setzen Sie zum Testen vorübergehend SSL_TYPE=self-signed in der mailserver.env; für den Produktionsbetrieb ist letsencrypt Pflicht.
Verifizieren: Prüfen Sie die YAML-Syntax mit:
docker compose config --quiet && echo "YAML gültig"
# Erwartete Ausgabe: YAML gültigSchritt 4: DNS-Records konfigurieren
Setzen Sie vor dem Start zumindest MX und SPF. Ohne korrekte DNS-Records weisen andere Server Mails ab oder stufen sie als Spam ein.
| 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 müssen Sie bei Ihrem Hosting-Anbieter oder Rechenzentrum beantragen – er lässt sich nicht selbst in der Domain-DNS-Verwaltung eintragen. Hintergründe dazu finden Sie in der Anleitung Reverse DNS (PTR) und IPv6 für Mailserver korrekt einrichten.
Verifizieren: Prüfen Sie 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
Starten Sie den Mailserver-Container im Hintergrund:
cd /opt/mailserver
docker compose up -dBeim ersten Start lädt ClamAV seine Signaturdatenbank (ca. 850 MB), alle Dienste initialisieren sich. Beobachten Sie den Start mit:
docker compose logs -f mailserverWarten Sie, 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üfen, ob der SMTP-Port lauscht:
ss -lntp | grep :25
# Erwartete Ausgabe: LISTEN 0 ... *:25 ...Schritt 6: E-Mail-Konto anlegen und DKIM einrichten
Ohne Konto startet der Container, kann aber keine Mails zustellen. Legen Sie daher sofort mindestens ein Konto an.
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 tragen Sie 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 finden Sie 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 der DNS-Propagation (MX, SPF, DKIM, PTR) senden Sie eine Testmail an die Einmal-Adresse von mail-tester.com. Ein Score ab 8/10 zeigt eine korrekte Konfiguration; MXToolbox.com prüft ergänzend alle DNS-Records.
Verbinden Sie sich 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
Updates schließen Sicherheitslücken in Postfix und den übrigen Diensten. Tragen Sie vorher die neue Versionsnummer beim image in der compose.yaml ein und lesen Sie die Release Notes, bei Hauptversionen (etwa 15 auf 16) auch die Hinweise zu geänderten Einstellungen:
cd /opt/mailserver
docker compose pull
docker compose up -d
# Alte Images aufräumen:
docker image prune -fFür automatische Update-Benachrichtigungen können Sie Diun oder WUD nutzen – diese informieren Sie, 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üfen Sie mitdocker exec mailserver hostname– der Wert muss exaktmail.example.comlauten. - ClamAV-Prozess stirbt nach dem Start: Zu wenig RAM. Setzen Sie
ENABLE_CLAMAV=0bei weniger als 1,5 GB freiem Arbeitsspeicher. - Fail2Ban: „Operation not permitted“ im Log:
cap_add: - NET_ADMINfehlt in dercompose.yaml; Fail2Ban braucht die Capability für iptables-Regeln. - 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. Passen Sie
$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. Konten, Aliasse, DKIM-Schlüssel und Postfix-Overrides liegen als Textdateien im Config-Volume (/tmp/docker-mailserver/). Für das Backup genügt der Ordner ./docker-data/dms/.
Wie lege ich weitere E-Mail-Konten und Aliasse an?
Jederzeit per docker exec, ohne Neustart: docker exec -it mailserver setup email add weitere@example.com PASSWORT. Aliasse 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 Rspamd (ENABLE_RSPAMD=1): moderner, ressourceneffizienter und in neuen Setups Standard. SpamAssassin ist für Migrationen von Bestandsinstallationen gedacht. Beide gleichzeitig zu aktivieren ist nicht vorgesehen.
Kann ich den Server ohne Let's Encrypt testen?
Ja, mit SSL_TYPE=self-signed in der mailserver.env erzeugt docker-mailserver ein selbst signiertes Zertifikat. Im Produktionsbetrieb ist SSL_TYPE=letsencrypt Pflicht, da andere Mailserver Verbindungen ohne gültiges Zertifikat ablehnen oder als unsicher einstufen.
Wie überprüfe ich die Gesamtkonfiguration meines Mailservers?
Das einfachste Werkzeug ist mail-tester.com: Senden Sie eine Testmail an die angezeigte Adresse und prüfen Sie den Score – 8/10 oder besser ist das Ziel. Für DNS-Records nutzen Sie 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?
Sichern Sie 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 finden Sie in der Anleitung 3-2-1-Backup-Strategie umsetzen.
Fazit
docker-mailserver bietet einen vollständigen Mailserver in einem Container, ohne externe Datenbank und mit dateibasierter Konfiguration; Betrieb und Backup bleiben überschaubar. Voraussetzung ist DNS-Disziplin: Stimmen PTR, SPF, DKIM und DMARC nicht, landen Mails im Spam oder werden abgewiesen. Für größere Teams mit Web-Oberfläche bietet der Mailcow-Stack ein Admin-Panel, ist aber deutlich komplexer.
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 v16.0.1: github.com/docker-mailserver


