Schluss mit Gmail & Co.? E-Mails selbst hosten! | Stalwart

Schluss mit Gmail & Co.? E-Mails selbst hosten! | Stalwart

Übersicht

In diesem Artikel richten wir gemeinsam unseren eigenen Mailserver mit Stalwart ein. Dafür nutzen wir einen kleinen VPS, auf dem wir Stalwart über Docker Compose installieren und konfigurieren.

Wir kümmern uns um die benötigten DNS-Einträge, Zertifikate und Firewall-Regeln, richten unsere ersten Postfächer ein und schauen uns die wichtigsten Funktionen der Administration an. Anschließend binden wir unseren Mailserver in einen E-Mail-Client ein, um E-Mails über unsere eigene Domain senden und empfangen zu können.

Das passende Video zum Beitrag: https://youtu.be/qYgaErlSKXA


Server

Stalwart würden wir zwar auch im Homelab zum Laufen bekommen, für einen Mailserver empfehle ich aber einen VPS. Gmail, Outlook und Co. misstrauen IP-Adressen aus privaten Anschlüssen, den nötigen Reverse-DNS-Eintrag (PTR) können wir zuhause nicht selbst setzen, und mit DS-Lite oder wechselnder IP wäre der Server von außen gar nicht sauber erreichbar.

