watchstate: deploy admin-gated jellyfin watch-state sync tool #419
Reference in New Issue
Block a user
Delete Branch "benvin/watchstate-deploy"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why
Deploy WatchState (arabcoders/watchstate), the Jellyfin/Plex/Emby watch-state
sync tool, as an internal admin tool. It gets an admin-only web UI/API gated the
same way as logviewer: an oauth2-proxy front backed by Authentik OIDC.
What
watchstatenamespace + media-project app; base atapps/base/watchstate,overlay at
apps/overlays/au-syd1/watchstate.ghcr.io/arabcoders/watchstate:v1.10.3(current release; canonicalupstream name, containerd mirrors route ghcr via artifactapi).
replicas: 1,strategy: Recreate, single5Gicephrbd-fast-deleteRWO PVCat
/config— sqlite + the in-container cron/redis are single-writer.runAsUser/runAsGroup/fsGroup: 1000(image's rootless user); liveness/readinessGET /v1/api/system/healthcheckon 8080 (route confirmed in upstreamsrc/API/System/HealthCheck.php, no auth guard).identity.k8s.syd1.au.unkin.net, redirecthttps://watchstate.k8s.syd1.au.unkin.net/oauth2/callback. Authorization isenforced Authentik-side (akR-global-admin only), so no oauth2-proxy group
allowlist is configured.
traefik-internal) forwatchstate.k8s.syd1.au.unkin.net,vault-issuerTLS leaf, external-dns to198.18.200.4. HTTP -> HTTPS redirect.VaultStaticSecretpulls OIDC creds fromkv/kubernetes/namespace/watchstate/default/oauth-credentials;vault-ca-certauto-reflects into the namespace.
ApplicationSet+AppProject.Scrape decision
No
VMPodScrape: WatchState exposes no Prometheus//metricsendpoint.Follow-ups
client_id,client_secret, andcookie_secretkeys at the kv path. Onlyclient_secretwas confirmed seeded;client_idand a generatedcookie_secretmust also be present or theoauth2-proxy pod will not start.
/v1/api/webhook)currently sits behind oauth2-proxy like everything else. When sync is wired up,
the jellyfins pushing webhooks will need an auth-bypass or an apikey route for
that path.