Files
homelabstack/stacks/streaming/docker-compose.yml
T
ginnoirandClaude Opus 5 5ba925f6ef fix(streaming): bind trickplay to real data dir, not a phantom path
Jellyfin 10.11's data dir is /config/data/data, so trickplay resolves to
/config/data/data/trickplay. The bind targeted /config/data/trickplay, which
Docker happily created and Jellyfin never used -- 11G of trickplay tiles went
to the 194G root SSD instead of the ZFS array, with root at 84%.

Metadata is unaffected: MetadataPath is set independently and its bind at
/config/data/metadata is live.

Existing 11G rsynced to /storage1/labdata/jellyfin/trickplay; root 84% -> 78%.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 11:00:06 -05:00

100 lines
3.0 KiB
YAML

# streaming stack — Jellyfin and its satellites.
#
# Storage split is deliberate: SQLite config on the root SSD, all bulk data
# (metadata, trickplay, cache, transcodes) on /storage1. The root disk is only
# 194G and has filled twice; nothing here may grow unbounded on it.
#
# Jellyfin 10.11 (linuxserver) keeps metadata at /config/data/metadata — NOT
# /config/metadata. Trickplay is NOT a sibling of metadata: the server's data
# dir is /config/data/data, so trickplay resolves to /config/data/data/trickplay.
# Binding /config/data/trickplay silently does nothing and dumps trickplay tiles
# on the 194G root SSD (found 2026-08-11 at 11G with root at 84%).
# Transcodes are configured to /transcode.
#
# Transcodes are disk-backed, not tmpfs: jellyfin#16608 means Remux and
# DirectStream jobs finish before the segment cleaner's first check, orphaning
# segments. Plex already writes transcodes to virtiofs at a 48% transcode rate.
#
# Env convention: every service gets stack.env via env_file; var names there are
# exactly what the containers read. No ${VAR} interpolation, no Portainer UI
# env vars.
services:
jellyfin:
container_name: jellyfin
image: lscr.io/linuxserver/jellyfin:latest
restart: unless-stopped
networks: [streaming, edge]
env_file:
- stack.env
devices:
- nvidia.com/gpu=0
environment:
- JELLYFIN_PublishedServerUrl=https://jellyfin.ginnoir.com
volumes:
- /etc/localtime:/etc/localtime:ro
- /config/jellyfin:/config
- /storage1/labdata/jellyfin/metadata:/config/data/metadata
- /storage1/labdata/jellyfin/cache:/config/cache
- /storage1/labdata/jellyfin/trickplay:/config/data/data/trickplay
- /storage1/labdata/jellyfin/transcodes:/transcode
- /storage1/Movies:/data/movies:ro
- /storage1/TV:/data/tv:ro
- /storage1/Anime:/data/anime:ro
ports:
- "8096:8096"
jellystat-db:
container_name: jellystat-db
image: postgres:16-alpine
restart: unless-stopped
networks: [streaming]
env_file:
- stack.env
labels:
- "com.centurylabs.watchtower.enable=false"
volumes:
- /config/jellystat-db:/var/lib/postgresql/data
jellystat:
container_name: jellystat
image: cyfershepard/jellystat:latest
restart: unless-stopped
networks: [streaming, edge]
depends_on:
- jellystat-db
env_file:
- stack.env
volumes:
- /config/jellystat:/app/backend/backup-data
ports:
- "3009:3000"
wizarr:
container_name: wizarr
image: ghcr.io/wizarrrr/wizarr:latest
restart: unless-stopped
networks: [streaming, edge]
env_file:
- stack.env
volumes:
- /config/wizarr:/data/database
ports:
- "5690:5690"
jellyplex-watched:
container_name: jellyplex-watched
image: luigi311/jellyplex-watched:latest
restart: unless-stopped
networks: [streaming, edge]
env_file:
- stack.env
networks:
streaming:
name: streaming
driver: bridge
edge:
name: edge
external: true