diff --git a/Caddyfile b/Caddyfile index af9adcd..96754bd 100644 --- a/Caddyfile +++ b/Caddyfile @@ -5,10 +5,11 @@ # # TLS: bewusst kein "tls internal" (Caddys eigene interne CA, Zertifikate nur # ~12h gueltig, auto-rotiert) und kein Let's Encrypt (braucht oeffentliche -# Domain + Port 80). Stattdessen ein manuell erzeugtes selbstsigniertes -# Zertifikat mit 100 Jahren Laufzeit, siehe README fuer den openssl-Befehl. -# Einmalig im Browser als Sicherheits-Ausnahme akzeptieren, danach nie wieder -# Renewal-Aerger. +# Domain + Port 80). Stattdessen ein selbstsigniertes Zertifikat mit 100 +# Jahren Laufzeit — wird beim allerersten Container-Start automatisch vom +# Entrypoint in docker-compose.yml erzeugt (kein manueller openssl-Befehl +# noetig), landet persistent im /certs-Volume. Einmalig im Browser als +# Sicherheits-Ausnahme akzeptieren, danach nie wieder Renewal-Aerger. :443 { tls /certs/dashboard.crt /certs/dashboard.key diff --git a/README.md b/README.md index a2fdc05..a8df176 100644 --- a/README.md +++ b/README.md @@ -156,9 +156,20 @@ aussen — kein anderer Rechner kommt mehr direkt ran. 5. **TLS-Reverse-Proxy (Caddy) einrichten — macht Port 443 von aussen erreichbar, Dashboard bleibt intern auf `127.0.0.1`:** - a. Selbstsigniertes Zertifikat erzeugen, 100 Jahre gueltig (bewusst kein - Let's Encrypt — kein Domain-/Port-80-Zwang, kein Renewal je wieder - noetig). Einmalig auf der Maschine: + a. Selbstsigniertes Zertifikat, 100 Jahre gueltig (bewusst kein Let's + Encrypt — kein Domain-/Port-80-Zwang, kein Renewal je wieder noetig). + **Erzeugt sich automatisch** — kein manueller Schritt mehr noetig: der + `caddy`-Container prueft beim Start, ob in `hermes-data/caddy-certs/` + schon ein Zertifikat liegt, und wenn nicht, installiert er sich kurz + `openssl` (per `apk`) und erzeugt es selbst (siehe `command:`-Block im + `caddy`-Service in `docker-compose.yml`). Einmalig generiert, danach + persistent im Volume — ueberlebt `docker compose up`/Neustarts, wird + nicht bei jedem Start neu gebaut. + + Falls Du's doch manuell/mit eigenem `/CN` (z.B. Server-IP) erzeugen + willst, geht das weiterhin von Hand — dann einfach VOR dem ersten + Hochziehen selbst nach `hermes-data/caddy-certs/dashboard.{crt,key}` + legen, der Auto-Generate-Check ueberspringt die Erzeugung dann: ```bash mkdir -p hermes-data/caddy-certs openssl req -x509 -nodes -newkey rsa:4096 \ @@ -167,8 +178,6 @@ aussen — kein anderer Rechner kommt mehr direkt ran. -days 36500 \ -subj "/CN=hermes-dashboard" ``` - `-days 36500` ≈ 100 Jahre. `/CN` ist egal (kein Public-DNS-Zwang), kann - auch die Server-IP sein wenn Du magst. b. Caddy-Basic-Auth-Hash erzeugen (EIGENER Hash, nicht derselbe wie bei Schritt 4 — Caddy will bcrypt, Hermes' Hash ist pbkdf2): diff --git a/docker-compose.yml b/docker-compose.yml index 55c9e8d..b094744 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -234,12 +234,33 @@ services: - hermes-agent-dashboard volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - - ./hermes-data/caddy-certs:/certs:ro + # kein :ro mehr -- der Entrypoint unten schreibt das Zertifikat selbst + # ins Volume, wenn noch keins da ist. + - ./hermes-data/caddy-certs:/certs - ./hermes-data/caddy-data:/data - ./hermes-data/caddy-config:/config environment: - HERMES_DASHBOARD_USER=${HERMES_DASHBOARD_USER:-admin} - CADDY_BASIC_AUTH_HASH=${CADDY_BASIC_AUTH_HASH:?CADDY_BASIC_AUTH_HASH muss in .env gesetzt sein - siehe .env.example} + # Erzeugt beim allerersten Start automatisch ein selbstsigniertes + # 100-Jahre-Zertifikat im /certs-Volume (persistent, ueberlebt Neustarts), + # kein manueller openssl-Befehl auf dem Host mehr noetig. apk add ist + # noetig, weil das caddy:2-alpine-Image openssl nicht mitbringt. + entrypoint: ["/bin/sh", "-c"] + command: + - | + set -e + if [ ! -f /certs/dashboard.crt ] || [ ! -f /certs/dashboard.key ]; then + echo "[caddy-init] Kein Zertifikat in /certs gefunden -- erzeuge selbstsigniertes 100-Jahre-Zertifikat..." + apk add --no-cache openssl >/dev/null + openssl req -x509 -nodes -newkey rsa:4096 \ + -keyout /certs/dashboard.key -out /certs/dashboard.crt \ + -days 36500 -subj "/CN=hermes-dashboard" + echo "[caddy-init] Zertifikat erzeugt." + else + echo "[caddy-init] Zertifikat bereits vorhanden, ueberspringe Erzeugung." + fi + exec caddy run --config /etc/caddy/Caddyfile --adapter caddyfile networks: hermes-net: