Dieses Tutorial ist VALID.

Bitte lies Dir den Disclaimer durch, bevor Du eine Anleitung umsetzt...

Haftungsausschluss / Disclaimer

Mailcow installieren – der „dockerisierte“ Mailserver

Installation

Es hat mich von den Socken gehauen, als ich das zum ersten Mal gesehen hab. Die Mailcow-Jungs haben das Docker-Prinzip bis an die Grenzen des Verstandes ausgereizt. Es ist der Wahnsinn, zuzusehen, wie hier eine ganze Armada von Diensten und Anwendungen wie eine gut geölte Maschine ineinandergreift und „einfach“ läuft. Aber seht selbst:

Auf dem Server laufen bis jetzt nur unser Betriebssystem und Docker. Von dem Punkt aus starten wir das Setup von Mailcow:

umask
### Hier soll die Ausgabe "0022" erscheinen!
cd /opt
apt install -y git
git clone https://github.com/mailcow/mailcow-dockerized

###
Klone nach 'mailcow-dockerized' ...
remote: Enumerating objects: 139, done.
remote: Counting objects: 100% (139/139), done.
remote: Compressing objects: 100% (93/93), done.
remote: Total 23640 (delta 54), reused 97 (delta 45), pack-reused 23501
Empfange Objekte: 100% (23640/23640), 13.89 MiB | 11.84 MiB/s, Fertig.
Löse Unterschiede auf: 100% (14184/14184), Fertig.
###

cd mailcow-dockerized
./generate_config.sh

Hostname (FQDN): mail.xp-server.de [Hier Deinen Mailname eintragen!]
Timezone: Europe/Berlin [ENTER]

nano mailcow.conf
# Skip Solr on low-memory systems or if you do not want to store a readable index of your mails in solr-vol-1.
SKIP_SOLR=y
# Auch wenn wir den Watchdog nicht verwenden, müssen wir eine Mailadresse eintragen, weil Mailcow das sonst bemängelt:
# WARNING: The WATCHDOG_NOTIFY_EMAIL variable is not set. Defaulting to a blank string.
WATCHDOG_NOTIFY_EMAIL=<deine-notfall-mailadresse>

docker-compose pull

###
Pulling unbound-mailcow   ...
Pulling mysql-mailcow     ...
Pulling redis-mailcow     ... pull complete
Pulling clamd-mailcow     ...
Pulling php-fpm-mailcow   ...
Pulling sogo-mailcow      ... extracting (95.8%)
Pulling dovecot-mailcow   ...
Pulling postfix-mailcow   ...
Pulling memcached-mailcow ...
Pulling nginx-mailcow     ...
Pulling rspamd-mailcow    ...
Pulling acme-mailcow      ...
Pulling netfilter-mailcow ... pull complete
Pulling watchdog-mailcow  ... downloading (73.3%)
Pulling dockerapi-mailcow ...
Pulling solr-mailcow      ...
Pulling olefy-mailcow     ...
Pulling ipv6nat-mailcow   ... waiting
### ca. zwei Minuten zum Laden und Entpacken...

docker-compose up -d

Docker macht jetzt seine Magie und zieht die Container in die Höhe. Das braucht etwa 20 Sekunden. Und dann…

Hear it now, believe it later: DAS WARS!

Dein Mailcow ist fertig installiert und läuft. WOW!
Ich ziehe meinen Hut vor den Mailcow-Leuten, die das Kunststück fertig gebracht haben, die Mailserver-Installation zu zähmen.

Update 20.07.2020: disable IPv6!

Nach einem sehr langen völlig reibungslosen Betrieb hat es mich heute beim Versenden von Mails an „gmail“ erwischt. Da kam eine 550-5.7.1 Error-Mail zurück, dass mein System nicht Googles IPv6 Versenderichtlinien entsprechen würde. WTF!
IPv6 juckt mich nicht, also weg damit… Nach dem Abschalten konnte ich wieder einwandfrei Mails an Google schicken.

Die einzelnen Schritte haben die Jungs von Mailcow wieder sehr löblich zusammengefasst:
https://mailcow.github.io/mailcow-dockerized-docs/firststeps-disable_ipv6/

Einfach der Reihe nach die Änderungen einpflegen und dann die Mailcow mit „docker-compose down“ und „docker-compose up -d“ neu starten.

