Both media servers read a Kodi-format sidecar (movie.nfo / tvshow.nfo / episode.nfo) only when it sits next to the media file, and the library lives on the RAID6 array, deliberately mounted read-only for every container and slow to seek for a thousand tiny XML reads. So neither server binds the array any more: both bind /mnt/media, an OverlayFS merge of the array (lowerdir, never written) with /var/lib/media-meta on the NVMe (upperdir, where every write lands). Jellyfin binds the view rw at /data and is the fleet's only metadata writer; Plex binds it ro at /mnt/entropy, the container path its own database already recorded, so only the host side of that bind moved and its library paths keep resolving. scripts/media-view.sh plans, installs, verifies, reports and reaps the view. It refuses to mount over an unmounted array, refuses an upper layer on rotational storage, and refuses a non-root install. deploy-remote.sh raises the view before it restarts either media server, both units carry ConditionPathIsMountPoint=/mnt/media so a missing view skips the start instead of letting a scan clear the library database, and the planner routes the installer and dankserver/host/** to the jellyfin+plex pair. tests/media_overlay.bats (11 seams) pins the resolved shape, both refusals, the two binds and their guard, the deployer's ordering, the planner mapping, and the reap behaviour against a fixture (ghosts listed, then moved to the SSD trash -- files that exist only above are sidecars, not ghosts, so only directories are candidates).
29 lines
1.1 KiB
SYSTEMD
29 lines
1.1 KiB
SYSTEMD
# /etc/systemd/system/mnt-media.mount
|
|
#
|
|
# Installed by `scripts/media-view.sh install` — the repo copy is the source of
|
|
# truth (fleet law: never edit host state by hand).
|
|
#
|
|
# An OverlayFS merge that shows the media library as one tree while splitting
|
|
# where its bytes live: lowerdir is the RAID6 array (the source of truth, never
|
|
# written), upperdir is a directory on the NVMe that receives every write. The
|
|
# two media servers bind the result at /mnt/media, so Jellyfin's Kodi-format
|
|
# sidecars and artwork are SSD bytes — which is what makes them fast to browse
|
|
# and what keeps Plex's NFO agent off the spinners — while the media itself stays
|
|
# on the array untouched.
|
|
#
|
|
# RequiresMountsFor is load-bearing: without the array mounted, lowerdir is an
|
|
# empty directory and the view would present an empty library as truth.
|
|
|
|
[Unit]
|
|
Description=SSD-backed overlay view of the media library (array + NVMe metadata layer)
|
|
RequiresMountsFor=/mnt/entropy
|
|
|
|
[Mount]
|
|
What=overlay
|
|
Where=/mnt/media
|
|
Type=overlay
|
|
Options=lowerdir=/mnt/entropy,upperdir=/var/lib/media-meta/upper,workdir=/var/lib/media-meta/work
|
|
|
|
[Install]
|
|
WantedBy=local-fs.target
|