SSD Nodes Learn Hosting plans →
Anleitungen Matt ConnorVon Matt Connor · Aktualisiert 2026-09-07

Stalwart auf dem VPS: Mailserver in einer Binärdatei

Stalwart bündelt SMTP, IMAP, JMAP und mehr in einer Rust-Binärdatei. Erfahren Sie, was Postfix und Dovecot ersetzt, was bleibt und wann mailcow besser passt.

Was Stalwart in einer einzigen Binärdatei bündelt

Stalwart ist ein Mailserver, den Sie als einzelne Rust-Binärdatei auf einem VPS betreiben. Derselbe Prozess stellt SMTP, IMAP, POP3, JMAP, CalDAV, CardDAV und WebDAV bereit. Außerdem enthält er einen eigenen Spamfilter, einen eigenen Nachrichtenspeicher und einen eigenen ACME-Client. Ein herkömmlicher Stack übernimmt diese Aufgaben mit Postfix, Dovecot, Rspamd, einer Datenbank für Konten und einem separaten Zertifikatstool. Stalwart ersetzt all das durch eine Service-Unit und eine Konfigurationsdatei unter /etc/stalwart/config.json.

Alle folgenden Zahlen, Einstellungsnamen und Befehle stammen aus der offiziellen Dokumentation, den Release-Seiten und dem Installationsskript von Stalwart. Sie wurden am 28 August 2026 für Release v0.16.19 geprüft, das am 24 August 2026 veröffentlicht wurde. Diese Befehle führen Sie auf Ihrem eigenen Server aus. Auf jeden Befehl folgt die Prüfung, mit der Sie feststellen, ob er erfolgreich war.

