IPTV-webapp

Je eigen IPTV-dienst met Docker

Draai je eigen versie van deze dienst, met je eigen naam, adres en IPTV-abonnement: een website in de stijl van Videoland en een eigen Android-app voor tv en telefoon. Installeren duurt ongeveer 20 minuten.

Download het installatiepakket Bijwerken en wat er nieuw is .tar.gz · bevat geen wachtwoorden of gegevens

Wat je krijgt

WebsiteLive TV met programmagids, films, series, zoeken, Mijn lijst en Verder kijken.
Android-appVoor tv-box en telefoon, met jouw app-naam. Speelt Dolby/DTS af en toont Nederlandse ondertiteling.
GebruikersEigen accounts per persoon; jij bent beheerder.
UpdatesBouw met één knop een nieuwe app-versie; geïnstalleerde apps werken zichzelf bij.

Wat je nodig hebt

Installeren met Portainer (aanbevolen)

Gebruik je Portainer? Dan installeer je alles als één stack, zonder iets te downloaden of te bouwen. De containers halen de software zelf op.

  1. Maak een nieuwe stack: Portainer → Stacks → Add stack. Geef hem een naam, bijvoorbeeld hoekitv, kies Web editor en plak deze stack:
    Laden…

    Ook te openen als bestand: portainer-stack.yml

  2. Vul de omgevingsvariabelen in. Klik onder de editor bij Environment variables op Advanced mode, plak dit en pas de waarden aan:
    APP_NAME=HoekiTV
    PUBLIC_URL=https://tv.mijndomein.nl
    LAN_URL=
    ADMIN_USER=admin
    ADMIN_PASSWORD=kies-een-sterk-wachtwoord
    HTTP_PORT=8080
    IPTV_SERVER=http://provider.example:8080
    IPTV_USERNAME=
    IPTV_PASSWORD=
    IPTV_M3U_URL=
    IPTV_TYPE=
    IPTV_MAX_STREAMS=
    VariabeleBetekenis
    APP_NAMENaam van jouw dienst en app
    PUBLIC_URLAdres waarop jij en de app de dienst bereiken (https aanbevolen)
    LAN_URL (optioneel)Intern adres, bijv. http://192.168.1.10:8080. De app gebruikt dat thuis automatisch: sneller zappen, niet via de proxy
    ADMIN_USER / ADMIN_PASSWORDJouw beheerdersaccount, alleen gebruikt bij de eerste start
    HTTP_PORTPoort op je server; zet je reverse proxy (Nginx Proxy Manager, Traefik, Pangolin) hierop
    IPTV_*Xtream: server + gebruikersnaam + wachtwoord, of alleen IPTV_M3U_URL. Leeg laten mag: dan stel je het later in de website in
    IPTV_TYPE (optioneel)dispatcharr als je Dispatcharr gebruikt: IPTV_SERVER = adres van Dispatcharr (bijv. http://dispatcharr:9191), gebruikersnaam + XC-wachtwoord van een Dispatcharr-gebruiker. Dispatcharr kan ook in dezelfde stack draaien: zie het blok dispatcharr in de stack
    IPTV_MAX_STREAMS (optioneel)Hoeveel streams tegelijk mogen (kijkers + opnames). Leeg = wat de provider opgeeft, anders 1. Later aan te passen in Instellingen > IPTV-bron > Geavanceerd
  3. Klik op Deploy the stack. Na ongeveer een minuut is de website bereikbaar op http://<server>:8080 of via je eigen domein.
  4. Log in als beheerder en ga naar Instellingen → Android TV-app → Nieuwe app-versie bouwen. De eerste keer installeert de APK-builder zijn bouwomgeving; dat duurt 10–20 minuten. Volg de voortgang in Portainer bij de logs van de container apk-builder.
Bijwerken: herstart beide containers in Portainer. Ze halen dan de nieuwste versie van de software op; je gegevens blijven in het volume data. Daarna bouw je een nieuwe app-versie, zodat ook de apps worden bijgewerkt. Alles over bijwerken en wat er nieuw is: Bijwerken en nieuw.

Bereikbaar maken via een reverse proxy

De stack opent de app alleen op http://<server>:HTTP_PORT. Voor een eigen domein met https zet je je eigen reverse proxy ervoor. Https is nodig voor Chromecast; de Android-app werkt ook via http, maar dan onversleuteld.

Altijd instellen

InstellingWaarom
PUBLIC_URL = je https-adres, bijv. https://tv.mijndomein.nlDe Android-app opent dit adres; na een wijziging een nieuwe app-versie bouwen
Geen inlogscherm van de proxy (geen SSO, pincode of Basic Auth)De app heeft een eigen login. Chromecast en de Android-app kunnen niet langs een extra inlogscherm
Buffering uit, lange timeoutsLivestreams lopen urenlang door

Wil je toch authenticatie op de proxy, maak dan uitzonderingen (bypass) voor /play/*, /p/*, /img/*, /apk/* en /api/*.

Pangolin

  1. Maak in Pangolin een site van het type Newt en noteer endpoint, ID en secret.
  2. Haal in de stack de # weg bij de service newt en zet PANGOLIN_ENDPOINT, NEWT_ID en NEWT_SECRET bij de omgevingsvariabelen. Draait Newt al ergens anders in je netwerk, dan sla je deze stap over.
  3. Maak een resource met je domein. Doel: app poort 8080 (Newt in de stack), of <ip-van-de-server> poort HTTP_PORT (Newt elders).
  4. Zet authenticatie voor deze resource uit en zet PUBLIC_URL op het https-adres.

Nginx Proxy Manager

  1. Add Proxy Host: je domein → scheme http, host <ip-van-de-server>, poort HTTP_PORT.
  2. Tab SSL: Let's Encrypt-certificaat aanvragen, Force SSL aan.
  3. Tab Advanced, plak:
    proxy_buffering off;
    proxy_request_buffering off;
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;

Traefik

Voeg aan de service app de gebruikelijke labels toe (router met je domein en certresolver, service-poort 8080) en hang hem aan je Traefik-netwerk. Traefik buffert standaard niet; er is verder niets bijzonders nodig.

Of: installeren met het installatiescript

Zonder Portainer gebruik je het installatiescript op de Docker-machine:

  1. Download en pak het pakket uit op de Docker-machine:
    curl -fsSL https://videoland.amsterdam2.nl/download/iptv-webapp-docker.tar.gz | tar -xz
    cd iptv-webapp/docker
  2. Start de installatie en beantwoord de vragen (zie de tabel hieronder):
    chmod +x install.sh
    ./install.sh
  3. Wacht tot alles gebouwd is. De eerste keer duurt dit 10–20 minuten, omdat de Android-bouwomgeving wordt gedownload. Daarna bouwt het script meteen de eerste Android-app.
  4. Open je adres in de browser en log in met het beheerdersaccount. Onder Instellingen zie je het abonnement, de gebruikers en de Android-app.

Wat het installatiescript vraagt

VraagVoorbeeldWaarvoor
Naam van de appHoekiTVWebsite, Android-app en tv-banner
Publiek adreshttps://tv.mijndomein.nlDe Android-app opent dit adres
https via Caddy?Ja / neeJa: automatisch certificaat (poort 80 en 443 nodig). Nee: eigen reverse proxy naar de app-poort
Poort8080Poort van de app op de machine
Beheerderadmin + wachtwoord (min. 8 tekens)Jouw eerste account
IPTV-abonnementXtream, M3U-link of laterKan ook later in de website worden ingesteld

De Android-app verspreiden

  1. Ga in de website naar Instellingen → Android TV-app → Downloadcode maken.
  2. Op de tv-box: installeer Downloader uit de Play Store, sta "onbekende apps installeren" toe voor Downloader en typ het getoonde adres in.
  3. De app logt automatisch in met een geheime sleutel van jouw server. Er staat geen wachtwoord in de app.

Nieuwe versie: kies Nieuwe app-versie bouwen in hetzelfde paneel. Alle apps tonen dan "Update vereist" en werken zichzelf bij.

Beheer

Voer deze opdrachten uit in de map iptv-webapp/docker:

OpdrachtWat het doet
docker compose logs -f appLogboek bekijken
docker compose restart appApp herstarten
docker compose up -d --buildBijwerken nadat je een nieuw pakket hebt uitgepakt (zie Bijwerken)
docker compose downStoppen (je gegevens blijven bewaard)

Naam of adres wijzigen: pas .env aan, voer docker compose up -d uit en bouw een nieuwe app-versie.

Maak een back-up van het Docker-volume <naam>_data. Daarin staan alle instellingen, gebruikers en de ondertekeningssleutel van de app. Raak je die sleutel kwijt, dan kunnen geïnstalleerde apps niet meer worden bijgewerkt en moet iedereen de app opnieuw installeren.

Meerdere diensten op één machine

Pak het pakket per dienst uit in een eigen map (bijvoorbeeld tv-familie en tv-vrienden) en voer in elke map ./install.sh uit, met een andere app-naam en poort. Elke dienst krijgt eigen containers, gegevens en een eigen app. Gebruik dan één reverse proxy voor https in plaats van Caddy per dienst.

Problemen oplossen

ProbleemOplossing
Website niet bereikbaardocker compose ps en docker compose logs app; controleer poort en firewall
Bouwen van de app misluktdocker compose logs apk-builder; vaak te weinig geheugen (minimaal 4 GB)
Geen https-certificaatDomein moet naar de machine wijzen en poort 80/443 moet open staan
Geen zenders of filmsControleer het abonnement onder Instellingen → IPTV-bron
Geen geluid in de browserBrowsers spelen geen Dolby/DTS af; gebruik de Android-app