# IPTV-webapp (bijv. HoekiTV) - stack voor Portainer # Portainer: Stacks > Add stack > Web editor: plak dit bestand. # Vul onder "Environment variables" minimaal APP_NAME, PUBLIC_URL, ADMIN_USER en ADMIN_PASSWORD in, en klik Deploy. # De containers halen de software zelf op van SOURCE_URL (een kopie blijft bewaard voor als die even niet bereikbaar is). # Eerste start: de website is binnen een minuut klaar; de APK-builder installeert eenmalig zijn bouwomgeving (10-20 min). services: app: image: node:22-alpine restart: unless-stopped environment: APP_NAME: ${APP_NAME:-HoekiTV} PUBLIC_URL: ${PUBLIC_URL:-} LAN_URL: ${LAN_URL:-} # optioneel: http://: (thuis direct, sneller) ADMIN_USER: ${ADMIN_USER:-admin} ADMIN_PASSWORD: ${ADMIN_PASSWORD:-} IPTV_SERVER: ${IPTV_SERVER:-} IPTV_USERNAME: ${IPTV_USERNAME:-} IPTV_PASSWORD: ${IPTV_PASSWORD:-} IPTV_M3U_URL: ${IPTV_M3U_URL:-} IPTV_TYPE: ${IPTV_TYPE:-} # "dispatcharr" als IPTV_SERVER een Dispatcharr is IPTV_MAX_STREAMS: ${IPTV_MAX_STREAMS:-} # streams tegelijk (kijkers + opnames); leeg = wat de provider opgeeft SOURCE_URL: ${SOURCE_URL:-https://videoland.amsterdam2.nl/download/iptv-webapp-docker.tar.gz} APK_BUILDER_URL: http://apk-builder:8090 DATA_DIR: /data HOST: 0.0.0.0 PORT: "8080" command: - sh - -c - | for i in 1 2 3 4 5; do command -v ffmpeg >/dev/null && break; apk add --no-cache ffmpeg && break; sleep 5; done command -v ffmpeg >/dev/null || echo "FFmpeg nog niet geïnstalleerd: de server probeert het zelf elke minuut opnieuw" mkdir -p /opt/src if wget -qO /tmp/pkg.tgz "$$SOURCE_URL"; then rm -rf /opt/src/new && mkdir -p /opt/src/new && tar -xzf /tmp/pkg.tgz -C /opt/src/new \ && rm -rf /opt/src/cur && mv /opt/src/new /opt/src/cur && echo "Software bijgewerkt van $$SOURCE_URL" else echo "Download mislukt; vorige versie wordt gebruikt" fi cd /opt/src/cur/iptv-webapp && exec node server.js volumes: - data:/data - code-app:/opt/src ports: - "${HTTP_PORT:-8080}:8080" healthcheck: test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:8080/api/status > /dev/null || exit 1"] interval: 30s timeout: 5s start_period: 60s apk-builder: image: node:22-bookworm restart: unless-stopped environment: SOURCE_URL: ${SOURCE_URL:-https://videoland.amsterdam2.nl/download/iptv-webapp-docker.tar.gz} DATA_DIR: /data command: - bash - -c - | mkdir -p /opt/src if curl -fsSL -o /tmp/pkg.tgz "$$SOURCE_URL"; then rm -rf /opt/src/new && mkdir -p /opt/src/new && tar -xzf /tmp/pkg.tgz -C /opt/src/new \ && rm -rf /opt/src/cur && mv /opt/src/new /opt/src/cur else echo "Download mislukt; vorige versie wordt gebruikt" fi exec bash /opt/src/cur/iptv-webapp/docker/builder/portainer-entry.sh volumes: - data:/data - code-builder:/opt/src - toolchain:/opt/toolchain # Optioneel: Dispatcharr (beheert provider(s), verbindingen en EPG). Haal de # weg, open daarna http://:9191, # voeg je provider toe, maak zenders en een gebruiker met XC-wachtwoord. Zet dan bij de app: # IPTV_TYPE=dispatcharr IPTV_SERVER=http://dispatcharr:9191 IPTV_USERNAME/IPTV_PASSWORD = die gebruiker # (of stel het later in via Instellingen > IPTV-bron > Dispatcharr). # dispatcharr: # image: ghcr.io/dispatcharr/dispatcharr:latest # restart: unless-stopped # environment: # DISPATCHARR_ENV: aio # REDIS_HOST: localhost # CELERY_BROKER_URL: redis://localhost:6379/0 # ports: # - "9191:9191" # volumes: # - dispatcharr_data:/data # Optioneel: Pangolin-tunnel (Newt). Haal de # weg en vul de drie waarden in uit Pangolin (Sites > Add site > Newt). # Maak in Pangolin een resource met als doel: app, poort 8080 (zonder Pangolin-authenticatie). # newt: # image: fosrl/newt # restart: unless-stopped # environment: # PANGOLIN_ENDPOINT: ${PANGOLIN_ENDPOINT} # NEWT_ID: ${NEWT_ID} # NEWT_SECRET: ${NEWT_SECRET} volumes: data: # instellingen, gebruikers, APK en de ondertekeningssleutel van de app: back-uppen! code-app: code-builder: toolchain: # Android SDK + Gradle (eenmalig gedownload) # dispatcharr_data: # haal de # weg als je Dispatcharr hierboven gebruikt