Mailcow ist eine leistungsstarke und flexible Lösung für einen eigenen Mailserver, mit dem du deine E-Mails sicher und effizient verwalten kannst. Du kannst mehrere E-Mail-Domains und -Konten erstellen, Benutzer verwalten, E-Mails senden und empfangen sowie zusätzliche Funktionen wie Spam-Filterung und Verschlüsselung nutzen. Mit Mailcow hast du die volle Kontrolle über deine E-Mail-Kommunikation und kannst sie an deine individuellen Anforderungen anpassen. In dieser Anleitung erfährst du, wie du Mailcow innerhalb weniger Minuten mittels Docker und Traefik einrichten kannst.
| Datum | Änderungen |
|---|---|
| 04.03.2026 | http_redirect angepasst, MTA-STS angepasst. Danke an alle Hinweisgeber |
| 14.09.2025 | Kapitel 0.1 erstellt. Diese ist nun notwendig. Danke an @psycho0verload |
| 06.08.2025 | Kapitel 4.1 gestrichen und ersetzt. docker-compose.override.yml angepasst |
| 18.04.2025 | Kapitel 4.2.2 angepasst |
| 15.04.2025 | Traefik aktualisiert, Kapitel 7 hinzugefügt, Kapitel 8 überabeitet, Bilder an aktuelle Version angepasst |
| 07.10.2024 | Kapitel 4.2. für Umsteiger angepasst |
| 06.10.2024 | Kapitel 4.2. auf Überarbeitet und auf Traefik v3 Anleitung angepasst. |
| 18.04.2024 | Kapitel 4.2 um Skript zur Umbenennung erweitert |
| 21.08.2023 | Anpassung und Fehlerkorrektur in der docker-compose.override.yml |
| 28.07.2023 | DNS Einträge vervollständigt |
| 27.07.2023 | 4.4 MTA-STS aktivieren neu verfasst + Traefik Konfiguration bereinigt |
| 01.06.2023 | Anpassung an die neue Traefik Anleitung |
| 05.04.2023 | Kapitel 5 angepasst |
| 30.10.2022 | Kapitel 1 angepasst. Hinweise zu Docker Compose v2 entfernt. Git Installation entfernt. |
| 11.08.2022 | Fehler bei Certbot behoben. Hilfen von Jonathan eingefügt. |
| 11.08.2022 | Verweis auf CrowdSec integriert, Traefik Anleitung Verweis angepasst, Docker Compose angepasst |
| 09.08.2022 | Anleitung auf Docker Compose v2 angepasst. Zusätzlich wurde noch MTA-STS in die Anleitung integriert. |
| 30.04.2021 | Anleitung funktioniert jetzt ohne Wildcard Zertifikate. Reihenfolge der Abschnitte wurde angepasst. |
| 19.05.2020 | Hinzugefügt: Kapitel DNS |
| 15.04.2020 | Hinzugefügt: Clam AV deaktivieren |
| 31.03.2020 | Hinzugefügt: docker-compose.override.yml, Test der Zertifikate |
| 29.03.2020 | Erste Version dieser Anleitung |
Ich habe mailcow ausprobiert, da es eine moderne GUI besitzt und sich viel leichter updaten lässt als mein bisheriger E-Mail Server. Die verlinkte Anleitung erfordert viele Schritte und das komplette System lässt sich sehr schlecht warten. Diese Nachteile hat man bei mailcow nicht.
Ein paar Eindrücke



0. Grundvoraussetzungen
- Docker & Docker Compose v2 (Debian / Ubuntu)
- Traefik ab v3.6 mit CrowdSec installieren und konfigurieren
0.1 jq Installation
Seit dem September Update ist es nun notwendig, dass ihr das Programm “jq” installiert haben müsst. Dies wollen wir nun tun.
apt update && apt install jq -y
1. Verzeichnis erstellen
Nun erstellen wir uns ein Verzeichnis für unseren späteren E-Mail Server
mkdir -p /opt/containers/mailcow
2. mailcow von git klonen
Nun klonen wir uns die neuste Version von mailcow.
git clone https://github.com/mailcow/mailcow-dockerized /opt/containers/mailcowCode-Sprache: PHP (php)
3. Konfigurationsdatei erstellen
Dazu müssen wir lediglich ein Skript starten.
cd /opt/containers/mailcow
./generate_config.sh
Hier gebt ihr ein:
- Mail server hostname (FQDN): mail.euredomain.de
- Timezone [Europe/Berlin]: mit Enter bestätigen oder anpassen und dann bestätigen
- Available Branches: mit “1” bestätigen
Bei mir sieht dies so aus:

