In der folgenden Anleitung werde ich darauf eingehen wie man eine VM mit Debian installiert und darauf Mailcow.

Für die Debian Installation wird zuerst ein aktuelles ISO Image benötigt. Dieses kann hier heruntergeladen werden. Hierfür wird ein System mit mindestens 2GB RAM, 2 Kernen und 10GB Storage empfohlen. Wenn die VM con der CD gebootet wird kommt als erstes ein Auswahlmenü, in diesem die Option Install wählen und danach enter drücken.

Im nächsten Schritt wird die Sprache, die Region und das Tastaturlayout fetgelegt. Im nächsten Schritt konfiguriert Debian einige Einstellungen wie die Netzwerkkonfiguration. Wenn die automatische Konfiguration abgeschlossen ist, frag der Installer nach dem Hostname, dieser kann frei gewählt werden. Ich verwende hierbei gerne Namen, die zu dem System passen, wie zum Beispiel mailcow. Der Domain Name im darauffolgenden Schritt kann leer gelassen werden. Wenn dieser festgelegt wurde sollte das Passwort für den root Benutzer festgelegt werden. Hierbei sollte auf einen Passwortgenerator gesetzt werden. Nachdem das Passwort für den root Benutzer festgelegt wurde fragt Debian noch nach benötigten Daten für einen nicht root Nutzer. Hierbei muss ein Anzeigenahme, ein Nutzername und ein generiertes Passwort festgelegt werden. Die Partitionierung wird mit `Guieded - use entire disk` bestätigt, danach die Festplatte ausgewählt. Als Partitionsschema wird `All Files in one partition` gewählt. Wenn alle Optionen gesetzt wurden wird nochmal eine zusammenfassung angezeigt. Diese wird dann mit `Finish partitioning and write changes to disk` und danach nochmal mit `yes` bestätigt.

Nun wird Debian auf die Festplatte installiert. Jenachdem wie schnell das Bootlaufwerk und die Festplatte ist kann dieser Schritt einige Minuten dauern. Nachdem die ersten Dateien auf die Festplatte kopiert wurden, fragt Debian ob CDs mit Paketen eingelesen werden sollen. Dieser Schritt sollte mit `No` bestätigt werden. Danach sollte die Region wo der Server steht ausgewählt werden, damit wählt Debian den nächstbesten Server für die Paketquellen aus. Die in der Region verfügbaren Server werden in der nächsten Seite angezeigt. Hierbei können im Prinzip alle verwendet werden außer `deb.debian.org`, da diese relativ langsam sind. Generell empfehle ich hierbei große Hoster oder UNIs. Ein Proxy im nächsten Schritt muss nicht angegeben werden. Die Analysedaten sollten in jedem Fall abgelehnt werden, außer du willst deine Daten an Debian weitergeben. Im nächsten Schritt sollte nur der SSH Server aktiviert werden. Die Optionen können deaktiviert oder aktiviert werden, indem mit den Pfeiltasten auf die entsprechende Option navigiert wird und dann die Leertaste gedrückt wird.

Nachdem der SSH Server installiert wurde, muss der Bootloader installiert werden, dafür muss bei der Frage ob Grub installiert werden soll "Yes" gedrückt werdeb und in der nächsten Seite die Systemfestplatte ausgewählt werden.

Nachdem das System installiert wurde wird Debian neugestartet. Nun kann sich entweder über die Oberfläche angemeldet werden oder via SSH über die IP Adresse. Nach der Authentifizierung am System mit dem zuvor erstellten Nutzer muss sich als root angemeldet werden und danach das System auf den neuesten Stand gebracht werden.

    su root
    # nun muss das Passwort den root Benutzers eingegeben werden
    apt update
    apt upgrade -y

Nachdem das System auf dem neuesten Stand ist kann (auch als root) Docker installiert werden. Docker stellt hierfür ein Script bereit. Zum herunterladen des Scripts muss zuerst Curl installiert werden.

    su root
    # nicht benötigt falls noch als root angemeldet aus dem vorherigen Schritt.
    apt install curl -y
    curl -sSL https://get.docker.com/ | CHANNEL=stable sh
    systemctl enable --now docker
    apt install docker-compose git -y

Nachdem nun die erforderlichen Vorbereitungen auf dem System abgeschlossen wurden, kann mit der Installation vom Mailcow selber begonnen werden. Dazu muss als erstes mit Git sich die Anwendung heruntergeladen werden und danach die Konfigurationsdatei mit dem mitgelieferten Script generiert werden. Das nachfolgende Script muss wie auch die beiden vorherigen mit root Rechten ausgeführt werden. Das Script fragt zuerst nach dem Hostname, welcher später verwendet werden soll um das WebUI von Mailcow zu erreichen und danach nach der Zeitzone, für welche `Europe/Berlin` verwendet werden sollte.

    su root
    # nicht benötigt falls noch als root angemeldet aus dem vorherigen Schritt.
    cd /opt
    git clone https://github.com/mailcow/mailcow-dockerized
    cd mailcow-dockerized
    ./generate_config.sh

Nachdem nun Mailcow zum ersten starten vorbereitet wurde, muss bevor es gestartet werden kann, die Firewall angepasst werden. Dafür müssen die nachfolgenden Ports von außen erreichbar sein:

- 25: SMTP
- 465: SMTP Secure
- 585: SMTP Submission
- 143: IMAP
- 993: IMAP Secure
- 80: HTTP
- 443: HTTPS

