E-Mail-Server mittels Docker und Mailcow

Mit Docker und Mailcow lässt sich ein eigener E-Mail-Server einrichten. Wichtig dabei sind die korrekten DNS-Einträge, bevor überhaupt mit dem Aufsetzen vom E-Mail-Server begonnen wird. Im folgenden Beispiel installieren wir Mailcow mittels GitHub.

Server-IP: 123.45.678.900
FQDN: mail.example.com

Prüfe vorab ebenfalls, ob locale (locale) und Zeitzone (tzdata) deines Servers korrekt sind. Für meinen Server gilt:

# timedatectl
               Local time: Mo 2023-07-24 11:42:37 CEST
           Universal time: Mo 2023-07-24 09:42:37 UTC
                 RTC time: Mo 2023-07-24 09:42:37
                Time zone: Europe/Zurich (CEST, +0200)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

DNS (Standard-Einträge)

Folgende Einträge sind für die Domain example.com für einen funktionierenden Mailcow-Server IP: 123.45.678.900 notwendig. Mit Mailcow können durchaus mehrere Domains als E-Mail verwaltet werden.
mail.example.com           A        123.45.678.900
autoconfig.example.com     CNAME    mail.example.com
autodiscover.example.com   CNAME    mail.example.com
example.com                MX       mail.example.com
_dmarc.example.com         TXT      v=DMARC1; p=reject; rua=mailto:mailauth-reports@example.com
example.com                TXT      v=spf1 mx -all

I. Docker installieren

Docker lässt sich in wenigen Schritten in Debian installieren.

II. Mailcow installieren (git)

Füge den Kanal «stabil» hinzu und weise Debian zu, Docker zu starten:

# curl -sSL https://get.docker.com/ | CHANNEL=stable sh
# systemctl enable --now docker
# apt update

Wechsle nun nach /opt

# cd /opt/

und lade das Docker-Image herunter:

# git clone https://github.com/mailcow/mailcow-dockerized

Wechsle in das Verzeichnis /mailcow-dockerized und generiere die generate_config.sh
Hier muss die FQDN angegeben werden. Dies wird mit

$ hostname --fqdn

angezeigt.

# cd mailcow-dockerized/
# ./generate_config.sh

Baue schlussendliche das Docker-Image:

# docker compose pull
# docker compose up -d

Mailcow starten


Nach erfolgreicher Installation wird Mailcow per Subdomain aufgerufen. In diesem Beispiel zeigt unser MX-Eintrag auf mail.example.com
Ändere unbedingt das Standard-Login vom User: admin und Passwort: moohoo ab. Zudem ist nach erfolgreicher Installation ein ARC/DKIM-Key zu setzen und zu importieren. Den soeben generierten Key fügen wir schlussendlich noch als TXT in die DNS-Einträge ein.

# cd /opt/mailcow-dockerized/
# openssl genrsa -out private.key 2048

Den Schlüssel findest du unter: /opt/mailcow-dockerized/private.key
Erstelle den DNS-Eintrag nach dem Muster:
dkim._domainkey.example.com     TXT     v=DKIM1 (...)
ab jetzt ist der Mailserver via https://mail.example.com erreichbar.

Standard-Ports

läuft auf dem Server eine Firewall wie ufw sind die folgenden Ports mittels ufw allow PORT zu öffnen:

ufw allow PORTNUMMER

Prüfe, ob folgende Ports geöffnet sind:

# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 25                         ALLOW IN    Anywhere
[ 2] 80                         ALLOW IN    Anywhere
[ 3] 110                        ALLOW IN    Anywhere
[ 4] 143                        ALLOW IN    Anywhere
[ 5] 443                        ALLOW IN    Anywhere
[ 6] 465                        ALLOW IN    Anywhere
[ 7] 587                        ALLOW IN    Anywhere
[ 8] 993                        ALLOW IN    Anywhere
[ 9] 995                        ALLOW IN    Anywhere
[10] 4190                       ALLOW IN    Anywhere
[11] 25 (v6)                    ALLOW IN    Anywhere (v6)
[12] 80 (v6)                    ALLOW IN    Anywhere (v6)
[13] 110 (v6)                   ALLOW IN    Anywhere (v6)
[14] 143 (v6)                   ALLOW IN    Anywhere (v6)
[15] 443 (v6)                   ALLOW IN    Anywhere (v6)
[16] 465 (v6)                   ALLOW IN    Anywhere (v6)
[17] 587 (v6)                   ALLOW IN    Anywhere (v6)
[18] 993 (v6)                   ALLOW IN    Anywhere (v6)
[19] 995 (v6)                   ALLOW IN    Anywhere (v6)
[20] 4190 (v6)                  ALLOW IN    Anywhere (v6)

Mailcow Backup erstellen (manuell)

Mailcow lässt sich mit dem eigenen Backup-Script sichern. Gib unter BACKUP_LOCATION einen gültigen Pfad an:

# cd /opt/mailcow-dockerized/
# BACKUP_LOCATION=/var/mc_backup/ ./helper-scripts/backup_and_restore.sh backup all

Bei Bedarf werden die Daten dann mittels restore zurück gespielt:

# cd /opt/mailcow-dockerized/
# ./helper-scripts/backup_and_restore.sh restore

Das Script fragt nach dem Backup-Pfad. Hier somit /var/mc_backup/

Mailcow legt den Backupordner mittels Zeitstempel an:

root@mail:/var/mc_backup# ls -la
insgesamt 12
drwxr-xr-x  3 root root 4096 24. Jul 11:28 .
drwxr-xr-x 12 root root 4096 24. Jul 10:11 ..
drwxr-xr-x  2 root root 4096 24. Jul 11:20 mailcow-2023-07-24-11-20-24

Backup mittels crontab

# crontab -e

füge nun den Befehl ein, welcher Mailcow z.B. alle Tage um 01:00 Uhr sichert und die drei neusten Backups behält:
# Backup alle Tage um 01:00 Uhr nach /backup_mc, älter als 3 Tage löschen
0 1 * * * cd /opt/mailcow-dockerized/; MAILCOW_BACKUP_LOCATION=/backup_mc /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all --delete-days 3
#