Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung E-Mail / Mailserver 05.07.2026 · 9 min Lesezeit

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

Schwarzer Rackserver im Rechenzentrum, auf dem ein Stapel unbeschrifteter weißer Briefumschläge liegt

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

  1. 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
  2. Docker Engine 20.10+ und Docker Compose v2 (Plugin, nicht das veraltete docker-compose v1) – falls noch nicht installiert, siehe Docker und Docker Compose auf Linux installieren
  3. RAM: mindestens 1 GB ohne ClamAV, mindestens 2 GB mit ClamAV (ENABLE_CLAMAV=1)
  4. Eigene Domain mit Zugriff auf die DNS-Verwaltung (für MX, SPF, DKIM, DMARC und PTR-Record)
  5. Offene Ports 25, 465, 587 und 993 – sowohl in der Server-Firewall als auch beim Hoster freigeschaltet
  6. TLS-Zertifikat für die Mail-Domain, z. B. via Let's Encrypt/Certbot – Anleitung: Let's Encrypt mit certbot
  7. Reverse-DNS-Eintrag (PTR) der Server-IP auf den FQDN des Mailservers – beim Hoster beantragen
  8. wget oder curl sowie ein Texteditor (nano, vim oder 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.

EigenschaftWert
Imageghcr.io/docker-mailserver/docker-mailserver:16.0.1
Aktueller stabiler Releasev16.0.1 (September 2026, Basis Debian 13, Dovecot 2.4)
Architekturamd64 (x86_64) und arm64
Externe Datenbanknicht erforderlich
LizenzMIT
PortProtokollZweck
25SMTPEingehende Mails von anderen Mailservern (MX-Ziel, muss extern erreichbar sein)
465SMTPSImplicit TLS – Postausgang für Mail-Clients
587SubmissionSTARTTLS – empfohlener Postausgangsport für Endnutzer
993IMAPSIMAP mit Implicit TLS – verschlüsselter Posteingang (empfohlen)
143IMAP4IMAP 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/mailserver

Verifizieren: Der Ordner existiert und Sie befinden sich darin:

pwd
# Erwartete Ausgabe: /opt/mailserver

Schritt 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.env

Passen 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=info

Wichtig: 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=none

Schritt 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ültig

Schritt 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-TypNameWert / ZielPflicht?
MXexample.commail.example.com (Priorität 10)Pflicht
Amail.example.comIP-Adresse des ServersPflicht
TXT (SPF)example.comv=spf1 mx -allPflicht
TXT (DKIM)mail._domainkey.example.comInhalt aus mail.txt nach Setup (Schritt 6)Pflicht
TXT (DMARC)_dmarc.example.comv=DMARC1; p=quarantine; rua=mailto:dmarc@example.comEmpfohlen
PTR (Reverse DNS)Server-IPmail.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 -d

Beim ersten Start lädt ClamAV seine Signaturdatenbank (ca. 850 MB), alle Dienste initialisieren sich. Beobachten Sie den Start mit:

docker compose logs -f mailserver

Warten 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 SICHERESPASSWORT

Alias für Postmaster anlegen (empfohlen, viele Server verlangen diesen):

docker exec -it mailserver setup alias add postmaster@example.com nutzer@example.com

DKIM-Schlüsselpaar generieren:

docker exec -it mailserver setup config dkim

Der generierte öffentliche Schlüssel liegt anschließend unter:

cat /opt/mailserver/docker-data/dms/config/opendkim/keys/example.com/mail.txt

Den 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.txt

Schritt 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:

EinstellungWert
IMAP-Servermail.example.com, Port 993, SSL/TLS
SMTP-Servermail.example.com, Port 587, STARTTLS
Benutzernamevollständige E-Mail-Adresse (nutzer@example.com)
Passwortwie 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 Postfix

Schritt 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 -f

Fü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/Volume

Troubleshooting / Typische Fehler

  1. 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.
  2. Falscher Hostname / Mails werden abgelehnt: Der hostname-Wert in compose.yaml weicht vom MX-Record ab. Prüfen Sie mit docker exec mailserver hostname – der Wert muss exakt mail.example.com lauten.
  3. ClamAV-Prozess stirbt nach dem Start: Zu wenig RAM. Setzen Sie ENABLE_CLAMAV=0 bei weniger als 1,5 GB freiem Arbeitsspeicher.
  4. Fail2Ban: „Operation not permitted“ im Log: cap_add: - NET_ADMIN fehlt in der compose.yaml; Fail2Ban braucht die Capability für iptables-Regeln.
  5. 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.
  6. Fehler „do not list domain in BOTH mydestination and virtual_mailbox_domains“: Ein Alias oder Account hat denselben Wert wie der Hostname. Passen Sie $myhostname in einer postfix-main.cf-Override-Datei an.
  7. DKIM schlägt fehl / Score niedrig: Der DNS-TXT-Record für mail._domainkey.example.com fehlt oder ist noch nicht propagiert. DNS-Propagation kann bis zu 48 Stunden dauern.
  8. Kein PTR-Record / Mails landen im Spam: Reverse-DNS-Eintrag fehlt. Beim Hoster beantragen, dass die Server-IP auf mail.example.com zeigt.
  9. Open Relay: PERMIT_DOCKER wurde auf host oder network gesetzt ohne konkreten Bedarf. Standard none beibehalten – 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

  1. OpenDKIM mit Postfix einrichten: DKIM-Signatur korrekt konfigurieren
  2. Reverse DNS (PTR) und IPv6 für Mailserver korrekt einrichten
  3. DMARC-Reports verstehen und auswerten: von p=none sicher zu p=reject
  4. Mailcow komplett aufsetzen – eigener Mailserver mit Docker
  5. Let's Encrypt mit certbot – TLS-Zertifikate ohne Reverse-Proxy
  6. Docker und Docker Compose auf Linux installieren (Ubuntu/Debian)
  7. 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

Passende Anleitungen auf S-EDV

  1. netcup Local Block Storage bestellen, einrichten und unter Linux einbinden
  2. Linux-Fileserver im Active Directory: Samba als Domain Member mit NTFS-ähnlichen