Zum Inhalt

Caddy Role

Deploy Caddy, a modern web server with automatic HTTPS, as a reverse proxy for Docker services.

Zertifikate: Die Wildcards für rwcloud.ch und gate81.ch werden seit 10. Oktober 2026 auf mgmt durch den certs-Stack im Repo homelab/portainer-hosted erneuert (acme.sh + Infomaniak DNS-01). Diese Rolle verteilt lediglich die exportierten Dateien an bestehende Caddy-Hosts. Betrieb und Wiederherstellung.

Zertifikats-Ablauf

Die Action Distribute Wildcard Certificates prüft täglich den certs-Stack auf mgmt, kopiert Zertifikate auf docker_base, docker01, docker_idp und lädt Caddy neu. immosrv410 ist absichtlich ausgeschaltet/im Aufbau und wird nach dem Caddy-Onboarding wieder aufgenommen. Bei manueller Ausführung wird zusätzlich ein Renewal-Check auf mgmt ausgeführt; force bleibt standardmäßig ausgeschaltet.

Quelle und Verzeichnis sind über Defaults konfigurierbar:

1
2
caddy_certificate_source_host: mgmt
caddy_certificate_source_dir: /etc/homelab/caddy/certs

Die Quelle liefert <domain>/fullchain.pem und <domain>/<domain>.key.pem. Private Schlüssel werden mit 0600 geschrieben und nicht in Task-Ausgaben angezeigt.

Manueller Renewal-Check:

1
2
uv run ansible-playbook -i inventory/hosts.yml \
  playbooks/proxmox/manage_certs.yml --tags renew --limit mgmt

Nur Gesundheit prüfen:

1
2
uv run ansible-playbook -i inventory/hosts.yml \
  playbooks/proxmox/manage_certs.yml --tags verify --limit mgmt

Nur verteilen und Caddy neu laden:

1
2
uv run ansible-playbook -i inventory/hosts.yml \
  playbooks/proxmox/deploy_certs_all.yml --tags caddy-copy-certs,caddyfile-reload

Der Workflow Deploy Docker Services mit service=caddy, action=reload aktualisiert weiterhin nur die lokale Caddy-Konfiguration und lädt lokale Zertifikatsdateien per --force neu; er stellt keine Zertifikate aus.

Usage

Basic Configuration

Konfiguration steht in playbooks/proxmox/group_vars/all.yml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Vars (aus group_vars/all.yml)
proxy_caddy_container_name: caddy
proxy_docker_network: proxy
proxy_caddy_caddyfile_folder: /docker/caddy/Caddyfile
proxy_caddy_data_folder: /docker/caddy/caddy_data
proxy_caddy_config_folder: /docker/caddy/caddy_config
proxy_caddy_own_certs_folder: /docker/caddy/caddy_own-certs

# Ports (Default: 80/443)
caddy_http_port: 80
caddy_https_port: 443

Defining Proxy Sites

Definiere die Services pro Gruppe in den group_vars/<gruppe>_services.yml:

1
2
3
4
5
6
7
caddy_proxy_sites:
  - name: wiki
    host: wiki.rwcloud.ch
    backend: http://wiki:80
  - name: whoami
    host: whoami.rwcloud.ch
    backend: http://whoami:80

Wildcard-Zertifikate

Jeder Host bekommt im wildcard-Modus für alle Domains in caddy_wildcard_certs (Default: roles/caddy/defaults/main.yml) einen eigenen Caddy-Site-Block mit dem passenden Zertifikat:

1
2
3
4
5
caddy_wildcard_certs:
  - domain_dot: rwcloud.ch
    domain_underline: rwcloud_ch
  - domain_dot: gate81.ch
    domain_underline: gate81_ch

caddy_proxy_sites UND caddy_additional_sites (z. B. pgadmin-*.gate81.ch) werden je nach Domäne in den zugehörigen Wildcard-Block gerendert. Das Zertifikat wird von mgmt geholt und unter {{ proxy_caddy_own_certs_folder }}/<domain>/ abgelegt:

  • fullchain.pem
  • <domain>.key.pem

Stage / Parallel Deployment

Zweite Caddy-Instanz (z. B. Stage) auf demselben Server — siehe playbooks/proxmox/deploy_docker_base.yml / deploy_docker_services.yml (caddy-stage, Ports 50000/50001).

Adding a New Service (Zero Downtime)

  1. Neue Site in caddy_proxy_sites (bzw. caddy_additional_sites) eintragen.
  2. Playbook mit dem Reload-Tag ausführen:
1
uv run ansible-playbook -i inventory/hosts.yml playbooks/proxmox/deploy_docker_services.yml --tags caddyfile-reload --limit docker01

Dies: 1. Rendert die Caddyfile neu auf dem Server. 2. Führt caddy reload im Container aus. 3. Wendet die Konfiguration an, ohne bestehende Verbindungen zu trennen.

Tags

Tag Beschreibung
caddy-install Volle Installation (Ordner, Zertifikate, Error-Pages, Container)
caddy-uninstall Entfernt den Caddy-Container
caddy-update Image neu pullen + Container neu starten
caddy-copy-certs Zertifikate von mgmt holen (wildcard-Modus)
caddyfile-reload Caddyfile neu rendern + caddy reload (Zero Downtime)
caddy-pages Error-Pages aktualisieren

(entsprechend caddy-stage-* für die Stage-Instanz)