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 und https aktivieren

Mailcow ist via
http://mail.example.com/admin
erreichbar.

Um https zu aktivieren, trage die Domain unter E-Mail > Konfiguration > Domain hinzufügen ein. Danach auf DNS klicken und den angezeigten Schlüssel in die DNS Zonen eintragen. Bis Mailcow den Schlüssel erkennt, kann es durchaus ein wenig dauern. Danach sollte Mailcow via https aufrufbar sein.

warte, bis «Key gültig» erscheint. Ab jetzt ist Mailcow via https 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
#