SSD Nodes Learn Hosting plans →
Anleitungen Matt ConnorVon Matt Connor

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 auf einem VPS als einzelne Rust-Binärdatei 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 erledigt dieselben Aufgaben mit Postfix, Dovecot, Rspamd, einer Datenbank für Konten und einem separaten Zertifikatstool. Stalwart ersetzt all das durch eine einzige Service-Unit und eine einzige Konfigurationsdatei unter /etc/stalwart/config.json.

Jede Zahl, jeder Einstellungsname und jeder Befehl unten stammt aus der offiziellen Dokumentation, den Release-Seiten und dem Installationsskript von Stalwart. Die Angaben wurden erstmals am 28 August 2026 gegen Release v0.16.19 (veröffentlicht am 24 August 2026) geprüft und am 12 October 2026 erneut geprüft. Zu diesem Zeitpunkt war v0.16.26 (veröffentlicht am 11 October 2026) die neueste Version. 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 nur 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 ausgeführt haben.

Eine einzige Binärdatei reduziert die Zahl der beteiligten Komponenten erheblich. 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 einsetzen

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 E-Mails nicht direkt an den Mailserver eines anderen Empfängers übergeben kann. Testen Sie den Port, bevor Sie etwas installieren.

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

Ein erfolgreicher Test gibt nach etwa einer Sekunde Connection to alt1.aspmx.l.google.com ... 25 port [tcp/smtp] succeeded! aus. Eine Sperre zeigt sich auf eine von zwei Arten. Werden die Pakete beim Provider verworfen, sendet niemand einen Reset zurück. nc wartet dann 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. Weist die Firewall die Pakete stattdessen zurück, sendet sie einen ICMP-Fehler zurück. netfilter sendet bei einer Zurückweisung port unreachable, sofern nicht ausdrücklich ein anderer Fehler wie administratively prohibited festgelegt wurde. Der Fehler tritt dann sofort auf, typischerweise als Connection refused oder No route to host. Öffnen Sie in beiden Fällen ein Ticket bei Ihrem Provider.

Wenn der Provider den Port nicht freigibt, bleibt als Ausweg nur ein Relay. Stalwart kann alle ausgehenden E-Mails über eine Relay-Route an einen Smarthost übergeben. Deren Port ist standardmäßig 25, akzeptiert aber jeden Wert von 1 bis 65535. Mit einem implicitTls-Schalter sowie den Feldern authUsername und authSecret können Sie ein authentifiziertes Relay über Port 465 oder 587 konfigurieren. Ihre E-Mails werden dann unter der Reputation des Relays versendet, nicht unter Ihrer eigenen.

Die zweite Hürde ist die Einschätzung, die empfangende Netzwerke von Ihrer IP-Adresse und Ihrer Domain haben. Dazu gehören Reverse DNS für die IP-Adresse, SPF, DKIM, DMARC und die Versandhistorie des Adressblocks, dem Ihre IP-Adresse zugewiesen wurde. Die DNS-Setup-Seite von Stalwart formulierte am 28 August 2026 klar, wo diese Arbeiten stattfinden: Reverse-DNS-Einträge „werden typischerweise vom Hosting-Provider konfiguriert, nicht von Stalwart selbst“. Das gilt auch für den restlichen Bereich. Die Konfiguration liegt in Ihrer DNS-Zone und im Control Panel Ihres Providers, nicht im Mailserver.

Diese Seite erklärt diese Einträge daher nicht erneut. Eine eigene Anleitung finden Sie hier: SPF, DKIM und DMARC einmalig für alle Absender 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 Grundlage nichts.

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

Die Seite mit den Systemanforderungen von Stalwart, abgerufen am 12. Oktober 2026, nennt folgende Werte. Der Speicherverbrauch im Leerlauf liegt bei etwa 100 MB. Eine kleine Bereitstellung für 5 bis 10 Benutzer läuft problemlos mit 1 GB RAM. Eine Konfiguration mit geringem Datenverkehr für etwa 5 Benutzer läuft auf einem einzelnen CPU-Kern. Auf der Seite steht außerdem: „Wenn Parallelität und Aktivität zunehmen, werden mehr CPU-Kerne erforderlich, um eine geringe Latenz und einen hohen Durchsatz aufrechtzuerhalten.“ Standardmäßig sind über alle Dienste hinweg 8,192 gleichzeitige Verbindungen zulässig. Dieser Wert kann konfiguriert werden.

