Zum Inhalt springen
Serverküche
Suche

Die Suche wird geladen … (nur in der veröffentlichten Seite verfügbar).

Anwendungen Schwierigkeit: Profi

Eigener Mailserver mit Mailcow: Setup von Grund auf

Mailcow (dockerized) auf einem eigenen Server aufsetzen: Postfix, Dovecot, Rspamd und SOGo-Webmail unter deiner Domain – kompletter Mailserver-Stack mit HTTPS.

· 13 Min. Lesezeit ·Dauer: ca. 90 Minuten
Inhaltsverzeichnis

Deine E-Mails sind das Rückgrat deiner digitalen Identität – Passwort-Resets, Rechnungen, Verträge laufen alle darüber. Trotzdem liegen sie bei den meisten bei einem Konzern in den USA. Mit Mailcow holst du dir den kompletten Mailserver auf den eigenen Server: Postfix, Dovecot, Spam-Filter und Webmail, sauber verpackt in Docker. Dieses Tutorial bringt den Stack zum Laufen – die knifflige Zustellbarkeit (SPF, DKIM, DMARC, Reverse DNS) behandeln wir danach im Zustellbarkeits-Rezept.

Einen eigenen Mailserver zu betreiben ist Arbeit – sei ehrlich zu dir

Ein Mailserver ist kein „einmal aufsetzen und vergessen". Du bist ab jetzt für Zustellbarkeit, Reputation, Backups und Updates verantwortlich. Landen deine Mails im Spam oder fällt der Server aus, betrifft das deine wichtigste Kommunikation. Wenn du das nicht regelmäßig pflegen willst, ist ein seriöser Mail-Hoster oft die bessere Wahl – das ist keine Schwäche, sondern eine ehrliche Abwägung. Wer die Kontrolle wirklich will, ist hier richtig.

Was bauen wir?

Am Ende läuft ein vollständiger Mailserver-Stack auf deinem Server, erreichbar als Webmail unter https://mail.DEINE_DOMAIN mit gültigem Let’s-Encrypt-Zertifikat. Enthalten sind:

  • Postfix als SMTP-Server (Senden/Empfangen),
  • Dovecot für IMAP/POP3 (Abruf durch Mail-Programme),
  • Rspamd als moderner Spam- und Signaturfilter,
  • SOGo als Webmail samt Kalender und Kontakten (CalDAV/CardDAV),
  • eine Admin-Oberfläche zum Anlegen von Domains, Postfächern und Aliassen.

Das Ganze kommt als mailcow-dockerized – ein fertig geschnürtes Compose-Projekt aus 18 Containern, das das notorisch komplizierte Mailserver-Setup handhabbar macht. Wir setzen auf Debian 13 mit Docker 29.6 und Compose v5.3 auf; mailcow ist ein Rolling Release und wird über Monats-Tags gepflegt (du aktualisierst per update.sh, es gibt keine klassische Versionsnummer). Getestet haben wir gegen den Stand 2026-07b mit Postfix 3.10.12, Dovecot 2.3.21.1, Rspamd 4.1.4 und SOGo 5.12.10.

Mailcow braucht einen eigenen Server

Anders als die meisten Rezepte hier läuft mailcow nicht hinter dem gemeinsamen Traefik-Reverse-Proxy. Es bringt seinen eigenen Webserver mit und belegt die Ports 80/443 selbst, dazu die Mail-Ports 25, 465, 587, 143, 993 (und mehr). Betreibe mailcow deshalb auf einem dedizierten Server, auf dem sonst nichts diese Ports braucht – nicht auf demselben Host wie dein Traefik-Stack.

