# ARRFLIX Self-hosted Jellyfin media server on nullstone, LAN-only. > **Start here** → [`ADMIN-GUIDE.md`](ADMIN-GUIDE.md) — the single page that > tells you what to do day-to-day. Everything else is a reference doc you only > read when the admin guide tells you to. ## Endpoint - `https://arrflix.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://arrflix.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 — see `docs/04-theming-and-users.md`. ## Operations docs Detailed playbooks (research-grade, with API curls, failure modes, recovery): | File | Topic | |------|-------| | [`docs/01-artwork-and-images.md`](docs/01-artwork-and-images.md) | Posters, backdrops, scrapers (TMDB/TVDB/Fanart), refresh API, language fallback | | [`docs/02-metadata-and-titles.md`](docs/02-metadata-and-titles.md) | Filename parsing, Identify flow, locking the right show, language cascade, multi-episode files | | [`docs/03-subtitles.md`](docs/03-subtitles.md) | OpenSubtitles plugin (.com), sidecar naming, ffmpeg/mkvextract extraction, per-user prefs | | [`docs/04-theming-and-users.md`](docs/04-theming-and-users.md) | ElegantFin theme, branding API, multi-user policies, SyncPlay, friend account playbook | | [`docs/05-file-structure-rules.md`](docs/05-file-structure-rules.md) | Authoritative folder/filename rules for movies, TV, anime, stand-up, concerts, docs, extras, NFO, artwork overrides | | [`docs/06-per-library-themes.md`](docs/06-per-library-themes.md) | Per-library theming research: JS-injector plugin shim + scoped CSS for Movies/Anime/Music looks | ## State as of 2026-05-08 - **Library**: Futurama 1999 series (TMDB 615), S01–S03, 44 episodes, fully scraped (Polish metadata + posters + backdrops + episode stills) - **Theme**: ElegantFin v25.12.31 applied via `/System/Configuration/branding` - **Subtitles**: OpenSubtitles plugin v20 installed; user must add opensubtitles.com creds (free tier = 20 dl/day) - **Users**: 1 admin (`s8n`); friend account creation playbook in doc 04 ## Deploy ```bash cd /opt/docker/jellyfin docker compose up -d ```