Stalwart steht unter der GNU Affero General Public License v3.0 (AGPL-3.0) und der Stalwart Enterprise License v2. Einige Funktionen sind ausschließlich für Enterprise verfügbar. Die dokumentierte Liste der HTTP-Endpunkte kennzeichnet /scim/v2/* entsprechend. Lesen Sie die Lizenzbedingungen, bevor Sie eine Bereitstellung auf eine Funktion stützen, die Sie nicht selbst getestet haben.

Eine einzige Binärdatei reduziert die Anzahl der beteiligten Komponenten tatsächlich. Sie reduziert jedoch nicht die beiden Faktoren, die darüber entscheiden, ob Ihre E-Mail zugestellt wird.

Port 25 und die DNS-Reputation hängen nicht davon ab, welche Software Sie verwenden

Der ausgehende TCP-Port 25 ist die erste Hürde. Viele VPS-Anbieter blockieren ihn bei neuen Konten standardmäßig. Ein blockierter Port 25 bedeutet, dass Ihr Server mit sich selbst, aber mit keinem anderen System kommunizieren kann. Testen Sie das, bevor Sie etwas installieren.

sudo apt update && sudo apt install -y netcat-openbsd
nc -vz -w 5 alt1.aspmx.l.google.com 25

Ein funktionierendes Ergebnis gibt nach etwa einer Sekunde Connection to alt1.aspmx.l.google.com ... 25 port [tcp/smtp] succeeded! aus. Bei einem blockierten Port wartet der Befehl die vollen fünf Sekunden und gibt anschließend nc: connect to alt1.aspmx.l.google.com port 25 (tcp) failed: Connection timed out aus, weil die Pakete upstream verworfen werden und niemand einen Reset an Sie zurücksendet. Wenn Sie das sehen, eröffnen Sie ein Ticket bei Ihrem Anbieter. Kein Mailserver kann verworfene Pakete umgehen.

Die zweite Hürde ist die Einschätzung Ihrer IP-Adresse und Ihrer Domain durch die empfangenden Netzwerke. Dazu gehören Reverse DNS für die IP-Adresse, SPF, DKIM, DMARC und die Versandhistorie des Adressbereichs, in dem Ihre Adresse liegt. Die DNS-Einrichtungsseite von Stalwart weist ausdrücklich darauf hin, wo diese Arbeiten erfolgen: Reverse-DNS-Einträge „werden normalerweise vom Hosting-Anbieter konfiguriert, nicht von Stalwart selbst“. Das gilt auch für den restlichen Bereich. Die Konfiguration liegt in Ihrer DNS-Zone und in der Verwaltungsoberfläche Ihres Anbieters, nicht im Mailserver.

Diese Seite erklärt diese Einträge daher nicht erneut. Eine entsprechende Anleitung finden Sie hier: SPF, DKIM und DMARC einmalig für alle Mailversender einrichten. Wenn Sie noch nicht entschieden haben, ob Sie überhaupt einen eigenen Mailserver betreiben möchten, beginnen Sie mit unserer ehrlichen Einschätzung, ob selbst gehostete E-Mail weiterhin sinnvoll ist. Die Wahl von Stalwart ändert an dieser Rechnung nichts.

Was ein kleiner VPS für einen Stalwart-Mailserver benötigt

Die Systemanforderungsseite von Stalwart nennt, abgerufen am 28 August 2026, diese Werte. Der Speicherbedarf im Leerlauf liegt bei etwa 100 MB. Eine kleine Installation mit 5 bis 10 Benutzern läuft problemlos mit 1 GB RAM. Eine Konfiguration mit geringem Datenaufkommen für etwa 5 Benutzer läuft auf einem einzelnen CPU-Kern. Auf der Seite steht außerdem: „Mit zunehmender Parallelität und Aktivität sind mehr CPU-Kerne erforderlich, um eine geringe Latenz und einen hohen Durchsatz beizubehalten.“ Das Standardlimit liegt bei 8,192 gleichzeitigen Verbindungen über alle Dienste hinweg und kann konfiguriert werden.

Auf der Seite wird keine Mindestgröße für den Datenträger genannt. Legen Sie die Größe daher anhand der erwarteten aufzubewahrenden E-Mail-Menge fest und planen Sie zusätzlichen Speicherplatz für die Komprimierung des Speichers ein.

Drei Verbindungen nach außen müssen funktionieren. Andernfalls wirkt der Server aus Gründen fehlerhaft, die nichts mit E-Mail zu tun haben. Er ruft das Bundle der Weboberfläche von https://github.com/stalwartlabs/webui/releases/latest/ ab. Für Zertifikate greift er auf https://acme-v02.api.letsencrypt.org/directory zu. Für MX- und Authentifizierungs-Records benötigt er DNS über UDP und TCP auf Port 53. Eine restriktive Egress-Firewall, die die erste Verbindung blockiert, führt zu einem laufenden Mailserver ohne Administrationsoberfläche.

Eine feste Version installieren, nicht „latest“

Das offizielle Installationsprogramm ist ein Shell-Skript. Lesen Sie es, bevor Sie es ausführen.

curl --proto '=https' --tlsv1.2 -sSf https://get.stalw.art/install.sh -o install.sh
less install.sh
sudo sh install.sh

Wenn Sie dieses Skript am 28 August 2026 lesen, sehen Sie genau, was es tut. Es erstellt ein stalwart-Dienstkonto und die benötigten Verzeichnisse. Anschließend lädt es von https://github.com/stalwartlabs/stalwart/releases/latest/download herunter. Die Binärdatei wird unter /usr/local/bin/stalwart mit den Rechten 0755 abgelegt. Die Konfiguration kommt nach /etc/stalwart/config.json, die Daten nach /var/lib/stalwart und die Logs nach /var/log/stalwart. Alle drei Verzeichnisse erhalten die Rechte 0750 und gehören stalwart. Unter /etc/stalwart/stalwart.env wird eine Umgebungsdatei mit den Rechten 0640 angelegt, die root:stalwart gehört. Das Skript akzeptiert ein optionales Installationspräfix und ein --fdb-Flag für den FoundationDB-Build. Es akzeptiert kein Versionsargument.

Dieser letzte Punkt ist wichtig. Das Skript lädt immer das neueste Release herunter. Deshalb führen zwei Server, die im Abstand von einer Woche eingerichtet wurden, nicht unbedingt denselben Code aus. Legen Sie die Binärdatei direkt danach selbst auf eine feste Version fest. Das ist auch der Upgrade-Weg, den die Release Notes zu v0.16.19 angeben: „Wenn Sie von v0.16.x aktualisieren, ersetzen Sie die Binärdatei (oder führen Sie docker pull aus).“

STALWART_TAG=v0.16.19
curl -fsSLO "https://github.com/stalwartlabs/stalwart/releases/download/${STALWART_TAG}/stalwart-x86_64-unknown-linux-gnu.tar.gz"
tar zxf stalwart-x86_64-unknown-linux-gnu.tar.gz
sudo systemctl stop stalwart
sudo install -m 0755 -o root -g root stalwart /usr/local/bin/stalwart
sudo systemctl start stalwart
systemctl is-active stalwart

systemctl is-active stalwart sollte active ausgeben. Bei jeder anderen Ausgabe lesen Sie journalctl -u stalwart -n 50. Zu jedem Release-Asset gehört ein passendes .sigstore.json-Bundle. Dadurch lässt sich die Signatur des Downloads vor der Installation überprüfen.

Die vom Skript geschriebene Unit wird als User=stalwart ausgeführt und setzt AmbientCapabilities=CAP_NET_BIND_SERVICE. Diese Capability ermöglicht es einem nicht privilegierten Konto, die Ports 25, 443, 465 und 993 zu binden. Wenn Sie später eine eigene Unit schreiben und diese Zeile weglassen, schlägt der Dienst beim Start fehl, weil ein normaler Benutzer keinen Port unterhalb von 1024 binden kann.

Wo das erste Administratorkennwort ausgegeben wird

Stalwart startet im Bootstrap-Modus und schreibt einmalig ein temporäres Kennwort mit 16 Zeichen in das Service-Log.

sudo journalctl -u stalwart -n 200 | grep -A8 'bootstrap mode'

Der Einrichtungsassistent lauscht über unverschlüsseltes HTTP auf Port 8080. Veröffentlichen Sie diesen Port daher nicht. Richten Sie stattdessen von Ihrem Laptop aus einen SSH-Tunnel ein:

ssh -N -L 8080:127.0.0.1:8080 you@your-vps

Öffnen Sie anschließend http://127.0.0.1:8080/admin und melden Sie sich als admin mit dem Kennwort aus dem Log an. Der Assistent fragt nach dem Hostnamen des Servers, der Standard-Mail-Domain, TLS, dem Speicher, dem Kontenverzeichnis, der Protokollierung und der DNS-Verarbeitung. Starten Sie den Dienst nach Abschluss neu. Verwenden Sie ab diesem Zeitpunkt https://<your-host>/admin.

Wenn das Kennwort im Log nicht mehr sichtbar ist, legen Sie stattdessen ein festes Kennwort fest. /etc/stalwart/stalwart.env enthält dafür auskommentierte Einträge, darunter STALWART_RECOVERY_ADMIN=admin:changeme, STALWART_RECOVERY_MODE=true und STALWART_RECOVERY_MODE_PORT (Standardwert 8080). Entfernen Sie die Kommentarzeichen, starten Sie den Dienst neu und melden Sie sich an. Setzen Sie die Kommentarzeichen anschließend wieder ein. Auf der Hardening-Seite von Stalwart wird empfohlen, dieses Konto nur für Notfälle zu verwenden. Melden Sie sich niemals mit einem Administratorkonto über IMAP, JMAP oder WebDAV an.

Auf derselben Seite wird aufgeführt, welche Listener aktiviert bleiben sollten: Port 25 für eingehendes SMTP, 465 für Submission mit implizitem TLS, 993 für IMAPS und 443 für sämtlichen HTTP-Verkehr. Die Ports 587, 143, 4190, 110, 995 und 8080 werden als nicht erforderlich eingestuft. Port 8080 soll nach Abschluss der Einrichtung deaktiviert werden.

Betrieb unter Docker mit einem festgelegten Tag

Das dokumentierte Image ist stalwartlabs/stalwart. Der Tag v0.16.19 war am 28 August 2026 auf Docker Hub vorhanden, zusammen mit einer Variante -alpine. Legen Sie die Patch-Version fest und nicht den veränderlichen Tag v0.16. Der Grund ist derselbe wie beim oben genannten Binary.

services:
  stalwart:
    image: stalwartlabs/stalwart:v0.16.19
    container_name: stalwart
    restart: unless-stopped
    ports:
      - "25:25"
      - "465:465"
      - "993:993"
      - "443:443"
      - "127.0.0.1:8080:8080"
    volumes:
      - stalwart-etc:/etc/stalwart
      - stalwart-data:/var/lib/stalwart
volumes:
  stalwart-etc:
  stalwart-data:

Diese Datei enthält den dokumentierten docker run-Befehl als Compose-Konfiguration. Nicht erforderliche Listener wurden weggelassen, und der Setup-Port ist an localhost gebunden. Starten Sie den Container und lesen Sie dieselbe Bootstrap-Zeile:

docker compose up -d
docker compose logs stalwart 2>&1 | grep -A8 'bootstrap mode'

Auf der Docker-Seite ist außerdem -e STALWART_RECOVERY_ADMIN=admin:mySecretPass als Möglichkeit dokumentiert, beim Start ein festes Zugangsdaten-Secret zu setzen. In Compose entspricht das dem Schlüssel environment:. Verwenden Sie diese Option, wenn Sie das Secret nicht aus den Logs lesen möchten.

Die vollständige dokumentierte Portliste und warum diese Datei kürzer ist

Die Docker-Seite von Stalwart führt die Ports 443, 8080, 25, 587, 465, 143, 993, 110, 995 und 4190 auf. Die Hardening-Seite bezeichnet 587, 143, 110, 995 und 4190 als nicht erforderlich und empfiehlt, 8080 nach dem Setup zu deaktivieren. Fügen Sie nur die Ports wieder hinzu, die Ihre Clients tatsächlich benötigen. Wenn ein Telefon auf die Übermittlung per STARTTLS besteht, veröffentlichen Sie 587. Wenn Ihre Benutzer Sieve-Regeln in einem Desktop-Client erstellen, veröffentlichen Sie 4190.

Falls Compose für Sie neu ist, erklärt unsere Anleitung zu Docker Compose für einen VPS den Dateiaufbau und das hier verwendete Modell mit benannten Volumes. Ein besonderer Hinweis für Mailserver: Docker veröffentlicht Ports, indem es eigene Firewall-Regeln schreibt. Diese Regeln werden vor den Regeln von ufw ausgewertet. Daher schließt ufw deny 8080 keinen Port, den Compose veröffentlicht hat. Erst die Bindung an 127.0.0.1 in der Portzuordnung schließt den Port tatsächlich. Deshalb verwendet die Datei oben diese Bindung, während der SSH-Tunnel weiterhin greift.

TLS ohne certbot und mit welchen Kosten

Stalwart implementiert ACME (automatic certificate management environment) direkt. Daher gibt es weder certbot noch einen Erneuerungs-Hook. Die Dokumentation führt vier Validierungsmethoden auf. HTTP-01 beantwortet eine Challenge-Anfrage auf Port 80. TLS-ALPN-01 präsentiert über das ACME-spezifische ALPN-Protokoll ein speziell dafür erstelltes Zertifikat auf Port 443. DNS-01 veröffentlicht temporäre TXT-Records und ist eine von zwei Methoden, mit denen Wildcard-Zertifikate ausgestellt werden können. DNS-PERSIST-01 verwendet langlebige TXT-Records zur Autorisierung, statt bei jeder Erneuerung einen neuen Record zu schreiben.

Der Nachteil ist, dass Stalwart den Port selbst verwalten möchte. TLS-ALPN-01 funktioniert, indem Stalwart den TLS-Handshake selbst abschließt. Daher kann die Methode nicht hinter einem Reverse Proxy funktionieren, der TLS für Sie terminiert. Wenn nginx oder Caddy auf diesem Host bereits Port 443 belegt, wechseln Sie entweder bei Stalwart zu DNS-01 oder weisen Sie ihm eine eigene IP-Adresse zu.

DANE und MTA-STS sowie die Standardeinstellungen, die Sie kennen sollten

Beide Funktionen werden pro TLS-Strategie am Objekt MtaTlsStrategy unter Settings, MTA, Outbound, TLS Strategies in der Weboberfläche konfiguriert. Das Feld dane ist standardmäßig auf optional gesetzt. Diese Einstellung versucht eine DANE-Validierung, wenn der Empfänger TLSA-Records veröffentlicht, und fällt andernfalls auf gewöhnliches STARTTLS zurück. Bei require wird die Zustellung nur fortgesetzt, wenn ein überprüfbarer TLSA-Record vorhanden ist. Das Feld mtaSts verhält sich genauso und ist standardmäßig auf optional gesetzt. Die zugehörigen Timeouts sind tlsTimeout (standardmäßig 3 Minuten) und mtaStsTimeout (standardmäßig 5 Minuten).

Auf der Eingangsseite kann Stalwart Ihre eigene MTA-STS-Richtlinie unter https://mta-sts.<domain>/.well-known/mta-sts.txt veröffentlichen. Dafür muss Port 443 geöffnet sein. Das Singleton MtaSts enthält mode (standardmäßig testing), maxAge (standardmäßig 7 Tage) und mxHosts. Wenn dieses Feld leer ist, werden die Hostnamen in Ihrem TLS-Zertifikat verwendet. Sie benötigen zwei DNS-Records: einen mta-sts-CNAME, der auf den Mailhost zeigt, und einen _mta-sts-TXT-Record mit der Richtlinienkennung.

dig +short TXT _mta-sts.example.org
curl -s https://mta-sts.example.org/.well-known/mta-sts.txt

Die TXT-Abfrage sollte einen v=STSv1; id=...-String zurückgeben, und curl sollte den Richtlinieninhalt ausgeben. Gibt curl nichts zurück, ist Port 443 geschlossen oder das Zertifikat für mta-sts.example.org wurde nie ausgestellt.

Belassen Sie mode auf testing, bis beide Prüfungen erfolgreich sind. Eine Richtlinie im Modus enforce mit einem fehlerhaften Zertifikat verhindert, dass andere Server Nachrichten an Sie zustellen. Ihre Benutzer werden Sie darüber informieren, nicht ein Log. Auch bei DANE gibt es eine entsprechende Falle: Dafür ist eine DNSSEC-signierte Zone erforderlich. Außerdem muss ein TLSA-Record, der das Leaf-Zertifikat festlegt, bei jeder ACME-Erneuerung neu veröffentlicht werden. Legen Sie stattdessen die ausstellende CA fest oder akzeptieren Sie den zusätzlichen Erneuerungsaufwand.

Verschlüsselung ruhender Daten ist keine Ende-zu-Ende-Verschlüsselung

Dieses Feature wird am häufigsten falsch verstanden. Daher folgt genau, was die Dokumentation sagt. Die Klartextnachrichten jedes Benutzers werden automatisch mit dessen OpenPGP- oder S/MIME-Zertifikat verschlüsselt, bevor die Nachrichten auf dem Datenträger gespeichert werden. encryptAtRest ist standardmäßig aktiviert und gilt für Nachrichten, die über SMTP oder LMTP eingehen, sofern der Empfänger einen Verschlüsselungsschlüssel registriert hat. encryptOnAppend ist standardmäßig auf false gesetzt. Dadurch bleiben angehängte Nachrichten unverändert, sodass Clients die vollständige Kontrolle über die gespeicherten Inhalte behalten. OpenPGP verwendet PGP/MIME statt des älteren PGP/Inline und unterstützt AES-256 oder AES-128. Stalwart erzeugt keine Schlüssel. Benutzer exportieren einen ASCII-armored Public Key und registrieren ihn unter Account, Public Keys als PublicKey-Objekt.

Damit sind ein gestohlenes Disk-Image, ein gestohlenes Backup und ein Administrator geschützt, der den Nachrichtenspeicher nach der Zustellung liest. Ohne den privaten Schlüssel sind die gespeicherten Bytes nicht lesbar. Auch der Administrator kann sie nicht entschlüsseln.

Die Nachricht während der Übertragung wird dadurch nicht geschützt. Eine Nachricht durchquert das Internet mit der TLS-Konfiguration, auf die sich die beiden Server geeinigt haben. Sie kommt als Klartext an. In diesem Moment verschlüsselt Stalwart sie. Der Absender, der Provider des Absenders und jeder Hop, der TLS entfernt hat, konnten den Klartext bereits sehen.

Drei weitere Einschränkungen müssen klar genannt werden. Die Ordner Sent und Drafts werden von Ihrem Client geschrieben. Das ist ein Append-Vorgang. encryptOnAppend ist standardmäßig auf false gesetzt. Daher bleiben diese Nachrichten unverschlüsselt, sofern Sie die Einstellung nicht ändern. Die Dokumentation, die ich am 28 August 2026 gelesen habe, beschreibt nur die Nachrichteninhalte. Sie sagt nicht, dass Envelope-Daten, Header oder Indexeinträge verschlüsselt werden. Gehen Sie daher nicht davon aus. Außerdem steht dort nicht, dass Nachrichten, die bereits vor dem Hochladen eines Schlüssels gespeichert wurden, nachträglich verschlüsselt werden. Gehen Sie daher davon aus, dass dies nicht geschieht, und prüfen Sie es. Ob die Volltextsuche weiterhin in verschlüsselten Nachrichtentexten funktioniert, ist ebenfalls nicht angegeben. Testen Sie dies mit einem Wegwerf-Account, bevor Sie es jemandem zusagen.

Wenn ein Benutzer seinen privaten Schlüssel verliert, sind seine E-Mails verloren. Es gibt absichtlich keinen Wiederherstellungsweg.

WKD ist eine Aufgabe für einen Webserver, nicht für einen Mailserver

WKD (Web Key Directory) ist der andere Teil des OpenPGP-Konzepts und löst ein anderes Problem. WKD veröffentlicht Ihren öffentlichen Schlüssel unter einer festen HTTPS-URL Ihrer Domain. Dadurch kann der Mailclient des Absenders den Schlüssel finden und die Nachricht verschlüsseln, bevor sie das Gerät des Absenders verlässt. Das ist Ende-zu-Ende-Verschlüsselung. Die Verschlüsselung ruhender Daten in Stalwart betrifft die Kopie auf Ihrer Festplatte. Die Einrichtung des einen Verfahrens ermöglicht nicht automatisch das andere.

Stalwart stellt WKD nicht bereit. Die am 28. August 2026 dokumentierten HTTP-Endpunkte nennen bekannte Pfade für jmap, caldav, carddav, oauth-authorization-server, openid-configuration, acme-challenge, mta-sts.txt, mail-v1.xml und Autoconfig. Einen Pfad openpgpkey gibt es nicht. Stellen Sie WKD über einen gewöhnlichen statischen Webserver bereit.

Die Spezifikation definiert zwei Layouts. Die erweiterte Methode verwendet https://openpgpkey.example.org/.well-known/openpgpkey/example.org/hu/iy9q119eutrkn8s1mk4r39qejnbu3n5q?l=Joe.Doe. Die direkte Methode verwendet https://example.org/.well-known/openpgpkey/hu/iy9q119eutrkn8s1mk4r39qejnbu3n5q?l=Joe.Doe. Diese Zeichenfolge mit 32 Zeichen ist der SHA-1-Hash des kleingeschriebenen lokalen Teils, codiert in z-base-32. Deshalb erstellen Sie diese Dateinamen niemals manuell. GnuPG erstellt sie für Sie.

gpg --export --armor you@example.org > you.asc
gpg-wks-client --print-wkd-url you@example.org
gpg-wks-client --install-key you.asc you@example.org

--print-wkd-url gibt die URL aus, die ein Client abruft, und verwendet dabei die Form mit Subdomain. --install-key schreibt den Schlüssel in eine lokale Verzeichnisstruktur, die das WKD-Layout abbildet. Standardmäßig liegt sie unter einem Verzeichnis der obersten Ebene mit dem Namen openpgpkey; mit -C dir können Sie diesen Namen ändern. Kopieren Sie diese Struktur in Ihr Webroot. Legen Sie die erforderliche Datei policy neben dem Verzeichnis hu ab; eine leere Datei ist gültig. Rufen Sie anschließend Ihre eigene URL mit curl ab, um zu bestätigen, dass sie Schlüsselbytes und nicht einen 404-Fehler zurückgibt.

Speicher auf einem einzelnen VPS

Stalwart teilt den Speicher in vier Rollen auf: einen Datenspeicher für strukturierte Datensätze wie den Postfachstatus, einen Blob-Speicher für rohe Nachrichtendaten und Anhänge, einen Suchspeicher für die Volltextindizierung und einen In-Memory-Speicher für Rate-Limiter, Authentifizierungstoken und Sitzungsdaten. Jede Rolle kann auf ein anderes Backend verweisen. Die unterstützte Liste umfasst RocksDB, FoundationDB, PostgreSQL, MySQL, SQLite, S3-kompatiblen Objektspeicher, Azure Blob Storage, Redis, ElasticSearch und Meilisearch.

Auf einem einzelnen VPS ist die Antwort kurz. In der Dokumentation wird RocksDB „wegen seiner Geschwindigkeit und Zuverlässigkeit als empfohlenes Backend für Einzelknoteninstallationen von Stalwart“ bezeichnet. Redis wird nur als In-Memory-Speicher unterstützt und kann weder als Datenspeicher noch als Blob-Speicher verwendet werden. Für die ersten Schritte ist daher kein separater Redis-Container erforderlich. Verschieben Sie den Blob-Speicher später zu S3, wenn die Postfächer den verfügbaren Speicherplatz überschreiten.

Backups richten sich nach dem verwendeten Backend. Verwenden Sie bei externen Datenbanken das jeweilige eigene Sicherungsverfahren. Bei den eingebetteten Backends wird in der FAQ empfohlen, das Verzeichnis /var/lib/stalwart zu kopieren. Führen Sie diesen Vorgang bei gestopptem Dienst oder anhand eines Dateisystem- beziehungsweise Volume-Snapshots durch. Beim Kopieren auf Dateiebene kann ein laufender Key-Value-Speicher während eines Schreibvorgangs erfasst werden. Das bemerken Sie möglicherweise erst beim Wiederherstellungsversuch.

Der Spamfilter als Ersatz für Rspamd

Die Filterung läuft im selben Prozess. Es muss daher kein zweiter Daemon aktiv gehalten werden. Der Klassifikator wird beim Singleton SpamClassifier unter Settings, Spam Filter, Classifier konfiguriert. Er verwendet den FTRL-Proximal-Algorithmus mit Feature-Hashing. FtrlFh ist für die meisten Bereitstellungen die empfohlene Standardeinstellung. FtrlCcfh verwendet stattdessen Cuckoo-Feature-Hashing, um Hash-Kollisionen zu reduzieren, und ist für große Bereitstellungen vorgesehen. Das Training läuft kontinuierlich: Wenn Benutzer eine Nachricht als Spam oder Ham markieren, fließt diese Kennzeichnung direkt in zukünftige Entscheidungen ein.

Den Klassifikator ergänzen DNS-Blocklisten, Greylisting, Phishing-Erkennung, Spam-Fallen und Pyzor. Zusätzlich kann SpamAssassin über Milter aufgerufen werden, wenn Sie Regeln weiterhin benötigen.

Wann mailcow weiterhin die richtige Wahl ist

Stalwart bietet kein Webmail. Das ist die mit Abstand größte Lücke, und sie ist nicht annähernd geschlossen. Die am 28 August 2026 gelesene mailcow-Dokumentation listet sechzehn Komponenten einschließlich SOGo auf. Damit erhalten Ihre Benutzer ein Browser-Postfach sowie eine CalDAV- und CardDAV-Schnittstelle ohne zusätzliche Einrichtung. In einem Roadmap-Beitrag vom 20 June 2025 schreibt Stalwart, ein integriertes Webmail stehe „in unseren Plänen, hat aber derzeit keine unmittelbare Priorität“. Es soll nach Version 1.0 mit Rust und Dioxus entwickelt werden, „höchstwahrscheinlich irgendwann 2026“. Am 28 August 2026 enthält der Projektblog keinen Beitrag, der ein solches Webmail ankündigt. Mit Stalwart müssen Sie daher entweder selbst Roundcube bereitstellen oder jeden Benutzer auffordern, einen Mail-Client zu konfigurieren.

Stalwart verfügt über eine Webadministrationsoberfläche. Das ist also nicht die Lücke, die viele erwarten. Die zweite Lücke betrifft die Versionsreife. Laut FAQ befindet sich Stalwart noch bei 0.x. Datenlayout und Konfiguration können sich vor v1.0 ändern, sodass eine Migration erforderlich werden kann. Der eigene Beitrag des Projekts vom June 2026 trägt den Titel „Zero open bug reports: The road to Stalwart 1.0“. Daraus wird die aktuelle Situation deutlich: Das Projekt ist nahe dran, aber noch nicht dort.

Die dritte Lücke findet sich in keiner Feature-Liste. Hinter Postfix, Dovecot und Rspamd steht ein Jahrzehnt dokumentierter Lösungen. Um zwei Uhr morgens, wenn E-Mails in der Queue liegen und Benutzer warten, ist eine Suche mit einer passenden Fehlermeldung mehr wert als eine elegante Architektur. Wenn das auf Ihre Situation zutrifft, führt unsere Installationsanleitung für mailcow durch den gesamten Stack und die Nacht wird kürzer.

Wählen Sie Stalwart, wenn Sie eine einzelne Binärdatei, eine einzelne Konfigurationsdatei und JMAP möchten und bereit sind, eine frühe Technologie einzusetzen. Wählen Sie mailcow, wenn Sie sofort Webmail und eine große Sammlung vorhandener Lösungen benötigen.

Vorhandene E-Mails migrieren

Der allgemeine Weg ist IMAP zu IMAP mit imapsync. Dabei spielt es keine Rolle, welche Software auf den beiden Seiten läuft. Führen Sie zuerst einen Probelauf durch.

imapsync --dry \
  --host1 old.example.org --user1 you@example.org --passfile1 /root/.old.pw \
  --host2 mail.example.org --user2 you@example.org --passfile2 /root/.new.pw

--dry bewirkt, dass imapsync „keine Änderungen ausführt, sondern nur anzeigt, was ausgeführt würde“. Lesen Sie diese Ausgabe, bevor Sie das Flag entfernen. Jede Passwortdatei enthält das Passwort in der ersten Zeile. Verwenden Sie daher chmod 600 für beide Dateien und löschen Sie sie anschließend.

Stalwart stellt außerdem neuere Werkzeuge bereit, die in den meisten Anleitungen von Drittanbietern noch nicht berücksichtigt werden. Im Blog werden Vandelay, ein JMAP-Importer und -Exporter (29 May 2026), sowie ein Migrationsproxy für Upgrades ohne Ausfallzeit beschrieben (10 June 2026). Lesen Sie beide Beiträge, bevor Sie eine umfangreiche Migration planen. Sie sind aktueller als fast alle anderen verfügbaren Anleitungen.

Fehlerbilder und die angezeigten Zeichenfolgen

Die Administrationsoberfläche wird nie geladen. Die FAQ nennt diesen Fall ausdrücklich: Das Weboberflächen-Bundle wird beim ersten Start von GitHub heruntergeladen. Ein Server ohne ausgehendes HTTPS zu github.com stellt daher einen laufenden Dienst, aber eine leere Seite bereit. Prüfen Sie dies auf dem Server mit curl -sI https://github.com/stalwartlabs/webui/releases/latest/. Weitere häufige Ursachen laut FAQ sind ein nicht übereinstimmendes HTTP- oder HTTPS-Schema sowie ein Reverse Proxy, der die Client-IP nicht weiterleitet.

Kein Bootstrap-Passwort im Log. Es wird beim Start im Bootstrap-Modus einmalig ausgegeben. Wenn der Dienst seitdem neu gestartet wurde, vergrößern Sie den Zeitraum mit sudo journalctl -u stalwart --since today | grep -A8 'bootstrap mode'. Wenn es tatsächlich nicht mehr vorhanden ist, setzen Sie STALWART_RECOVERY_ADMIN in /etc/stalwart/stalwart.env und starten Sie den Dienst neu.

Das Relay über einen lokalen Proxy wird abgelehnt. In den Versionshinweisen zu v0.16.19 ist eine Korrektur für abgelehnte Relay-Routen mit host resolves loopback address dokumentiert. Wenn diese genaue Zeichenfolge angezeigt wird, verwenden Sie einen älteren Build. Aktualisieren Sie gezielt auf eine neuere Version, statt das Problem zu umgehen.

Der Dienst startet nicht, nachdem Sie eine eigene Unit erstellt haben. Ohne AmbientCapabilities=CAP_NET_BIND_SERVICE kann der Benutzer stalwart die Ports 25, 443, 465 oder 993 nicht binden. Der Start schlägt daher beim ersten Listener fehl. Kopieren Sie die Capability-Zeile aus der vom Installer erzeugten Unit.

Zertifikate werden nie ausgestellt. Für HTTP-01 muss Port 80 erreichbar und frei sein. Für TLS-ALPN-01 muss Stalwart selbst den TLS-Handshake auf Port 443 beantworten. Wenn ein anderer Dienst auf dem System einen der beiden Ports belegt, schlägt ACME weiterhin unauffällig fehl, während alle anderen Komponenten gesund wirken.

FAQ

Ersetzt Stalwart Postfix, Dovecot und Rspamd auf einem VPS?

Ja. Ein einziges Rust-Binary stellt SMTP, IMAP, POP3, JMAP, CalDAV, CardDAV und WebDAV bereit. Es enthält außerdem den Spamfilter, den Nachrichtenspeicher und einen ACME-Client. Statt vier Daemons und ihrer Verknüpfungen gibt es eine systemd-Unit und eine Konfigurationsdatei unter /etc/stalwart/config.json. Ihre DNS-Zone und die Port-25-Richtlinie Ihres Providers werden dadurch nicht ersetzt. Davon hängt ab, ob selbst gehostete E-Mail tatsächlich funktioniert.

Wie viel RAM benötigt ein Stalwart-Mailserver?

Die Systemanforderungen von Stalwart, abgerufen am 28. August 2026, nennen im Leerlauf ungefähr 100 MB. Dort steht außerdem, dass 1 GB RAM für eine kleine Bereitstellung mit 5 bis 10 Benutzern ausreicht. Eine Konfiguration mit geringem Datenverkehr für etwa 5 Benutzer läuft auf einem einzigen CPU-Kern. Das Standardlimit beträgt 8,192 gleichzeitige Verbindungen über alle Dienste hinweg und kann angepasst werden. Die Obergrenze steigt daher mit der Anzahl der Verbindungen und dem E-Mail-Volumen, nicht nur mit der Benutzerzahl. Eine Mindestgröße für den Datenträger wird nicht angegeben. Planen Sie die Größe daher anhand der E-Mails, die Sie aufbewahren.

Verbessert der Wechsel zu Stalwart die Zustellbarkeit meiner E-Mails?

Nein. Die Zustellbarkeit hängt davon ab, ob der ausgehende TCP-Port 25 auf Ihrem VPS geöffnet ist, ob für Ihre IP ein Reverse-DNS-Eintrag vorhanden ist und ob Ihre Domain SPF, DKIM und DMARC verwendet. Stalwart unterstützt DANE, MTA-STS und SMTP-TLS-Reporting. Außerdem kann Stalwart Ihre MTA-STS-Richtlinie veröffentlichen. Diese Mechanismen regeln jedoch die Transportsicherheit und nicht die Frage, ob ein empfangendes Netzwerk Ihrer Adresse vertraut. Testen Sie Port 25 mit nc -vz -w 5 alt1.aspmx.l.google.com 25, bevor Sie etwas installieren.

Enthält Stalwart Webmail?

Stand 28. August 2026 nicht. Stalwart enthält eine Webadministrationsoberfläche. Das ist etwas anderes. Der Roadmap-Beitrag des Projekts vom 20. Juni 2025 sagt, dass nach Version 1.0 ein Webmail-Client geplant ist. Er soll in Rust mit Dioxus entwickelt werden, „höchstwahrscheinlich irgendwann im Jahr 2026“. Im Projektblog gibt es bisher keine entsprechende Ankündigung. Wenn Ihre Benutzer jetzt ein Browser-Postfach benötigen, stellen Sie Roundcube daneben bereit oder verwenden Sie einen Stack mit integriertem SOGo.

Wovor schützt die Verschlüsselung ruhender Daten in Stalwart?

Stalwart verschlüsselt die Nachrichten jedes Benutzers mit dessen eigenem öffentlichen OpenPGP- oder S/MIME-Schlüssel, bevor sie auf den Datenträger geschrieben werden. Dadurch können der Inhalt eines gestohlenen Datenträgers, eines gestohlenen Backups oder eines Administrators, der den Nachrichtenspeicher liest, nicht wiederhergestellt werden. Es handelt sich nicht um Ende-zu-Ende-Verschlüsselung. Die Nachricht kommt im Klartext an und wird erst bei der Zustellung verschlüsselt. Bis dahin war sie an jedem Zwischenpunkt lesbar. encryptOnAppend ist standardmäßig auf false gesetzt. Daher bleiben von Ihrem Client geschriebene Nachrichten in Sent und Drafts unverschlüsselt, sofern Sie diese Einstellung nicht ändern. Die Dokumentation behandelt nur die Nachrichteninhalte. Zu Metadaten, Indexeinträgen oder der erneuten Verschlüsselung von E-Mails, die vor dem Hochladen des Schlüssels gespeichert wurden, macht sie keine Angaben. Prüfen Sie diese Punkte daher selbst, statt von einer entsprechenden Funktion auszugehen.

#stalwart#email#self-hosting#mail-server#smtp