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.
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
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
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_DOMAINzeigen.
Mailcow ist RAM-hungrig, deshalb empfehlen wir mindestens den VPS 2000. Wie viel dein konkreter Bedarf ist, schätzt dir der Server-Rechner.
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.
💶 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:
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
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:
sudo apt update && sudo apt install -y git jqPrüfe, dass Docker und das Compose-Plugin laufen:
docker --version && docker compose versionDu 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:
sudo su
umask 0022
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerizedJetzt erzeugst du die zentrale Konfigurationsdatei mailcow.conf mit dem interaktiven Generator:
./generate_config.shZuerst 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:
Detecting if your IP is listed on Spamhaus Bad ASN List...
Check completed! Your IP is cleanDanach stellt er dir nacheinander diese Fragen:
- Mail server hostname (FQDN): Trage hier
mail.DEINE_DOMAINein – 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
1für denmaster-Branch – das ist der stabile, empfohlene Stand.2istnightly(Testing),3der abgekündigtelegacy-Branch.
Die ClamAV-Frage siehst du nur auf kleinen Servern
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:
/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:
grep -E "^(MAILCOW_HOSTNAME|TZ|HTTP_PORT|HTTPS_PORT|SKIP_CLAMD|ENABLE_IPV6)=" mailcow.confAuf unserem Testserver sah das so aus – SKIP_CLAMD=n heißt „ClamAV läuft mit":
MAILCOW_HOSTNAME=mail.DEINE_DOMAIN
HTTP_PORT=80
HTTPS_PORT=443
TZ=Europe/Berlin
SKIP_CLAMD=n
ENABLE_IPV6=trueDie Datei enthält auch alle Port-Belegungen. In der Standardkonfiguration nimmt mailcow diese Host-Ports in Beschlag:
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:
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/tcpNutzt 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:
docker compose pull
docker compose up -dDas erste Hochfahren dauert ein paar Minuten – Datenbank, Suchindex und die einzelnen Dienste initialisieren sich. Beobachte den Fortschritt mit:
docker compose psIn 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:
Benutzer: admin
Passwort: moohooZeigt 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:

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:

Klick auf dem Reiter Domains auf Domain hinzufügen und trage deine Domain
DEINE_DOMAINein. 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.
Eine neue Mail-Domain anlegen. 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.

Ein neues Postfach anlegen.
Ohne SOGo-Neustart bleibt die Webmail zu
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
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:
cd /opt/mailcow-dockerized
sudo ./update.shDas 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:
cd /opt/mailcow-dockerized/helper-scripts
sudo BACKUP_LOCATION=/opt/mailcow-backups ./backup_and_restore.sh backup allSichere 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?

E-Mail-Zustellbarkeit: SPF, DKIM, DMARC und PTR richtig setzen
Damit deine selbstgehosteten Mails im Posteingang landen statt im Spam: Reverse DNS, SPF, DKIM und DMARC Schritt für …
Das könnte dir auch schmecken

Stalwart: der schlanke Mailserver in einem Container
Stalwart Mail Server mit Docker aufsetzen: SMTP, IMAP, JMAP und Spam-Filter in einem einzigen, schlanken Container – die …

Die eigene Website mit Hugo hosten – wie die Serverküche selbst
Statische Website mit Hugo bauen und im Docker-Container hinter Traefik ausliefern – schnell, sicher, ohne Datenbank. …

Immich optimieren: Handy-Backup, deutsche KI-Suche & Familien-Betrieb (Teil 2)
Immich Teil 2: Handy-Backup zuverlässig machen, die KI-Suche auf Deutsch umstellen, Bestandsfotos als externe Bibliothek …