120 lines
4.4 KiB
Markdown
120 lines
4.4 KiB
Markdown
|
|
# 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-<userid>.json` × 5 | `GET /DisplayPreferences/usersettings?userId=<id>&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="*redacted*"
|
|||
|
|
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="*redacted*"
|
|||
|
|
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.
|