×

📺 IPTV

B2C · Xtream · Reseller

IPTV Gebruikers beheren

Archiefopslaglagen

Drielagig archiefsysteem voor 500+ gelijktijdige klanten. Configureren in Config > Opslag > Opslaglagen. Elke laag heeft een onafhankelijk levenscyclus, capaciteitsberekening en fallback-gedrag.

Encoder

Schrijfbuffer

2u hot window (NVMe of tmpfs)

→ mirror (continu)

HDD RAID 5

50 TB, 14 dagen retentie

→ prefetch op aanvraag

Afspeelcache

1 TB warme cache, 500+ klanten

Klanten

Spiegelen, niet verplaatsen

Segmenten ouder dan mirror_min_age_minutes worden continu GEKOPIEERD naar RAID. De write_buffer houdt een roterend 2-uurs 'hot' venster vast, zodat terugspoelen naar recente afspeelgeschiedenis op snelle opslag blijft. Segmenten worden pas verwijderd uit de write_buffer nadat evict_age_minutes is verstreken (en alleen wanneer geverifieerd gespiegeld). RAID heeft altijd de lange-termijn kopie — geen uurlijkse burst-overdrachten.

Tier

Doel

Instellingen

Schrijfpuffer

Ontvangt segmenten 24/7, houdt 2-uurs hot venster vast voor snel recent-terugspoelen, beschermt RAID tegen willekeurige IO. Apparaat kan een fysieke NVMe-partitie (productie) of tmpfs (dev/test-box zonder fysieke NVMe — zie tmpfs sectie hieronder) zijn.

device_path (blokapparaat of 'tmpfs'), tmpfs_size_pct (10-50% MemAvailable bij tmpfs), mirror_min_age_minutes, evict_age_minutes, flush_threshold_percent (forceer flush-trigger)

HDD RAID Archief

Lang-termijnopslag voor volledige retentie (standaard 14 dagen). Ontvangt continue spiegel-trickle van write_buffer — sequentiële schrijfbewerking, geen uurlijkse bursts. Overleeft herstart. RAID overleeft een enkel schijffout.

retention_days, raid_device, nginx_location, min_free_percent

Afspeelcache (optioneel)

Leescache voor populaire bestanden ouder dan 2 uur (bijv. EPG catch-up). Wordt op aanvraag gevuld vanuit de archive na overschrijding van de populardrempel (3 hits / 5 min). Apparaat kan NVMe of tmpfs zijn.

prefetch_hours, max_sessions, eviction_policy (session/lru/fifo)

Capaciteitsberekening

live schrijft × 2u = grootte van de hot window van de write_buffer. Voorbeeld: 50 streams × 8 Mbps × 2u ≈ 36 GB. Voeg ~30% marge toe voor mirror-trickle-backlog → ~50 GB write_buffer is genoeg voor 50 streams. RAID berekend voor volledige retentie: 50 × 8 Mbps × 14 dagen ≈ 6 TB.

Leesbewerkingen (tier-bewuste opzoeking)

Stream.dvr_file_path/2 scant write_buffer → playback_cache → archive in die volgorde. Een segment in het 2-uurs hot venster wordt bediend vanuit write_buffer met native snelheden, hoewel het ook op RAID bestaat. Nginx X-Accel-Redirect bedient bestanden direct zonder door Phoenix te gaan.

tmpfs Virtuele Schijf (dev/test)

Elke tier kan een door RAM ondersteund tmpfs-virtueel schijfapparaat gebruiken in plaats van een fysiek blokapparaat. Handig voor dev-boxen zonder beschikbare NVMe, of voor tijdelijke testomgevingen. Het apparaat-dropdownmenu van de Storage Tier-kaart bevat een optie 'tmpfs (virtueel schijfapparaat van RAM)' die de apparaatpad-selector vervangt door een percentage-schuifregelaar.

Grootte in % vrije RAM

