Eigenen Mailserver mit Stalwart und Coolify hosten
Selfhosting Tutorial

Inhaltsverzeichnis
Have questions?
Contact MeEinen eigenen Mailserver mit Coolify zu hosten und zu betreiben ist nicht ganz einfach. Es gibt einige Fallstricke und die Anleitungen, die ich dazu gefunden habe, beziehen sich auf veraltete Versionen und führen einen in die falsche Richtung. Deshalb habe ich meine Einrichtung hier aufgeschrieben.
Es gibt auch andere Mailserver wie z.B. Mailcow, die sich einfacher betreiben lassen und direkt einen Webmail Client mitbringen. Ich habe mich trotzdem für Stalwart entschieden. Mailcow braucht deutlich mehr Ressourcen, Stalwart kommt besser mit Traefik zurecht und ich binde meine Postfächer ohnehin lieber in mein Mailprogramm ein, statt jedes Mal den Webmail Client zu öffnen.
Einrichtung
Schritt 1: Projekt und Ressource anlegen
In Coolify unter /projects ein neues Projekt erstellen, z.B. “Email”. Darin eine neue Ressource anlegen und “Docker Compose” auswählen.
Der Editor in Coolify bietet an dieser Stelle noch keine Rohtext Ansicht. Wenn man hier die komplette Compose Datei hineinkopiert, muss man die Einrückung größtenteils von Hand reparieren. Deshalb erstmal nur diesen minimalen Platzhalter einfügen:
services:
web:
image: hello-worldDie Ressource anlegen und warten, bis Coolify fertig ist.
Schritt 2: Die richtige Compose Datei einfügen
Jetzt kann ein passender Name für den Service vergeben werden, z.B. “stalwart”. Danach über “Edit Compose File” das Modal öffnen und ganz unten “Use plain-text editor” wählen. Dort lässt sich die eigentliche Compose Datei ohne Formatierungsprobleme einfügen:
services:
stalwart-mail:
image: 'stalwartlabs/stalwart:latest'
container_name: stalwart-mail
environment:
- TZ=UTC
ports:
- '25:25'
- '587:587'
- '465:465'
- '143:143'
- '993:993'
volumes:
- 'stalwart-data:/var/lib/stalwart'
- 'stalwart-config:/etc/stalwart'
networks:
- coolify
restart: unless-stopped
volumes:
stalwart-data: null
stalwart-config: null
networks:
coolify:
external: true
Das WebUI von Stalwart läuft im Container auf Port 8080. Diesen Port muss man nicht nach außen freigeben, weil Traefik über das coolify Netzwerk direkt auf den Container zugreift und sich um HTTPS kümmert. Nach außen freigegeben werden nur die Ports, die für den Mailverkehr gebraucht werden.
Wer POP3 oder ManageSieve (Sieve Filter aus dem Mailclient verwalten) nutzen möchte, ergänzt zusätzlich 110, 995 und 4190.
Stalwart empfiehlt für den produktiven Einsatz, statt
latesteine feste Version zu verwenden (z.B.stalwartlabs/stalwart:v0.16). So kommt ein größeres Update nicht unbemerkt bei einem Neustart dazu. Die neueste Version kann man auf Docker Hub einsehen.
Schritt 3: Platzhalter entfernen
Unter “Compose Resources” kann die Ressource “web” jetzt gelöscht werden (Zahnrad Icon, dann “Delete”). Sie war nur für den Workaround aus Schritt 1 nötig.
Schritt 4: Domain konfigurieren
In der Ressource unter “Domains” die Domain für das WebUI eintragen:
- Protokoll: https
- Domain: mail.deinedomain.xyz
- Port: 8080
- Path: leer lassen
Beim Registrar sollte für diese Subdomain bereits ein A Record (und bei IPv6 ein AAAA Record) auf die IP des Servers zeigen. Sonst bekommt Traefik kein Zertifikat für das WebUI.
Schritt 5: Container starten
Den Container starten (oben rechts unter “Actions” die erste Option “Start Container”) und die Logs im Blick behalten. Falls einer der Mail Ports (25, 587, 465, 143, 993) schon belegt ist, startet der Container nicht. Oft läuft dann noch ein anderer Mailserver wie Postfix auf dem System. Dieser muss gestoppt werden, weil Stalwart die Ports zwingend braucht.

Schritt 6: Sofort anmelden
Beim ersten Start läuft Stalwart im Bootstrap Modus und schreibt einen Benutzernamen und ein temporäres Passwort in die Logs. Mit diesen Zugangsdaten jetzt sofort im WebUI anmelden. Solange die Ersteinrichtung nicht abgeschlossen ist, könnte sonst jeder, der die Domain aufruft, den Server einrichten.
Das WebUI erreicht man in Coolify oben rechts über “Links”. Dort den ersten Eintrag mit der eben eingerichteten Domain anklicken.

