# livetv Self-hosted live-TV stack: an Xtream IPTV source is mirrored through this VPS and served to **Jellyfin** so it can be watched ad-free in Jellyfin's apps. ``` Xtream provider (API only) │ player_api.php (URL + username + password) ▼ Dispatcharr ← ingests via the Xtream API, regenerates a clean │ HDHomeRun tuner + M3U + EPG ▼ Jellyfin ← Live TV: adds Dispatcharr as a tuner + guide │ ▼ Jellyfin apps (HTTPS via Nginx Proxy Manager) ``` Both services run on the shared external Docker network **`proxy`**, where Nginx Proxy Manager (NPM) reaches them by name — no raw host ports are opened. ## Services | Service | Internal address | Public (via NPM) | |--------------|-------------------------|--------------------------------------| | `jellyfin` | `jellyfin:8096` | `https://jellyfin.altricade.com` | | `dispatcharr`| `dispatcharr:9191` | `https://dispatcharr.altricade.com` (admin, behind an Access List) | ## Deploy Pushing to `master` triggers `.forgejo/workflows/deploy.yaml`, which runs `docker compose up -d` on the VPS runner. The compose project name is pinned to `livetv` so the named volumes persist across deploys. ```bash git add -A git commit -m "..." git push origin master ``` ## NPM proxy hosts Create two hosts (both forward over the `proxy` network, scheme `http`, Websockets on, SSL via Let's Encrypt): - `jellyfin.altricade.com` → `jellyfin` : `8096` - `dispatcharr.altricade.com` → `dispatcharr` : `9191` (add an **Access List** — this is the admin UI) ## First-time configuration 1. **Dispatcharr** (`https://dispatcharr.altricade.com`): create admin login → add an **Xtream Codes** account (server URL + username + password) → let it scan channels via the API → add the EPG source. 2. **Jellyfin** (`https://jellyfin.altricade.com`): Dashboard → Live TV → - Tuner Devices → add **HDHomeRun** `http://dispatcharr:9191` (or an M3U Tuner). - TV Guide Data → add **XMLTV** using Dispatcharr's EPG URL. - Refresh guide and map channels. ## Notes - No credentials are stored in this repo. The Xtream login is entered in the Dispatcharr UI and lives in the `dispatcharr_data` volume on the VPS. - Confirm the shared network is named `proxy` (`docker network ls`); adjust `docker-compose.yaml` if NPM is on a different network.