Stalwart: der schlanke Mailserver in einem Container
Stalwart Mail Server mit Docker aufsetzen: SMTP, IMAP, JMAP und Spam-Filter in einem einzigen, schlanken Container – die moderne Alternative zu Mailcow.
Inhaltsverzeichnis
Ein eigener Mailserver muss nicht aus zwei Dutzend Containern bestehen. Stalwart packt den kompletten Mailserver – SMTP, IMAP, JMAP, Spam-Filter und Speicher – in einen einzigen, in Rust geschriebenen Container. Das macht ihn schlank, schnell und wartungsarm: die moderne, leichtgewichtige Alternative zu Schwergewichten wie Mailcow.
Mailserver bleiben anspruchsvoll – egal wie schlank
Was bauen wir?
Am Ende läuft Stalwart 0.16.14 als einzelner Docker-Container auf deinem Server und stellt alles bereit, was ein vollwertiger Mailserver braucht:
- SMTP (Senden/Empfangen) auf den Ports 25, 465 und 587,
- IMAP (993) und das moderne JMAP für schnelle, effiziente Clients,
- ManageSieve (4190) für serverseitige Filterregeln,
- einen eingebauten Spam- und Phishing-Filter (kein separater Rspamd/ClamAV nötig),
- einen integrierten Speicher (RocksDB) – keine externe Datenbank,
- eine moderne Weboberfläche zur Verwaltung von Domains, Konten und Einstellungen.
Der große Unterschied zu Mailcow: Es ist ein Prozess, ein Container, wenige Hundert Megabyte Image. Das senkt RAM-Bedarf, Angriffsfläche und Wartungsaufwand deutlich. Getestet mit Docker 29 auf Debian 13.
Warum lohnt sich der schlanke Ansatz? Ein klassischer Mailserver-Stack besteht aus einem guten Dutzend Diensten – Postfix, Dovecot, Rspamd, ein Datenbankserver, ein Virenscanner, Redis, ein Webserver – die alle einzeln laufen, aktualisiert und aufeinander abgestimmt werden müssen. Jeder davon ist eine potenzielle Fehlerquelle und ein Stück Angriffsfläche. Stalwart bündelt dieselbe Funktionalität in einer einzigen, in Rust geschriebenen Anwendung. Rust bringt zudem Speichersicherheit von Haus aus mit – für eine Software, die ungefiltert Daten aus dem ganzen Internet entgegennimmt, ist das ein echtes Sicherheitsargument.
Voraussetzungen
- Ein eigener Server mit Debian 13 und installiertem Docker, auf dem die Mail- und Web-Ports frei sind (kein Reverse Proxy, der 25/443 belegt).
- Eine Domain, deren DNS du selbst steuerst – für den A-Record des Mailservers und den MX-Record.
- Port 25 ausgehend muss offen sein. Viele Provider sperren ihn gegen Spam; bei netcup schaltest du ihn per Support-Ticket frei. Ohne offenen Port 25 kannst du keine Mails an fremde Server zustellen.
- Ein PTR-/Reverse-DNS-Eintrag für die Server-IP (im netcup-SCP), der auf deinen Mail-Hostnamen zeigt.
Stalwart ist genügsam – für den Einstieg reicht ein kleiner Server. Wie viel dein Setup insgesamt braucht, schätzt dir der Server-Rechner.
VPS 1000 G12
4 vCore · 8 GB RAM · 256 GB NVMe
ab 10,36 €/Monat
Stalwart ist schlank – der VPS 1000 reicht für den Einstieg gut aus.
💶 5 € Gutschein für netcup-Neukunden:36nc17844976032
(nur Neukunden, keine Domains)
Schritt für Schritt
Schritt 1: DNS-Records anlegen
Richte zuerst die DNS-Einträge ein – sie brauchen Zeit zum Propagieren. DEINE_DOMAIN ist deine
Mail-Domain, DEINE_SERVER_IP die IPv4-Adresse des Servers:
mail.DEINE_DOMAIN. A DEINE_SERVER_IP
DEINE_DOMAIN. MX 10 mail.DEINE_DOMAIN.Der MX-Record verweist andere Mailserver an mail.DEINE_DOMAIN. Dieser Hostname ist die
Identität deines Servers. SPF, DKIM und DMARC ergänzen wir im Zustellbarkeits-Tutorial – die
DKIM-Schlüssel erzeugt Stalwart im Setup selbst.
Schritt 2: Die compose.yaml schreiben
Lege einen Ordner an und wechsle hinein:
mkdir -p /opt/stalwart && cd /opt/stalwartErstelle die Datei compose.yaml:
services:
stalwart:
image: stalwartlabs/stalwart:v0.16.14
container_name: stalwart
restart: unless-stopped
ports:
- "25:25" # SMTP (Server-zu-Server)
- "465:465" # SMTPS (Senden, implizites TLS)
- "587:587" # Submission (Senden, STARTTLS)
- "143:143" # IMAP
- "993:993" # IMAPS
- "4190:4190" # ManageSieve
- "8080:8080" # Weboberfläche & JMAP (Ersteinrichtung)
- "443:443" # HTTPS (nach der Einrichtung, eigenes Zertifikat)
volumes:
- stalwart_data:/opt/stalwart
volumes:
stalwart_data:Das Wichtigste: ein Service, ein Volume für alle Daten. Stalwart holt sich sein TLS-Zertifikat später selbst per Let’s Encrypt – einen separaten Reverse Proxy brauchst du dafür nicht. Achte darauf, dass Port 443 auf dem Host frei ist (Stalwart nutzt ihn auch für den Zertifikatsabruf, siehe Schritt 4).
Schritt 3: Den Container starten und das Startpasswort holen
Starte Stalwart:
docker compose up -dBeim allerersten Start läuft Stalwart im Bootstrap-Modus: Es gibt noch keine Konfiguration, und Port 8080 ist für die Ersteinrichtung offen. Dabei erzeugt es ein einmaliges Administrator-Passwort, das du aus den Logs abliest:
docker compose logs | grep -A2 "temporary administrator"🔑 Stalwart bootstrap mode - temporary administrator account
password: <EINMAL-PASSWORT>Notiere dieses Passwort – es wird nur einmal angezeigt. (Wenn du lieber ein festes Passwort
setzt, kannst du in der compose.yaml unter environment: ein
STALWART_RECOVERY_ADMIN=admin:DEIN_PASSWORT hinterlegen.)
Schritt 4: Anmelden und den Einrichtungs-Assistenten durchlaufen
Rufe die Weboberfläche im Browser auf: http://DEINE_SERVER_IP:8080/admin. Du landest auf der
Anmeldung. Melde dich als Benutzer admin mit dem Einmal-Passwort aus Schritt 3 an – die
Eingabe erfolgt in zwei Schritten (erst Benutzername, dann Passwort):

