Add Jellyfin media stack (LXC 106, NVIDIA GTX 1060)

- New Ansible role: jellyfin — Docker + nvidia-container-toolkit setup,
  full *arr stack compose file (Jellyfin, qBittorrent, Radarr, Sonarr,
  Prowlarr, FlareSolverr, Jellyseerr), systemd service for auto-start
- New playbook: jellyfin.yml targeting media_servers group
- Inventory: add media LXC (10.10.1.50) to media_servers group
- Traefik: add internal .homelab routes for all 6 media services
- Pi-hole: add DNS records for all 6 media services → Traefik
- network-interfaces: DNAT port 6881 TCP+UDP → 10.10.1.50 for BitTorrent
- homelab-requirements.md: document full Jellyfin stack requirements
  including NVIDIA GTX 1060 passthrough approach and driver notes
- jellyfin-tools: original reference compose file from upstream

Infrastructure created on Proxmox:
- LXC 106 (media, Debian 12, privileged, nesting=1, 10.10.1.50/vmbr1)
- ZFS dataset hdd/media mounted at /media in LXC
- NVIDIA device passthrough entries in /etc/pve/lxc/106.conf

Note: NVIDIA driver 580.159.03 (.run) installed on Proxmox host — not
managed by apt (Debian only has 550.x which doesn't support kernel 7.x
or GTX 1060 Pascal as of this driver version).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Adyrem
2026-05-18 13:28:37 +02:00
parent 30b2d42fcc
commit 3bb01ddaaf
13 changed files with 573 additions and 2 deletions
@@ -0,0 +1,95 @@
name: jellyfin
services:
jellyfin:
image: jellyfin/jellyfin:{{ jellyfin_version }}
container_name: jellyfin
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=compute,video,utility
- TZ={{ jellyfin_timezone }}
volumes:
- /containers/jellyfin/config:/config
- /media:/media
ports:
- "8096:8096"
restart: unless-stopped
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:{{ qbittorrent_version }}
container_name: qbittorrent
environment:
- PUID={{ jellyfin_puid }}
- PGID={{ jellyfin_pgid }}
- TZ={{ jellyfin_timezone }}
- WEBUI_PORT=5080
volumes:
- /containers/qbittorrent/config:/config
- /media:/downloads
ports:
- "5080:5080"
- "6881:6881"
- "6881:6881/udp"
restart: unless-stopped
radarr:
image: lscr.io/linuxserver/radarr:{{ radarr_version }}
container_name: radarr
environment:
- PUID={{ jellyfin_puid }}
- PGID={{ jellyfin_pgid }}
- TZ={{ jellyfin_timezone }}
volumes:
- /containers/radarr/config:/config
- /media:/downloads
ports:
- "7878:7878"
restart: unless-stopped
sonarr:
image: lscr.io/linuxserver/sonarr:{{ sonarr_version }}
container_name: sonarr
environment:
- PUID={{ jellyfin_puid }}
- PGID={{ jellyfin_pgid }}
- TZ={{ jellyfin_timezone }}
volumes:
- /containers/sonarr/config:/config
- /media:/downloads
ports:
- "8989:8989"
restart: unless-stopped
prowlarr:
image: lscr.io/linuxserver/prowlarr:{{ prowlarr_version }}
container_name: prowlarr
environment:
- PUID={{ jellyfin_puid }}
- PGID={{ jellyfin_pgid }}
- TZ={{ jellyfin_timezone }}
volumes:
- /containers/prowlarr/config:/config
ports:
- "9696:9696"
restart: unless-stopped
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:{{ flaresolverr_version }}
container_name: flaresolverr
environment:
- LOG_LEVEL=info
- TZ={{ jellyfin_timezone }}
ports:
- "8191:8191"
restart: unless-stopped
jellyseerr:
image: ghcr.io/fallenbagel/jellyseerr:{{ jellyseerr_version }}
container_name: jellyseerr
environment:
- TZ={{ jellyfin_timezone }}
volumes:
- /containers/jellyseerr/config:/app/config
ports:
- "5055:5055"
restart: unless-stopped