The static sonarr/radarr API keys were copies of the real per-app keys,
seeded by hand into kv and never rotated. The arrstack secrets engine can
mint short-lived machine tokens instead, so mediamark leases one rather
than holding a copy of the real thing.
Drop the sonarr-apikey and radarr-apikey VaultStaticSecrets.
Add an arrstack-creds VaultAuth bound to the new `mediamark` k8s role.
Add an arrstack-virtual-key VaultDynamicSecret reading arrstack/creds/mediamark.
Project the leased token to both /etc/mediamark/keys/{sonarr,radarr}.
Point MEDIAMARK_{SONARR,RADARR}_URL at arrproxy-api, which is the only
thing that honours a virtual key.
Reload on arrstack-virtual-key instead of the removed secrets.
Adds the mediamark app (Go single binary) to the media project: an
oauth2-proxy-fronted service that reads the shared mediastore CephFS tree
and talks to the adult-tier sonarr/radarr through arrproxy's hash routes.
- Add apps/base/mediamark: namespace, VaultAuth, three VaultStaticSecrets,
static mediastore PV/PVC, the app Deployment, oauth2-proxy
ConfigMap/Deployment, two Services, and the internal + external
Gateway/HTTPRoute pairs.
- Run the app as 1000:1000 so it owns files on the shared media tree
(hardlink/rename safe), with a read-only root filesystem, all caps
dropped and no service-account token.
- Project the sonarr/radarr API keys as one file per app under
/etc/mediamark/keys, mirroring arrproxy's keys projection, with reloader
annotations on both secrets.
- Front both mediamark.unkin.net (traefik-external, reflected LE wildcard)
and mediamark.k8s.syd1.au.unkin.net (traefik-internal, vault-issuer) with
one oauth2-proxy using a relative redirect URL, gated on
akP-mediamark-user and passing X-Forwarded-Groups to the app.
- Append mediamark to the wildcard-unkin-net reflector namespace lists and
register the app in the media ApplicationSet and AppProject.