4. Anpassungen für Traefik vornehmen
4.1 docker-compose.override.yml erstellen
Nun erstellen wir eine neue Datei, in der wir alle unsere Anpassungen tätigen. Grundlage für diese Anpassungen bildet die offizielle Mailcow Dokumentation.
4.1.1 Ältere Installationen anpassen
Wenn wir mailcow frisch aufsetzten können wir direkt weiter zu 4.1.2 springen. Wenn wir aktuell die alte docker-compose.override.yml nutzen und auf die neue Version umsteigen möchten, sind folgende Schritte notwendig:
1. Mailcow herunterfahren mit:
cd /opt/containers/mailcow
docker compose down
2. Das Zertifikat manuell aus der Datei entfernen:
nano /opt/containers/traefik-crowdsec-stack/traefik/acme_letsencrypt.json
oder
nano /opt/containers/traefik-crowdsec-stack/traefik/data/traefik/certs/acme_letsencrypt.json
{
"http_resolver": {
"Account": {
"Email": "deine@email.de",
"Registration": {
"body": {
"status": "valid",
"contact": [
"mailto:deine@email.de"
]
},
"uri": "https://acme-v02.api.letsencrypt.org/acme/acct/1653677777"
},
"PrivateKey": "ixxxxxxxxxxxxxxxxL4/mGSedh7MvirEfXls0vg5nNVzEQwgIsKLGGxxxxxxxxxxxxJ",
"KeyType": "4096"
},
"Certificates": [
{
"domain": {
"main": "andererdomain.de",
"sans": [
"www.andererdomain.de"
]
},
"certificate": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Store": "default"
},
############# Dieser Teil muss entfernt werden
# {
# "domain": {
# "main": "mail.deinedomain.de",
# "sans": [
# "autodiscover.deinedomain.de",
# "autoconfig.deinedomain.de",
# "mta-sts.deinedomain.de",
# "imap.deinedomain.de",
# "pop3.deinedomain.de",
# "smtp.deinedomain.de"
# ]
# },
# "certificate": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
# "key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
# "Store": "default"
# },
############# Dieser Teil muss entfernt werden
{
"domain": {
"main": "andererdomain.de",
"sans": [
"www.andererdomain.de"
]
},
"certificate": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Store": "default"
}
]
}
}Code-Sprache: PHP (php)
3. Traefik neu starten.
cd /opt/containers/traefik-crowdsec-stack/
docker compose down && docker compose up -d
4. Mailcow wieder starten:
cd /opt/containers/mailcow
docker compose up -d
4.1.2. docker-compose.override.yml
Nun erstellen wir uns die Datei:
nano /opt/containers/mailcow/docker-compose.override.yml
Inhalt:
networks:
proxy:
name: proxy
external: true
services:
certdumper:
image: ghcr.io/kereis/traefik-certs-dumper:latest
restart: unless-stopped
network_mode: none
command: --restart-containers mailcowdockerized-postfix-mailcow-1,mailcowdockerized-dovecot-mailcow-1
volumes:
- /opt/containers/traefik-crowdsec-stack/data/traefik/certs:/traefik:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/assets/ssl:/output:rw
environment:
DOMAIN: ${MAILCOW_HOSTNAME}
ACME_FILE_PATH: "/traefik/tls_letsencrypt.json"
healthcheck:
test: ["CMD", "/usr/bin/healthcheck"]
interval: 30s
timeout: 10s
retries: 5
nginx-mailcow:
ports: !reset
networks:
proxy:
labels:
traefik.docker.network: proxy
traefik.enable: "true"
traefik.http.services.nginx-mailcow.loadbalancer.server.port: "80"
traefik.http.routers.nginx-mailcow-secure.entrypoints: websecure
traefik.http.routers.nginx-mailcow-secure.rule: "Host(`mail.euredomain.de`) || Host(`autodiscover.euredomain.de`) || Host(`autoconfig.euredomain.de`) || Host(`mta-sts.euredomain.de`) || Host(`imap.euredomain.de`) || Host(`pop3.euredomain.de`) || Host(`smtp.euredomain.de`)"
traefik.http.routers.nginx-mailcow-secure.service: nginx-mailcow
traefik.http.routers.nginx-mailcow-secure.tls: "true"
traefik.http.routers.nginx-mailcow-secure.tls.certresolver: tls_resolver
traefik.http.routers.nginx-mailcow-unsecure.entrypoints: web
traefik.http.routers.nginx-mailcow-unsecure.rule: "Host(`mail.euredomain.de`) || Host(`autodiscover.euredomain.de`) || Host(`autoconfig.euredomain.de`) || Host(`mta-sts.euredomain.de`) || Host(`imap.euredomain.de`) || Host(`pop3.euredomain.de`) || Host(`smtp.euredomain.de`)"Code-Sprache: PHP (php)
Nun müssen wir noch die URLs anpassen. Dies könnt ihr von Hand machen oder mit folgendem Skript. Wichtig ist, dass ihr das Skript noch an eure Domain anpasst.
cd /opt/containers/mailcow
sed -i "s/euredomain.de/<DeineDomain>/g" docker-compose.override.yml
Beispiel:
sed -i "s/euredomain.de/goneuland.de/g" docker-compose.override.ymlCode-Sprache: JavaScript (javascript)
4.2 mailcow.conf anpassen
Hier müssen wir noch eine Änderung vornehmen, damit Mailcow keinen eigenen Zertifikate versucht zu erstellen. Ebenfalls deaktivieren wir das redirect.
nano /opt/containers/mailcow/mailcow.conf
bisher:
# Skip running ACME (acme-mailcow, Let's Encrypt certs) - y/n
SKIP_LETS_ENCRYPT=n
# Redirect HTTP connections to HTTPS - y/n
HTTP_REDIRECT=y
ändert ihr zu:
# Skip running ACME (acme-mailcow, Let's Encrypt certs) - y/n
SKIP_LETS_ENCRYPT=y
# Redirect HTTP connections to HTTPS - y/n
HTTP_REDIRECT=nCode-Sprache: PHP (php)
5. Mailcow starten
Nun können wir mailcow zum ersten mal starten. Gebt dazu folgendes ein.
Wichtig ist, dass ihr den Befehl als Benutzer root ausführt.
cd /opt/containers/mailcow
docker compose up
Wenn ihr keine Fehlermeldung bekommt, könnt ihr den Prozess wieder beenden und im Hintergrund starten:
docker compose up -d
Jetzt könnt ihr direkt bei Abschnitt 6 weitermachen.
5.1 Möglicher Fehler: Pool overlaps with other one on this address space
Ich habe bei mir obigen Fehler bekommen.

Wie ihr in der Docker Compose Datei gesehen habt, werden hier feste IP Bereiche (172.22.0/24) verwendet. Es kann jedoch sein, dass dieser Bereich derzeit schon von einem anderen Container verwendet wird.
Jetzt habt ihr zwei Möglichkeiten
- Alle IP Adressen in der Docker Compose anpassen
- Den Container neu starten, welcher den Bereich (172.22.0/24) blockiert.
Ich habe mich für die zweite Möglichkeit entschieden, da es sich schneller realisieren lässt. Um den “blockenden” Container zu finden, verwende ich das Tool Portainer (Installations-Anleitung dazu findet ihr hier).
Hier kann ich mir jetzt anzeigen lassen, welcher Container bereits diesen IP Bereich belegt.

Diesen Container beende ich nun und starte ihn neu, NACHDEM ich mailcow gestartet habe.
Nun starte ich zuerst mailcow und danach dann die eben beendeten Service.
cd /opt/containers/mailcow
docker compose up -d
6. DNS Einstellungen
Alle DNS Einstellungen übernehme ich aus dem Empfehlungen von Mailcow. Diese könnt ihr hier nachlesen.
Bis diese Einstellungen wirken, kann es mehrere Stunden dauern !!!
6.1 Reverse DNS anpassen
Bei netcup könnt ihr den Reverse DNS Eintrag eures Servers sehr einfach anpassen. Dazu geht ihr Server Control Panel (SCP) und wählt dort euren Server aus. Unter dem Reiter “Netzwerk” könnt ihr nun den rDNS Eintrag anlegen.

Der rDNS Eintrag sollte identisch mit dem “MAILCOW_HOSTNAME” (Schritt 3) sein.
Diesen Eintrag könnt ihr euch hier anschauen:
nano /opt/containers/mailcow/.env

6.2 DNS Einstellungen
Diese Einstellungen hole ich auch aus der offiziellen Mailcow Anleitung.
Dazu geht ihr bei netcup ins CCP und wählt dort den Reiter “Domains” aus.

Nun wählt ihre eure Domain aus und klickt auf DNS.