Voraussetzungen

  • Ein eigener Server mit Debian 13, auf dem Docker installiert ist und der nur für mailcow da ist (Ports 80/443 und die Mail-Ports frei).
  • Mindestens 6 GB RAM – der Spam-Filter (Rspamd) und der optionale Virenscanner (ClamAV) brauchen Luft. Mit weniger wird es zäh oder ClamAV muss aus.
  • Eine Domain, deren DNS du selbst steuerst. Ohne passende Records (v. a. MX und Reverse DNS) nimmt kein anderer Mailserver deine Post an.
  • Port 25 ausgehend muss offen sein. Viele Provider sperren ihn standardmäßig gegen Spam – bei netcup schaltest du ihn per Support-Ticket frei. Ohne offenen Port 25 kannst du keine Mails an andere Server zustellen.
  • Ein PTR-/Reverse-DNS-Eintrag für die Server-IP, den du im Provider-Panel setzt (bei netcup im SCP). Er muss auf mail.DEINE_DOMAIN zeigen.

Mailcow ist RAM-hungrig, deshalb empfehlen wir mindestens den VPS 2000. Wie viel dein konkreter Bedarf ist, schätzt dir der Server-Rechner.

🍳 Empfehlung Anzeige

VPS 2000 G12

8 vCore · 16 GB RAM · 512 GB NVMe

ab 19,24 €/Monat

Für mailcow inklusive Spam- und Virenfilter sollten es 8 GB RAM sein.

Zu netcup →

💶 5 € Gutschein für netcup-Neukunden:36nc17844976032 (nur Neukunden, keine Domains)

Schritt für Schritt

Schritt 1: DNS-Records anlegen

Bevor du irgendetwas installierst, richte die DNS-Einträge ein – sie brauchen Zeit zum Propagieren, und mailcow holt beim Start das TLS-Zertifikat für den Hostnamen. Lege bei deinem DNS-Anbieter (siehe Domain mit dem Server verbinden) diese Einträge an. DEINE_DOMAIN ist deine Mail-Domain (z. B. beispiel.de), DEINE_SERVER_IPV4 die IPv4-Adresse des Servers:

Ausgabe
mail.DEINE_DOMAIN.   A      DEINE_SERVER_IPV4
mail.DEINE_DOMAIN.   AAAA   DEINE_SERVER_IPV6      (falls du IPv6 nutzt)
DEINE_DOMAIN.        MX     10 mail.DEINE_DOMAIN.

Der MX-Record sagt anderen Mailservern: „Post für @DEINE_DOMAIN nimmt mail.DEINE_DOMAIN entgegen." Der Hostname mail.DEINE_DOMAIN ist der FQDN des Mailservers – nicht zu verwechseln mit der Mail-Domain selbst. Die weiteren Records für Zustellbarkeit (SPF, DKIM, DMARC) und den PTR-Eintrag behandeln wir im Folge-Tutorial zur Zustellbarkeit ausführlich; der PTR-Eintrag sollte aber schon jetzt gesetzt sein, weil viele Server sonst gar nicht erst annehmen.

Tipp

Setz die TTL der Records vor dem Umzug niedrig (z. B. 300 Sekunden). Dann greifen spätere Korrekturen schnell, während du testest. Nach dem Feinschliff kannst du sie wieder erhöhen.

Schritt 2: Voraussetzungen auf dem Server installieren

Melde dich per SSH auf dem abgesicherten Server an. Mailcows Konfigurations-Generator braucht neben Docker auch git und jq – letzteres wird gern vergessen, und der Generator bricht sonst mit Cannot find command 'jq' ab. Installiere beides:

Terminal
sudo apt update && sudo apt install -y git jq

Prüfe, dass Docker und das Compose-Plugin laufen:

Terminal
docker --version && docker compose version

Du solltest zwei Versionszeilen sehen – bei uns Docker version 29.6.1 und Docker Compose version v5.3.1. Mailcow verlangt mindestens Docker 24; darunter bricht der Konfigurations-Generator ab. Fehlt etwas, hol das Docker-Setup nach, bevor du weitermachst.

Schritt 3: Mailcow klonen und konfigurieren

