# Rollback — 2026-05-08 pre-ElegantFin Snapshot captured immediately before the Cineplex → ElegantFin theme migration. Restore one or all of the artefacts below to revert to the Cineplex-themed ARRFLIX deploy as of 2026-05-08 03:58 UTC. Tag: `snapshot-2026-05-08-pre-elegantfin` Remote: `git.s8n.ru/s8n/ARRFLIX` --- ## Files in this snapshot | File | Source | Purpose | |------|--------|---------| | `branding.json` | `GET /System/Configuration/branding` | CustomCss + LoginDisclaimer + SplashscreenEnabled | | `index.html` | `nullstone:/opt/docker/jellyfin/web-overrides/index.html` | Bind-mounted Jellyfin web shim (critical-path CSS, branding, runtime shim include) | | `docker-compose.yml` | `nullstone:/opt/docker/jellyfin/docker-compose.yml` | Compose file driving the jellyfin container | | `users.json` | `GET /Users` | Full user list with policies + configurations | | `libraries.json` | `GET /Library/VirtualFolders` | Library definitions (paths, types, options) | | `displayprefs-.json` × 5 | `GET /DisplayPreferences/usersettings?userId=&client=emby` | Per-user UI preferences (home sections, theme, etc.) | User IDs captured: - `571decc67cdc4ea683b4c936b0a31ff8` — 5 - `82dd8542915740c8ae799b6723542c63` — guest - `a4cbcdf95bb34888885af6fbf5c340d1` — house - `d787fbfc373a44119a247e7406b2721e` — marco - `2be0f0d3fe3a45dc9298138a15a01925` — s8n --- ## Rollback — three concrete commands ```bash SNAP=/tmp/ARRFLIX/snapshots/2026-05-08-pre-elegantfin TOKEN="" BASE="https://arrflix.s8n.ru" ``` ### 1. Restore CustomCss + LoginDisclaimer (branding) ```bash curl -ksX POST "$BASE/System/Configuration/branding" \ -H "Authorization: MediaBrowser Token=$TOKEN" \ -H "Content-Type: application/json" \ --data-binary @$SNAP/branding.json # Expected: HTTP 204 ``` ### 2. Restore the bind-mounted index.html on nullstone ```bash scp $SNAP/index.html user@nullstone:/opt/docker/jellyfin/web-overrides/index.html # No restart needed — Traefik serves the file directly via the bind-mount. ``` ### 3. Restore per-user DisplayPreferences ```bash for uid in 571decc67cdc4ea683b4c936b0a31ff8 \ 82dd8542915740c8ae799b6723542c63 \ a4cbcdf95bb34888885af6fbf5c340d1 \ d787fbfc373a44119a247e7406b2721e \ 2be0f0d3fe3a45dc9298138a15a01925; do curl -ksX POST "$BASE/DisplayPreferences/usersettings?userId=$uid&client=emby" \ -H "Authorization: MediaBrowser Token=$TOKEN" \ -H "Content-Type: application/json" \ --data-binary @$SNAP/displayprefs-$uid.json done # Expected: HTTP 204 each ``` --- ## One-shot rollback (all three at once) ```bash SNAP=/tmp/ARRFLIX/snapshots/2026-05-08-pre-elegantfin TOKEN="" BASE="https://arrflix.s8n.ru" # 1. branding curl -ksX POST "$BASE/System/Configuration/branding" \ -H "Authorization: MediaBrowser Token=$TOKEN" \ -H "Content-Type: application/json" \ --data-binary @$SNAP/branding.json # 2. index.html scp $SNAP/index.html user@nullstone:/opt/docker/jellyfin/web-overrides/index.html # 3. per-user displayprefs for uid in 571decc67cdc4ea683b4c936b0a31ff8 82dd8542915740c8ae799b6723542c63 \ a4cbcdf95bb34888885af6fbf5c340d1 d787fbfc373a44119a247e7406b2721e \ 2be0f0d3fe3a45dc9298138a15a01925; do curl -ksX POST "$BASE/DisplayPreferences/usersettings?userId=$uid&client=emby" \ -H "Authorization: MediaBrowser Token=$TOKEN" \ -H "Content-Type: application/json" \ --data-binary @$SNAP/displayprefs-$uid.json done ``` --- ## Reference (read-only — for diffing, not posting back) - `users.json` — sanity-check that policies/permissions match before/after a future user-mgmt change. The User API uses `/Users/{id}/Policy` and `/Users/{id}/Configuration` endpoints, NOT a bulk POST. - `libraries.json` — sanity-check that VirtualFolders are still intact. Library mutations go through `/Library/VirtualFolders` add/remove endpoints, not a single POST. - `docker-compose.yml` — reference only. If the compose file changes, restore by hand and `docker compose up -d` on nullstone. --- ## What this snapshot does NOT cover - Jellyfin SQLite databases (`library.db`, `users.db`, etc.) — full data is preserved by Restic backups, not this snapshot. - Plugins / plugin config — not part of the CSS/branding migration scope. - Media files on disk — never touched by theme work. If a recovery requires DB-level restore, fall back to the Restic snapshot job documented in `SYSTEM.md` rather than this CSS-scoped rollback.