Ich habe bereits schon hier eine Anleitung geschrieben, wie ihr einen E-Mail Server normal „von Hand“ installieren könnt. Nun zeige ich euch, wie ihr dies in wenigen Minuten mit Docker realisiert. Traefik dient uns hier als Reverse Proxy und stellt später den Dienst verschlüsselt per TLS bereit.

Update

19.05.2020Hinzugefügt: Kapitel DNS
15.04.2020Hinzugefügt: Clam AV deaktivieren
31.03.2020Hinzugefügt: docker-compose.override.yml, Test der Zertifikate
29.03.2020Erste Version dieser Anleitung

Ich habe mailcow ausprobiert, da es eine moderne GUI besitzt und sich viel leichter updaten lässt als mein bisheriger E-Mail Server. Die verlinkte Anleitung erfordert viele Schritte und das komplette System lässt sich sehr schlecht warten. Diese Nachteile hat man bei mailcow nicht.

Ein paar Eindrücke

1. Vorbereitungen

1.1 Docker installieren

Falls ihr noch kein Docker installiert haben solltet, könnt ihr hier lesen, wie es funktioniert.

1.2 Docker Compose installieren

Zu Docker Compose habe ich bereits ebenfalls eine Anleitung geschrieben, welche ihr hier findet.

1.3 git installieren

Hier müsst ihr lediglich folgende Zeilen eingeben:

apt-get update
apt-get install git

1.4 Verzeichnis erstellen

Nun erstellen wir uns ein Verzeichnis für unseren späteren E-Mail Server

mkdir -p /opt/containers/mailcow

2. mailcow von git klonen

Nun klonen wir uns die neuste Version von mailcow.

git clone https://github.com/mailcow/mailcow-dockerized /opt/containers/mailcow

3. Konfigurationsdatei erstellen

Dazu müssen wir lediglich ein Skript starten.

cd /opt/containers/mailcow
./generate_config.sh

Hier gebt ihr den FQDN ein. Zum Beispiel: mail.euredomain.de

4. Anpassungen für Traefik vornehmen

4.1 Docker Compose anpassen

Traefik dient uns als Reverse Proxy und ermöglicht es uns damit, dass mehre Dienste beispielsweise über den Port 443 (HTTPS) kommunizieren können. Wer Traefik noch nicht installiert hat, kann es mit Hilfe dieser Anleitung schnell erledigen. Ebenfalls habe ich mit dieser Anleitung noch ein Wildcard Zertifikat hinzugefügt, welches hier verwendet wird.

Nun passen wir noch die Docker Compose Datei an Traefik an. Dazu öffnet ihr folgende Datei:

nano /opt/containers/mailcow/docker-compose.yml

Ihr scrollt nun bis zum Abschnitt „nginx-mailcow“. Dort müsst ihr folgendes ändern:

Zeilen auskommentieren:
      #ports:
        #- "${HTTPS_BIND:-0.0.0.0}:${HTTPS_PORT:-443}:${HTTPS_PORT:-443}"
        #- "${HTTP_BIND:-0.0.0.0}:${HTTP_PORT:-80}:${HTTP_PORT:-80}"

4.2 docker-compose.override.yml erstellen

Nun erstellen wir eine neue Datei, in der wir alle unsere Anpassungen tätigen. Grundlage für diese Anpassungen bildet die offizielle Mailcow Dokumentation.

nano /opt/containers/mailcow/docker-compose.override.yml
version: '2.1'