Nach der Anmeldung begrüßt dich der Einrichtungs-Assistent. Im ersten Schritt legst du die Server-Identität fest:
- Server Hostname:
mail.DEINE_DOMAIN– der FQDN aus deinem A-Record. - Default Email Domain:
DEINE_DOMAIN– deine Mail-Domain. - Automatically Obtain TLS Certificate aktiviert lassen – Stalwart holt das Let’s-Encrypt-Zertifikat selbst. Dafür muss Port 443 von außen erreichbar sein: Stalwart nutzt standardmäßig die TLS-ALPN-01-Challenge über 443, Port 80 braucht es dafür nicht.
- Generate Email Signing Keys aktiviert lassen – das erzeugt gleich deine DKIM-Schlüssel.

Klick dich durch die weiteren Schritte des Assistenten:
- Speicher (Storage): Die Voreinstellung RocksDB ist ein eingebetteter Schlüssel-Wert-Speicher und für Einzelserver-Setups perfekt – kein externer Datenbankserver nötig. Nur für große, geclusterte Installationen greifst du zu PostgreSQL o. Ä.
- Verzeichnis (Directory): Das interne Verzeichnis verwaltet Konten und Passwörter direkt in Stalwart. Wer bereits ein zentrales LDAP/Active Directory betreibt, kann es hier stattdessen anbinden – für den Einstieg bleibst du beim internen Verzeichnis.
- Logging: Legt fest, wie ausführlich Stalwart protokolliert.
Infoist im Alltag ein guter Kompromiss; bei Problemen drehst du kurzzeitig aufDebug. - DNS: Für den Anfang genügt die manuelle Verwaltung – die anzulegenden Records zeigt dir Stalwart später unter der jeweiligen Domain an.
Zum Abschluss erzeugt Stalwart dein dauerhaftes Administrator-Konto und zeigt dessen Passwort ein einziges Mal an – schreib es dir sofort weg. Ab jetzt ist der Bootstrap-Modus beendet und Port 8080 nicht mehr offen für die Einrichtung; die Konsole erreichst du künftig über HTTPS.
Schon ein Reverse Proxy im Einsatz?
Schritt 5: Domain und erstes Postfach anlegen
Nach dem Setup bist du in der Verwaltungskonsole. Über die linke Navigation erreichst du Directory → Domains und Directory → Accounts. Lege bei Bedarf weitere Domains an und dann dein erstes Postfach:

Über Create account (bzw. Konto anlegen) legst du ein Postfach an – E-Mail-Adresse, angezeigter Name und ein starkes Passwort (Passwortmanager!). Dieses Konto kann sich anschließend per IMAP/JMAP und SMTP anmelden:

Schritt 6: In einem Mailprogramm einrichten
Trage das neue Konto in deinem Mailprogramm ein. Stalwart unterstützt Autodiscovery, meist reicht also E-Mail-Adresse und Passwort. Manuell nutzt du:
IMAP: mail.DEINE_DOMAIN, Port 993, SSL/TLS
SMTP: mail.DEINE_DOMAIN, Port 587, STARTTLS
Benutzer: die volle E-Mail-AdresseNeben dem altbewährten IMAP spricht Stalwart auch JMAP – ein modernes, JSON-basiertes Protokoll, das für heutige Netze entworfen wurde. JMAP überträgt nur echte Änderungen statt ganze Ordner neu zu synchronisieren, kommt mit einer einzigen Verbindung aus und ist damit spürbar sparsamer mit Akku und Datenvolumen – gerade auf dem Handy. Unterstützt dein Mail-Client JMAP (z. B. die Thunderbird-Familie in neueren Versionen), profitierst du direkt davon; ansonsten bleibst du bei IMAP, das genauso funktioniert.
Eine Mail von dir an dich selbst sollte sofort im Posteingang landen – das beweist, dass lokale Zustellung, IMAP und SMTP stehen. Der Härtetest ist aber das Senden nach außen und der Empfang von außen, und da entscheidet die Zustellbarkeit.
Hinweis
Schritt 7: Spam-Filter und Sieve-Regeln
Ein großer Vorteil von Stalwart: Der Spam- und Phishing-Filter ist bereits eingebaut und aktiv – du musst keinen separaten Rspamd-Container betreiben und pflegen. Er bewertet eingehende Mails anhand zahlreicher Merkmale (Reputation, SPF/DKIM/DMARC-Ergebnis, Inhaltsheuristiken) und markiert oder blockiert Verdächtiges. In der Konsole unter Settings → Spam Filter kannst du die Empfindlichkeit anpassen und Absender auf Allow- oder Blocklisten setzen.
Für eigene Regeln beim Ein- und Ausgang unterstützt Stalwart Sieve – die standardisierte Filtersprache. Damit sortierst du z. B. Newsletter automatisch in einen Ordner oder leitest bestimmte Absender weiter. Sieve-Skripte verwaltest du serverseitig (über ManageSieve auf Port 4190) oder direkt in der Weboberfläche, sodass die Regeln unabhängig vom Mailprogramm greifen – auch dann, wenn dein Rechner aus ist.
Tipp
Wenn es nicht funktioniert
Die Weboberfläche auf Port 8080 antwortet nicht. Der Container ist noch am Hochfahren oder Port
8080 ist belegt/geblockt. docker compose ps prüfen, docker compose logs lesen und
sicherstellen, dass die Firewall Port 8080 (und später 443)
durchlässt.
Ich habe das Bootstrap-Passwort verpasst. Es wird nur einmal geloggt. Setze in der
compose.yaml ein STALWART_RECOVERY_ADMIN=admin:DEIN_PASSWORT unter environment: und starte
mit docker compose up -d neu – damit hast du ein festes Recovery-Admin-Konto.
Kein TLS-Zertifikat, die HTTPS-Adresse zeigt eine Warnung. Let’s Encrypt erreicht deinen Server
nicht auf Port 443 (Stalwart nutzt die TLS-ALPN-01-Challenge über 443), oder der A-Record von
mail.DEINE_DOMAIN stimmt nicht. A-Record prüfen und Port 443 in der Firewall öffnen – Stalwart
wiederholt die Zertifikatsanforderung danach automatisch.
Mails nach außen bleiben hängen, Logs zeigen Timeouts auf Port 25. Dein Provider sperrt ausgehenden SMTP-Verkehr auf Port 25. Port 25 ausgehend beim Provider freischalten lassen (bei netcup per Ticket). Ohne das ist keine Zustellung an fremde Server möglich.
Andere Server nehmen deine Mails nicht an oder sie landen im Spam. Fehlender oder falscher PTR-Eintrag, kein SPF/DKIM/DMARC. Das ist kein Fehler von Stalwart, sondern Sache der DNS-/Reputations-Konfiguration – siehe das Zustellbarkeits-Tutorial.
Wartung & Backups
Updates. Stalwart ist ein einzelner Container – ein Update ist entsprechend einfach:
cd /opt/stalwart
docker compose pull && docker compose up -dLies vor größeren Sprüngen die Release-Notes auf
GitHub; bleib bei einem konkreten Versions-Tag
(wie hier v0.16.14) statt latest, damit Updates reproduzierbar bleiben.
Backups. Alle Daten – Nachrichten, Konten, Konfiguration und die DKIM-Schlüssel – liegen im
Volume stalwart_data. Sichere dieses Volume regelmäßig weg vom Server, am saubersten verschlüsselt
mit restic. Weil Stalwart die Daten im laufenden Betrieb
schreibt, sicherst du am konsistentesten, indem du den Container kurz stoppst
(docker compose stop), das Volume sicherst und wieder startest. Die DKIM-Schlüssel sind besonders
wichtig: Gehen sie verloren, brechen nach einer Wiederherstellung deine Signaturen, bis du die
DNS-Records neu setzt. Ein Backup, das du nie zurückgespielt hast, ist nur ein Hoffnungswert –
teste die Wiederherstellung einmal auf einem Testsystem.
Reputation im Blick behalten. Prüfe gelegentlich, ob deine Server-IP auf einer Blockliste gelandet ist, und wirf einen Blick in die Stalwart-Konsole unter Observability. Ein kompromittiertes Postfach, das Spam verschickt, ruiniert die Reputation deiner ganzen Domain schnell.
Feedback per E-Mail: feedback@serverkueche.de
Das könnte dir auch schmecken

Eigener Mailserver mit Mailcow: Setup von Grund auf
Mailcow (dockerized) auf einem eigenen Server aufsetzen: Postfix, Dovecot, Rspamd und SOGo-Webmail unter deiner Domain – …

E-Mail-Zustellbarkeit: SPF, DKIM, DMARC und PTR richtig setzen
Damit deine selbstgehosteten Mails im Posteingang landen statt im Spam: Reverse DNS, SPF, DKIM und DMARC Schritt für …

Die eigene Website mit Hugo hosten – wie die Serverküche selbst
Statische Website mit Hugo bauen und im Docker-Container hinter Traefik ausliefern – schnell, sicher, ohne Datenbank. …