docs(media): one page for the metadata view, and the three pages it re-points

New owner page Dankserver/Media Metadata View.md: the shape, the two binds and
why Plex keeps the /mnt/entropy container path, the commands, the laws (SSD-only
upper layer, never mount over an unmounted array, never delete through the view
because a whiteout only hides the array's copy, reap after any relayout, inotify
does not cross the merge), the failure signatures, and the rollback.

Jellyfin.md: /data is the view, so Local metadata works; the
"Read-only file system : '/data/…/movie.nfo'" line that used to be expected noise
is now the signature of a missing view. Plex.md: same bind, one fact changed.
Media Relayout.md: two new laws for the metadata that does not follow a rename.
AGENTS.md: runbook-index row plus a summary row. Root index regenerated.
This commit is contained in:
Frank committed 2026-10-30 21:41:56 -07:00
1 parent f5a3badb56
commit 206dc3baf1
6 files changed
+145 -20

No files matched your search

+17 -14
View File
@@ -1,9 +1,9 @@
---
type: reference
title: Jellyfin
description: "Jellyfin on Dankserver: quadlet unit, entropy-volume data layout, ports, client access, hardware-transcode status."
description: "Jellyfin on Dankserver: quadlet unit, overlay metadata view layout, ports, access, hardware-transcode status."
tags: [jellyfin, dankserver, media-server]
timestamp: 2026-09-03T00:00:00Z
timestamp: 2026-10-30T00:00:00Z
---
# Jellyfin
@@ -26,7 +26,7 @@ public vhost `jelly.franksdank.cloud` behind the [[Anubis]] guard chain →
| Image | `ghcr.io/jellyfin/jellyfin:latest` |
| Network | `dankserver_appnet`; publishes 8096/tcp, 8920/tcp, 7359/udp, 1900/udp |
| Data roots | `/home/dank/Containers/jellyfin/config:/config`, `/home/dank/Containers/jellyfin/cache:/cache` |
| Media | `Volume=/mnt/entropy:/data:ro` — the whole [[Entropy Volume]] mounted read-only; nothing automated writes to it |
| Media | `Volume=/mnt/media:/data` — the [[Media Metadata View]] overlay, **writable**; sidecars land on the NVMe, the [[Entropy Volume]] array underneath stays read-only and untouched |
| GPU | none — no `AddDevice`; CPU decode only (jellyfin-ffmpeg path) |
| Env quirks | `DOTNET_SYSTEM_IO_DISABLEFILELOCKING=true`, `LD_PRELOAD=libjemalloc.so.2`, `MALLOC_TRIM_THRESHOLD_=131072` kept verbatim from the compose-era container (zero-drift cutover) |
| Health | `curl -f http://localhost:8096/health` every 30 s |
@@ -36,20 +36,23 @@ public vhost `jelly.franksdank.cloud` behind the [[Anubis]] guard chain →
```
/home/dank/Containers/jellyfin/config -> /config (JELLYFIN_DATA_DIR)
/home/dank/Containers/jellyfin/cache -> /cache (JELLYFIN_CACHE_DIR, XDG_CACHE_HOME)
/mnt/entropy -> /data (read-only media volume)
/mnt/media -> /data (the SSD-backed overlay view)
```
Library folders point at `/data` paths; because the mount uses the same
absolute path as on the host, library paths survive container recreation.
Library folders point at `/data` paths, which are the view's paths: stable
across container recreation, and identical to the raw array layout below it.
`Local metadata` — save metadata to media folders — cannot work against a `ro`
mount, and it is enabled: every item update logs
`System.IO.IOException: Read-only file system : '/data/Movies/<film>/movie.nfo'`.
The exception lands in the sidecar saver, after the database row is written, so
indexing proceeds anyway — a 2026-10-30 scan dropped stale records and added
episodes while these lines filled the log. Expected noise, not a fault: if it
ever needs silencing, turn the saver off under *Library → Metadata* rather than
making `/data` writable.
`Local metadata` — save metadata to media folders — is enabled, and it works
because `/data` is the [[Media Metadata View]] rather than the read-only array:
`movie.nfo`, `tvshow.nfo`, `episode.nfo` and artwork are written once, on the
NVMe upper layer, and [[Plex]] reads the same files. Jellyfin is the fleet's
only metadata writer.
**Failure signature:** `System.IO.IOException: Read-only file system :
'/data/Movies/<film>/movie.nfo'` means the container is binding the raw array
instead of the view — the view is unmounted or the quadlet drifted. That used to
be the expected state (pre-view, every item update logged it); today it is a
fault. Run `scripts/media-view.sh status`.
## Ports & access