Mein eigener Mailserver – endlich unabhängig

Ich bin jetzt schon seit 5+ Jahren bei all-inkl und habe bisher immer nur meine Mails zu gmail weitergeleitet. Ich wollte mich nicht zu sehr an den Provider binden, falls ich irgendwann doch einmal wechseln möchte. Nun habe ich seit ein paar Wochen einen Root-Server bei Webtropia und wollte nun endlich meinen eigenen Mailserver aufsetzen. Als Domain (ist natürlich Spielerei) habe ich mir dafür emailu.de gesichert – diese habe ich bei expireddomains gefunden und sofort registriert.

Mein DNS habe ich wie folgt konfiguriert:

Man muss dazu sagen, dass ich das alles auch zum ersten Mal gemacht habe – hoffentlich ist alles richtig soweit.

Als erstes habe ich dann das Tutorial von Thomas Leiser gefunden. Aber nach zwei Stunden habe ich gemerkt, dass ich das alles gar nicht machen möchte. Ich hatte damit begonnen, alles in einen Docker-Container zu packen bis ich gedacht habe, dass es doch bestimmt schon jemanden gibt, welcher das gleiche Problem hatte. Gefunden habe ich dann relativ fix dieses GitHub-Repo.

Die Zertifikate etc. wollte ich mit Lets Encrypt erstellen – dafür gibt es ein cooles Tool names acme.sh, welches sehr viel „leichter“ ist als das Standard-Framework von Letsencrypt. Damit habe ich mir also erstmal die entsprechenden Zertifikate gebaut:

~/.acme.sh/acme.sh --issue -d emailu.de -d imap.emailu.de -d smtp.emailu.de -w /var/www/html/emailu.de/htdocs

Diese werden dann erstmal für den Apache installiert (bräuchte man nur, wenn man auch eine Webseite betreiben möchte). Ich habe diese dort hingepackt, da ich dort gerne Rainloop installieren möchte um auch einen Webclient nutzen zu können. Der Apache selbst hat bisher nur das Modul für Macros und SSL aktiviert bekommen. PHP selbst möchte nur per FPM (ebenfalls in Containern) ausführen, damit man von der einen Website später nicht in die andere kommt. Sollte also wirklich mal eine Seite gehackt werden, kommt der Hacker nicht besonders weit.

~/.acme.sh/acme.sh --install-cert -d emailu.de \
--cert-file      /var/www/html/emailu.de/cert/cert.cer  \
--key-file       /var/www/html/emailu.de/cert/private.key  \
--fullchain-file /var/www/html/emailu.de/cert/fullchain.cer \
--reloadcmd     "service apache2 force-reload"

Danach habe ich den Mailserver geklont und Tag 2.3 ausgecheckt (das ist heute die aktuellste Version).

git clone git@github.com:tomav/docker-mailserver.git mailserver
git checkout 2.3
cp docker-compose.yml.dist docker-compose.yml
vi docker-compose.yml

Und wie folgt geändert.

version: '2'

services:
  mail:
    image: tvial/docker-mailserver:2.3
    hostname: mail
    domainname: domain.com
    container_name: mail
    ports:
    - "25:25"
    - "143:143"
    - "587:587"
    - "993:993"
    volumes:
    - maildata:/var/mail
    - mailstate:/var/mail-state
    - ./config/:/tmp/docker-mailserver/
    - /var/www/html/emailu.de/cert:/tmp/ssl:ro
    environment:
    - ENABLE_SPAMASSASSIN=1
    - ENABLE_CLAMAV=1
    - ENABLE_FAIL2BAN=1
    - ONE_DIR=1
    - DMS_DEBUG=0
    - OVERRIDE_HOSTNAME=mail.emailu.de
    - POSTMASTER_ADDRESS=postmaster@emailu.de
    - SSL_TYPE=manual
    - SSL_CERT_PATH=/tmp/ssl/cert.cer
    - SSL_KEY_PATH=/tmp/ssl/private.key
    cap_add:
    - NET_ADMIN
    restart: always

volumes:
  maildata:
    driver: local
  mailstate:
    driver: local

Ob es jetzt besonders schön ist, dass ich direkt die SSL-Zertifikate aus meinem Webroot nehme? Darüber kann man sicher streiten. Ich habe es erstmal so gemacht und hoffe, dass es keine Probleme damit gibt. Bisher sieht alles gut aus und mein Mailclient liefert zumindest auch keine Fehlermeldungen.

Dadurch dass „maildata“ und „mailstate“ als local-Driver angegeben sind, liegen die Maildaten unter „/var/lib/docker/volumes/mailserver_maildata/_data“. Nicht, dass sich jemand wundert wo die sensiblen Daten dann landen. Finde ich eigentlich eine gute Lösung, da man sich so keine Gedanken machen muss wo alles hinkommt und Docker den Zugriff entsprechend beschränkt.

Die DKIM-Config kann man im Container dann wie folgt erstellen lassen:

docker run --rm \
  -v "$(pwd)/config":/tmp/docker-mailserver \
  -ti tvial/docker-mailserver:2.3 generate-dkim-config

Alle Mailaccounts liegen unter config/postfix-accounts.cf und neue Einträge können einfach wie folgt erstellt werden:

docker run --rm \
  -e MAIL_USER=blabla@emailu.de \
  -e MAIL_PASS=t0p$ecr3t \
  -ti tvial/docker-mailserver:2.3 \
  /bin/sh -c 'echo "$MAIL_USER|$(doveadm pw -s SHA512-CRYPT -u $MAIL_USER -p $MAIL_PASS)"' >> config/postfix-accounts.cf

Dann den Server gestartet, eingeloggt im Mailclient und alles funktioniert wunderbar. Ab jetzt geht es ans Testen und Feintuning – wenn alles geht, werden sämtliche Mailkonten mitgriert.

docker-compose up -d

Wirklich cool wie schnell alles geht!


Beitrag veröffentlicht

in

von

Schlagwörter: