From 4437519430ecf89e5fec98d8bf7c837347ed0056 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 30 Oct 2026 22:17:04 -0700 Subject: [PATCH] chore(media): retire the legacy Jellyfin block from dankserver/compose.yaml The container has had one owner since the Quadlet cutover (dankserver/jellyfin/quadlet/jellyfin.container). The block was a second owner, and wrong on every path: jellyfin/jellyfin:latest instead of the pinned ghcr image, /opt/jellyfin/* data roots that no longer exist, and a read-only /mnt/entropy:/data bind that the metadata view has since replaced. The planner no longer counts jellyfin as a compose service, so editing the inventory cannot restart a media server; tests/deployment_scoping.bats pins that contract for both jellyfin and plex. --- dankserver/compose.yaml | 34 ++++++---------------------------- scripts/deploy-plan.py | 3 ++- tests/deployment_scoping.bats | 10 ++++++++++ 3 files changed, 18 insertions(+), 29 deletions(-) diff --git a/dankserver/compose.yaml b/dankserver/compose.yaml index 5dd3dfe..67ee0d8 100644 --- a/dankserver/compose.yaml +++ b/dankserver/compose.yaml @@ -94,34 +94,12 @@ services: timeout: 10s retries: 3 - # ═══════════════════════════════════════════════ - # Jellyfin — media server (movies, TV, music) - # ═══════════════════════════════════════════════ - jellyfin: - image: jellyfin/jellyfin:latest - container_name: jellyfin - restart: unless-stopped - ports: - - "8096:8096/tcp" - - "8920:8920/tcp" - - "7359:7359/udp" - - "1900:1900/udp" - environment: - - JELLYFIN_PublishedServerUrl=http://192.168.0.235:8096 - - DOTNET_SYSTEM_IO_DISABLEFILELOCKING=true - volumes: - - /opt/jellyfin/config:/config - - /opt/jellyfin/cache:/cache - - /mnt/entropy:/data:ro - devices: - - /dev/dri:/dev/dri - group_add: - - "992" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8096/health"] - interval: 30s - timeout: 10s - retries: 3 + # Jellyfin left this file when it became a Quadlet: the container is owned by + # dankserver/jellyfin/quadlet/jellyfin.container, its data roots are under + # /home/dank/Containers/jellyfin, and its library arrives through the SSD + # overlay at /var/lib/media-meta/view (scripts/media-view.sh). The block that + # was here named /opt/jellyfin/* and a read-only array bind — a second owner for + # the container name `jellyfin`, wrong on every path. One owner per container. # ═══════════════════════════════════════════════ # Calibre-Web — e-book web frontend diff --git a/scripts/deploy-plan.py b/scripts/deploy-plan.py index eb293c3..02b7985 100755 --- a/scripts/deploy-plan.py +++ b/scripts/deploy-plan.py @@ -155,13 +155,14 @@ DANKCLAW_COMPOSE_SERVICES = set() # Quadlet unit now — the last compose services were the hermes trio, whose units # have owned their containers since 2026-09-12 and whose compose blocks were # dead weight that could only create a duplicate container. +# jellyfin left the Dankserver file on 2026-10-30 for the same reason: its Quadlet +# has owned the container since the cutover, so a compose edit must not restart it. DANKSERVER_COMPOSE_SERVICES = { "mariadb", "redis", "romm", "copyparty", - "jellyfin", "calibre-web", } COMPOSE_NAME_MAP = {"mariadb": "romm-mariadb", "redis": "romm-redis"} diff --git a/tests/deployment_scoping.bats b/tests/deployment_scoping.bats index 3b957fa..f250030 100644 --- a/tests/deployment_scoping.bats +++ b/tests/deployment_scoping.bats @@ -133,6 +133,16 @@ REMOTE_DEPLOY="$REPO_ROOT/scripts/deploy-remote.sh" [ -z "$output" ] } +@test "a compose edit never restarts a Quadlet-owned media server" { + # dankserver/compose.yaml is an inventory; the media servers' Quadlets own + # their containers. A compose edit that restarted them would cut real viewers + # for a change that cannot affect them. + run python3 "$PLANNER" --target dankserver --paths dankserver/compose.yaml + [ "$status" -eq 0 ] + ! printf '%s\n' "$output" | grep -qx jellyfin + ! printf '%s\n' "$output" | grep -qx plex +} + @test "compose planner narrows a compose edit to the changed service" { local base head base=$(git -C "$REPO_ROOT" rev-parse HEAD)