services:
    nginx-mailcow:
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.nginx-mailcow.entrypoints=http"
        - "traefik.http.routers.nginx-mailcow.rule=HostRegexp(`{host:(autodiscover|autoconfig|webmail|mail|email).+}`)"
        - "traefik.http.middlewares.nginx-mailcow-https-redirect.redirectscheme.scheme=https"
        - "traefik.http.routers.nginx-mailcow.middlewares=nginx-mailcow-https-redirect"
        - "traefik.http.routers.nginx-mailcow-secure.entrypoints=https"
        - "traefik.http.routers.nginx-mailcow-secure.rule=Host(`mail.euredomain.de`)" ###### hier eure FQDN angeben #####
        - "traefik.http.routers.nginx-mailcow-secure.tls=true"
        - "traefik.http.routers.nginx-mailcow-secure.service=nginx-mailcow"
        - "traefik.http.services.nginx-mailcow.loadbalancer.server.port=80"
        - "traefik.docker.network=proxy"

      networks:
        proxy:


    certdumper:
        image: humenius/traefik-certs-dumper
        container_name: traefik_certdumper
        restart: unless-stopped
        network_mode: none
        command: – restart-containers mailcowdockerized_postfix-mailcow_1,mailcowdockerized_dovecot-mailcow_1
        volumes:
          # mount the folder which contains Traefik's `acme.json' file
          #   in this case Traefik is started from its own docker-compose in ../traefik
          - /opt/containers/traefik/data:/traefik:ro
          # mount mailcow's SSL folder
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - ./data/assets/ssl:/output:rw
        environment:
          # only change this, if you're using another domain for mailcow's web frontend compared to the standard config
          #- DOMAIN=${MAILCOW_HOSTNAME}
          - DOMAIN=euredomain.de   #### Hier eure Domain ohne mail angeben ###

networks:
  proxy:
    external: true

4.3 mailcow.conf anpassen

Hier müssen wir noch eine Änderung vornehmen, damit Mailcow keinen eigenen Zertifikate versucht zu erstellen.

nano /opt/containers/mailcow/mailcow.conf
bisher:
# Skip running ACME (acme-mailcow, Let's Encrypt certs) - y/n
SKIP_LETS_ENCRYPT=n

ändert ihr zu:
# Skip running ACME (acme-mailcow, Let's Encrypt certs) - y/n
SKIP_LETS_ENCRYPT=y

4.4 Clam AV Virenscanner deaktivieren

Wenn ihr den integrierten Clam AV Virenscanner deaktivieren wollt, so müsst ihr folgendes tun:

nano /opt/containers/mailcow/mailcow.conf
bisher
# Skip ClamAV (clamd-mailcow) anti-virus (Rspamd will auto-detect a missing ClamAV container) - y/n
SKIP_CLAMD=n

ändert ihr zu
# Skip ClamAV (clamd-mailcow) anti-virus (Rspamd will auto-detect a missing ClamAV container) - y/n
SKIP_CLAMD=y

5. Mailcow starten

Nun können wir mailcow zum ersten mal starten. Gebt dazu folgendes ein:

docker-compose up

Wenn ihr keine Fehlermeldung bekommt, kann direkt bei Abschnitt 6 weitermachen.

5.1 Möglicher Fehler: Pool overlaps with other one on this address space

Ich habe bei mir obigen Fehler bekommen.

Wie ihr in der Docker Compose Datei gesehen habt, werden hier feste IP Bereiche (172.22.0/24) verwendet. Es kann jedoch sein, dass dieser Bereich derzeit schon von einem anderen Container verwendet wird.

Jetzt habt ihr zwei Möglichkeiten

  1. Alle IP Adressen in der Docker Compose anpassen
  2. Den Container neu starten, welcher den Bereich (172.22.0/24) blockiert.

Ich habe mich für die zweite Möglichkeit entschieden, da es sich schneller realisieren lässt. Um den „blockenden“ Container zu finden, verwende ich das Tool Portainer (Installations-Anleitung dazu findet ihr hier).

Hier kann ich mir jetzt anzeigen lassen, welcher Container bereits diesen IP Bereich belegt.

Diesen Container beende ich nun und starte ihn neu, NACHDEM ich mailcow gestartet habe.

Nun starte ich zuerst mailcow und danach dann die eben beendeten Service.

docker-compose -f /opt/containers/mailcow/docker-compose.yml up

6. Zertifikate überprüfen

Nun könnt ihr per Konsole überprüfen, ob die Zertifikate richtig geladen wurden. Dies ist wichtig, da ihr euch sonst später nicht mit Clients zu Mailcow verbinden könnt. Gebt dazu folgende Befehle ein:

# Connect via SMTP (587)
echo "Q" | openssl s_client -starttls smtp -crlf -connect mx.euredomain.de:587

# Connect via IMAP (143)
echo "Q" | openssl s_client -starttls imap -showcerts -connect mx.euredomain.de:143

Ausgabe verkürzt:
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = euredomain.de
verify return:1
---
Certificate chain
 0 s:CN = euredomain.de
   i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
 1 s:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
   i:O = Digital Signature Trust Co., CN = DST Root CA X3