Update / Exkurs 27.10.2021: Alternative Anleitung mit Anbindung an Traefik

Weil die Frage doch immer mal wieder aufgekommen ist, wie man die MailCow in ein Traefik Netzwerk einbinden kann, hier zum Selbststudium eine sehr umfangreiche Anleitung von einem Hosting Anbieter:
https://www.dogado.de/vps/vserver-anwendungsfaelle/mailserver-mailcow-auf-vserver-installieren

Aber bitte daran denken, dass diese Anleitung nicht auf unsere Umgebung zugeschnitten ist und ihr beim Nachturnen auf die Anpassung diverser Parameter wie Netzwerknamen und dergleichen achten müsst…

Einloggen und Ändern von Benutzername und Passwort

Lassen wir unserer Maschine eine Minute Zeit, das Let’s Encrypt Zertifikat zu holen, um unsere Verbindung später per SSL abzusichern. Dann starten wir einen Browser und öffnen die Adresse [https://mail.xp-server.de]. Unsere Mailcow begrüßt uns hier mit dem Login-Schirm.

Mailcow Login Screen

Sollte vom Browser eine Sicherheitswarnung erscheinen, ist das Zertifikat noch nicht so weit. Einfach 20 Sekunden warten und die Seite neu laden. Ein paar Anläufe später klappt die Verbindung dann reibungslos.

Der erste Login geht über den Benutzer „admin“ und das Passwort „moohoo“.

Sind wir eingeloggt ist das auch *sofort* das Erste, das wir ändern:

Hinter „admin“ ist eine Schaltfläche „Bearbeiten“. Da klicken wir hin und geben dem Admin einen neuen Namen und vor allen Dingen ein anständiges Passwort! Über „Änderungen speichern“ sichern wir die Eingabe, loggen aus (oben rechts bei „admin“) und loggen uns gleich wieder mit den neuen Zugangsdaten ein… Phew! Safe :)

Übersicht über die Container und Logs

In der Menüleiste klicken wir auf den Punkt „Konfiguration“ und im Drop-Down-Menü auf „Systeminformation“. Hier sehen wir eine Übersichtsseite, auf der sämtliche Container und ihr Status angezeigt werden. Darüber sehen wir, wie viel von unserem Speicherplatz noch übrig ist.

Oben links wechseln wir zum Reiter „Logs“ und lassen und das „Postfix“-Log ausgeben. Das wird später das wichtigste Log, wenn wir herausfinden wollen, warum die einer oder andere Mail nicht korrekt zugestellt wurde…

Anzeige *