Die Seite nennt keine minimale Festplattengröße. Dimensionieren Sie die Festplatte daher für die erwartete Menge dauerhaft gespeicherter E-Mails und zusätzlichen Spielraum für die Komprimierung des Speichers.

Drei ausgehende Verbindungen müssen funktionieren. Andernfalls wirkt der Server auf eine Weise fehlerhaft, die nichts mit E-Mail zu tun hat. Er ruft das Bundle der Weboberfläche von https://github.com/stalwartlabs/webui/releases/latest/ ab. Für Zertifikate muss er https://acme-v02.api.letsencrypt.org/directory erreichen. Für Abfragen von MX- und Authentifizierungsdatensätzen 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 festgelegte 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 das Skript am 12. Oktober 2026 lesen, sehen Sie genau, was es tut. Es legt ein stalwart-Dienstkonto und die benötigten Verzeichnisse an. 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 wird unter /etc/stalwart/config.json gespeichert, die Daten unter /var/lib/stalwart und die Logs unter /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. Ein Versionsargument wird nicht unterstützt.

Dieser letzte Punkt ist wichtig. Das Skript lädt immer die neueste Version herunter. Deshalb führen zwei Server, die im Abstand von einer Woche eingerichtet wurden, nicht unbedingt denselben Code aus. Legen Sie die Version der Binärdatei direkt danach selbst fest. Das entspricht auch dem Upgrade-Verfahren in den Release Notes zu v0.16.26: „Wenn Sie von v0.16.x aktualisieren, ersetzen Sie die Binärdatei (oder führen Sie docker pull aus).“ Zwischen dem 24. August und dem 11. Oktober 2026 wurden sieben Patch-Versionen veröffentlicht, mehrere davon mit Sicherheitskorrekturen. Legen Sie daher die neueste Version fest und ändern Sie diese Festlegung bewusst.

STALWART_TAG=v0.16.26
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 können Sie die Signatur des Downloads vor der Installation verifizieren.

Die vom Skript geschriebene Unit läuft als User=stalwart und setzt AmbientCapabilities=CAP_NET_BIND_SERVICE. Diese Capability ermöglicht es einem unprivilegierten 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.26 war am 12 October 2026 auf Docker Hub vorhanden, ebenso eine Variante mit -alpine. Die Docker-Seite von Stalwart empfiehlt für den Produktivbetrieb den Minor-Tag v0.16. Legen Sie stattdessen die Patch-Version fest. Dafür gilt derselbe Grund wie beim obigen Binary.

services:
  stalwart:
    image: stalwartlabs/stalwart:v0.16.26
    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 in Compose-Syntax. Nicht erforderliche Listener sind weggelassen. Der Setup-Port ist an localhost gebunden. Starten Sie den Stack und lesen Sie dieselbe Bootstrap-Zeile aus:

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

Auf der Docker-Seite wird außerdem -e STALWART_RECOVERY_ADMIN=admin:mySecretPass als Möglichkeit dokumentiert, beim Start ein festes Kennwort zu setzen. Das entspricht dem Compose-Schlüssel environment:, falls Sie diese Methode dem Auslesen der Logs vorziehen.

Die vollständige dokumentierte Portliste und der Grund für die kürzere Datei

Auf der Docker-Seite von Stalwart werden die Ports 443, 8080, 25, 587, 465, 143, 993, 110, 995 und 4190 veröffentlicht. Auf der Hardening-Seite werden 587, 143, 110, 995 und 4190 als nicht erforderlich bezeichnet. Außerdem wird empfohlen, 8080 nach dem Setup zu deaktivieren. Fügen Sie nur die Ports wieder hinzu, die Ihre Clients tatsächlich benötigen. Wenn ein Telefon unbedingt die Übermittlung per STARTTLS verwendet, veröffentlichen Sie 587. Wenn Ihre Benutzer Sieve-Regeln in einem Desktop-Client erstellen, veröffentlichen Sie 4190.