Bei den obigen Befehlen muss immer bei Domain das „mx“ stehen bleiben!

Wichtig ist bei den Ausgaben, dass hier eure Domain steht und nicht „example…..“.

7. Mailcow konfigurieren

Nach dem Start solltet ihr auf folgende Webseite gehen: mail.euredomain.de

Nun solltet ihr folgendes sehen:

Die Benutzerdaten sind:

  • Benutzername: admin
  • Passwort: moohoo

8. Administratorkennwort ändern

Hier zeige ich euch, wie ihr das Kennwort ändern könnt. Dazu klickt ihr auf „bearbeiten“.

Hier gebt ihr dann euer neues Kennwort ein.

9. Eure Domain hinzufügen

Dazu klickt ihr auf „Konfiguration“ -> „E-Mail-Setup“.

Hier klickt ihr auf „Domain hinzufügen“.

Hier gebt ihr nun eure Domain ein. Beispielsweise: euredomain.de

Gebt dort aber NICHT „mail.euredomain.de“ ein!

Anschließend bestätigt ihr mit „Domain hinzufügen und SoGo neustarten“.

Nun sollte eure Domain angezeigt werden.

10. DNS Einstellungen

Alle DNS Einstellungen übernehme ich aus dem Empfehlungen von Mailcow. Diese könnt ihr hier nachlesen.

Bis diese Einstellungen wirken, kann es mehrere Stunden dauern !!!

10.1 Reverse DNS anpassen

Bei netcup könnt ihr den Reverse DNS Eintrag eures Servers sehr einfach anpassen. Dazu geht ihr Server Control Panel (SCP) und wählt dort euren Server aus. Unter dem Reiter „Netzwerk“ könnt ihr nun den rDNS Eintrag anlegen.

Der rDNS Eintrag sollte identisch mit dem „MAILCOW_HOSTNAME“ sein.

Diesen Eintrag könnt ihr euch hier anschauen:

nano /opt/containers/mailcow/.env

10.2 DNS Einstellungen

Diese Einstellungen hole ich auch aus der offiziellen Mailcow Anleitung.

Dazu geht ihr bei netcup ins CCP und wählt dort den Reiter „Domains“ aus.

Nun wählt ihre eure Domain aus und klickt auf DNS.

Hier habe ich jetzt folgende Einträge gemacht:

# Name              Typ       Wert
mail                      A       eure IP
autodiscover      CNAME   mail.euredomain.de
autoconfig          CNAME   mail.euredomain.de
@                          MX 10   mail

SPF
@                   TXT     v=spf1 mx a -all

DMARC
_dmarc              TXT     v=DMARC1; p=reject; rua=mailto:eureE-Mail@domain.de

10.3 DKIM Schlüssel erzeugen

Uns fehlt nun noch der DKIM Eintrag auf unserem DNS Server. Dazu loggen wir uns mit unserem Administrator Account bei mailcow ein.

Nun klickt ihr auf „Konfiguration“ -> „Server-Konfiguration“.

Hier klickt ihr „Konfiguration“ -> „ARC/DKIM-Keys“.

Nun klickt ihr auf „Domains mit fehlenden Keys auswählen“ und eure Domain sollte in das Feld eingetragen werden. Anschließend wählt ihr einen Selektor aus (bei mir „mail“) und legt die Schlüssellänge (bei mir 2048bit) fest.

Mit einem Klick auf „Hinzufügen“ wird euch der Schlüssel generiert.

Diesen gebt ihr nun in eurem DNS Server ein.

#Name   Typ    Wert
selector._domainkey    TXT   v=DKIM1;k=rsa;t.....

selector ersetzt ihr mit eurem vorherigen Selektor. Bei mir "mail".

10.4 DNS Einstellungen testen

Bitte bedenkt, dass eure obigen Einstellungen einige Stunden dauern können, bis diese übernommen worden sind.

10.4.1 DNS Einstellungen testen mit mailcow

Mailcow bietet nun auch die Möglichkeit eure DNS Einstellungen zu testen. Dazu loggt ihr euch mit eurem Admin Account ein.

Anschließend klickt ihr auf „Konfiguration“ -> „E-Mail-Setup“.

Hier seht ihr dann eure Domains. Nun klickt ihr auf DNS und solltet dann alle DNS Einstellungen sehen.

10.4.2 Testen mit mail-tester.com

Auf dieser Homepage bekommt ihr eine E-Mail Adresse angezeigt. Hier schickt ihr eine E-Mail hin und müsst einen Betreff / paar Zeilen Inhalt hinzufügen. Dies könnt ihr aber erst tun, wenn ihr weiter mit dieser Anleitung seid und schon Nutzer angelegt habt.

Mein Score

10.4.3 Testen mit mxtoolbox.com

Die Webseite https://mxtoolbox.com liefert sehr viele Tests für euren Mail-Server. Diese könnt ihr einfach mal ausprobieren.

11. E-Mail Benutzer anlegen

Nun legen wir einen ersten E-Mail Benutzer an. Dazu klickt ihr auf „Mailboxen“ und dann „Mailbox hinzufügen“.

Nun könnt ihr einen Benutzer anlegen. Hier zum Beispiel „test“.

In der Übersicht sollten nun alle eure Benutzer zu sehen sein.

12. Webmail starten

Unter „Apps“ -> „Webmail“ könnt ihr euch nun euer Postfach anschauen.

Ihr solltet nun auf die Webseite “ https://mail.euredomain.de/SOGo“ weitergeleitet werden. Hier meldet ihr euch nun an.

Danach könnt ihr direkt E-Mails schreiben, Kontakte pflegen sowie Kalender anlegen.

13. Quellen

https://github.com/mailcow/mailcow-dockerized

https://mailcow.email/

https://mailcow.github.io/mailcow-dockerized-docs/firststeps-ssl/

https://mailcow.github.io/mailcow-dockerized-docs/firststeps-rp/

https://mailcow.github.io/mailcow-dockerized-docs/firststeps-ssl/#how-to-use-your-own-certificate

https://hub.docker.com/r/jovobe/mailcow-traefik-acme-adapter

Teile diesen Beitrag
Christian

