Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung E-Mail / Mailserver 05.07.2026 · 10 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 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.

docker mailserver mit Docker installieren: Vollständiger eigener Mailserver mit Docker Container, SMTP, IMAP, DKIM, SPF, DMARC, TLS Verschlüsselung, mehreren Domains und sicherem Self Hosting für professionelle E Mail Kommunikation.

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

  1. Linux-Server (Ubuntu 22.04/24.04 oder Debian 12 empfohlen) mit statischer öffentlicher IP-Adresse
  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

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.

EigenschaftWert
Imageghcr.io/docker-mailserver/docker-mailserver:latest
Aktueller stabiler Releasev15.1.0 (August 2025)
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

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/mailserver

Verifizieren: Der Ordner existiert und du befindest dich darin:

pwd
# Erwartete Ausgabe: /opt/mailserver

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

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

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

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

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

Der 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 mailserver

Warte, 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 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 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.txt

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

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

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

Fü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/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üfe mit docker exec mailserver hostname – der Wert muss exakt mail.example.com lauten.
  3. ClamAV-Prozess stirbt nach dem Start: Zu wenig RAM. ClamAV benötigt ca. 850 MB für die Signaturdatenbank. Setze 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 muss iptables-Regeln schreiben können – die Capability ist Pflicht.
  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. Passe $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. 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

  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 v15.1.0: github.com/docker-mailserver

Passende Anleitungen auf S-EDV

  1. netcup Local Block Storage bestellen, einrichten und unter Linux einbinden
  2. Linux-Kernel CVE-2026-23111: Ein-Zeichen-Fehler in nf_tables ermöglicht lokale R
  3. Linux-Fileserver im Active Directory: Samba als Domain Member mit NTFS-ähnlichen