Eigenen Mailserver mit Stalwart und Coolify hosten

Selfhosting Tutorial

Stalwart Mailserver unter Coolify
Inhaltsverzeichnis

Have questions?

Contact Me

Einen 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.

Das Ziel: Ein eigener Mailserver auf Basis von Stalwart, der unter Coolify läuft und seine DNS Einträge und Zertifikate selbst verwaltet.


Voraussetzungen: Ein Server mit laufender Coolify Installation, eine eigene Domain und Zugriff auf die DNS Einstellungen beim Domain Registrar.


Meine Versionen: Coolify 4.3.17, Stalwart WebUI v1.0.9

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

Die 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
Docker Config eingefügt mit Plaintext Option
Warum werden Port 443 und 8080 nicht freigegeben?

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 latest eine 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.

Logindaten im Log

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.

WebUI Link

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:Domain zeigt die Domain an, für die Mails eingerichtet werden.
  • /account/Settings/x:DnsServer zeigt 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:AcmeProvider sollte 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

WebUI ist nicht per HTTPS erreichbar

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.

Mails kommen nicht an oder landen im Spam

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.

Mailclient meldet ein ungültiges Zertifikat

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

Previous

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.

Coolify
Stalwart
Docker
Traefik
+1
Next

Wizard Score App

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

Astro
JQuery
TypeScript
CSS
+3