# jellyfin-stack Self-hosted Jellyfin media server on nullstone, LAN-only. ## Endpoint - `https://tv.s8n.ru` — accessible only from LAN (192.168.0.0/24) and Tailscale admin/infra tags via Traefik `no-guest@file` middleware. - DNS resolved internally by Pi-hole (`/opt/docker/pihole/etc-pihole/custom.list`). - TLS via Let's Encrypt DNS-01 (Gandi). ## Storage | Path | Purpose | |-----------------------------------|-------------------------------| | `/home/docker/jellyfin/config/` | Jellyfin config + DB (writable, UID 1000) | | `/home/docker/jellyfin/cache/` | Transcode + image cache | | `/home/user/media/movies/` | Movies library (mounted RO) | | `/home/user/media/tv/` | TV library (mounted RO) | ## Routing Traefik docker-label provider does NOT pick up the labels on this container (unknown reason — file-provider routing for the same backend works). The deploy uses **file-provider** routing in `/opt/docker/traefik/config/jellyfin-test.yml`. If you fix the docker-provider issue later, flip routing back to labels and remove the file-provider snippet. ## Transcoding GTX 1660 Ti is present on nullstone but `nvidia-smi` currently fails — driver is broken or not loaded. Jellyfin runs CPU-only transcode for now. After fixing the driver, add the standard NVIDIA hwaccel block in compose: ```yaml deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] ``` …and enable NVENC in Jellyfin's Playback → Transcoding settings. ## First-run setup 1. Browse to `https://tv.s8n.ru` from the LAN. 2. Create the admin user (Jellyfin onboarding wizard). 3. Add libraries pointing at `/media/movies` and `/media/tv` inside the container (these map to `/home/user/media/{movies,tv}`). 4. (Optional) Apply Netflix-style theme by pasting a community theme into Dashboard → General → Custom CSS. ## Deploy ```bash cd /opt/docker/jellyfin docker compose up -d ```