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!