Let's Encrypt Support: DOMAIN+LETSENCRYPT_EMAIL in .env aktivieren echtes Zertifikat

- caddy/entrypoint.sh generiert Caddyfile jetzt dynamisch: sind DOMAIN und
  LETSENCRYPT_EMAIL gesetzt, holt Caddy automatisch ein Let's-Encrypt-Zertifikat;
  sonst Fallback auf das bisherige selbstsignierte 100-Jahres-Zertifikat.
- .env.example um DOMAIN/LETSENCRYPT_EMAIL ergaenzt (auskommentiert), inkl. Erklaerung.
- Caddy /data und /config (ACME-Cache) jetzt unter ./daten gebind-mounted statt
  Named Volumes, damit ein einzelner Ordner fuer Backup/Umzug reicht.
- statische Caddyfile entfernt (wird zur Laufzeit erzeugt), README entsprechend
  um beide Zertifikats-Modi erweitert.
This commit is contained in:
ARIA
2026-07-20 20:20:49 +00:00
parent 0b6acbb874
commit 4dfcc3303f
8 changed files with 140 additions and 65 deletions
+42 -17
View File
@@ -16,36 +16,60 @@ Alle persistenten Daten liegen im Projektverzeichnis unter `./daten`:
daten/
config/ Baikal-Konfiguration (Setup, Admin-Login, DB-Settings)
data/ Baikal-Nutzdaten (Kalender, Adressbuecher, SQLite-DB)
caddy_certs/ Selbstsigniertes TLS-Zertifikat (baikal.crt / baikal.key)
caddy_certs/ Selbstsigniertes TLS-Zertifikat (nur Fallback-Modus, s.u.)
caddy_data/ Let's-Encrypt-Zertifikatscache (nur Let's-Encrypt-Modus)
caddy_config/ Caddy Runtime-Config-Autosave
```
`daten/` ist damit der einzige Ordner, den man fuer Backups sichern bzw. bei
einem Umzug/Redeploy 1:1 mitnehmen muss.
## TLS-Zertifikat (100 Jahre, automatisch)
## TLS-Zertifikat (Let's Encrypt oder 100 Jahre selbstsigniert, automatisch)
Der Caddy-Container hat einen eigenen Entrypoint
(`caddy/entrypoint.sh`): Beim Start prueft er, ob unter
`daten/caddy_certs/baikal.crt` + `baikal.key` bereits ein Zertifikat liegt.
Der Caddy-Container hat einen eigenen Entrypoint (`caddy/entrypoint.sh`), der
das `Caddyfile` bei JEDEM Start dynamisch erzeugt — abhaengig davon, ob in
`.env` eine Domain + Email fuer Let's Encrypt hinterlegt sind:
- **Nicht vorhanden** -> es wird automatisch ein neues, selbstsigniertes
Zertifikat per `openssl` erzeugt, gueltig fuer **36500 Tage (100 Jahre)**.
- **Vorhanden** -> wird unveraendert weiterverwendet (kein Ueberschreiben bei
jedem Neustart).
### Modus 1 — Let's Encrypt (echtes Zertifikat)
Caddys eingebautes automatisches HTTPS (ACME / interne CA mit kurzlebigen
Zertifikaten) ist im `Caddyfile` bewusst per `auto_https off` deaktiviert —
stattdessen wird das selbst erzeugte Langzeit-Zertifikat direkt referenziert.
Werden **beide** Variablen `DOMAIN` und `LETSENCRYPT_EMAIL` in `.env`
ausgefuellt, fordert Caddy automatisch ein echtes, oeffentlich
vertrauenswuerdiges Let's-Encrypt-Zertifikat fuer `DOMAIN` an und erneuert es
danach von selbst (Caddys eingebautes automatisches HTTPS).
Voraussetzungen:
- `DOMAIN` zeigt per DNS (A/AAAA-Record) auf diesen Host.
- Port `80` UND `443` sind aus dem Internet erreichbar (HTTP-01 Challenge).
```bash
cp .env.example .env
# .env bearbeiten:
# DOMAIN=baikal.meine-domain.de
# LETSENCRYPT_EMAIL=ich@meine-domain.de
```
### Modus 2 — Fallback: selbstsigniertes 100-Jahres-Zertifikat
Bleibt `DOMAIN` oder `LETSENCRYPT_EMAIL` leer (Default, z.B. bei reiner
LAN/IP-Nutzung ohne oeffentliche Erreichbarkeit), nutzt der Entrypoint
automatisch ein selbstsigniertes Zertifikat:
- **Noch keins vorhanden** unter `daten/caddy_certs/baikal.crt` +
`baikal.key` -> es wird automatisch per `openssl` neu erzeugt, gueltig fuer
**36500 Tage (100 Jahre)**.
- **Bereits vorhanden** -> wird unveraendert weiterverwendet (kein
Ueberschreiben bei jedem Neustart).
Da es sich um ein selbstsigniertes Zertifikat handelt, werden CalDAV/CardDAV-
Clients (Browser, Thunderbird, DAVx5, iOS/macOS Kalender-App, ...) beim ersten
Verbinden eine Zertifikatswarnung anzeigen. Das Zertifikat muss dort einmalig
als vertrauenswuerdig akzeptiert bzw. importiert werden.
als vertrauenswuerdig akzeptiert bzw. importiert werden. Bei Modus 1 (Let's
Encrypt) entfaellt diese Warnung, da das Zertifikat echt ist.
### Hostname/CN anpassen
### Hostname/CN des selbstsignierten Zertifikats anpassen
Der Common Name (CN) und SAN-Eintrag des Zertifikats werden ueber die
Umgebungsvariable `CADDY_CERT_CN` gesteuert (Default: `baikal.local`).
Nur relevant fuer Modus 2. Der Common Name (CN) und SAN-Eintrag werden ueber
die Umgebungsvariable `CADDY_CERT_CN` gesteuert (Default: `baikal.local`).
Eigene Domain/IP setzen, bevor der Container zum ersten Mal hochfaehrt (das
Zertifikat wird nur EINMAL erzeugt — danach `daten/caddy_certs` loeschen und
@@ -95,4 +119,5 @@ docker compose up -d --build
```
Beim naechsten Start wird automatisch ein neues 100-Jahres-Zertifikat mit dem
aktuellen `CADDY_CERT_CN` erzeugt.
aktuellen `CADDY_CERT_CN` erzeugt (nur relevant im Fallback-Modus 2, siehe
oben — bei aktivem Let's Encrypt kuemmert sich Caddy selbst um Erneuerung).