Mailcow wird als Git-Repository ausgeliefert und nicht über einen einzelnen Image-Tag gepflegt. Klone es nach /opt und wechsle hinein. Wichtig ist die umask 0022, damit die erzeugten Dateien die richtigen Rechte bekommen:

Terminal
sudo su
umask 0022
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized

Jetzt erzeugst du die zentrale Konfigurationsdatei mailcow.conf mit dem interaktiven Generator:

Terminal
./generate_config.sh

Zuerst prüft er, ob die IP deines Servers auf der Spamhaus-Bad-ASN-Liste steht – ein sinnvoller Frühwarner, denn aus manchen Netzen nimmt kaum ein Mailserver Post an:

Ausgabe
Detecting if your IP is listed on Spamhaus Bad ASN List...
Check completed! Your IP is clean

Danach stellt er dir nacheinander diese Fragen:

  • Mail server hostname (FQDN): Trage hier mail.DEINE_DOMAIN ein – den Hostnamen des Servers, nicht deine Mail-Domain. Der Wert muss zum A-Record aus Schritt 1 passen.
  • Timezone: Meist schon korrekt vorausgefüllt (z. B. Europe/Berlin) – mit Enter bestätigen.
  • Choose the Branch with it’s number [1/2/3]: Wähle 1 für den master-Branch – das ist der stabile, empfohlene Stand. 2 ist nightly (Testing), 3 der abgekündigte legacy-Branch.

Die ClamAV-Frage siehst du nur auf kleinen Servern

Nach dem Virenscanner (Do you want to disable ClamAV now?) fragt der Generator nur, wenn der Server höchstens 2,5 GiB RAM hat. Auf einer Maschine mit 6–8 GB stellt er SKIP_CLAMD=n still ein, ClamAV läuft also von vornherein mit. Abschalten kannst du ihn jederzeit, indem du in der mailcow.conf SKIP_CLAMD=y setzt und den Stack neu startest.

IPv6-Hosts: Docker wird neu gestartet

Findet der Generator eine funktionierende IPv6-Verbindung (Default-Route plus erreichbare Gegenstelle), muss auch Docker IPv6 sprechen – sonst könnte mailcow zu einem offenen Relay werden. Fehlt /etc/docker/daemon.json, fragt er deshalb:

Ausgabe
/etc/docker/daemon.json not found. Create it with IPv6 settings? [Y/n]

Bestätigst du mit Enter, legt er die Datei selbst an (bei Docker ≥ 28 genügt {"ipv6": true}) und startet Docker sofort neu. Genau deshalb gehört mailcow auf einen eigenen Server: Der Neustart reißt jeden anderen Container auf dem Host mit. Antwortest du mit n, bricht der Generator ab und du musst die Einstellung von Hand nachtragen. Willst du bewusst ohne IPv6 fahren, setzt du später in der mailcow.conf ENABLE_IPV6=false.

Wirf danach einen Blick in die erzeugte mailcow.conf. Die wichtigsten Werte stehen oben:

Terminal
grep -E "^(MAILCOW_HOSTNAME|TZ|HTTP_PORT|HTTPS_PORT|SKIP_CLAMD|ENABLE_IPV6)=" mailcow.conf

Auf unserem Testserver sah das so aus – SKIP_CLAMD=n heißt „ClamAV läuft mit":

Ausgabe
MAILCOW_HOSTNAME=mail.DEINE_DOMAIN
HTTP_PORT=80
HTTPS_PORT=443
TZ=Europe/Berlin
SKIP_CLAMD=n
ENABLE_IPV6=true

Die Datei enthält auch alle Port-Belegungen. In der Standardkonfiguration nimmt mailcow diese Host-Ports in Beschlag:

Ausgabe
25    SMTP     (Server-zu-Server-Zustellung)
465   SMTPS    (Senden mit impliziter TLS)
587   Submission (Senden durch Mailprogramme, STARTTLS)
143   IMAP  /  993 IMAPS   (Abruf durch Mailprogramme)
110   POP3  /  995 POP3S
4190  Sieve    (serverseitige Filterregeln)
80    HTTP  /  443 HTTPS   (Webmail + Admin + ACME)