Falls Mailcow nicht außerhalb des lokalen Netztes erreichbar sein soll (z.B. weil Mails nur über VPN abrufbar sein sollen) reicht es Port 25 nach außen zu öffnen. Dieser wird aber zwingend benötigt, da über den SMTP Port eingehende Mails ankommen. Nachdem die Ports freigegeben wurden, müssen noch einige DNS Einträge angelegt werden. Der erste ist ein A Record für den im Config Script angegebenen Hostname auf die öffentliche IP Adresse des Servers gesetzt werden. Als zweiter Eintrag muss ein MX Eintrag auf den Domain selber gesetzt werden. Als MX Server muss der bei Mailcow angegebene Hostname angegeben werden. Die Priorität ist bei nur einem Server uninteressant, daher kann hier jede Zahl eingegeben werden. Bei mehreren Servern versucht der sendende Server von der kleinsten Priorität an alle durch bis er einen erreichen kann. Als nächstes muss ein CNAME Eintrag für `autodiscover` und einer `autoconfig` auf den Mail Domain angelegt werden. Der nächste Eintrag ist ein TXT Eintrag für den subdomain `_dmarc` mit dem Inhalt `v=DMARC1; p=none`. Als letzten Eintrag brauchen wir noch den SPF Eintrag, dieser wird direkt auf den Domain angelegt und muss vom Typ TXT sein. Der Inhalt des Eintrags lautet `v=spf1 a mx ip4:<IP DES SERVERS> ~all` wobei `<IP DES SERVERS>` durch die IP Adresse des Servers ersetzt werden muss. Danach muss beim Hoster für die IP Adresse der reverse DNS Eintrag auf den gleichen Domain wie im MX Eintrag geändert werden (also in meinem Fall auf `mail.jonasled-test.xyz`)

Wenn nun alle DNS Einstellungen laufen kann Mailcow das erste mal mit dem nachfolgenden Befehl gestartet werden. Beim ersten mal werden alle Programme heruntergeladen, abhängig von der Internetgeschwindigkeit kann dies einige Minuten dauern. Nach ein paar weiteren Minuten sollte über den festgelegten Domain das Webinterface erreichbar sein.

    su root
    # nicht benötigt falls noch als root angemeldet aus dem vorherigen Schritt.
    docker-compose up

Nachdem das oben abgebildete Login Fenster angezeigt wird, ist Mailcow fertig gestartet. Der default Nutzername ist admin mit dem Passwort moohoo, dieses sollte umgehend nach dem ersten Login abgeändert werden. Dazu in der Benutzerübersicht beim Admin Benutzer auf `edit` (blauer Button im Bild unten) klicken und ein neues Passwort mit einem Passwortgenerator erstellen und speichern. Als nächstes empfehle ich dringend ein Zweifaktor Login festzulegen. Dazu kann entweder wenn ein passender Hardwareschlüssel vorhanden ist WebAuthn oder Yubico verwendet werden. Wenn kein Hardwareshlüssel vorhanden ist, können time based OTP Keys verwendet werden. Hierfür kann ich entweder die Integration im kostenpflichtigen Bitwarden Passwortmanager oder die Android App FreeOTP+ empfehlen. Im nächsten Schritt kann der Domain für die Mails angelegt werden, dafür auf die Domain Konfiguration unter `Configuration` --> `Mail Setup` wechseln und einen neuen Domain anlegen. (siehe Screenhots) In dem Popup muss nur der Domain angegeben werden und danach mit `Add domain and restart SOGo` angelegt werden. Nach einem Moment warten ist der Domain in Mailcow erstellt und unter `Mailboxes` können nun Mailboxen angelegt werden.

In der Mailbox Konfiguration kann nun mit dem Button `Add mailbox` eine neue Mailbox angelegt werden. Hier muss der Teil der Mail vor dem `@` angegeben werden. (Beispielswiese für die Mail `info@jonasled-test.xyz` muss hier info angegeben werden) Danach sollte der volle Name des Nutzers und ein Passwort aus einem Passwortgenerator festgelegt werden. Wenn nun alle Einstellungen passen, kann der Domain mit `Add` angelegt werden. Nun kann sich der Nutzer ins SOGo anmelden um das Webmail zu nutzen oder mit einem Client wie Thunderbird anmelden.

Nachdem wir nun die erste Mailbox erstellt haben, muss noch ein DNS Eintrag erstellt werden, damit andere Server validieren können, dass der sendende Server wirklich authorisiert dazu ist. Dazu im Mailcow Admin Interface auf `Configuration` --> `Configuration & Details` gehen und dann abschließend auf der Seite unter Configuration auf ARC/DKIM Keys gehen. Danach den beim Domain angegebenen Key kopieren und in der DNS Verwaltung als TXT Record mit der Bezeichnung `dkim._domainkey` eintragen.

Nun ist unser Mail Server vollständig konfiguriert und kann auch eingesetzt haben. Um die Funktion zu testen sollte zuerst mit einem anderen Anbieter eine Mail an eine Adresse auf dem neuen Server gesendet werden. Danach muss noch die ausgehende Funktion getestet werden. Dafür gibt es die Seite mail-tester.com. Auf dieser bekommt man eine Mail Adresse, an welche man eine Mail senden kann und danach alle fehler angezeigt bekommt.