Ich nutze dafür netcup. Den PTR-Eintrag setzen wir dort selbst im Server Control Panel, und die Port-25-Sperre („netcup Mail block") entfernen wir mit einem Klick in der Firewall, ganz ohne Ticket. Da Stalwart sehr genügsam ist, reicht ein kleiner VPS völlig aus. Für das Video verwende ich den VPS 500 G12.5.

Theoretisch würde auch der VPS nano G11.5s aus der VPS-Lite-Reihe reichen. Die Lite-Tarife sind nochmal günstiger, haben dafür aber eine reduzierte Bandbreite und eine langsamere Netzwerkanbindung. Für ein paar Postfächer ist das kein Problem, wer mehr vorhat, ist mit der regulären Reihe besser bedient.

Wenn ihr mich unterstützen möchtet, könnt ihr über meinen Affiliate-Link buchen. Für die reguläre VPS-Reihe bekommt ihr damit außerdem einen 5 € Gutschein. Für die Lite-Tarife gibt es leider keinen Gutschein, aber auch da hilft mir die Buchung über meinen Link. Ich würde mich freuen, ist aber natürlich kein Muss.

  • 5 € Gutscheincode: 36nc17222595270
  • Günstige VPS-Server & Domains bei netcup hier*

*Es handelt sich hierbei um einen Affiliate-Link.

Natürlich könnt ihr auch Server und Domains von anderen Hostern verwenden. Wichtig ist nur, dass ihr dort den PTR-Eintrag selbst setzen könnt und Port 25 offen ist bzw. freigeschaltet werden kann.

Installation

Wenn wir unseren Server haben, erhalten wir im Falle von Netcup Zugriff auf das Server Control Panel. Dort können wir jetzt den Server entsprechend vorbereiten.

Betriebssystem

Ich nutze meine Linux-Server gerne mit Ubuntu als Betriebssystem. Wenn ihr andere Favoriten habt, könnt ihr natürlich auch diese wählen.

Um auf unserem VPS das gewünschte OS zu installieren, gehen wir auf den Reiter Medien und dort auf den Unterreiter Images.

In meinem Fall wähle ich hier also Ubuntu 26.04 UEFI. Im nächsten Fenster können wir den Hostnamen angeben und bei Bedarf einen Benutzer zusätzlich zu Root erstellen. Der Hostname sollte dabei genauso sein, wie später auch die Domain für den Mailserver wird, worüber er erreichbar ist.

Mit Klick auf Installation wird die Installation gestartet.

Reverse DNS (PTR)

In der Zeit, wo der Server installiert, können wir schon mal den PTR-Eintrag setzen. Für einen Mailserver ist der sehr wichtig, damit unsere Mails korrekt zugestellt werden.

Wenn unser Server eine Mail verschickt, prüft der empfangende Server, ob die IP-Adresse auch wieder auf den Namen unseres Mailservers zurückzeigt, also zum Beispiel auf mail.deinedomain.de. Genau das regelt der PTR-Eintrag. Fehlt er oder steht dort nur ein generischer Name des Hosters, wirkt unser Server wie eine beliebige Spam-Schleuder. Die Mails landen dann im Spam oder werden direkt abgelehnt, Gmail zum Beispiel nimmt sie ohne passenden PTR gar nicht erst an.

Das machen wir im SCP im Reiter Netzwerk. In meinem Fall habe ich vor, nur IPv4 zu verwenden und setze entsprechend nur den Eintrag dafür.

DNS

Stalwart kann für uns automatisch die DNS-Einträge verwalten. Wer das nicht möchte, setzt in diesem Schritt schon einmal den Eintrag für den Mail-Server selber. Alle weiteren Einträge für DKIM, SPF und Co. bekommen wir später als Zonen-Datei von Stalwart zum einfachen Hochladen.

Zugangsdaten

Zurück zum Images-Tab unter Medien können wir nach Abschluss der Installation unsere initialen Zugangsdaten einsehen.

Absicherung VPS

Da der Server aus dem Internet erreichbar ist, sollte er entsprechend abgesichert werden. Im späteren Verlauf kümmern wir uns noch um die Firewall-Einstellungen, dass nur auf benötigte Ports zugegriffen werden kann. Allerdings sollte der SSH-Zugang zusätzlich abgesichert werden. Eine Anleitung dazu findet ihr hier.

Falls ihr NetBird verwendet, könnt ihr Services wie SSH auch komplett "unsichtbar" machen, mehr dazu in diesem Video.

IPv6

Ich persönlich bin mit IPv6 nie warm geworden. Bei Netcup gibt es alle Server mit IPv6-Adressen, welche ich aber nicht nutzen mag. Deaktivieren können wir die mit folgendem Befehl auf dem Server

sudo tee /etc/sysctl.d/99-disable-ipv6.conf > /dev/null <<'EOF'
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOF

sudo sysctl --system

Docker

Als Nächstes installieren wir Docker, falls das noch nicht geschehen ist, da wir Stalwart mit Docker betreiben möchten. Das können wir ganz einfach mit dem offiziellen Convenience Script von Docker machen.

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

Verzeichnis

Bevor wir fortfahren, müssen wir uns ein geeignetes Verzeichnis erstellen, wo wir Stalwart später laufen lassen wollen. Ich habe meine Docker-Compose Stacks immer gerne unter /opt, darunter erstelle ich einen neuen Ordner für Stalwart mit:

sudo mkdir /opt/stalwart
cd /opt/stalwart

Docker Compose

Die Docker Compose Konfiguration finden wir in der Dokumentation von Stalwart. Da ich lieber Bind-Mounts verwende, um die Daten komplett unter /opt/stalwart zu haben, habe ich die Compose entsprechend angepasst und die Volumes entfernt.

services:
  stalwart:
    image: stalwartlabs/stalwart:v1
    container_name: stalwart
    init: true
    restart: unless-stopped
    ports:
      - "25:25"
      - "465:465"
      - "993:993"
      - "995:995"
      - "4190:4190"
      - "443:443"
      - "127.0.0.1:8080:8080"
    volumes:
      - ./stalwart-etc:/etc/stalwart
      - ./stalwart-data:/var/lib/stalwart

Da es sich um eine minimal Ubuntu-Installation handelt, ist nano noch nicht installiert, ich arbeite aber gerne damit. Also installieren wir erst nano und anschließend legen wir die Config in der Datei compose.yml ab.

sudo apt install nano
sudo nano /opt/stalwart/compose.yml

Stalwart Verzeichnisse

Da ich in meinem Fall Bind-Mounts verwende und Stalwart im Container aus Sicherheitsgründen nicht als root läuft, sondern als eigener Benutzer mit der ID 2000, müssen die Ordner auf dem Host auch diesem Benutzer gehören. Deshalb legen wir zuerst die drei Ordner für Konfiguration, Daten und Logs an und übergeben sie anschließend mit chown an die ID 2000. Ohne diesen Schritt gehören die Ordner root, und Stalwart startet nicht oder bricht mit „Permission denied" ab.

cd /opt/stalwart
sudo mkdir -p stalwart-etc stalwart-data
sudo chown -R 2000:2000 stalwart-etc stalwart-data

Starten des Containers

Alles ist bereit und wir können Stalwart starten, um dann mit dem Setup weiterzumachen.

sudo docker compose up -d

Beim ersten Start geht der Container in einen "Bootstrap Mode". Hier wird ein initialer Benutzer für die Einrichtung angelegt und in den Logs mitgeteilt. Die Daten brauchen wir gleich für den nächsten Schritt und können wir mit folgendem Befehl einsehen.

sudo docker logs stalwart 2>&1 | grep -A8 'bootstrap mode'


Ersteinrichtung

Stalwart ist bereit und wartet auf unsere Einrichtung. Initial passiert das auf Port 8080. Zur Sicherheit ist dieser Port nur auf dem Server selber aufrufbar, da die Einrichtungsseite nicht wirklich geschützt ist. Damit wir darauf trotzdem von unserem Rechner aus zugreifen können, können wir einen Tunnel für den Port via SSH öffnen.

ssh -L 8080:127.0.0.1:8080 <user>@<host>

Im Browser rufen wir dann also Folgendes auf:

http://localhost:8080/admin

und melden uns mit den Credentials aus den Logs an.

Setup

Ein initiales Setup startet. Im ersten Fenster geben wir den Hostnamen und die Default-Domain an. Außerdem können wir das automatische Ausstellen von Zertifikaten aktivieren.

Storage

Im nächsten Schritt geht es um den Storage. Hier können wir an sich alles auf dem Default belassen, dann wird alles in einer "RocksDB" gespeichert. Bei Bedarf könnte man hier auch bspw. einen zusätzlichen PostgreSQL-Server einsetzen.

Benutzer Directory

Jetzt haben wir die Möglichkeit, für unsere Benutzer einen Identity Provider wie bspw. Authentik anzubinden. Ich belasse es für dieses Video aber bei internen Benutzern.

Logging

Im nächsten Reiter geht es dann um Einstellungen für das Logging. Hier würde ich empfehlen, einfach ganz oben von Log File auf Console umzustellen. Damit haben wir am Ende die Logs ganz normal in den Docker-Container-Logs.

DNS Management

Stalwart bietet uns an, die ganzen DNS-Einträge für uns zu übernehmen. Bei einem Mailserver gibt es relativ viele Einträge, die man einpflegen muss, daher ist das eine gute Arbeitserleichterung. Für alle, die das nicht möchten, bekommt man für jede Domain aber später auch eine Zonen-Datei, die man bei seinem Provider hochladen kann.

Cloudflare

In meinem Fall nutze ich Cloudflare als Nameserver für meine Domain. Hier gibt es die Möglichkeit, einen API-Key nur für die entsprechende Zone zu erstellen.

Mir ist aufgefallen, dass hierbei ggf. einige Einträge wie bspw. der MX-Eintrag nicht gesetzt werden. Eine Überprüfung ist daher sinnvoll.

Setup abgeschlossen

Das war auch schon alles. Das Setup ist abgeschlossen, wir erhalten nun einen richtigen initialen Account für unsere Stalwart-Instanz und bekommen mitgeteilt, dass wir den Container einmal neustarten sollen. Das machen wir mit dem Befehl:

sudo docker compose restart


Erste Anmeldung

Nachdem wir den Container neugestartet haben, können wir auf Stalwart nicht mehr via Port 8080 zugreifen. Falls ihr euch dafür entschieden habt, DNS-Credentials zu hinterlegen, ist Stalwart vermutlich gerade dabei, alle Einträge zu hinterlegen und Zertifikate via Let's Encrypt zu holen. Je nach Provider kann das einen Moment dauern, bis die Einträge überall angekommen sind.

DNS Manuell

Habt ihr keine Credentials hinterlegt und wollt die Einträge manuell setzen, wie in meinem Fall, haben wir am Anfang ja bereits den Eintrag für den Server selber bereits gesetzt. Wir können nun also zu der Domain navigieren, erhalten aber ggf. noch ein selbstsigniertes Zertifikat und damit eine Warnung, darum kümmern wir uns aber jetzt.

Auf der Seite angekommen, melden wir uns mit den initialen Credentials an.

Bei Stalwart angekommen, gehen wir jetzt als erstes auf den Reiter Domains, dort können wir dann bei unserer Domain View Zone File wählen.

Hier sehen wir jetzt alle Einträge, die gesetzt werden müssen. Die können wir uns einmal kopieren und in ein .txt File speichern und beim entsprechenden Provider hochladen.


Firewall

Stalwart läuft und bevor wir weitermachen können wir nun die Firewall entsprechend einrichten. Bei den meisten Providern dürfen Server im ersten Moment nicht via Port 25 und co. senden und außerdem muss man von außen nur auf bestimmte Ports und nicht alle zugreifen können.

Zurück im SCP von Netcup gehen wir ganz oben auf den Menüpunkt Firewall Policys. Hier erstellen wir eine Policy für Stalwart, die bestimmt auf welchen Ports von außen zugegriffen werden kann. Ich habe hier einmal die minimal nötigen Ports genutzt.

Jetzt müssen wir die Policy auf unseren Server anwenden. Dafür gehen wir zurück auf unsere Serveransicht im SCP und dort auf Firewall.

Hier sehen wir schon die netcup default Policy für das Blocken von Mailports wie 25 für SMTP. Die Policy entfernen wir und anschließend hinterlegen wir unsere Stalwart Policy.


Administration

Die Einrichtung ist fertig und wir können uns nun auf Stalwart konzentrieren. Es gibt eine Menge Anpassungsmöglichkeiten, ich möchte euch einmal den Überblick über die wichtigsten Punkte geben.

Accounts

Unter dem Reiter Accounts könnt ihr lokale Benutzer anlegen, falls ihr kein Directory hinterlegt habt.

Groups

Hier können Gruppenpostfächer angelegt werden, auf die dann gewünschte Benutzer berechtigt werden und gemeinsam mitarbeiten können.

Mailing Lists

Mit Mailing Lists sind E-Mail-Verteiler gemeint. Quasi Adressen, an die E-Mails gesendet werden können, und alle Benutzer der Liste erhalten diese E-Mail dann in ihr Postfach.


E-Mail Client

Damit ist alles eingerichtet. Wenn ihr eure Accounts erstellt habt, könnt ihr diese ganz einfach bspw. in Thunderbird oder anderen genutzten Mail-Clients hinterlegen. Durch gesetzte Autodiscover-Einträge erkennen die meisten Clients bereits die Einstellungen, sodass ihr nur eure E-Mail + Passwort benötigt.


Fazit

Mit Stalwart lässt sich ein eigener Mailserver vergleichsweise einfach betreiben. Gerade die Einrichtung über den Setup-Assistenten und die automatische Verwaltung der DNS-Einträge nehmen uns einiges an Arbeit ab.

Trotzdem sollte man nicht vergessen, dass ein eigener Mailserver auch Verantwortung mit sich bringt. Updates, Backups, Sicherheit und vor allem die zuverlässige Zustellung der E-Mails liegen in unserer Hand.

Wer sich damit beschäftigen möchte, bekommt mit Stalwart aber eine interessante Möglichkeit, seine E-Mails selbst zu verwalten und unabhängig von klassischen Mailanbietern zu betreiben.