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).
28 lines
948 B
INI
28 lines
948 B
INI
[Unit]
|
|
Description=Plex Media Server (quadlet, rootless fleet identity)
|
|
After=network-online.target
|
|
Wants=network-online.target
|
|
|
|
[Container]
|
|
Image=lscr.io/linuxserver/plex:1.43.5.11079-b3b13e506-ls330@sha256:01a53d9c7adcbb3701fbb0a4230c0a37c85453759b6b05a67356c3c7a09de08d
|
|
ContainerName=plex
|
|
Network=dankserver_appnet:alias=plex
|
|
Environment=PUID=0
|
|
Environment=PGID=0
|
|
Environment=TZ=America/Los_Angeles
|
|
Volume=/var/lib/plexmediaserver:/config
|
|
# The container path stays /mnt/entropy on purpose: every path Plex recorded in
|
|
# its own database is written against it, so swapping the HOST source of this bind
|
|
# to the overlay view re-points Plex at the sidecars without touching its DB.
|
|
# Read-only: Plex consumes the NFO files Jellyfin writes and writes no metadata.
|
|
Volume=/mnt/media:/mnt/entropy:ro
|
|
UnitConfigItem=ConditionPathIsMountPoint=/mnt/media
|
|
PublishPort=32400:32400
|
|
|
|
[Service]
|
|
Restart=always
|
|
RestartSec=5
|
|
|
|
[Install]
|
|
WantedBy=default.target
|