Toewijzing wordt opgegeven als een percentage van MemAvailable (uit /proc/meminfo) — stap 10, geldige waarden 10/20/30/40/50. Harde ondergrens 10% (validatie weigert waarden hieronder). Harde bovengrens 50%. Standaard 30%. Op een host met 100 GB MemAvailable: 10% = 10 GB, 30% = 30 GB, 50% = 50 GB. De grootte wordt opnieuw berekend en live opnieuw gekoppeld wanneer de schuifregelaar wordt verplaatst en opgeslagen.

OOM-veiligheidsbeveiliging

Als de berekende doelwaarde meer dan 60% van de huidige MemAvailable zou overschrijden, wordt het aankoppelen geweigerd en blijft de tier offline (Stream.archive_path valt terug op de volgende gezonde tier). Voorkomt dat een agressieve instelling het BEAM laat crashen door OOM. De guard wordt uitgevoerd zowel bij opstarten als bij elke opslag in de interface.

Opnieuw opstarten persistentie

tmpfs leeft in RAM — alle inhoud in de buffer die nog niet is weggeschreven, gaat verloren bij een herstart van de host. De fstab-regel die bij provisionen wordt geschreven, koppelt de lege tmpfs automatisch opnieuw aan bij de volgende opstart, maar oude segmenten keren niet terug. Spiegelen naar de archive gaat normaal door voor alles wat al gespiegeld was vóór de herstart — alleen het laatste niet-gespiegelde venster (doorgaans < mirror_min_age_minutes) gaat verloren. Gebruik voor productie een fysiek NVMe-apparaat; tmpfs is bedoeld als dev/test-substituut.

Wanneer tmpfs gebruiken

Gebruik tmpfs voor write_buffer wanneer: (a) de dev/test-box geen reserve NVMe heeft, maar u toch de volledige DVR-pipeline wilt uitvoeren voor integratietesten, (b) de operator het gedrag van mirror + archief wil valideren zonder vooraf NVMe aan te schaffen, (c) tijdelijke tests waarbij verlies bij opnieuw opstarten acceptabel is. Gebruik tmpfs NIET in productie — RAM is vluchtig en is per GB aanhouding ordes van grootte duurder dan NVMe.

Snellere flush voor tmpfs

Wanneer de write-tier tmpfs is, gebruikt StorageTierFlush strakkere standaardwaarden — mirror_min_age 2 min, evict_age 15 min (vs. 5 min / 120 min voor fysieke NVMe). RAM is duurder dan schijf, dus het roterende hot venster wordt kleiner gehouden. Overschrijven via MIRROR_MIN_AGE_MINUTES / EVICT_AGE_MINUTES omgevingsvariabelen indien nodig.

Tier Auto-Provisioning & Veiligheid

Tiers worden eenmalig geconfigureerd via Config > Storage > Storage Tiers en automatisch provisioned — geen handmatig mkfs/mount/fstab bewerken op de host. StorageTier.ensure_all_provisioned/0 wordt bij elke opstart uitgevoerd vanuit SystemInitializer en is idempotent: al gemonteerde tiers worden overgeslagen, ontbrekende apparaten zijn no-ops, tmpfs-tiers worden na herstart netjes opnieuw gemonteerd.

Standaard opstartwaarde

Bij de eerste opstart (geen write-tier in de database) maakt het systeem automatisch een write-tier aan, ondersteund door tmpfs, met een toewijzing van 30% van MemAvailable, met het aankoppelpunt /mnt/nvme_write. Dit biedt een direct werkende DVR-pijplijn op elke host met voldoende RAM. De operator kan het apparaat later via de interface wijzigen naar een fysieke NVMe zonder andere tier-instellingen te verliezen.

Gezondheid & failover

Stream.archive_path/1 retourneert de eerste 'gezonde' tier — write_buffer indien gemonteerd, schrijfbaar en free_pct boven de veiligheidsdrempel, anders valt het terug op de archive (gedegradeerde modus). Veiligheidsdrempel is 20% voor tmpfs (RAM-strikte), 2% voor blokapparaten. Het endpoint tier_health blokkeert per tier mounted/writable/free_pct voor monitoring.

Live grootte wijzigen

Het wijzigen van tmpfs_size_pct in de interface triggerd umount + remount met de nieuwe grootte bij het opslaan. Actieve DVR-schrijfbewerkingen worden kort onderbroken (mount-overgang < 1 s). Aanbeveling: wijzig de tmpfs-grootte alleen wanneer het DVR-schrijftempo laag is, en overweeg streams na de wijziging te herstarten om te zorgen dat ze het nieuwe aankoppelpunt netjes oppikken.

Basis-URL — OSTV-speler

Pakketvelden

Pakketten-API

Wachtwoordbeleid

Reseller-API

Instellingen

Gebruikersvelden

Gebruikersbeheer

IPTV Gebruikersbeheer

Basis-URL — OSTV Player

De OSTV Player-applicatie stelt gebruikers in staat de server-basis-URL (API-adres) te wijzigen. Deze functie is alleen beschikbaar voor gebruikers met provider ingesteld op root.

Reden: het wijzigen van de basis-URL is alleen bedoeld voor beheerders/root-gebruikers zodat ze kunnen wisselen tussen servers (bijv. productie vs. test). Gewone gebruikers hebben een vaste basis-URL.

Gebruikersvelden

Pakketten API

Geeft een lijst van alle actieve pakketten met prijzen en factuurperioden.

Lijst van beheerdersgebruikers (resellers / providers).

Geeft creditsaldo terug voor een specifieke beheerdersgebruiker.

Pakketvelden

API Rivenditore

API voor resellers/providers. Autorisatie: Authorization: Bearer mtk_... (token van Gebruikersbeheer). Reseller ziet alleen eigen klanten (owner_id).

Wachtwoordbeleid

Wachtwoord is vereist bij het aanmaken van een abonnee. Regels:

Minimaal 8 tekens

Minimaal 1 hoofdletter (A-Z)

Minimaal 1 speciaal teken (!@#$%^&* enz.)

Van toepassing op UI en API. Bij update is wachtwoord optioneel, maar indien opgegeven moet het voldoen aan de regels.

Instellingen

Tier auto-inrichting en beveiliging

Capaciteits- en bestandssysteem auto-detectie: wanneer een vrije NVMe wordt geselecteerd uit de vervolgkeuzelijst, wordt capaciteit (GB) gelezen uit lsblk -bn -o SIZE en huidig FS uit blkid.

Tier Flush-mechanisme — Continue spiegel

StorageTierFlush GenServer draait elke 60s. In plaats van te wachten op een uur-directory die 'veroudert' en deze als 5GB-burst te verplaatsen, trickelt het segmenten continu naar RAID terwijl een 2h hot-venster op NVMe wordt bewaard voor snel 'recent terugspelen'.

Waarom continue spiegel beter is dan 'wacht 60min, batch-verplaats': (1) RAID-belasting is gelijkmatig; (2) Meeste hete data staat al op RAID; (3) Verwijdering is geverifieerd per bestand.

Veiligheid lopende segmenten: de spiegel pikt alleen bestanden op ouder dan MIRROR_MIN_AGE_MINUTES via find -mmin +5.

Per-deployment afstemming (.env)

500–1000

Maatregelregel:

DVR Preview Kalender

Het DVR Preview-tabblad toont een server-gerenderde kalender die alleen dagen markeert waarvoor opnames op schijf bestaan.

Dagen met opnames zijn klikbaar (blauw) — klikken vult het datum-tijdinvoerveld vooraf in met die dag om 00:00.

Geïmplementeerd in Stream.available_dvr_days/1 via find -mindepth 4 -maxdepth 4 -type d op elke tier-mount.

B2C-speler-API

Overzicht

De B2C (Business-to-Consumer) API biedt authenticatie en streamtoegang voor eindgebruikers-spelapplicaties. Gebruikers authenticeren met gebruikersnaam/wachtwoord en ontvangen een tijdsbeperkt auth-token voor latere verzoeken.

Authenticatie

Een gebruiker authenticeren en een auth_token verkrijgen voor latere API-aanroepen.

Methode

Eindpunt

Verzoeklichaam

Parametro

Tipo

Vereist

Beschrijving

Ja

Gebruikersloginnaam

Wachtwoord van gebruiker

Voorbeeld verzoek

Responsvelden

Succesrespons (200)

Versleuteld authenticatietoken voor latere API-aanroepen

Vervaldatum/tijd van token in ISO 8601-formaat

Voorbeeld succesrespons

Foutrespons (403)

Foutbeschrijving

HTTP-statuscode

Voorbeeld foutrespons

Gebruikersinfo

Haal informatie op over de geauthenticeerde gebruiker met behulp van het authenticatietoken.

Antwoordvelden

Gebruikersnaam van de geauthenticeerde gebruiker

Serverbericht (leeg indien geen bericht)

Authenticatiestatus (1 = geauthenticeerd)

Accountstatus: Actief, Geblokkeerd, Uitgeschakeld, Proefversie

Vervaldatum van de account (null indien onbeperkt)

Aantal huidige actieve verbindingen

Aanmaakdatum van de account in ISO 8601-formaat

Maximaal toegestane gelijktijdige verbindingen

Lijst van toegestane uitvoerstreamformaten

Naam van de provider van de eigenaar/verkooppartner van de gebruiker (null indien geen)

URL van de logo-afbeelding van de provider (null indien geen)

URL van de logo-afbeelding voor provider-inzinking 208x208 (null indien geen)

Huidige servertijd in ISO 8601-formaat

Voorbeeldaanvraag

Categorieën

Categorieën ophalen, gefilterd op type. Beschikbare typen: live (streams), vod (films), series.

Categorietype: live, vod of serie

Categorie-ID als tekenreeks

Weergavenaam van de categorie

ID van de bovenliggende categorie (0 als root)

MD5-hash van inhoud voor cache-invalidering

Voorbeeldaanvraag

VOD-detail

Haal gedetailleerde informatie op voor een specifiek VOD-item, inclusief metadata en streamlinks.

VOD-stream-ID (UUID)

Velden van het info-object

URL van coverafbeelding

TMDB-identificatie

URL van achtergrondafbeelding

Genresstring

Plot / beschrijving

Castleden

Waardering (0-10)

Naam van de regisseur

Releasedatum

Duur in seconden

Duur als opgemaakte string

Lijst met categorie-IDs

1 bij volwassen inhoud, 0 anders

Velden van het VOD-object

VOD-stream-ID

VOD-titel

Datum toegevoegd (ISO 8601)

URL's van streamlinks

Metadata van video-/audiocodec

Seriemeldetails

Haal serie-informatie op met volledige seizoen- en afleveringslijsten, gegroepeerd op seizoensnummer.

Serie-ID (UUID)

Eigenschappen van de Seizoenen-array

Seizoensnummer

Weergavenaam van het seizoen

Aantal afleveringen in het seizoen

Uitzenddatum van het seizoen

Overzicht / beschrijving van het seizoen

URL van de afbeelding voor de seizoenscover

Afleveringen Object

Map, gekeyed op het seizoennummer als string. Elke waarde is een array van afleveringsobjecten.

Eigenschappen van afleveringsobject

Afleverings-ID

TMDB-afleverings-ID

Afleveringsnummer binnen het seizoen

Titel aflevering

Datum toegevoegd (ISO 8601)

Seizoensnummer

Afleveringsinfo-object (zelfde structuur als VOD-info)

URL's van streamlinks

Video-/audiocodec-metadata

Opmerkingen

Tokenverval is afhankelijk van de gebruikersrol: admin = 365 dagen, overige = 30 dagen|Gedeactiveerde accounts kunnen zich niet authenticeren (retourneert 403)|Elke succesvolle aanmelding update het last_login-tijdstempel van de gebruiker|Tokens zijn versleuteld en bevatten user_id, gebruikersnaam, rol en vervaldatum

Succesrespons (200)

Authenticatietoken verkregen van het /auth-eindpunt