33 Kommentare zu „Mailcow installieren – der „dockerisierte“ Mailserver“

  1. ZITAT
    “Hostname” darf NICHT “Mailname” sein. Heißt der Mailserver “mail.xp-server.de”, dann darf der Hostname nicht genau so lauten. Hostname wäre hier z.B.: “xp-server.de”.
    ZITAT-END

    Was das für ein Schwachsinn?
    xp-server.de = Domainname!
    Und wo steht bitte das FQDN nicht Mailname sein darf?

  2. Hallo,
    ich habe noch ein Problem mit den Zertifikaten.
    Folgender Fehler im ACME Protokoll:
    mail.mydomain – Cannot validate any hostnames, skipping Let’s Encrypt for 1 hour.
    mail.mydomain – Confirmed A record with IP xx.xx.xx.xx, but HTTP validation failed
    Ich habe keine Idee warum.
    Port 80 ist freigeschaltet.

    Gruß Rolf

    1. Peter Fiedler

      Hallo Rolf,
      tut mir leid, aber den Fehler hatte ich noch nicht und kann darum keinen Tipp geben, woran das liegen könnte.
      Die Mailcow hat keine Firewall – 80 sollte auf dem Server offen sein, ja.

      Bitte mach einen Eintrag im Community Forum, da tummeln sich auch Entwickler. Die sollten Dir da kompetent weiterhelfen können.

      Beste Grüße
      Peter.

  3. Hallo,
    ich habe ein Testsystem aufgesetzt und es lief wunderbar.
    Dann habe ich ./update.sh ausgeführt.
    Nun starten die Container nicht mehr.
    Fehler beim Ausführen von docker-compose up -d
    ERROR: The Compose file ‚./docker-compose.yml‘ is invalid because:
    networks.mailcow-network.ipam.config.subnet is invalid: should use the CIDR format
    Ich habe keine Idee, was ich machen soll.
    Gruß
    Rolf

    1. Peter Fiedler

      Hallo Rolf,
      hab auf meinem Testserver auch gerade ein update.sh gefahren und da ist die Mailcow danach wieder anstandslos hochgekommen.

      Da ich an der Stelle auch nur raten kann, fragst Du am besten direkt im MailCow Forum die Community um Rat:
      https://community.mailcow.email/

      Viel Glück!
      Peter.

    2. Fehler gefunden.
      In der mailcow.conf
      IPV4_NETWORK=172.22.1
      stand dummes Zeug drin.
      Vorsicht beim unsachgemäßen editieren.

      Gruß
      Rolf

  4. Ich möchte die bisherige Installation von Mailcow unter einer anderen URL verfügbar machen, beudetet das Admin-Interface aber auch die SOGO-Instanz. Worauf sollte ich achten und wo muss ich die Anpassungen vornehmen? Der Mail-Hostname ist identisch zur bisherigen URL. Könnte das Probleme geben?

  5. Hallo,
    vielen Dank für die ausführliche Anleitung.
    Hat einer von euch es geschafft Mailcow mit in den Traefik verbund einzufädeln?
    Komme da leider nicht weiter.

    MFG

    1. Okay, habs scheinbar doch selbst geschafft.
      Nachdem ich herausgefunden habe, dass meine DB Passwörter nicht gematched haben.
      Hier meine docker.compose.overwrite.yml – https://pastebin.com/Hg13S0xP
      Zusätzlich halt in der mailcow.conf:
      HTTP_BIND=127.0.0.1
      HTTP_PORT=8080
      HTTPS_BIND=127.0.0.1
      HTTPS_PORT=8443
      SKIP_LETS_ENCRYPT=y
      Dann sollte alles so starten, dass man Mailcow mit dem hier schon vorher eingerichteten Traefik nutzen kann.

      1. Hallo Sascha,
        schön, dass Du es hinbekommen hast und vielen Dank für das Posten der Lösung :)

        Ich hab das immer sein lassen mailcow mit den anderen Diensten zu verbinden, weil die Mailserver bei mir wirklich systemkritisch sind und ich die darum tatsächlich lieber auf eigenen Maschinen hoste. Ein Ausfall würde mein Geschäft schädigen.

        In dieser Anleitung wird das Vorgehen auch beschrieben, die hat Juno damals gefunden:
        https://goneuland.de/mailcow-e-mail-komplettsytem-mit-antivirus-spam-filer-webmail-webfrontend-installieren-mittels-docker-und-traefik/#4_Anpassungen_fuer_Traefik_vornehmen

        Was mich abhält sind zwei Sachen:
        – die Möglichkeit, dass Container „überlappen“ und dann auf einmal Dienste stehen bleiben, weil die sich um die IP prügeln
        – ein Wildcard-Zertifikat für den Mailserver. Für Wildcard muss die API vom Domainanbieter mit in die Config. Und die API von netcup ist leider viel zu mächtig, als dass ich die irgendwo stehen haben will.

  6. Hi, wenn du mal Zeit hast, wäre es toll wenn du mal schauen schauen kannst, ob du eine Möglichkeit siehst, Piler oder einen ähnliches Email Archiv aufzusetzen. Am betsen natürlich in Docker und wie das funktioniert dann. :-)

    1. Da such ich selber so sehr danach, Jan…
      Das ist das Einzige, das dem Mailcow „out of the box“ fehlt – eine Archiv-Funktion.

      Piler hat ein Bekannter von mir am Laufen für seine Firma und dessen Mailarchiv. Muss ich mir doch mal ansehen…

  7. Nachdem ich jetzt mehrmals dieses tolle Tutorial durchforstet habe, habe ich nun doch eine Frage (auf die Gefahr hin, dass ich den Bereich überlesen habe):
    Woher bekomme ich den „Crypt-Key“ für das backup oder wo lege ich diesen fest?

    1. So wie ich das verstanden habe, erzeugt die Mailcow den Schlüssel selbst bei der Installation. Im Backup wird der Schlüssel mit gesichert, damit Du nachher beim Rücksichern die Mails wieder entschlüsseln kannst.
      Jedenfalls hab ich „crypt-key“ beim Backup als Verzeichnis gesehen…

      1. Hallo Peter, danke für die Antwort :-)
        Ich frage nur für den Fall der Fälle. Ich sichere mir den Server auch noch regelmäßig per Backup, aber ggf. benötige ich ja nur mal die Datensicherung.
        Diese tolle ANleitung habe ich übrigens heute einem Freund weiterempfohlen :-D
        Viele Grüße Michael

  8. Ich kam wegen meiner Traefik-Probleme – nun habe ich einen Mail-Server :D

    Deine Erklärungen passen wirklich genau zu meinem Wissenstand. Macht echt Spaß sich da durchzuarbeiten! Danke

  9. Hallo Peter !
    Vielen Dank für diese klasse Anleitung !!!

    Vor allem das Thema Backup & Restore ist sehr hilfreich …
    … sehr passend, da ich es hinbekommen habe, den Cloudspeicherplatz ( HiDrive ) so einzubinden,
    dass nach Aufruf des Backup-Scriptes, die Dateien in ein Verzeichnis gespeichert werden, welches automatisch
    mit HiDrive synchronisiert.

    Jetzt muss ich nur noch die Restore Funktion testen … ;-)
    Gäbe es hier auch die Möglichkeit – wie beim Backup – alles auf einmal wieder herzustellen ?!

    Ach ja, wie sieht es denn mit einer Archiv-Funktion aus ?

    Gruß, Martin

    1. Peter Fiedler

      Gerne, Martin.

      Der Restore funktioniert seit einem der Updates nun auch auf einen Rutsch. Da wurde die Option „All“ mit eingebaut.

      Archiv gibts wohl noch keins – zumindest hab ich noch keins gefunden.

      Beste Grüße
      Peter.

  10. Hallo, hört sich gut an… Ich habe mittlerweile mehrere Container auf deiner Basis installiert. Jetzt möchte ich gerne auch Mailcow ins Leben rufen. Klappt das? Meine Ports sind ja schon sozusagen belegt.

    Danke für deine Hilfe

    1. Nein, leider nicht.
      Die Mailcow läuft bei mir auf einer separaten Maschine. Auch die Macher der Mailcow empfehlen eine eigene Maschine dafür.

      Beste Grüße
      Peter.

        1. Peter Fiedler

          Hi Juno,
          wow, das ist pfiffig…

          Versucht hab ich es, ja. Allerdings hatte ich damals alle Änderungen direkt in der docker-compose.yml drin, die bei jedem Update überschrieben wurde. Dann hab ich es sein lassen.
          Beste Grüße
          Peter.

          1. Schade wie es ausschaut muss ich wohl doch in einen zweiten Server investieren.

          2. Peter Fiedler

            Sorry, da hab ich mich wohl falsch ausgedrückt…
            Mit der Anleitung, die Du mir geschickt hast, ist das Betreiben von mailcow und den Anwendungen auf der selben Maschine möglich. Gibt halt die beschriebenen Konflikte, falls die IP-Range schon in Gebrauch ist. Und Du hängst von einem Image ab, das die Zertifikate von Let’s Encrypt an die mailcow weiterreicht. Aber ansonsten sollte das funktionieren.

            Ich persönlich trenne gerne Mail vom Rest des Systems, nicht nur weil die Macher von der mailcow das empfehlen, sondern auch um unterschiedliche Management-Strategien zu fahren.

          3. Verstehe deine Entscheidung. Die erwähnte Anleitung ist auch sehr kurz gehalten. Über seine DNS-Config erzählt er auch nichts…

          4. Hier geb ich den Tipp den man auch in mailcow’s Anleitungen findet deine Änderungen anstelle sie in die docker-compose.yml zu schreiben, sie in die (zu erstellende Datei) docker-compose.override.yml zu schreiben. Beim Start der docker-compose.yml werden hier noch die Änderungen / überschriebenen Werte aus der docker-compose.override.yml angewendet. Vorteil ist auch bei Updates wird nichts überschrieben, weil die .override.yml nicht Teil des git-repository/des Updates ist.

          5. Danke für den Hinweis!
            Das mit den Updates ist wirklich eine gute Sache… Da bin ich offenbar drüber gestolpert, als ich die Config damals bearbeitet habe.

            Beste Grüße und ein schönes Wochenende ;)
            Peter.

Kommentar verfassen

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

Verwendung
von Cookies

Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung.

Scroll to Top