Wenn Compose für Sie neu ist, erläutert unser Docker-Compose-Leitfaden für einen VPS den Dateiaufbau und das hier verwendete Modell mit benannten Volumes. Eine Warnung, die insbesondere bei Mailservern relevant ist: Docker veröffentlicht Ports, indem es eigene Firewall-Regeln schreibt. Diese Regeln werden vor den ufw-Regeln 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 obige Datei diese Bindung, und der SSH-Tunnel funktioniert weiterhin.

TLS ohne certbot und mit den entsprechenden Einschränkungen

Stalwart implementiert ACME (Automatic Certificate Management Environment) direkt. Daher gibt es weder certbot noch einen Hook für die Erneuerung. Die Dokumentation nennt vier Validierungsmethoden. HTTP-01 beantwortet eine Challenge-Anfrage auf Port 80. TLS-ALPN-01 präsentiert auf Port 443 ein speziell dafür ausgestelltes Zertifikat und verwendet dazu das ACME-spezifische ALPN-Protokoll. DNS-01 veröffentlicht vorübergehend 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 besteht darin, dass Stalwart den TLS-Handshake selbst durchführen muss. TLS-ALPN-01 funktioniert nur, wenn Stalwart den 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 System bereits Port 443 verwendet, haben Sie drei Möglichkeiten. Die nginx-Anleitung von Stalwart verwendet nginx als TCP-Passthrough mit listen 443; proxy_pass 127.0.0.1:10443; proxy_protocol on;. Dadurch erreicht die TLS-Verbindung Stalwart unverändert. Damit werden alle Verbindungen auf Port 443 an Stalwart weitergeleitet. Das eignet sich für ein System, auf dem nginx auf diesem Port keine anderen Dienste bereitstellt. Andernfalls stellen Sie Stalwart auf DNS-01 oder HTTP-01 um oder geben Sie Stalwart eine eigene IP-Adresse.

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

Diese Funktion 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 generiert keine Schlüssel. Benutzer exportieren einen ASCII-armored public key und registrieren ihn unter Account, Public Keys als PublicKey-Objekt.

Damit sind ein gestohlenes Festplatten-Image, ein gestohlenes Backup und ein Administrator geschützt, der den Speicher 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, erreicht den Zielserver im Klartext und wird erst in diesem Moment von Stalwart verschlüsselt. Der Absender, der Provider des Absenders und jeder Hop, der TLS entfernt hat, haben den Klartext bereits gesehen.

Drei weitere Einschränkungen müssen klar genannt werden. Die Ordner Sent und Drafts werden von Ihrem Client geschrieben. Das ist ein append, und encryptOnAppend ist standardmäßig false. Daher bleiben diese Nachrichten im Klartext, sofern Sie die Einstellung nicht ändern. Die Dokumentation, die ich am 12. Oktober 2026 erneut geprüft habe, beschreibt nur die Nachrichteninhalte. Sie sagt nicht, dass Envelope-Daten, Header oder Indexeinträge verschlüsselt werden. Gehen Sie daher nicht davon aus. Sie sagt ebenfalls nicht, dass Nachrichten, die bereits vor dem Hochladen eines Schlüssels gespeichert wurden, erneut verschlüsselt werden. Gehen Sie 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 Testkonto, 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 die andere Hälfte von OpenPGP und löst ein anderes Problem. WKD veröffentlicht Ihren öffentlichen Schlüssel unter einer festen HTTPS-URL in Ihrer Domain. So kann der Mailclient des Absenders den Schlüssel finden und die Nachricht verschlüsseln, bevor sie dessen Gerät verlässt. Das ist Ende-zu-Ende-Verschlüsselung. Die Verschlüsselung ruhender Daten in Stalwart betrifft die Kopie auf Ihrer Festplatte. Die Einrichtung der einen Funktion stellt die andere nicht bereit.

