The Caddyfile was bind-mounted as a single file. ansible.builtin.template writes
atomically (temp + rename), so a re-render swaps the file's inode while the running
container keeps the old one — `caddy reload` then re-read stale config and silently
no-op'd ("config is unchanged"), so new routes never loaded. Surfaced deploying the
NetBird route: Caddy never requested its cert. Fix: render to ./caddy/Caddyfile and
mount the ./caddy DIRECTORY at /etc/caddy — directory mounts reflect inode swaps, so
graceful `caddy reload` works. Proven on askari: atomic replace in the host dir is
visible inside the running container.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| base | ||
| dev_env | ||
| docker_host | ||
| netbird_coordinator | ||
| public_dns | ||
| reverse_proxy | ||
| README.md | ||
roles/
Local Ansible roles. No Galaxy roles — every role is written and maintained here
(ADR-003). Scaffold new ones with make new-role NAME=<name>; never create the
directory structure by hand.
Each role must have: a molecule/default/ scenario (Debian 13), a populated
README.md, and a filled-in meta/main.yml. Conventions: CLAUDE.md and
docs/runbooks/new-role.md.
Current state: base is partially built — its firewall (nftables) and
hardening (SSH key-only + fail2ban) concerns are implemented, tested, and the
hardening concern is applied to askari; the remaining concerns (auditd, packages,
users) are not yet built. docker_host (Docker engine + Compose), reverse_proxy
(Caddy), public_dns (Gandi), and dev_env are built. See STATUS.md for the
authoritative breakdown.