Anleitung für Mailserver Mailcow hinter Traefik mit Docker
Einen eigenen Mailserver mit Mailcow einrichten und mit Docker hinter Traefik als Proxy-Manager betreiben.
Inhaltsverzeichnis
Sollte man seinen eigenen Mailserver hosten? Vermutlich ist es für gewöhnlich den Aufwand nicht wert, insbesondere wenn es um unternehmenskritische Mailfunktionalität geht. Ist man darauf angewiesen, ist es deutlich einfacher einen externen Dienst dafür einzuschalten.
Als Beispiele finden sich Dienste wie Zoho Mail, Mailbox, Runbox oder ProtonMail. Die Kosten dafür fangen bei ca. 1 - 5 € im Monat an. Möglich ist es auch, wenn man sowieso schon einen Microsoft 365 Vertrag hat, sich darüber ein persönliches E-Mail Postfach einzurichten. Gleiches gilt für ein Abo beim Google Workspace.
Ich möchte aber dennoch meinen eigenen Mailserver hosten. Auch hier bietet sich eine große Auswahl an Programmen, die dazu verwendet werden könnten. Erwähnenswert sind sicherlich Mail-in-a-box als auch Mailu.
Mailcow
In diesem Tutorial nutzen wir aber Mailcow, die Mailserver Suite mit dem “Muuh” 😃
mailcow.email | The mailserver suite with the ‘moo’ – 🐮 + 🐋 = 💕
— Mailcow
Mailcow ist eine freie, Open-Source-Software-Suite, die zur Einrichtung, Verwaltung und Verwaltung von E-Mail-Adressen verwendet wird. Mailcow verwendet verschiedene andere Open-Source-Tools und Dienste, wie zum Beispiel Postfix, Dovecot und ClamAV, um E-Mails zu senden, zu empfangen, zu filtern und zu sichern.
Am besten ist es vorher die Demo auszuprobieren, um zu sehen, ob die Suite zumindest auf den ersten Blick das bietet, was man wirklich haben möchte.
Voraussetzungen
Die Voraussetzungen für das Hosten des Mail-Servers ist Zugriff auf einen Linux Server (zum Beispiel Ubuntu oder Debian), laut Dokumentation sollte das System mindestens über die folgenden Ressourcen verfügen:
- CPU: 1 GHz
- RAM: mindestens 6 GiB + 1 GiB swapDisk
- HDD: 20 GiB (zusätzlich zum benötigten Speicherplatz für die E-Mails)
- System-Typ: x86_64
6 GiB RAM + 1 GiB swap are fine for most private installations while 8 GiB RAM are recommended for ~5 to 10 users.
Es funktioniert meiner Erfahrung nach auch mit etwas weniger RAM, aber viel Puffer bleibt dann nicht mehr. Ich setze voraus, dass der Server so eingerichtet ist, wie in meiner anderen Anleitung beschrieben. Demnach wird auch Traefik als Proxy-Manger eingesetzt. Beim Server dürfen die Ports 25 und 587 nicht vom Anbieter geblockt sein, dies ist zum Beispiel bei Hetzner (Affliate-Link) der Fall, solange man nicht darum bittet, diese Sperre aufzuheben. Sollte eine Firewall im Einsatz sein, so müssen einige Ports offen sein, oder in den Einstellungen später auf offene Ports verändert werden.
Service | Port |
---|---|
Postfix SMTP | 25 |
Postfix SMTPS | 465 |
Postfix Submission | 587 |
Dovecot IMAP | 143 |
Dovecot IMAPS | 993 |
Dovecot POP | 3110 |
Dovecot Manage Sieve | 4190 |
Bei Netcup (Affliate Link) (Neukunden-Gutscheine) hatte ich in der Vergangenheit keine Probleme damit, einen Mailserver zu betreiben.
Mailcow installieren
Nachdem wir uns über ssh mit unserem Server verbunden haben ssh benutzername@server-ipadresse
, laden wir das Repository “mailcow dockerized” in unser Docker-Verzeichnis runter.
cd ~/docker
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
./generate_config.sh
Bei der Frage nach der FQDN muss die Adresse des Mailservers eingegeben werden. Es ist nicht zwangsläufig die Adresse, die bei den E-Mails rechts vom @-Zeichen stehen soll. Stattdessen ist es die URL, die zur Einrichtung dient und die man aufrufen soll, um seine Mailcow zu verwalten. Zum Beispiel mail.einedomain.de
.
Danach öffnen wir die Konfiguration nano mailcow.conf
. Uns interessiert der Bereich mit SKIP_LETS_ENCRYPT=n
. Abhängig davon, ob Traefik sich um das Zertifikat kümmert, sollte diese Zeile eigentlich zu SKIP_LETS_ENCRYPT=y
geändert werden.
In meinem Fall bekomme ich aber Probleme bei der SSL-Verschlüsselung, sobald ich diesen Wert auf y
stelle. Deshalb lasse ich es auf n
, damit sich Mailcow um das Zertifikat kümmert.
Des Weiteren muss der Part mit den HTTP/S Bindungen angepasst werden. Die geänderte Einstellung könnte ungefähr so aussehen:
# You should use HTTPS, but in case of SSL offloaded reverse proxies:
# Might be important: This will also change the binding within the container.
# If you use a proxy within Docker, point it to the ports you set below.
# Do _not_ use IP:PORT in HTTP(S)_BIND or HTTP(S)_PORT
# IMPORTANT: Do not use port 8081, 9081 or 65510!
# Example: HTTP_BIND=1.2.3.4
# For IPv6 see https://mailcow.github.io/mailcow-dockerized-docs/firststeps-ip_bindings/
HTTP_PORT=8083
HTTP_BIND=127.0.0.1
HTTPS_PORT=8443
HTTPS_BIND=127.0.0.1
Florian hat in den Kommentaren dankenswerterweise darauf hingewiesen, dass es zu Problemen mit dem selbst signierten Let’s Encrypt (Wildcard-)Zertifikat kommen kann. Deshalb ist es vielleicht ratsam die Konfigurationsdatei auch bei ADDITIONAL_SAN
bzw. ADDITIONAL_SERVER_NAMES
anzupassen:
# Additional SAN for the certificate
#
# You can use wildcard records to create specific names for every domain you add to mailcow.
# Example: Add domains "example.com" and "example.net" to mailcow, change ADDITIONAL_SAN to a value like:
#ADDITIONAL_SAN=imap.*,smtp.*
# This will expand the certificate to "imap.example.com", "smtp.example.com", "imap.example.net", "imap.example.net"
# plus every domain you add in the future.
#
# You can also just add static names...
#ADDITIONAL_SAN=srv1.example.net
# ...or combine wildcard and static names:
#ADDITIONAL_SAN=imap.*,srv1.example.com
#
ADDITIONAL_SAN=imap.*,smtp.*,mail.*
# Additional server names for mailcow UI
#
# Specify alternative addresses for the mailcow UI to respond to
# This is useful when you set mail.* as ADDITIONAL_SAN and want to make sure mail.maildomain.com will always point to the mailcow UI.
# If the server name does not match a known site, Nginx decides by best-guess and may redirect users to the wrong web root.
# You can understand this as server_name directive in Nginx.
# Comma separated list without spaces! Example: ADDITIONAL_SERVER_NAMES=a.b.c,d.e.f
ADDITIONAL_SERVER_NAMES=mail.meinedomain.de
Wie bereits geschrieben müssen ggf. die “other bindings” verändert werden, wenn die Ports schon belegt sind. Das lässt sich herausfinden, wenn man den Befehl sudo lsof -i -P -n | grep LISTEN
ausführt.
Anschließend benötigen wir eine Docker Compose Datei, die die originale in einigen Punkten überschreibt. nano docker-compose.override.yml
version: "2.1"
### NETWORKS ###
networks:
web:
external:
name: web
default:
driver: bridge
### Services ###
services:
nginx-mailcow:
networks:
- web
labels:
- "traefik.enable=true"
- "traefik.docker.network=web"
- "traefik.http.routers.moo-rtr.rule=Host(`${MAILCOW_HOSTNAME}`)"
- "traefik.http.routers.moo-rtr.tls=true"
- "traefik.http.routers.moo-rtr.service=moo-svc"
- "traefik.http.services.moo-svc.loadbalancer.server.port=8083"
- "traefik.http.routers.moo-rtr.middlewares=chain-no-auth@file"
certdumper:
image: humenius/traefik-certs-dumper
container_name: traefik_certdumper
network_mode: none
volumes:
- ../traefik/acme:/traefik:ro
- ./data/assets/ssl/:/output:rw
environment:
- DOMAIN=${MAILCOW_HOSTNAME}
Die Portnummer beim Loadbalancer entspricht der HTTP Portnummer, die wir vorher vergeben haben.
Wir starten den Dienst mit docker-compose up -d
und warten auf den Download aller Images. Anschließend schauen wir unter “traefik.domain.de”, ob Fehler aufgetreten sind. Falls nicht, sollte unter “mail.einedomain.de” nun unsere Mailkuh erreichbar sein.
Einrichtung Mailcow
Die Anmeldung in das Webinterface erfolgt über die voreingestellten Daten Benutzername: admin
, Passwort: moohoo
. Insofern sollte als erstes das Adminpasswort geändert werden.
Wenn wir uns dann abmelden und erneut anmelden, sollte das neue Passwort wirksam sein. Es ist auch möglich eine Zwei-Factor-Authentifizierung mit beispielsweise Google Authenticator einzurichten.
Google Authenticator verwendet für Ihr Google-Konto die Bestätigung in zwei Schritten und bietet Ihnen damit zusätzlichen Schutz bei der Anmeldung. Bei der Bestätigung in zwei Schritten ist für die Anmeldung in Ihrem Konto sowohl Ihr Passwort als auch ein Bestätigungscode erforderlich, den Sie mit …
— Android App
— iOS App Store
Wenn wir uns nach Aktivierung ab- und erneut anmelden, erscheint die Abfrage zum OTP. An dieser Stelle könnten wir in der docker-compose.override-Datei die Authentifizierung auf chain-no-auth
ändern, wenn wir möchten, dass sich auch andere Personen anmelden können. Falls die Zeile geändert wird, muss nochmal docker-compose down
und docker-compose up -d
ausgeführt werden.
Nächster Schritt ist das E-Mail-Setup.
Wir fügen eine Domain hinzu. Diesmal entspricht die Domain dem, was rechts vom @-Zeichen steht.
Und wir müssen die DNS Einstellungen konfigurieren. Wir finden die richtigen Einstellungen unter dem Button DNS.
Der blaue Button prüft und zeigt die DNS Einstellungen
Meine DNS-Einstellungen in Netcup. Die Daten müssen natürlich angepasst werden Unter Mailboxen fügen wir eine neue Mailbox hinzu.
Danach muss SoGo neu gestartet werden. Sobald die Anmeldung als neu angelegter Nutzer erfolgt, kann zur Webmail-App gewechselt werden.
Integration in Outlook u. ä. E-Mail-Clients
Möchte man das E-Mail-Postfach in ein E-Mail-Programm integrieren, lässt sich das grundsätzlich in wenigen Schritten bewerkstelligen. Ich zeige das am Beispiel vom Outlook. Bei Thunderbird ist der Vorgang fast identisch.
Hier könnt ihr unter dem Menüpunkt Datei ein neues Konto hinzufügen.
Im nächsten Fenster wählt ihr den Haken bei der manuellen Einrichtung.
Bei der Art des Zugriffs möchte ich IMAP haben. POP wäre aber auch möglich. Das Internet Message Access Protocol wird von E-Mail-Clients verwendet, um auf E-Mails von einem Mailserver zuzugreifen. Im Gegensatz zu POP3 holt das E-Mail-Programm nur die benötigten Informationen vom Server. Bei POP3 holt ein E-Mail-Programm die E-Mails vollständig vom Server ab, sie befinden sich danach nichtmehr auf dem Server, sondern nur noch im Mailprogramm.
Nachdem das Kennwort des Postfachs eingegeben wurde, muss man die Servereinstellungen anpassen. Folgende Werte können eingegeben werden:
Eingehende E-Mail: Server: mail.meinedomain.de Port: 993 Verschlüsselungsmethode: SSL/TLS Ausgehende E-Mail: Server: mail.meinedomain.de Port: 465 Verschlüsselungsmethode: SSL/TLS
Hat man vorher smtp.*
zu den zusätzlichen SANS in der Konfiguration hinzugefügt, sollte auch kein Fehler erscheinen.
Mailserver testen
Bei Mail-tester könnt ihr eure Mail auf Spampotenzial testen.
mail-tester.com is a free online service that allows you to test your emails for Spam, Malformed Content and Mail Server Configuration problems
— Newsletters spam test by mail-tester.com
Mein Ergebnis ist mit dieser Einrichtung eine 8/10.
Damit ist der eigene Mail-Server hinter Traefik eingerichtet. Interessant sollte noch die RAM-Auslastung sein, die man mit htop
verfolgen kann.
Update
Updates lassen sich einfach über das beigefügte Skript einfach bewerkstelligen. Dazu einfach ins Mailcow Verzeichnis wechseln cd /pfad/zu/mailcow
und das Skript ausführen ./update.sh
. Das Skript führt dann durch das Update.
Ich hoffe diese Anleitung hilft jemandem weiter 😃