From 7bb0e15cff1f7d3ec2e8a28e0f96dc93a039fff9 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Wed, 21 Sep 2022 12:04:33 +0200 Subject: [PATCH] Add Caddy v2 Section for Reverse Proxies --- docs/post_installation/firststeps-rp.de.md | 76 ++++++++++++++++++++-- docs/post_installation/firststeps-rp.en.md | 64 ++++++++++++++++++ 2 files changed, 135 insertions(+), 5 deletions(-) diff --git a/docs/post_installation/firststeps-rp.de.md b/docs/post_installation/firststeps-rp.de.md index bace0bf00..e1a89d40e 100644 --- a/docs/post_installation/firststeps-rp.de.md +++ b/docs/post_installation/firststeps-rp.de.md @@ -153,8 +153,8 @@ server { ### HAProxy (von der Community unterstützt) -!!! warning - Dies ist ein nicht unterstützter Community Beitrag. Sie können gerne Korrekturen bereitstellen. +!!! warning "Warnung" + Dies ist ein nicht unterstützter Community Beitrag. Korrekturen sind immer erwünscht! **Wichtig/Fix erwünscht**: Dieses Beispiel leitet nur HTTPS-Verkehr weiter und benutzt nicht den in mailcow eingebauten ACME-Client. @@ -172,8 +172,8 @@ backend mailcow ### Traefik v2 (von der Community unterstützt) -!!! warning - Dies ist ein nicht unterstützter Community Beitrag. Fühlen Sie sich frei, Korrekturen bereitzustellen. +!!! warning "Warnung" + Dies ist ein nicht unterstützter Community Beitrag. Korrekturen sind immer erwünscht! **Wichtig**: Diese Konfiguration deckt nur das "Reverseproxing" des Webpanels (nginx-mailcow) unter Verwendung von Traefik v2 ab. Wenn Sie auch die Mail-Dienste wie dovecot, postfix... reproxen wollen, müssen Sie die folgende Konfiguration an jeden Container anpassen und einen [EntryPoint](https://docs.traefik.io/routing/entrypoints/) in Ihrer `traefik.toml` oder `traefik.yml` (je nachdem, welche Konfiguration Sie verwenden) für jeden Port erstellen. @@ -232,7 +232,7 @@ networks: Starten Sie die neuen Container mit `docker compose up -d`. -Da Traefik 2 ein acme v2 Format verwendet, um ALLE Lizenzen von allen Domains zu speichern, müssen wir einen Weg finden, die Zertifikate auszulagern. Zum Glück haben wir [diesen kleinen Container] (https://hub.docker.com/r/humenius/traefik-certs-dumper), der die Datei `acme.json` über ein Volume und eine Variable `DOMAIN=example. org`, und damit wird der Container die `cert.pem` und `key.pem` Dateien ausgeben, dafür lassen wir einfach den `traefik-certs-dumper` Container laufen, binden das `/traefik` Volume an den Ordner, in dem unsere `acme.json` gespeichert ist, binden das `/output` Volume an unseren mailcow `data/assets/ssl/` Ordner, und setzen die `DOMAIN=example.org` Variable auf die Domain, von der wir die Zertifikate ausgeben wollen. +Da Traefik 2 ein acme v2 Format verwendet, um ALLE Zertifikaten von allen Domains zu speichern, müssen wir einen Weg finden, die Zertifikate auszulagern. Zum Glück haben wir [diesen kleinen Container] (https://hub.docker.com/r/humenius/traefik-certs-dumper), der die Datei `acme.json` über ein Volume und eine Variable `DOMAIN=example. org`, und damit wird der Container die `cert.pem` und `key.pem` Dateien ausgeben, dafür lassen wir einfach den `traefik-certs-dumper` Container laufen, binden das `/traefik` Volume an den Ordner, in dem unsere `acme.json` gespeichert ist, binden das `/output` Volume an unseren mailcow `data/assets/ssl/` Ordner, und setzen die `DOMAIN=example.org` Variable auf die Domain, von der wir die Zertifikate ausgeben wollen. Dieser Container überwacht die Datei `acme.json` auf Änderungen und generiert die Dateien `cert.pem` und `key.pem` direkt in `data/assets/ssl/`, wobei der Pfad mit dem `/output`-Pfad des Containers verbunden ist. @@ -242,6 +242,72 @@ Nachdem wir die Zertifikate übertragen haben, müssen wir die Konfigurationen a Und das sollte es gewesen sein 😊, Sie können überprüfen, ob der Traefik-Router einwandfrei funktioniert, indem Sie das Dashboard von Traefik / traefik logs / über https auf die eingestellte Domain zugreifen, oder / und HTTPS, SMTP und IMAP mit den Befehlen auf der zuvor verlinkten Seite überprüfen. +### Caddy v2 (von der Community unterstützt) + +!!! warning "Warnung" + Dies ist ein nicht unterstützter Communitybeitrag. Korrekturen sind immer erwünscht! + +Die Konfiguration von Caddy mit mailcow ist sehr simpel. + +In der Caddyfile muss einfach nur ein Bereich für den E-Mailserver angelegt werden. + +Bspw: + +``` hl_lines="1 3 13" + +MAILCOW_HOSTNAME autodiscover.MAILCOW_HOSTNAME autoconfig.MAILCOW_HOSTNAME { + log { + output file /var/log/caddy/MAILCOW_HOSTNAME.log { + roll_disabled + roll_size 512M + roll_uncompressed + roll_local_time + roll_keep 3 + roll_keep_for 48h + } + } + + reverse_proxy 127.0.0.1:HTTP_BIND +} +``` + +Dies erlaubt es Caddy automatisch die Zertifikate zu erstellen und den Traffic für diese erwähnten Domains anzunehmen und an mailcow weiterzuleiten. + +**Wichtig**: Der ACME Client der mailcow muss deaktiviert sein, da es sonst zu Fehlern seitens mailcow kommt. + +Da Caddy sich direkt selbst um die Zertifikate kümmert, können wir mit dem folgenden Skript die Caddy generierten Zertifikate in die mailcow inkludieren: + +```bash +#!/bin/bash +MD5SUM_CURRENT_CERT=($(md5sum /opt/mailcow-dockerized/data/assets/ssl/cert.pem)) +MD5SUM_NEW_CERT=($(md5sum /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/develcow.derlinkman.de/develcow.derlinkman.de.crt)) + +if [ $MD5SUM_CURRENT_CERT != $MD5SUM_NEW_CERT ]; then + cp /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/develcow.derlinkman.de/develcow.derlinkman.de.crt /opt/mailcow-dockerized/data/assets/ssl/cert.pem + cp /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/develcow.derlinkman.de/develcow.derlinkman.de.key /opt/mailcow-dockerized/data/assets/ssl/key.pem + postfix_c=$(docker ps -qaf name=postfix-mailcow) + dovecot_c=$(docker ps -qaf name=dovecot-mailcow) + nginx_c=$(docker ps -qaf name=nginx-mailcow) + docker restart ${postfix_c} ${dovecot_c} ${nginx_c} + +else + echo "Certs not copied from Caddy (Not needed)" +fi +``` + +!!! warning "Achtung" + Der Zertifikatspfad von Caddy variiert je nach Installationsart.
+ Bei diesem Installationsbeispiel wurde Caddy mithilfe des Caddy Repos ([weitere Informationen hier](https://caddyserver.com/docs/install#debian-ubuntu-raspbian)) installiert.
+
+ Um den Caddy Zertifikatspfad auf Ihrem System herauszufinden, genügt ein `find / -name "certificates"`. + + +Dieses Skript könnte dann als Cronjob jede Stunde aufgerufen werden: + +```bash +0 * * * * /bin/bash /path/to/script/deploy-certs.sh >/dev/null 2>&1 +``` + ### Optional: Post-Hook-Skript für nicht-mailcow ACME-Clients Die Verwendung eines lokalen Certbots (oder eines anderen ACME-Clients) erfordert den Neustart einiger Container, was Sie mit einem Post-Hook-Skript erledigen können. diff --git a/docs/post_installation/firststeps-rp.en.md b/docs/post_installation/firststeps-rp.en.md index ec2777853..12871ceac 100644 --- a/docs/post_installation/firststeps-rp.en.md +++ b/docs/post_installation/firststeps-rp.en.md @@ -246,6 +246,70 @@ After we have the certs dumped, we'll have to reload the configs from our postfi Aaand that should be it 😊, you can check if the Traefik router works fine trough Traefik's dashboard / traefik logs / accessing the setted domain trough https, or / and check HTTPS, SMTP and IMAP trough the commands shown on the page linked before. +### Caddy v2 (supported by the community) + +!!! warning + This is an unsupported community contribution. Feel free to provide fixes. + +The configuration of Caddy with mailcow is very simple. + +In the caddyfile you just have to create a section for the mailserver. + +For example +``` hl_lines="1 3 13" + +MAILCOW_HOSTNAME autodiscover.MAILCOW_HOSTNAME autoconfig.MAILCOW_HOSTNAME { + log { + output file /var/log/caddy/MAILCOW_HOSTNAME.log { + roll_disabled + roll_size 512M + roll_uncompressed + roll_local_time + roll_keep 3 + roll_keep_for 48h + } + } + + reverse_proxy 127.0.0.1:HTTP_BIND +} +``` + +This allows Caddy to automatically create the certificates and accept traffic for these mentioned domains and forward them to mailcow. + +**Important**: The ACME client of mailcow must be disabled, otherwise mailcow will fail. + +Since Caddy takes care of the certificates itself, we can use the following script to include the Caddy generated certificates into mailcow: + +```bash +#!/bin/bash +MD5SUM_CURRENT_CERT=($(md5sum /opt/mailcow-dockerized/data/assets/ssl/cert.pem)) +MD5SUM_NEW_CERT=($(md5sum /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/develcow.derlinkman.de/develcow.derlinkman.de.crt)) + +if [ $MD5SUM_CURRENT_CERT != $MD5SUM_NEW_CERT ]; then + cp /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/develcow.derlinkman.de/develcow.derlinkman.de.crt /opt/mailcow-dockerized/data/assets/ssl/cert.pem + cp /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/develcow.derlinkman.de/develcow.derlinkman.de.key /opt/mailcow-dockerized/data/assets/ssl/key.pem + postfix_c=$(docker ps -qaf name=postfix-mailcow) + dovecot_c=$(docker ps -qaf name=dovecot-mailcow) + nginx_c=$(docker ps -qaf name=nginx-mailcow) + docker restart ${postfix_c} ${dovecot_c} ${nginx_c} + +else + echo "Certs not copied from Caddy (Not needed)" +fi +``` + +!!! warning "Attention" + Caddy's certificate path varies depending on the installation type.
+ In this installation example, Caddy was installed using the Caddy repo ([more informations here](https://caddyserver.com/docs/install#debian-ubuntu-raspbian)).
+
+ To find out the Caddy certificate path on your system, just run a `find / -name "certificates"`. + +This script could be called as a cronjob every hour: + +```bash +0 * * * * /bin/bash /path/to/script/deploy-certs.sh >/dev/null 2>&1 +``` + ### Optional: Post-hook script for non-mailcow ACME clients Using a local certbot (or any other ACME client) requires to restart some containers, you can do this with a post-hook script.