Propagate this build's lessons into the scripts and every runbook
addCommunityMediaServer.sh asks for the diag hostname, DNS-checks it and passes it to --hosts, so a rebuild sets it up like every other host instead of leaving it to be discovered missing. HOSTNAME-CHANGE.md gains §D, adding a new host, which is where the hour went: --apply is stateless and reads hostnames back out of the Caddyfile, so it silently omits a role that is not already there and the name ends up with no certificate. README and the Phase 13 checklist now point at --full or --hosts instead of --apply, and the plan's risks section carries the same warning plus the path-prefix cascade. LOGGING.md collects the four traps this produced so none of them is rediscovered. FRESH-INSTALL gains an ordered §7b and appendix M for the diag host, including that running without a webhook is correct rather than half-configured; the old Afterwards section is relettered N. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -15,7 +15,7 @@ Roles: `main` (gateway page at `/`), `files` (copyparty), `clips`, `sync`, `live
|
||||
| Place | Holds |
|
||||
|---|---|
|
||||
| `Caddyfile` | every site block — the source of truth `configure.py` reads back (`# vanguard:<role>` markers) |
|
||||
| `.env` | `MAIN_HOST`, `FILES_HOST`, `CLIPS_HOST`, `SYNC_HOST`, `WATCH_HOST`, `GIT_HOST`, `BOT_HOST`, `LIVE_HOST`, `APEX_HOST`, `APEX_REDIRECT` |
|
||||
| `.env` | `MAIN_HOST`, `FILES_HOST`, `CLIPS_HOST`, `SYNC_HOST`, `DIAG_HOST`, `WATCH_HOST`, `GIT_HOST`, `BOT_HOST`, `LIVE_HOST`, `APEX_HOST`, `APEX_REDIRECT` |
|
||||
| `mediamtx.yml` | `webrtcAdditionalHosts: [MAIN_HOST]` (needs a MediaMTX restart to take effect) |
|
||||
| `docker-compose.yml` → container env | Jellyfin `PublishedServerUrl` (WATCH), Gitea `DOMAIN/ROOT_URL/SSH_DOMAIN` (GIT), bot `WEB_PUBLIC_URL` (BOT), MediaMTX `LIVE_HOST` (text of the "is live" post), act_runner `GITEA_INSTANCE_URL` (GIT). `compose up -d` in the apply recreates the affected containers (seconds each) |
|
||||
| Caddy TLS | certificates for new names are fetched automatically; old ones linger harmlessly |
|
||||
@@ -122,8 +122,30 @@ name under BASE, the outpost host (`auth.`) is unchanged.
|
||||
5. Discord: re-pin `https://media.BASE/` (members), `https://clips.BASE/` (gamers), `https://files.BASE/` (editors).
|
||||
6. Old `ovh1` bookmarks stop working (no Caddy block, TLS fails) — point people at the gateway.
|
||||
|
||||
## D. Adding a NEW host
|
||||
|
||||
**`./configure.py --apply` cannot do this, and will not complain.** It is stateless by design: it reads the
|
||||
hostnames back out of the `Caddyfile` (`# vanguard:<role>` markers), so a role that is not in there yet has no
|
||||
value to write and the site is simply left out. The containers come up, Caddy reloads, and the new name has no
|
||||
site block and therefore no certificate — which presents as an SSL handshake error, not as an error from the
|
||||
apply. This cost an hour on 2026-11-03 when `diag.` was added.
|
||||
|
||||
Introduce a new host with **`--full`** (asks for every hostname, defaults from the current config) or with
|
||||
**`--hosts`**, which is the non-interactive form and takes them positionally:
|
||||
|
||||
./configure.py --hosts AUTH WATCH GIT BOT LIVE FILES SYNC CLIPS DIAG # "" leaves one unset
|
||||
|
||||
After that, `--apply` maintains it like any other host, because the marker is now in the file.
|
||||
|
||||
1. DNS: `CNAME` (or `A`) for the new name → the box; check it resolves before continuing.
|
||||
2. Add the role to `configure.py`: a `write_caddy` block, a `<ROLE>_REQUIRE_GROUP` default in `write_env`,
|
||||
the prompt in `full()`, the positional in `--hosts`, and the line in `show()`.
|
||||
3. `./configure.py --hosts …` with every hostname including the new one.
|
||||
4. Verify the marker landed: `grep -c "vanguard:<role>" Caddyfile` → 1. Then `curl -sI https://NEW/` → 302.
|
||||
5. Add it to `addCommunityMediaServer.sh` so a rebuild asks for it too.
|
||||
|
||||
## Checklist after any change
|
||||
dev$ for h in HOST files.BASE clips.BASE sync.BASE live.BASE auth.BASE watch.BASE git.BASE bot.BASE; do printf '%-26s ' $h; curl -s -o /dev/null -m 10 -w '%{http_code}\n' https://$h/; done
|
||||
dev$ for h in HOST files.BASE clips.BASE sync.BASE live.BASE diag.BASE auth.BASE watch.BASE git.BASE bot.BASE; do printf '%-26s ' $h; curl -s -o /dev/null -m 10 -w '%{http_code}\n' https://$h/; done
|
||||
https://HOST/whoami → your identity (gate works on the new name)
|
||||
https://watch.BASE/sso/OID/start/authentik → Jellyfin SSO round trip
|
||||
https://git.BASE/user/login → "Sign in with authentik" round trip
|
||||
|
||||
Reference in New Issue
Block a user