22 Kommentare

  1. Hi Christian,

    Great post. I was looking for this tutorial. I followed you steps first to set up traefik which is working fine and then mailcow.
    But when I do docker-compose up for mailcow. It first of does not add a certificate in traefik/data/acme.json and hence I can not reach the service. When I check the logs of traefik container this is what I get:

    time=“2020-04-18T03:09:50+02:00″ level=error msg=“service \“nginx-mailcow\“ error: unable to find the IP address for the container \“/mailcowdockerized_nginx-mailcow_1\“: the server is ignored“ container=nginx-mailcow-mailcowdockerized-dd47441f698b9238afad41df1362253b6392fd5da10ba38d7134e3d221bc3b74 providerName=docker

    Do you know what could be the issue?

    Thanks.

  2. Hallo,

    Du erzählst leider nichts zu deiner DNS-Config? Wie sind die Erfahrungen mit Updates der Container, funktioniert das über traefik auch einwandfrei?
    Sind bei dir Mails schon mal im SPAM auf externer Seite angekommen? Habe gehört das es hierbei immer wieder Probleme gibt

  3. Hallo und Danke für das HowTo wirklich sehr hilfreich und toll dokumentiert.
    Ich habe bereits eine MailCow Instanz auf einem anderen Server laufen. Soweit kein Problem. Nun habe ich einen neuen Server aufgesetzt und da ist mir folgendes Aufgefallen.

    Du setzt hier Traefik> V2 ein. Aktuell bei mir ist dies 2.2.1.
    Damit die Certificates von LE in den MailCow container gelangen, werden die mit humenius/traefik-certs-dumper aus dem acme.json Store extrahiert und nach
    Mailcow /opt/containers/mailcow/data/assets/ kopiert. Wobei hier nur das Cert kopiert wird mit dem Namen myserver.de.

    Aber das passiert gar nicht.

    danielhuisman/traefik-certificate-extractor unterstützt hier gar kein V2 das jedoch Traefik nutzt.
    Manuell habe ich hier den Container aufgerufen:

    docker run -d –rm -v /opt/containers/traefik/data:/app/data -v /opt/containers/mailcow/data/assets/ssl:/app/certs danielhuisman/traefik-certificate-extractor

    Die Ausgabe hier ist nur :
    Certificate storage found (acme.json)
    ‚Account‘

    So fand ich auch den Hinweis von Daniel hier:

    https://github.com/DanielHuisman/traefik-certificate-extractor/issues/23

    das Version 2 nicht unterstützt ist und auch nicht in zukunft unterstützt wird. Er hat auch recht, dass Traefik hier nicht von Haus aus den Export unterstützt.

    Daniel hat auch noch einen Hinweis auf: ldez/traefik-certs-dumper hinterlassen.
    Damit gelingt der Extract aber im PEM Format:

    docker run -v /home/micsen/certs/:/data/certs -v /opt/containers/traefik/data/acme.json:/acme.json ldez/traefik-certs-dumper:latest file –version v2 –dest /data/certs/ –domain-subdir

    Das geht soweit, aber die Certs werden hier im PEM Format ausgegeben.

  4. Hallo,

    super Seite und Anleitungen. Ich studiere und installiere schon seit Tagen. In dieser Anleitung steht in der Überschrift „…mit Antivirus, Spam Filer,“. Aber zu zeigst nur wie der Clam AV deaktiviert werden kann. Kannst du hier noch nachlegen?

  5. Hallo,

    Ist es denn möglich, dass man neben Mailcow auch weitere Container zum laufen bringen kann? z.B. WordPress / Nextcloud usw

    Bisher war es meines Wissens immer so, entweder Mailcow oder WordPress usw.

    Hat sich daran etwas geändert?

    VG Hardy

  6. Leider bekommt mailcow bei mir keine Zertifikate – also Warnmeldungen vom Browser.

    Habe alles nach Anl. gemacht.

    Hat jemand ne Idee für mich?

    VG Hardy

  7. Mein Mailserver läuft nun. Kann z.B. mit Outlook senden/empfangen, aber von einer WordPressinstallation kann ich keine Mails versenden.

    Habe mehrere Plugins probiert – nix.

    Gibt es da evtl. eine besondere Konfig? Rootserver – Mailcow – WordPress – Email???

    vlt bekomme ich ja diesmal einen Tipp… 🙂

    VG Hardy

  8. Hallo

    Vielen Dank dass du dir die Arbeit machst und diese tollen Anleitungen bereit stellst.

    Bei 6. Zertifikate überprüfen benutzt du auf einmal mx.eurodomain.de un verweist daruf das mx stehen bleiben muss. Zuvor wurde immer mit mail.eurodomain.de gearbeitet.
    Wenn ich mx benutze bekomme ich
    „139935361738048:error:2008F002:BIO routines:BIO_lookup_ex:system lib:../crypto/bio/b_addr.c:726:No address associated with hostname
    connect:errno=22“

    Wenn ich mail benutze kommt ein Zertifikat mit „mail.example.org“, was ja laut Anleitung nicht kommen darf.

    Was läuft hier falsch?

  9. Hallo,

    wenn in der docker-compose.override.yaml die Zeile:
    – „traefik.http.routers.nginx-mailcow-secure.tls.certresolver=http“
    fehlt, dann erzeugt doch traefik keine Zertifikate.
    Erst nachdem ich die Zeile eingefüght habe, wurde Zertifikate und traefik_certdumper extrahiert.
    Den Zertifikatstest. mx.xxxxxx.de verstehe ich nicht. Wird den mx irgendwie umgeleitet?
    Bei mir geht der Test nur mit mail.xxxxxx.de

  10. Wenn man keine wildcard cert generierung von traefik einsetzt bräuchte man nicht auch noch diese Zeile?

    – „traefik.http.routers.nginx-mailcow.tls.certresolver=netcup“

    sonst scheint traefik ja keine Zertifikate für diese Subdomains zu generieren: autodiscover|autoconfig|webmail|mail|email

    oder lese ich die config falsch?

  11. Mir fällt gerade was auf. Wenn wir mehrere Domains auf dieser Mailcow Instanz hosten, fehlen den zusätzlichen Domains die Zertifikate weil traefik ja davon ncihts weiß.

    Hier gitb ein Beispiel wie man das lösen könnte, indem traefik nur die Zertifikate für die Hauptdomain erstellt aber Mailcow weiterhin für alle hinzugefügten Domains, wäre super wenn du das Thema aufgreifen würdest, ich schaff das nicht ganz alleine 😉

    https://github.com/mailcow/mailcow-dockerized/issues/3569

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.