Schritt 7: Onboarding durchlaufen
Im Onboarding den Server Hostname und die Default Email Domain anpassen. Die restlichen Werte können so bleiben.
Wichtig ist der letzte Schritt “Automatic DNS Management”. Hier empfehle ich unbedingt, den eigenen Domain Registrar anzubinden. Stalwart legt dann alle benötigten DNS Records (MX, SPF, DKIM, DMARC usw.) selbst an und kann seine Zertifikate über DNS beziehen.
Schritt 8: Neustart und eigenes Passwort
Den Container neu starten und wieder die Logs beobachten. Taucht das temporäre Passwort nicht mehr auf, wurde die Konfiguration erfolgreich gespeichert.
Danach erneut bei Stalwart anmelden und direkt das eigene Passwort ändern unter /account/Account/x:AccountPassword.
Schritt 9: Einstellungen prüfen
Jetzt lohnt sich ein kurzer Blick auf diese Seiten:
/account/Management/x:Domainzeigt die Domain an, für die Mails eingerichtet werden./account/Settings/x:DnsServerzeigt den DNS Anbieter, über den Stalwart die Records verwaltet. Hier sollte der eigene Domain Registrar stehen. Falls es Probleme beim Anlegen der Records gibt, lassen sich in diesem Eintrag Timeouts und Intervalle anpassen./account/Settings/x:AcmeProvidersollte einen Provider vom Typ DNS-01 enthalten. Hier “Reuse Key” aktivieren, das lief bei mir stabiler als die anderen Optionen.
Schritt 10: Auf das Zertifikat warten
Jetzt heißt es warten, bis Stalwart ein TLS Zertifikat bezogen hat. Das kann durchaus mehrere Stunden dauern. Sobald es da ist, taucht es unter /account/Settings/x:Certificate auf.
Den Fortschritt und eventuelle Fehler sieht man unter /account/Management/x:Task beim Task “Perform ACME certificate renewal for a domain”.
Schritt 11: Postfach anlegen und im Mailclient einbinden
Ist das Zertifikat vorhanden, kann unter /account/Management/x:Account/User ein Mail Account angelegt werden. Diesem ein Passwort über “Password for authenticating to the account” geben.
Anschließend lässt sich das Postfach in jedem beliebigen Mailclient hinzufügen:
- Server: die Domain aus Schritt 4, z.B. mail.deinedomain.xyz
- IMAP: Port 993 mit SSL/TLS
- SMTP: Port 465 mit SSL/TLS oder Port 587 mit STARTTLS
- Benutzername: die Mailadresse
- Passwort: das eben vergebene Passwort
Mögliche Probleme
Zuerst prüfen, ob die Domain in Coolify wirklich mit https eingetragen ist. Falls ja, die DNS Records beim Registrar kontrollieren und für die Subdomain (z.B. “mail”) zusätzlich eigene A und AAAA Records mit der IPv4 und IPv6 Adresse des Servers anlegen.
Neue DNS Records brauchen manchmal mehrere Stunden, bis sie überall angekommen sind. Also nicht direkt verzweifeln, wenn es nicht sofort klappt.
Viele Hoster sperren ausgehenden Traffic auf Port 25 standardmäßig, z.B. bei neuen Kundenkonten. Dies kann oft in der Firewallkonfiguration im WebUI angepasst werden. Teilweise muss die Sperre auch per Anfrage beim Hoster aufgehoben werden.
Außerdem wichtig ist der Reverse DNS Eintrag (PTR Record) der Server IP. Er sollte auf den Server Hostname zeigen, der im Onboarding (Schritt 7) eingetragen wurde, also z.B. mail.deinedomain.xyz. Mit diesem Namen meldet sich Stalwart beim Versand bei anderen Mailservern. Diesen Eintrag kann Stalwart nicht selbst setzen, er wird beim Hoster des Servers konfiguriert und nicht beim Domain Registrar. Ohne passenden PTR Record lehnen viele große Anbieter Mails ab oder sortieren sie direkt in den Spam.
Ob alles passt, lässt sich gut mit mail-tester.com prüfen.
Traefik und Stalwart verwalten ihre Zertifikate getrennt. Traefik kümmert sich nur um das WebUI, die Mail Ports nutzen das Zertifikat von Stalwart selbst. Solange Schritt 10 nicht abgeschlossen ist, bekommt der Mailclient deshalb noch kein gültiges Zertifikat angezeigt. Wiederhole Schritt 9.
Solltest du noch Fragen oder Verbesserungsvorschläge haben, kontaktiere mich gerne.
Stalwart Docker Dokumentation
Host your own mail server with Stalwart and Coolify
Step by step guide on how to set up the Stalwart mail server on Coolify with Docker Compose, including DNS, certificates and common pitfalls.

Wizard Score App
Design and development of a score counter and analysis webapp for the card game Wizard