Hier habe ich jetzt folgende Einträge hinzugefügt. Wahrscheinlich stehen schon einige Einträge wie “www” drin.
# Name Typ Wert
mail A eure IP
autodiscover CNAME mail.euredomain.de
autoconfig CNAME mail.euredomain.de
pop3 CNAME mail.euredomain.de
imap CNAME mail.euredomain.de
smtp CNAME mail.euredomain.de
@ MX 0 mail.euredomain.de
# SPF Konfiguration
@ TXT v=spf1 mx a -all
# DMARC Konfiguration
_dmarc TXT v=DMARC1; p=reject; rua=mailto:eureE-Mail@domain.de
#MTA-STS
mta-sts CNAME mail.euredomain.de
_smtp._tls TXT v=TLSRPTv1; rua=mailto:eureE-Mail@domain.de
# Dienste
_autodiscover._tcp SRV 0 1 443 mail.euredomain.de.
_caldavs._tcp SRV 0 1 443 mail.euredomain.de.
_caldavs._tcp TXT path=/SOGo/dav/
_carddavs._tcp SRV 0 1 443 mail.euredomain.de.
_carddavs._tcp TXT path=/SOGo/dav/
_imap._tcp SRV 0 1 143 mail.euredomain.de.
_imaps._tcp SRV 0 1 993 mail.euredomain.de.
_pop3._tcp SRV 0 1 110 mail.euredomain.de.
_pop3s._tcp SRV 0 1 995 mail.euredomain.de.
_sieve._tcp SRV 0 1 4190 mail.euredomain.de.
_smtps._tcp SRV 0 1 465 mail.euredomain.de.
_submission._tcp SRV 0 1 587 mail.euredomain.de.Code-Sprache: PHP (php)
Später in der Anleitung (Schritt 12) werden wir hier noch zwei Werte hinzufügen. Daher könnt ihr dieses Browserfenster offen lassen.
7. Firewall Einstellungen
Damit euer E-Mail Server später von extern zu erreichen ist, müsst ihr folgende Ports öffnen. Zuerst schauen wir uns an, ob die Ports durch Mailcow genutzt werden:
ss -tlpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'Code-Sprache: JavaScript (javascript)
Ausgabe:
LISTEN 0 4096 0.0.0.0:443 0.0.0.0:* users:(("docker-proxy",pid=134819,fd=7))
LISTEN 0 4096 0.0.0.0:465 0.0.0.0:* users:(("docker-proxy",pid=143334,fd=7))
LISTEN 0 4096 0.0.0.0:143 0.0.0.0:* users:(("docker-proxy",pid=143851,fd=7))
LISTEN 0 4096 0.0.0.0:25 0.0.0.0:* users:(("docker-proxy",pid=143327,fd=7))
LISTEN 0 4096 0.0.0.0:4190 0.0.0.0:* users:(("docker-proxy",pid=143872,fd=7))
LISTEN 0 4096 0.0.0.0:80 0.0.0.0:* users:(("docker-proxy",pid=134812,fd=7))
LISTEN 0 4096 0.0.0.0:110 0.0.0.0:* users:(("docker-proxy",pid=143844,fd=7))
LISTEN 0 4096 0.0.0.0:995 0.0.0.0:* users:(("docker-proxy",pid=143865,fd=7))
LISTEN 0 4096 0.0.0.0:993 0.0.0.0:* users:(("docker-proxy",pid=143858,fd=7))
LISTEN 0 4096 0.0.0.0:587 0.0.0.0:* users:(("docker-proxy",pid=143341,fd=7))Code-Sprache: JavaScript (javascript)
Hier eine Auflistung, welche Funktionen die einzelnen Ports haben:
Service Protocol Port
Postfix SMTP TCP 25
Postfix SMTPS TCP 465
Postfix Submission TCP 587
Dovecot IMAP TCP 143
Dovecot IMAPS TCP 993
Dovecot POP3 TCP 110
Dovecot POP3S TCP 995
Dovecot ManageSieve TCP 4190
HTTP(S) TCP 80/443
Genauere Infos findet ihr direkt hier bei Mailcow.
Wir werden die Ports hier bei der ufw Firewall freigeben. Diese könnt ihr schnell mittels dieser Anleitung installieren. Nun die Freigaben:
ufw allow 25/tcp
ufw allow 465/tcp
ufw allow 587/tcp
ufw allow 143/tcp
ufw allow 993/tcp
ufw allow 110/tcp
ufw allow 995/tcp
ufw allow 4190/tcp
ufw allow 80/tcp
ufw allow 443/tcp
Mit folgenden Befehl bekommt ihr eine Übersicht der ufw Regeln angezeigt. Dort solltet ihr nun diese Ports finden:
ufw status
Ausgabe
Status: active
To Action From
-- ------ ----
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
25/tcp ALLOW Anywhere
465/tcp ALLOW Anywhere
587/tcp ALLOW Anywhere
143/tcp ALLOW Anywhere
993/tcp ALLOW Anywhere
110/tcp ALLOW Anywhere
995/tcp ALLOW Anywhere
4190/tcp ALLOW Anywhere
2214/tcp (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
25/tcp (v6) ALLOW Anywhere (v6)
465/tcp (v6) ALLOW Anywhere (v6)
587/tcp (v6) ALLOW Anywhere (v6)
143/tcp (v6) ALLOW Anywhere (v6)
993/tcp (v6) ALLOW Anywhere (v6)
110/tcp (v6) ALLOW Anywhere (v6)
995/tcp (v6) ALLOW Anywhere (v6)
4190/tcp (v6) ALLOW Anywhere (v6)Code-Sprache: HTTP (http)
8. Zertifikate überprüfen
Nun könnt ihr per Konsole überprüfen, ob die Zertifikate richtig geladen wurden. Dies ist wichtig, da ihr euch sonst später nicht mit Clients zu Mailcow verbinden könnt. Gebt dazu folgende Befehle ein:
# Connect via SMTP (587)
echo "Q" | openssl s_client -starttls smtp -crlf -connect mx.euredomain.de:587
# Connect via IMAP (143)
echo "Q" | openssl s_client -starttls imap -showcerts -connect mx.euredomain.de:143
Ausgabe verkürzt:
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = euredomain.de
verify return:1
---
Certificate chain
0 s:CN = euredomain.de
i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
1 s:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
i:O = Digital Signature Trust Co., CN = DST Root CA X3
Code-Sprache: PHP (php)
Bei den obigen Befehlen muss immer bei Domain das “mx” stehen bleiben!
Wenn ihr folgende Ausgabe sehen solltet, dann habt ihr kein offizielles Zertifikat und könnt euch später nicht mit eurem Server verbinden:
CONNECTED(00000003)
depth=0 C = DE, ST = NRW, L = Willich, O = mailcow, OU = mailcow, CN = mail.euredomain.de
verify error:num=18:self-signed certificate
verify return:1
depth=0 C = DE, ST = NRW, L = Willich, O = mailcow, OU = mailcow, CN = mail.euredomain.de
verify return:1Code-Sprache: PHP (php)
In diesem Fall solltet ihr bei Traefik gehen und schauen, ob Zertifikate erstellt wurden. Dies könnt ihr auch kontrollieren, indem ihr auf mail.euredomain.de geht. Im nächsten Schritt schaut ihr, ob die Übergabe der Zertifikate zwischen Traefik und Mailcow funktioniert. Dazu macht ihr folgendes:
cd /opt/containers/mailcow/
docker compose logs certdumper
Hier sollte nun folgendes stehen:
docker compose logs certdumper
certdumper-1 | [2025-04-15T18:25:08+0000]: Got value of --restart-containers: mailcowdockerized-postfix-mailcow-1,mailcowdockerized-dovecot-mailcow-1. Splitting values.
certdumper-1 | [2025-04-15T18:25:08+0000]: Values split! Got 'mailcowdockerized-postfix-mailcow-1 mailcowdockerized-dovecot-mailcow-1'
certdumper-1 | [2025-04-15T18:25:08+0000]: --restart-services is empty. Won't attempt to restart services.
certdumper-1 | [2025-04-15T18:25:08+0000]: Got value of DOMAIN: mail.euredomain.de. Splitting values.
certdumper-1 | [2025-04-15T18:25:08+0000]: Values split! Got 'mail.euredomain.de'
certdumper-1 | [2025-04-15T18:25:08+0000]: ACME file path: /traefik/acme_letsencrypt.json
certdumper-1 | [2025-04-15T18:25:08+0000]: Clearing dumping directory
certdumper-1 | [2025-04-15T18:25:08+0000]: Dumping certificates
certdumper-1 | ╭─────────────────────────────────────────────────────────────────────────╮
certdumper-1 | │ │
certdumper-1 | │ Request for Donation. │
certdumper-1 | │ │
certdumper-1 | │ I need your help! │
certdumper-1 | │ Donations fund the maintenance and development of traefik-certs-dumper. │
certdumper-1 | │ Click on this link to donate: https://donate.ldez.dev │
certdumper-1 | │ │
certdumper-1 | ╰─────────────────────────────────────────────────────────────────────────╯
certdumper-1 | [2025-04-15T18:25:08+0000]: Certificates for domain 'mail.euredomain.de' don't exist. Omitting...
certdumper-1 | [2025-04-15T18:25:49+0000]: Clearing dumping directory
certdumper-1 | [2025-04-15T18:25:49+0000]: Dumping certificates
certdumper-1 | [2025-04-15T18:25:49+0000]: Certificates for domain 'mail.euredomain.de' don't exist. Omitting...
certdumper-1 | [2025-04-15T18:25:54+0000]: Clearing dumping directory
certdumper-1 | [2025-04-15T18:25:54+0000]: Dumping certificates
certdumper-1 | [2025-04-15T18:25:54+0000]: Certificate or key for 'mail.euredomain.de' differ, updating
certdumper-1 | [2025-04-15T18:25:54+0000]: Trying to restart containers
certdumper-1 | [2025-04-15T18:25:54+0000]: Looking up container with name mailcowdockerized-postfix-mailcow-1
certdumper-1 | [2025-04-15T18:25:54+0000]: Found 'aa4bc235be3edf1e14ba94357a428563cda7fbce5c2a09d94a2c304c6b0aa01b'. Restarting now...
certdumper-1 | aa4bc235be3edf1e14ba94357a428563cda7fbce5c2a09d94a2c304c6b0aa01b
certdumper-1 | [2025-04-15T18:25:56+0000]: Restarting container 'aa4bc235be3edf1e14ba94357a428563cda7fbce5c2a09d94a2c304c6b0aa01b' was successful
certdumper-1 | [2025-04-15T18:25:56+0000]: Looking up container with name mailcowdockerized-dovecot-mailcow-1
certdumper-1 | [2025-04-15T18:25:56+0000]: Found '95e968d054694d80d59bfa9d84033c6ae4e18d60e1a6c53468d6d5bdfff1275a'. Restarting now...
certdumper-1 | 95e968d054694d80d59bfa9d84033c6ae4e18d60e1a6c53468d6d5bdfff1275a
certdumper-1 | [2025-04-15T18:25:59+0000]: Restarting container '95e968d054694d80d59bfa9d84033c6ae4e18d60e1a6c53468d6d5bdfff1275a' was successful
certdumper-1 | [2025-04-15T18:25:59+0000]: Container restarting process done.Code-Sprache: PHP (php)
9. Mailcow konfigurieren
Nach dem Start solltet ihr auf folgende Webseite gehen: mail.euredomain.de/admin
Nun solltet ihr folgendes sehen:

Die Benutzerdaten sind:
- Benutzername: admin
- Passwort: moohoo
10. Administratorkennwort ändern
Dazu geht ihr auf “System –> Konfiguration”.

Hier könnt ihr nun mittels “Bearbeiten” euer Kennwort eingeben.

Hier gebt ihr dann euer neues Kennwort ein.
11. Eure Domain hinzufügen
Dazu klickt ihr auf “E-Mail” -> “Konfiguration”.

Hier klickt ihr auf “Domain hinzufügen”.

Hier gebt ihr nun eure Domain ein. Beispielsweise: euredomain.de
Gebt dort aber NICHT “mail.euredomain.de” ein!
Anschließend bestätigt ihr mit “Domain hinzufügen und SoGo neustarten”.

Nun sollte eure Domain angezeigt werden.

12. MTA-STS aktivieren
MTA-STS (Mail Transfer Agent-Strict Transport Security), kurz als STS bezeichnet, stellt eine vergleichsweise innovative Lösung dar, um die Sicherheit beim Versenden und Empfangen von E-Mails zu verbessern. Mit der Ratifizierung als RFC-8461 kann es nun implementiert werden. Wie bei DANE, werden auch für STS relevante Informationen in das DNS eingefügt. Der wesentliche Unterschied besteht jedoch darin, dass STS nicht auf DNSSEC angewiesen ist. Da zahlreiche Hosting-Anbieter DNSSEC zurzeit nicht unterstützen, kann auch DANE nicht verwendet werden. Hier bietet STS (zumindest vorübergehend bis DNSSEC und DANE allgemein verfügbar sind) eine praktikable Alternative.
Seit Version 2025-09 wird der MTA-STS Eintrag direkt in der Nutzeroberfläche generiert. Dazu klickt ihr auf eure Domain und wählt “Bearbeiten” aus:

Hier wählt ihr “MTA-STS” aus:

Nun gebt ihr folgendes ein:
Maximales Alter: 86400
MX-Server: mail.euredomain.deCode-Sprache: CSS (css)
Anschließend können wir uns den MTA-STS DNS Eintrag anzeigen lassen. Dazu geht ihr auf eure Domain zurück und wählt “DNS” aus:

Hier seht ihr nun den DNS Wert, welchen ihr noch bei eurem DNS Server eintragen müsst:

13. DKIM Schlüssel erzeugen
Uns fehlt nun noch der DKIM Eintrag auf unserem DNS Server. Dazu loggen wir uns mit unserem Administrator Account bei mailcow ein.
Nun klickt ihr auf “System –> Konfiguration”.

Hier klickt ihr “Einstellungen –> ARC/DKIM-Keys”

Nun solltet ihr direkt euren DKIM Key sehen:

Diesen gebt ihr nun in eurem DNS Server ein.
#Name Typ Wert
dkim._domainkey TXT v=DKIM1;k=rsa;t.....Code-Sprache: PHP (php)

14. DNS Einstellungen testen
Bitte bedenkt, dass eure obigen Einstellungen einige Stunden (bis zu 48 Stunden!) dauern können, bis diese übernommen worden sind.
14.1 DNS Einstellungen testen mit mailcow
Mailcow bietet nun auch die Möglichkeit eure DNS Einstellungen zu testen. Dazu loggt ihr euch mit eurem Admin Account ein.
Anschließend klickt ihr auf “E-Mail” -> “Konfiguration”.

Hier seht ihr dann eure Domains. Nun klickt ihr auf DNS und solltet dann alle DNS Einstellungen sehen.

14.2 Testen mit mail-tester.com
Auf dieser Homepage bekommt ihr eine E-Mail Adresse angezeigt. Hier schickt ihr eine E-Mail hin und müsst einen Betreff / paar Zeilen Inhalt hinzufügen. Dies könnt ihr aber erst tun, wenn ihr weiter mit dieser Anleitung seid und schon Nutzer angelegt habt.

Mein Score

14.3 Testen mit verifier.port25.com
Dies ist ein weiterer Webdienst, welcher euren E-Mail Server testet. Dieser Dienst zeigt euch sehr viele technische Details an. Um den Dienst nutzen zu können, schickt ihr einfach von eurer neuen E-Mail Adresse eine leere E-Mail an :
check-auth@verifier.port25.comCode-Sprache: CSS (css)
14.4 Testen mit mxtoolbox.com
Die Webseite https://mxtoolbox.com liefert sehr viele Tests für euren Mail-Server. Diese könnt ihr einfach mal ausprobieren.
14.4 MTA-STS testen
Dazu gehst du auf folgende Webseite: https://www.checktls.com/TestReceiver
Hier gebt ihr nun eure Domain an und wählt dann noch den MTA-STS Test aus. Wichtig ist, dass es einige STUNDEN dauern kann, bis die DNS Einstellungen übernommen wurden von allen Servern.

Wenn alles geklappt hat, dann solltet ihr folgendes sehen:

15. E-Mail Benutzer anlegen
Nun legen wir einen ersten E-Mail Benutzer an. Dazu klickt ihr auf “Mailboxen” und dann “Mailbox hinzufügen”.

Nun könnt ihr einen Benutzer anlegen. Hier zum Beispiel “test”.

In der Übersicht sollten nun alle eure Benutzer zu sehen sein.

16. Webmail starten
Unter “Apps” -> “Webmail” könnt ihr euch nun euer Postfach anschauen.

Ihr solltet nun auf die Webseite ” https://mail.euredomain.de/SOGo” weitergeleitet werden. Hier meldet ihr euch nun an.

Danach könnt ihr direkt E-Mails schreiben, Kontakte pflegen sowie Kalender anlegen.

17. Mailcow zusätzlich mittels CrowdSec absichern
Bei CrowdSec handelt es sich um eine open source Software, welche euch zusätzlichen Schutz bringt. Wie ihr CrowdSec zusammen mit Mailcow einrichten könnt, erfahrt ihr hier.

Hallo zusammen,
zunächst einmal vielen Dank für eure Arbeit und diese Community. Ich beschäftige mich jetzt zwar seit 5 Jahren mit meinem Homeserver und Docker, nehme durch euch aber sehr viel mit.
An mailcow verzweifle ich gerade.Der Stack startet mit meinen Configs problemlos, ich kann auch eine Domain anlegen, E-Mails versenden, soweit alles wie erwartet. Allerdings geht meine CPU nach kurzer Zeit durch die Decke. Der CPU-Load steigt unaufhörlich, nach einer knappen Minute fangen sich diverse Jobs an zu stapeln, ohne zu beenden.
PID PPID USER %MEM %CPU CMD
1331220 1331204 root 0.0 48.8 /usr/local/bin/gosu nobody /usr/local/bin/imapsync_runner.pl
1331226 1331170 root 0.0 48.8 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1333080 1333011 root 0.0 46.7 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1334565 1334551 root 0.0 46.5 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1336365 1336345 root 0.0 44.4 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1338817 1328001 root 0.0 42.8 /usr/local/bin/gosu vmail /usr/local/bin/repl_health.sh
1338867 1338824 root 0.0 42.2 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1340513 1340426 root 0.0 41.8 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1342158 1342127 root 0.0 40.3 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1343993 1343957 root 0.0 37.9 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1331217 1331171 root 0.0 37.6 /usr/local/bin/gosu sogo /usr/sbin/sogo-tool -v expire-sessions 480
1331225 1331205 root 0.0 37.1 /usr/local/bin/gosu sogo /usr/sbin/sogo-ealarms-notify -p /etc/sogo/cron.creds
1345727 1345709 root 0.0 37.1 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1333067 1333048 root 0.0 36.2 /usr/local/bin/gosu sogo /usr/sbin/sogo-ealarms-notify -p /etc/sogo/cron.creds
1333068 1333060 root 0.0 35.5 /usr/local/bin/gosu sogo /usr/sbin/sogo-tool -v expire-sessions 480
1349307 1349218 root 0.0 35.1 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1347515 1328001 root 0.0 34.6 /usr/local/bin/gosu vmail /usr/local/bin/repl_health.sh
1347621 1347588 root 0.0 34.5 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1334558 1334524 root 0.0 34.1 /usr/local/bin/gosu sogo /usr/sbin/sogo-tool -v expire-sessions 480
1336352 1336306 root 0.0 34.0 /usr/local/bin/gosu sogo /usr/sbin/sogo-ealarms-notify -p /etc/sogo/cron.creds
1334564 1334518 root 0.0 33.6 /usr/local/bin/gosu sogo /usr/sbin/sogo-ealarms-notify -p /etc/sogo/cron.creds
1352604 1352541 root 0.0 32.7 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1336351 1336308 root 0.0 32.2 /usr/local/bin/gosu sogo /usr/sbin/sogo-tool -v expire-sessions 480
1354187 1354130 root 0.0 31.3 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1355858 1355786 root 0.0 30.9 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1357431 1328001 root 0.0 30.6 /usr/local/bin/gosu vmail /usr/local/bin/repl_health.sh
1338872 1338808 root 0.0 30.5 /usr/local/bin/gosu sogo /usr/sbin/sogo-ealarms-notify -p /etc/sogo/cron.creds
1357469 1357451 root 0.0 30.4 /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh
1338866 1338849 root 0.0 30.2 /usr/local/bin/gosu sogo /usr/sbin/sogo-tool update-autoreply -p /etc/sogo/cron.creds
Dovecot und SOGo scheinen mir hier was krumm zu nehmen.
An den Systemvoraussetzungen scheitere ich nicht, die reichen hier aus. Die einzigen Anpassungen in der Config habe ich an den Volumes sowie den HTTP(S)-Ports und dem Redirect auf HTTPS vorgenommen und natürlich an meine Traefik-Gegebenheiten angepasst.
Ich vermute hier stark, dass ich das Problem bin, aber ich finde einfach nicht heraus, an welcher Stelle. Die Logs machen mich hier leider auch nicht schlauer, weil augenscheinlich alles zu funktionieren scheint. Hat diese Erfahrung schon einmal jemand gemacht oder eine Idee, wo ich hier suchen sollte?
Vielen Dank vorab
Daniel
Hallo,
erstmal großes Lob und Vielen Dank für eure Arbeit !
Ist echt großartig was ihr so nebenbei auf die Beine stellt.
Ich würde gerne meinen alten Mailserver auf Mailcow migrieren, habe dafür auf Ubuntu 24.04 nach eurer Anleitung über github den traefik und crowdsec stack eingerichtet, danach mailcow nach eurer Anleitung. Portainer hatte ich auch mal getestet, der funktioniert.
mailcow komme ich aber nicht auf die Oberfläche, ich bekomme “ERR_TOO_MANY_REDIRECTS” und finde nicht die Ursache, vielleicht habt ihr eine Idee ?
Vielen Dank
Chris
Hat noch jemand Probleme damit das die Zertifikate nicht automatisch erneuert werden? Habe das jetzt manuell versucht zu triggern, aber so wirklich funktioniert will es nicht.
Anstatt
Würde ich unter
wie folgt ergänzen:
damit müssen keine Änderungen in der docker-compose.yml vorgenommen werden und das update skript von mailcow läuft dann später mal sauber durch ✌
Es gab Probleme mit Mails an Google. Dort wird die IP6 Adresse verglichen.
Christian
psycho0verload
Ich konnte das Problem mit dem DNS Einstellungen erledigen.
@—-aaaa—-meine Ip6 Adresse
Jetzt kommen auch die Mails an Google Adressen durch.
Vielleicht eine Ergänzung für die Anleitung.
Hallo in die Runde, nach Rückmeldung von
mrfab läuft alles wie erwartet. Jetzt folgende Frage. Wenn ich unter checktls meine Mailadresse checke bekomme ich nur bei Mailadressen mit der Domain die ich unter Pkt. 4.4.1 MTA-STS Policy als MX *.meineDomain.de eingetragen habe keine MTA Fehlermeldung. Bei anderen Mailadresse mit meiner zweiten und dritten Domain kommt diese Meldung
MX–>meineDomain.de (0) mail.meineDomain.de {MTASTS fail}
MTA-STS fail: no policy
Ansonsten läuft alles. Muss die Policy um die weiteren Domains erweitert werden.
mx: mail.euredomain.de
mx: *.euredomain.de
mx: *.euredomain2.de
usw.
Vielen Dank.
Hallo in die Runde,
ich möchte nach der erfolgreichen Installation eine zweite Domain hinzufügen. Der DKIM Key liegt vor und ist unter DNS eingetragen. Punkt 12. Alle anderen Eintragungen habe ich so gelassen. Im Internet habe keine weiteren Angaben gefunden. Jetzt kann ich darüber Mails versenden aber keine empfangen. Unter checktls.com/testreceiver erhalte ich {mtasts fail} und mta-sts faul: no policy. Wo liegt da bei mir der Fehler. Muss ich in der mta-sts.txt einen zweiten MX Eintrag vornehmen Punkt 4.4.1 Vielen Dank für Hilfe.
Wäre klasse, wenn ihr noch optional die Einrichtung von DANE mit hinzufügen würdet 🥳
Hallo zusammen
Vielen Dank für diese super Anleitung.
Ich konnte mailcow und traefik bei Hetzner in der Cloud auf einem shared vCPU Ampere installieren (CAX31) für den privaten Gebrauch und nun lasse ich das ganze auf CAX11 laufen. Mal schauen ob das von den Ressourcen her reicht oder ich auf längere sicht doch auf CAX21 gehen muss.
Frage: Im Kapitel “4.4.1 MTA-STS Policy” erstellt man ja die Datei “/opt/containers/mailcow/data/web/.well-known/mta-sts.txt” welche ja dann über HTTPS://mta-sts.domain.de/.well-known/mta-sts.txt erreichbar sein muss.
Leider wird nirgendwo beschrieben was man konfigurieren muss damit diese Text Datei per Webserver erreichbar ist, wenn mich nicht alles täuscht.
Was müsste man machen damit diese Datei über HTTPS erreichbar ist?
Freundliche Grüsse
Hallo in die Runde,
mit einem eigenen Mailserver habe ich mich noch nicht beschäftigt. Darum folgende Frage. Ich hoste alles auf einem eigenen Server mit einer Dynamischen IP. Ist es überhaupt möglich hier ein Mail Server wie Mailcow zum Einsatz zu bringen. Vielen Dank für eine Aufklärung. Stalwart gibt e s ja auch noch. Da wird es wohl ähnlich sein. Gruß Andreas