Diese Ports müssen auf dem Host frei sein – darum der eigene Server. Läuft dort schon ein Reverse Proxy auf 80/443, kollidiert mailcow damit.

Schritt 4: Firewall öffnen

Deine UFW-Firewall muss die Mail- und Web-Ports durchlassen. Neben SSH gibst du frei:

Terminal
sudo ufw allow 25/tcp
sudo ufw allow 80,443/tcp
sudo ufw allow 465,587/tcp
sudo ufw allow 143,993/tcp
sudo ufw allow 110,995/tcp
sudo ufw allow 4190/tcp

Nutzt du zusätzlich die netcup-Firewall im SCP, gib dieselben Ports auch dort frei – sonst blockt die Perimeter-Firewall den Verkehr, bevor er den Server erreicht.

Schritt 5: Den Stack starten

Jetzt lädst du die Images und startest den Stack. Rechne mit rund 4,5 GB auf der Platte – der Stack besteht aus 18 Diensten, die dicksten sind SOGo, Dovecot und Postfix:

Terminal
docker compose pull
docker compose up -d

Das erste Hochfahren dauert ein paar Minuten – Datenbank, Suchindex und die einzelnen Dienste initialisieren sich. Beobachte den Fortschritt mit:

Terminal
docker compose ps

In der Spalte STATUS steht bei jedem Dienst Up …; die Container mit eigenem Healthcheck (etwa unbound-mailcow und clamd-mailcow) melden zusätzlich (healthy). Mailcow holt in dieser Zeit im Hintergrund über seinen eingebauten ACME-Client das Let’s-Encrypt-Zertifikat für mail.DEINE_DOMAIN. Dafür müssen der A-Record und Port 80 von außen erreichbar sein – ist das nicht der Fall, bleibt der acme-mailcow-Container in einer Wiederhol-Schleife und du siehst das in seinen Logs (docker compose logs acme-mailcow).

Schritt 6: Erste Anmeldung an der Admin-Oberfläche

Rufe https://mail.DEINE_DOMAIN im Browser auf. Du landest in der mailcow-UI. Melde dich mit den Standard-Zugangsdaten an:

Ausgabe
Benutzer:  admin
Passwort:  moohoo

Zeigt die Maske „Anmeldung als Benutzer", klick unten auf „Als Admin anmelden" – das Login-Formular auf der Startseite meldet dich sonst als Postfach-Nutzer an, nicht als Administrator.

Standard-Passwort sofort ändern

admin / moohoo ist öffentlich bekannt. Ändere das Admin-Passwort umgehend unter System → Konfiguration → Zugang: In der Tabelle Administratoren klickst du beim Benutzer admin auf Bearbeiten. Im selben Reiter aktivierst du gleich die Zwei-Faktor-Authentisierung (TOTP oder WebAuthn). Solange das Standard-Passwort gilt, ist dein Mailserver offen wie ein Scheunentor.

Nach dem Login landest du im mailcow-Dashboard mit dem Überblick über deine Dienste:

Das mailcow-Dashboard nach der ersten Anmeldung mit Systemüberblick.
Das mailcow-Dashboard direkt nach dem Login.

Schritt 7: Mail-Domain und erstes Postfach anlegen

In mailcow trennst du Domain (z. B. beispiel.de) und Postfach (z. B. kontakt@beispiel.de).

Über E-Mail → Konfiguration in der oberen Navigationsleiste verwaltest du Domains und Postfächer in getrennten Reitern:

Die Mail-Setup-Oberfläche von mailcow mit den Reitern für Domains und Mailboxen.
E-Mail → Konfiguration: Domains und Postfächer verwalten.

  1. Klick auf dem Reiter Domains auf Domain hinzufügen und trage deine Domain DEINE_DOMAIN ein. Die Standardwerte (Postfach- und Alias-Kontingente) sind für den Anfang in Ordnung. Speichere unten mit „Domain hinzufügen und SOGo neustarten" – nicht mit „Nur Domain hinzufügen". Warum, steht gleich im Kasten darunter.

    Der Dialog zum Hinzufügen einer Mail-Domain in mailcow.
    Eine neue Mail-Domain anlegen.

  2. Wechsle auf den Reiter Mailboxen und klick auf Mailbox hinzufügen – Benutzername, Domain, voller Name und ein starkes Passwort (Passwortmanager!). Dieses Postfach kann sich anschließend an der Webmail und per IMAP/SMTP anmelden.

    Der Dialog zum Anlegen eines neuen Postfachs in mailcow.
    Ein neues Postfach anlegen.

Ohne SOGo-Neustart bleibt die Webmail zu

SOGo liest die Liste der Mail-Domains nur beim Start seines Containers ein. Legst du die erste Domain mit „Nur Domain hinzufügen" an, protokolliert SOGo No authentication sources defined - nobody will be able to login, und jeder Webmail-Login endet mit einer nackten Seite Unauthorized – obwohl Passwort und Postfach stimmen. Deshalb der zweite Button; nachträglich geht es über E-Mail → SOGo neustarten. Hat sich schon ein fehlgeschlagener Login in den Cache gebrannt, hilft zusätzlich ein Neustart von memcached (siehe „Wenn es nicht funktioniert").

Nach dem Anlegen der Domain zeigt dir mailcow unter dem Domain-Eintrag den DKIM-Schlüssel und die empfohlenen DNS-Records an. Die brauchst du für die Zustellbarkeit – dazu gleich mehr.

Schritt 8: Webmail testen

Öffne https://mail.DEINE_DOMAIN/SOGo/ (oder klick in der mailcow-UI oben rechts auf Apps → Webmail). Bist du noch nicht angemeldet, landest du zuerst auf der mailcow-Anmeldemaske „Anmeldung als Benutzer" – dort meldest du dich mit der vollen Mail-Adresse und dem Postfach-Passwort an und wirst direkt in den SOGo-Webmailer mit Posteingang, Kalender und Kontakten durchgereicht. Eine Test-Mail von dir an dich selbst sollte sofort im Posteingang liegen – das beweist, dass lokale Zustellung, IMAP und Webmail funktionieren.

Der eigentliche Härtetest ist aber das Senden nach außen und das Empfangen von außen – und genau da entscheidet sich, ob deine Mails im Postfach oder im Spam-Ordner des Empfängers landen. Das hängt an SPF, DKIM, DMARC und dem PTR-Eintrag und ist eigenständig genug für ein eigenes Rezept.

Hinweis

Willst du sofort prüfen, wie es um deine Zustellbarkeit steht, schick nach dem Setup eine Mail an einen Test-Dienst wie mail-tester.com – er bewertet SPF, DKIM, DMARC, Reverse DNS und Blocklisten. Unter 10/10 ist noch Luft nach oben; wie du auf die volle Punktzahl kommst, ist Thema des Zustellbarkeits-Tutorials.

Wenn es nicht funktioniert

generate_config.sh bricht mit Cannot find command 'jq' ab. Das Paket jq fehlt. sudo apt install -y jq und den Generator erneut starten.

Der Generator meldet „User declined to create daemon.json" und bricht ab. Auf Hosts mit aktivem IPv6 hast du die Frage nach der IPv6-fähigen Docker-Konfiguration mit n beantwortet – ohne sie läuft mailcow dort nicht, sonst droht ein offenes Relay. Lege /etc/docker/daemon.json mit {"ipv6": true} an (Docker 28 und neuer), starte Docker mit sudo systemctl restart docker neu und führe ./generate_config.sh erneut aus – oder bestätige die Frage beim zweiten Anlauf einfach mit Enter, dann erledigt der Generator beides selbst.

