From 630b253278315a8ae790f2adb88b66d565edae65 Mon Sep 17 00:00:00 2001 From: Brandyn / Techy Date: Fri, 6 Nov 2026 19:05:47 -0600 Subject: [PATCH] bunch of shit --- HOSTNAME-CHANGE.md | 163 +++++++-- LOGGING.md | 11 +- README.md | 43 ++- STATUS.md | 23 +- about/index.html | 11 +- about/onboarding/index.html | 58 +++ authentik/brand/favicon.svg | 4 + authentik/brand/login-bg.svg | 16 + authentik/brand/logo.svg | 5 + bin/dumpd.py | 609 ++++++++++++++++++++++++++++++-- bin/install.list | 2 + bin/normalize-sweep.sh | 63 +++- bin/vghosts-check.py | 407 +++++++++++++++++++++ bin/vgstitch.py | 179 ++++++++++ bin/vgstuck.sh | 116 ++++-- check.sh | 4 +- configure.py | 363 +++++++++++++++++-- deployLive.sh | 2 +- dock/index.html | 102 +++++- docker-compose.yml | 18 +- firewall/nftables.conf | 3 +- live/src/GoLive.jsx | 132 ++++++- live/src/broadcast.js | 85 ++++- observability/kibana-setup.py | 9 +- streaming/disk.html | 132 +++++++ streaming/index.html | 416 ++++++++++++++++++++++ stuck/index.html | 113 ------ switchToClone.sh | 6 +- systemd/normalize-sweep.service | 1 + 29 files changed, 2793 insertions(+), 303 deletions(-) create mode 100644 about/onboarding/index.html create mode 100644 authentik/brand/favicon.svg create mode 100644 authentik/brand/login-bg.svg create mode 100644 authentik/brand/logo.svg create mode 100755 bin/vghosts-check.py create mode 100755 bin/vgstitch.py create mode 100644 streaming/disk.html create mode 100644 streaming/index.html delete mode 100644 stuck/index.html diff --git a/HOSTNAME-CHANGE.md b/HOSTNAME-CHANGE.md index beff11d..2d715e4 100644 --- a/HOSTNAME-CHANGE.md +++ b/HOSTNAME-CHANGE.md @@ -5,9 +5,27 @@ domain. Both are mostly `configure.py --full` plus a known list of places outsid Do it between streams: the main host is MediaMTX's WebRTC advertised host, so a main-host change needs a MediaMTX restart. -Roles: `main` (gateway page at `/`), `files` (copyparty), `clips`, `sync`, `live` (portal + `/dock/`, `/dock/clock/`, -`/dump`, `/me`, `/time`), `auth`, `watch`, `git`, `bot`. Ours: `media.`, `files.`, `clips.`, `sync.`, `live.`, … under -`dumpstervigilantes.rip`. +Roles: `main` (gateway page at `/`, `/onboarding/`), `files` (copyparty), `clips`, `sync`, `live` (portal + Go Live, +`/dock/`, `/dock/clock/`, `/dump`, `/me`, `/time`, `/whoami`), `auth`, `watch`, `git`, `bot`, `diag` (Kibana at `/`, +`/streaming`, `/disk`, dumpd's `/streaming/api/*`), and optionally `apex` (the bare domain, a redirect to +`APEX_REDIRECT`; it needs its own A record at the box or Caddy cannot get its certificate — as of 2026-11-06 the bare +`dumpstervigilantes.rip` resolves elsewhere, so leave `APEX_HOST` empty or fix the record first). Ours: `media.`, +`files.`, `clips.`, `sync.`, `live.`, `diag.`, … under `dumpstervigilantes.rip`. `ovh1.BASE` is ssh only. + +## The one rule: apps before Authentik + +Change the app, then Authentik, never the other way round. An app that already lives on its new name but whose +Authentik provider still says the old one is simply unreachable until Authentik is updated; a provider pointed at +a name the app does not answer on yet locks you out of the app, and if that app is the gate in front of the admin +UI, out of everything. So in every procedure below Authentik comes after the servers, the containers, Jellyfin and +Gitea — and the Discord developer portal after Authentik. The safety net at every step is akadmin's password +card, `https://AUTH/if/flow/default-authentication-flow/?admin=1`, which bypasses the Discord forward. + +Note that `configure.py --apply` does touch Authentik on its own: the login redirect stage's target (the Discord +source's login URL on the auth host) and the brand's default application. Both are Authentik-internal, neither +decides whether an app is reachable, and the admin card ignores the redirect stage — so they cannot lock you out. +The things that can — outpost host, proxy provider external host and cookie domain, Jellyfin/Gitea redirect +URIs — are never changed by any script here. ## Where hostnames live @@ -15,16 +33,19 @@ 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:` markers) | -| `.env` | `MAIN_HOST`, `FILES_HOST`, `CLIPS_HOST`, `SYNC_HOST`, `DIAG_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`; during a move `ALT_BASE` (every site also answers under it) and `REDIRECT_BASE` (old names 308 to the new) | | `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) | +| `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), Kibana `server.publicBaseUrl` via `DIAG_HOST` (DIAG). `compose up -d` in the apply recreates the affected containers (seconds each). MediaMTX is on the host network and is deliberately **not** recreated by the apply | +| Authentik, by `configure.py --apply` (`--ak-branding` alone) | the login **redirect stage** target `https://AUTH/source/oauth/login//` (members never see an Authentik page), the brand's default application (the proxy provider whose external host is MAIN), logo/favicon/background paths (relative, no host). Re-run after an **auth** or **main** change | +| Kibana landing dashboard, by `configure.py --apply` (`KEY=… kibana-setup.py landing` alone) | the Vanguard tile's links: LIVE, FILES, WATCH, MAIN, GIT, BOT, SYNC from `.env`, AUTH derived as `auth.`; `/streaming`, `/disk` relative. Re-run after any change | | Caddy TLS | certificates for new names are fetched automatically; old ones linger harmlessly | ### Pages in the repo that derive sibling hosts from the browser's location (label names hard-coded) | File | Assumes | |---|---| -| `about/index.html` | `files.`, `clips.`, `sync.`, `live.`, `auth.`, `watch.`, `git.`, `bot.` + the parent of the current host | -| `dock/index.html` | `auth.` (sign-out), ingest host prefilled from the current host (`live.`; any name of the box works for RTMP/SRT) | +| `about/index.html` | `files.`, `clips.`, `sync.`, `live.`, `auth.`, `watch.`, `git.`, `bot.`, `diag.` + the parent of the current host (`sub('