Stalwart stellt WKD nicht bereit. Die dokumentierten HTTP-Endpunkte, abgerufen am 12. Oktober 2026, führen Well-Known-Pfade für jmap, caldav, carddav, oauth-authorization-server, openid-configuration, acme-challenge, mta-sts.txt, mail-v1.xml und Autoconfig auf. 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 in Kleinbuchstaben geschriebenen lokalen Teils, codiert in z-base-32. Deshalb sollten Sie diese Dateinamen nie manuell erstellen. 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 Subdomain-Form. --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 ändern Sie diesen Namen. Kopieren Sie diese Struktur in Ihr Webroot. Legen Sie die erforderliche Datei policy neben dem Verzeichnis hu an. Eine leere Datei ist zulässig. Rufen Sie anschließend Ihre eigene URL mit curl ab, um zu bestätigen, dass sie Schlüsselbytes und keinen 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 hat kein Webmail. Das ist die mit Abstand größte Lücke, und sie wird in absehbarer Zeit nicht geschlossen. Die am 12 October 2026 gelesene mailcow-Dokumentation listet sechzehn Komponenten auf, darunter SOGo. Damit erhalten Ihre Benutzer sofort ein Browser-Postfach sowie eine CalDAV- und CardDAV-Schnittstelle. Im Roadmap-Beitrag von Stalwart vom 20 June 2025 steht, dass integriertes Webmail „in our plans, but it's not currently our immediate priority“ ist. Es soll nach Version 1.0 in Rust mit Dioxus entwickelt werden, „most likely sometime in 2026“. Am 12 October 2026 enthält der Projekt-Blog keinen Beitrag, der ein solches Webmail ankündigt. Mit Stalwart müssen Sie daher entweder Roundcube selbst bereitstellen oder jeden Benutzer auffordern, einen Mail-Client zu konfigurieren.

Stalwart verfügt über eine Weboberfläche zur Administration. Das ist also nicht die Lücke, die viele erwarten. Die zweite Lücke betrifft die Reife der Version. 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“. Das zeigt den aktuellen Stand: fast fertig, aber noch nicht so weit. Am 12 October 2026 ist die neueste Version weiterhin v0.16.26.

Die dritte Lücke nennt niemand in einer Feature-Liste. Hinter Postfix, Dovecot und Rspamd steht ein Jahrzehnt an dokumentierten Antworten. Um zwei Uhr morgens, wenn E-Mails in der Warteschlange stehen und Benutzer warten, ist eine Suche, die eine passende Fehlermeldung liefert, 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 noch junge Lösung einzusetzen. Wählen Sie mailcow, wenn Sie sofort Webmail benötigen und auf eine große Menge vorhandener Antworten zurückgreifen möchten.

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 Meldungen

Die Administrationsoberfläche wird nie geladen. Die FAQ nennt diesen Fall ausdrücklich: Das Weboberflächen-Bundle wird beim ersten Start von GitHub heruntergeladen. Hat der Server keinen ausgehenden HTTPS-Zugriff auf github.com, läuft der Dienst zwar, aber alle Routen der Weboberfläche liefern 404 zurück. Prüfen Sie dies mit curl -sI https://github.com/stalwartlabs/webui/releases/latest/ auf dem Server. Als weitere häufige Ursachen nennt die FAQ ein nicht übereinstimmendes HTTP- oder HTTPS-Schema sowie einen Reverse Proxy, der die Client-IP nicht weiterleitet.

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

Die Weiterleitung über einen lokalen Proxy wird abgelehnt. Die Release Notes zu v0.16.19 dokumentieren eine Korrektur für Relay-Routen, die mit host resolves loopback address abgelehnt wurden. Wenn diese Meldung genau so erscheint, verwenden Sie einen älteren Build. Aktualisieren Sie auf eine feste 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 dann beim ersten Listener fehl. Übernehmen Sie die Capability-Zeile aus der Unit, die der Installer erzeugt hat.

Zertifikate werden nie ausgestellt. Für HTTP-01 muss Port 80 erreichbar und frei sein. Bei TLS-ALPN-01 muss Stalwart selbst den TLS-Handshake auf Port 443 beantworten. Wenn ein anderer Dienst auf dem System einen dieser Ports belegt, schlägt ACME weiterhin unauffällig fehl, während der übrige Dienst scheinbar fehlerfrei läuft.

FAQ

Ersetzt Stalwart Postfix, Dovecot und Rspamd auf einem VPS?

Ja. Eine Rust-Binärdatei übernimmt SMTP, IMAP, POP3, JMAP, CalDAV, CardDAV und WebDAV. Sie 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 ersetzt Stalwart jedoch nicht. Davon hängt ab, ob selbst gehosteter Mailbetrieb tatsächlich funktioniert.

Wie viel RAM benötigt ein Stalwart-Mailserver?

Die Systemanforderungen von Stalwart, abgerufen am 12. Oktober 2026, nennen im Leerlauf ungefähr 100 MB. Für eine kleine Bereitstellung mit 5 bis 10 Benutzern werden 1 GB RAM empfohlen. Eine Konfiguration mit geringem Datenverkehr und etwa 5 Benutzern läuft auf einem einzelnen CPU-Kern. Das Standardlimit beträgt 8,192 gleichzeitige Verbindungen über alle Dienste hinweg und lässt sich konfigurieren. Die Obergrenze steigt daher mit der Anzahl der Verbindungen und dem Mailvolumen und nicht allein mit der Benutzerzahl. Eine minimale Datenträgergröße wird nicht angegeben. Dimensionieren Sie den Datenträger nach der Menge der aufzubewahrenden Mail.

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

Nein. Die Zustellbarkeit hängt davon ab, ob ausgehende TCP-Verbindungen über Port 25 auf Ihrem VPS möglich sind, ob für Ihre IP ein Reverse DNS eingerichtet ist und ob Ihre Domain SPF, DKIM und DMARC verwendet. Stalwart unterstützt DANE, MTA-STS und SMTP-TLS-Reporting. Es kann auch Ihre MTA-STS-Richtlinie veröffentlichen. Diese Funktionen 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?

Zum 12. Oktober 2026 nicht. Stalwart stellt eine Webadministrationsoberfläche bereit. Das ist etwas anderes. Der Roadmap-Beitrag des Projekts vom 20. Juni 2025 nennt einen Webmail-Client als nach Version 1.0 geplante Funktion. Er soll mit Rust und Dioxus entwickelt werden, „höchstwahrscheinlich irgendwann im Jahr 2026“. Im Projektblog wurde bisher noch keine solche Funktion angekündigt. Wenn Ihre Benutzer jetzt ein Postfach im Browser benötigen, stellen Sie zusätzlich Roundcube bereit oder verwenden Sie einen Stack mit SOGo.

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

Stalwart verschlüsselt die Nachrichten jedes Benutzers vor dem Schreiben auf den Datenträger mit dessen eigenem öffentlichen OpenPGP- oder S/MIME-Schlüssel. Dadurch lassen sich die Inhalte von einem gestohlenen Datenträger, einem gestohlenen Backup oder von einem Administrator, der den Speicher liest, nicht wiederherstellen. Es handelt sich nicht um Ende-zu-Ende-Verschlüsselung. Die Nachricht kommt im Klartext an und wird erst bei der Zustellung verschlüsselt. Jeder vorherige Übertragungsschritt konnte sie daher lesen. encryptOnAppend ist standardmäßig auf false gesetzt. Von Ihrem Client gespeicherte gesendete Nachrichten und Entwürfe bleiben daher unverschlüsselt, sofern Sie diese Einstellung nicht ändern. Die Dokumentation behandelt nur die Nachrichteninhalte. Zu Metadaten, Indexeinträgen und der erneuten Verschlüsselung von Nachrichten, die vor dem Hochladen des Schlüssels gespeichert wurden, enthält sie keine Angaben. Prüfen Sie diese Punkte daher selbst, statt etwas anzunehmen.

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