Die Webmail antwortet nur mit Unauthorized. SOGo kennt deine Mail-Domain nicht: Es liest die Domainliste ausschließlich beim Start und wurde nach dem Anlegen der Domain nicht neu gestartet – in seinen Logs steht No authentication sources defined - nobody will be able to login. Starte SOGo über E-Mail → SOGo neustarten neu. Bleibt es dabei, hängt noch ein fehlgeschlagener Login im Cache: docker compose restart memcached-mailcow sogo-mailcow.

Kein Zertifikat, acme-mailcow startet immer wieder neu. Let’s Encrypt erreicht deinen Server nicht auf Port 80, oder der A-Record von mail.DEINE_DOMAIN stimmt nicht. Prüfe mit docker compose logs acme-mailcow, ob der Hostname und die IP passen, und dass Port 80 durch UFW und die netcup-Firewall offen ist.

Mails nach außen werden nicht zugestellt, Logs zeigen Timeouts auf Port 25. Dein Provider sperrt ausgehenden SMTP-Verkehr auf Port 25 (üblich als Spam-Schutz). Port 25 ausgehend beim Provider freischalten lassen (bei netcup per Support-Ticket). Ohne das kannst du keine Mails an fremde Server senden – Empfang und lokale Zustellung funktionieren trotzdem.

Ports 80/443 lassen sich nicht binden (address already in use). Auf dem Host läuft schon ein Webserver oder Reverse Proxy (z. B. Traefik). Mailcow gehört auf einen eigenen Server. Zur Not lassen sich HTTP_PORT/HTTPS_PORT in der mailcow.conf verbiegen und mailcow hinter einen Proxy stellen – das ist aber fortgeschritten und für die Mail-Ports ohnehin keine Lösung.

Container starten träge oder werden vom Kernel beendet (OOM). Zu wenig RAM. Auf mindestens 6–8 GB gehen oder ClamAV in der mailcow.conf (SKIP_CLAMD=y) deaktivieren – der Virenscanner ist der größte Speicherfresser.

Wartung & Backups

Ein Mailserver lebt von Pflege – plane sie fest ein.

Updates. Mailcow bringt ein eigenes Update-Skript mit. Führe es regelmäßig (etwa monatlich) aus; es aktualisiert die Compose-Datei und alle Images auf den neuesten Stand:

Terminal
cd /opt/mailcow-dockerized
sudo ./update.sh

Das Skript legt vor dem Update automatisch eine Sicherung der Konfiguration an und startet den Stack neu. Lies die angezeigten Release-Hinweise – bei größeren Sprüngen stehen dort gelegentlich manuelle Schritte.

Backups. Deine Mails, die Datenbank und die Krypto-Schlüssel (DKIM!) liegen in Docker-Volumes. Mailcow bringt dafür ein fertiges Backup-Skript mit:

Terminal
cd /opt/mailcow-dockerized/helper-scripts
sudo BACKUP_LOCATION=/opt/mailcow-backups ./backup_and_restore.sh backup all

Sichere das Zielverzeichnis anschließend weg vom Server – am saubersten verschlüsselt mit restic. Besonders wichtig sind die DKIM-Schlüssel: Gehen sie verloren, brechen nach einer Wiederherstellung deine Signaturen, bis du die DNS-Records neu setzt. Ein Backup, das du nie zurückgespielt hast, ist nur ein Hoffnungswert – teste die Wiederherstellung einmal auf einem Testsystem.

Reputation im Blick behalten. Prüfe gelegentlich, ob deine Server-IP auf einer Blockliste gelandet ist (z. B. über einen der gängigen Blocklist-Checker) und wirf ab und zu einen Blick in das Rspamd-Dashboard der mailcow-UI. Ein gehacktes oder falsch konfiguriertes Postfach, das Spam verschickt, ruiniert die Reputation deiner ganzen Domain schnell.

Zuletzt aktualisiert: 25.08.2026

Feedback per E-Mail: feedback@serverkueche.de

Wie geht's weiter?

Das könnte dir auch schmecken