systemd-sysctl applies /etc/sysctl.conf AFTER all of sysctl.d/, so the stale ip_unprivileged_port_start=80 line there beat every drop-in and kept the runtime value at 80 after the first deploy pass. deploy_pihole now comments out an active line in /etc/sysctl.conf (idempotent) and generalizes the sysctl.d conflict scan to any file setting a value above 53.
5.5 KiB
5.5 KiB
type, title, description, tags, timestamp
| type | title | description | tags | timestamp | |||
|---|---|---|---|---|---|---|---|
| reference | Bundle Change Log | Chronological record of meaningful changes to the serverAppConfigs knowledge base. |
|
2026-09-14 |
Bundle Change Log
2026-09-14
- Creation: Hermes-WebUI — new
hermes-webuicompose service on Dankclaw (the Hermex server): runshermes-webui'sbootstrap.py --foregroundin the agent image, shares/home/dank/hermes-datawith the gateway (identical rootless Podman uid mapping), publishes127.0.0.1:8787only, password-gated viaHERMES_WEBUI_PASSWORDin the host.env. /dankclaw/compose.yaml,/dankclaw/.env.example— service definition and password placeholder; container-internal bind is0.0.0.0(Podman's port forwarder dials the bridge IP) while the host-side publish stays loopback so the SSH tunnel is the sole ingress./scripts/deploy-plan.py,/scripts/deploy.sh,/scripts/deploy-remote.sh—hermes-webuiregistered as an isolated Dankclaw service in all three inventories; planner narrows edits to its compose block only./tests/hermes_webui.bats— new seam: foreground entrypoint, loopback publish + auth, shared volume,/healthhealthcheck, env placeholder, planner narrowing (hermetic fixture repo), deployer dispatch.- Remote access pattern documented: iPhone Termius local forward
127.0.0.1:8787 -> 127.0.0.1:8787over the existing router port forward to Dankclaw:22; Hermex points athttp://localhost:8787. No Tailscale, no Cloudflare.
2026-08-26
/dankclaw/Caddyfile— Both Plex vhosts now proxy to PMS over a TLS upstream (insecure_skip_verify); PMS drops plain-HTTP connections from non-loopback sources, which produced empty-body 502s./docs/Infrastructure/Caddy.md— Documented the Plex TLS-upstream requirement and the/web/vs/distinction./tests/caddyfile.bats— Added a test pinning the TLS upstream transport on both Plex vhosts./docs/Dankclaw/Gitea.md— Documented migration of Gitea web proxy ownership to canonical Caddy and retirement of the standalone proxy./docs/Dankclaw/Dankclaw Stack.md— Updated boot-persistence and Caddy deployment descriptions for the two-unit Gitea stack./docs/Architecture/Deployment Flow.md— Replaced the split-proxy safety description with the canonical Caddy ownership model./dankclaw/gitea/quadlet/gitea-caddy.container— Retired the standalone Gitea Caddy Quadlet; deployment stages any live copy into home trash./scripts/deploy-plan.py— Routes retirement of the legacy proxy to the canonical Caddy and removes it from the service inventory./scripts/deploy.shand/scripts/deploy-remote.sh— Removed standalone proxy dispatch and added idempotent retirement before canonical Caddy deployment./tests/caddyfile.bats,/tests/deployment_scoping.bats,/tests/deployment_flow.bats,/tests/frank_large_config.bats— Added migration coverage and corrected the existing ubatch harness assertion./docs/index.md— Bundle index remains the root navigation entry for the updated pages.- Boot-persistence audit (post-reboot, 2026-08-26 evening): after Frank's reboot, Caddy and Pi-hole were both down. Caddy ran as a bare compose container (
restart: unless-stoppeddoes not survive shutdown's explicit stop; rootless Podman has no boot-time auto-start for bare containers). Pi-hole's quadlet existed but crash-looped (restart counter 1645):net.ipv4.ip_unprivileged_port_startwas reset to 80 by two sources — a later-sorted sysctl drop-in (99-rootless-ports.conf) and a stale line in/etc/sysctl.conf, which systemd-sysctl applies after all ofsysctl.d/(the first deploy pass only fixed the drop-in; the runtime value stayed 80 until the/etc/sysctl.confline was neutralized too). /AGENTS.md— new MANDATORY section "Boot Persistence & Self-Healing": every deployed, proven-working container must have a self-healing, boot-persistent quadlet unit (WantedBy=default.target+ enabled + linger,Restart=always, repo-provenance.container), verified before a service is declared deployed./dankclaw/caddy/quadlet/caddy.container,/dankclaw/caddy/env.example— Caddy is now a boot-persistent quadlet (caddy.service): joinsdankclaw_defaultso container-name upstreams keep resolving,Pull=never(local-only image), Porkbun credentials via/home/dank/Containers/caddy/env(deploy writes it from.env), bare-IP-catch-all health check. The caddy service was removed from/dankclaw/compose.yaml./dankclaw/pihole/sysctl/99-dnsmasq.conf— repo source of truth forip_unprivileged_port_start=53;deploy_piholeinstalls it to/etc/sysctl.d/, stages conflicting drop-ins (value > 53) in the home trash, comments out a stale/etc/sysctl.confline (applied after all of sysctl.d), and appliessysctl --system(the boot code path)./scripts/deploy-remote.sh—deploy_caddyinstalls/enables/starts the quadlet (retiring the bare container; all state is in host volumes);deploy_piholeenforces the sysctl prerequisite./tests/caddy_quadlet.bats(new seam),/tests/caddyfile.bats,/tests/deployment_flow.bats,/tests/pihole.bats— quadlet boot-persistence, self-healing, network, env, and sysctl coverage; compose assertions repointed from the removed caddy service to the quadlet./docs/Infrastructure/Caddy.md,/docs/Infrastructure/Pi-hole.md,/docs/Dankclaw/Dankclaw Stack.md— quadlet runtime facts, the 2026-08-26 incident, and the sysctl-conflict failure mode.