×

📺 IPTV

B2C · Xtream · Reseller

IPTV-käyttäjien hallinta

Arkiston tallennus kerroksissa

Kolmitasoinen arkistointijärjestelmä yli 500 samanaikaiselle asiakkaalle. Konfiguroi kohdassa Asetukset > Tallennus > Tallennustasot. Jokaisella tasolla on itsenäinen elinkaari, kapasiteettilaskenta ja varajärjestelmä.

Enkooderi

Kirjoituspuskuri

2h kuuma ikkuna (NVMe tai tmpfs)

→ peilataan (jatkuva)

HDD RAID 5

50 TB, 14 päivän säilytys

→ esihaku pyydettäessä

Toistopuskuri

1 TB lämmin välimuisti, 500+ asiakasta

Asiakkaat

Peili, ei siirto

Segmentit, jotka ovat vanhempia kuin mirror_min_age_minutes, KOPIOITAAN RAID-levyille jatkuvasti. Kirjoituspuskuri sisältää 2h kuumaksi ikkunaksi, joten loppuun kela äskettäisille pysyy nopealla tallenuksella. Vain evict_age_minutes jälkeen (ja vain kun todennettu peilattu) poistetaan segmentit kirjoituspuskurista. RAID:lla on aina pitkähäntäisen kopio - ei tuntitason purskausta.

Taso

Tarkoitus

Asetukset

Kirjoitus puskuri

Vastaanottaa segmentit 24/7, pitää 2h kuuman ikkunan nopeaa viimeaikaista kelauksestapalautusta varten, suojaa RAIDia satunnaiselta IO:lta. Laite voi olla fyysinen NVMe-osio (tuotanto) tai tmpfs (kehitys-/testilaatikko ilman fyysistä NVMe:tä — ks. tmpfs-osio alla).

device_path (lohkolaite tai 'tmpfs'), tmpfs_size_pct (10-50% MemAvailable kun tmpfs), mirror_min_age_minutes, evict_age_minutes, flush_threshold_percent (pakota flush-laukaisin)

HDD RAID -arkisto

Pitkäaikainen tallennus täydelle säilytykselle (oletus 14 päivää). Vastaanottaa jatkuvan peilin tipautusvirran kirjoituspuskurista - peräkkäinen kirjoitus, ei tuntitason purskausta. Selviää uudelleenkäynnistyksestä. RAID selviää yksittäisen levyn vioituksesta.

retention_days, raid_device, nginx_location, min_free_percent

Toiston välimuisti (valinnainen)

Lukupuolen välimuisti suosituille tiedostoille, jotka ovat yli 2h vanhoja (esim. EPG catch-up). Täytetään arkistosta pyydettäessä suosiopraja-arvon jälkeen (3 osumaa / 5 min). Laite voi olla NVMe tai tmpfs.

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

Kapasiteettilaskenta

live-kirjoitukset × 2h = write_buffer-kuuman ikkunan koko. Esimerkki: 50 streamia × 8 Mbps × 2h ≈ 36 GB. Lisää ~30% puskuritilaa peilaustakailogille → ~50 GB write_buffer riittää 50 streamille. RAID mitoitettu täydelle säilytykselle: 50 × 8 Mbps × 14 pv ≈ 6 TB.

Lukeminen (tasotietoinen haku)

Stream.dvr_file_path/2 tutkii write_buffer → playback_cache → arkisto järjestyksessä. Segmentti 2h kuumassa ikkunassa palvellaan write_puskurista alkuperäisillä nopeuksilla, vaikka se onkin myös RAID:lla. Nginx X-Accel-Redirect palvelee tiedostot suoraan ilman Phoenix-läpikulkua.

tmpfs-virtuaalilevy (kehitys/testi)

Jokainen taso voi käyttää RAM-pohjaista tmpfs-näennäislevyä fyysisen lohkoyksikön sijasta. Hyödyllinen dev-laatikoille ilman varaosaa NVMe tai lyhytikäisille testausympäristöille. Tallennus kerroksessa laiteasetukset avattava sisältää 'tmpfs (virtuaalilevy RAM:sta)' -vaihtoehdon, joka korvaa laitteen polun valitsimen prosenttiluistimella.

Koko prosentteina vapaasta RAM:ista

Jako määritetään prosentteina MemAvailablesta (from /proc/meminfo) - askel 10, kelvolliset arvot 10/20/30/40/50. Kova lattia 10% (validointi hylkää alle). Kova katto 50%. Oletus 30%. 100 GB MemAvailable-isäntää: 10% = 10 GB, 30% = 30 GB, 50% = 50 GB. Koko lasketaan uudelleen ja uudelleenasennetaan, kun liukusäädintä siirretään ja tallennetaan.

OOM-turvavahti

Jos laskettu tavoite ylittäisi 60% nykyisestä MemAvailable-arvosta, liitos hylätään ja taso pysyy offline-tilassa (Stream.archive_path putoaa seuraavaan terveelle tasolle). Estää aggressiivisen asetuksen tappamasta BEAM OOM:n kautta. Vartija ajetaan sekä käynnistyksen että jokaisen Save UI:ssa.

Uudelleenkäynnistyksen kestävyys

tmpfs elää RAM:issa — kaikki keskeneräinen puskurin sisältö MENETETÄÄN, kun isäntä käynnistyy uudelleen. Provisioinnin yhteydessä kirjoitettu fstab-merkintä liittää tyhjän tmpfs:n automaattisesti uudelleen seuraavassa käynnistyksessä, mutta vanhat segmentit eivät palaudu. Arkistoon peilaus jatkuu normaalisti kaiken sille, mikä oli jo peilattu ennen uudelleenkäynnistystä — vain viimeinen peilaamaton ikkuna (yleensä < mirror_min_age_minutes) menetetään. Tuotantoon käytä fyysistä NVMe-laitetta; tmpfs on tarkoitettu kehitys-/testikorvaajaksi.

Milloin käyttää tmpfs

Käytä tmpfs:ää write_bufferille, kun: (a) kehitys-/testilaatikolla ei ole vapaata NVMe:tä, mutta haluat silti täydellisen DVR-putken integraatiotestaukseen, (b) operaattori haluaa validoida peili + arkistokäyttäytymistä ilman NVMe:n ostamista etukäteen, (c) lyhytaikainen testaus, jossa häviö uudelleenkäynnistyksen yhteydessä on hyväksyttävää. ÄLÄ käytä tmpfs:ää tuotannossa — RAM on haihtuva ja kertaluokkia kalliimpaa kuin NVMe per GB säilytystä.

Nopeampi huuhtelu tmpfs:lle

Kun kirjoitustaso on tmpfs, StorageTierFlush käyttää tiukempia oletuksia - mirror_min_age 2 min, evict_age 15 min (vs 5 min / 120 min fyysiselle NVMe). RAM on kalliimpaa kuin levy, joten rullava kuuma ikkuna pidetään pienempänä. Ohita MIRROR_MIN_AGE_MINUTES / EVICT_AGE_MINUTES env vars joiden kautta tarvittaessa.

Tason automaattinen provisiointi ja turvallisuus

Tasot konfiguroidaan kerran kohdassa Asetukset > Tallennus > Tallennustasot ja provisoidaan automaattisesti — ei manuaalista mkfs/mount/fstab-muokkausta isännällä. StorageTier.ensure_all_provisioned/0 ajetaan jokaisessa käynnistyksessä SystemInitializerista ja on idempotentti: jo liitetyt tasot ohitetaan, puuttuvat laitteet ovat no-op, tmpfs-tasot liitetään uudelleen puhtaasti uudelleenkäynnistyksen jälkeen.

Oletuskäynnistysinitalisointi

Ensimmäisessä käynnistyksessä (ei write-tasoa tietokannassa) järjestelmä luo automaattisesti tmpfs-pohjaisen write-tason, jolla on 30% MemAvailable-allokaatio, liitospiste /mnt/nvme_write. Tämä tarjoaa toimivan DVR-putken heti minkä tahansa isännän kanssa, jolla on tarpeeksi RAM:ia. Operaattori voi myöhemmin vaihtaa laitteen fyysiseen NVMe:hen käyttöliittymän kautta menettämättä muita tasokonfiguraatioita.

Terveys ja varajärjestelmä

Stream.archive_path/1 palauttaa ensimmäisen "terveen" tason — write_buffer, jos liitetty+kirjoitettavissa+free_pct yli turvarajan, muuten palautuu arkistoon (alennettu tila). Turvaraja 20% tmpfs:lle (RAM-tiukka), 2% lohkolaitteille. tier_health-päätepiste paljastaa per-tason liitetty/kirjoitettavissa/free_pct seurantaa varten.

Koon muutos lennossa

Muuttaminen tmpfs_size_pct:ää käyttöliittymässä käynnistää umount + remount uudella koolla Tallenna. Aktiiviset DVR-kirjoitukset on lyhyesti pysäytetty (liitossiirtymä < 1 s). Suositus: muuta tmpfs-koko vain kun DVR-kirjoitusnopeus on alhainen ja harkitse virtausten uudelleenkäynnistystä, jotta ne valitsevat uuden liitoksen puhtaasti.

Perus URL — OSTV-soitin

Paketin kentät

Paketit API

Salasanakäytäntö

Jälleenmyyjän API

Asetukset

Käyttäjän kentät

Käyttäjähallinta

IPTV hallitse käyttäjiä

Perus-URL — OSTV Player

OSTV Player -sovelluksessa käyttäjät voivat vaihtaa palvelimen perus-URL:n (API-osoite). Tämä ominaisuus on käytettävissä vain käyttäjille, joiden palveluntarjoajaksi on asetettu root.

Syy: Perus-URL:n vaihtaminen on tarkoitettu vain järjestelmänvalvojille/root-käyttäjille, jotta he voivat vaihtaa palvelinten välillä (esim. tuotanto vs. testaus). Tavallisilla käyttäjillä on kiinteä perus-URL, jota ei voi muuttaa.

Käyttäjäkentät

Pakettien API

Palauttaa luettelon kaikista aktiivisista paketeista hintojen ja laskutusjaksojen kanssa.

Luettelo hallintakäyttäjistä (jälleenmyyjät / palveluntarjoajat).

Palauttaa krediittisaldon tietylle hallintakäyttäjälle.

Paketin kentät

Jälleenmyyjä-API

API jälleenmyyjille/palveluntarjoajille. Valtuutus: Authorization: Bearer mtk_... (token Hallintakäyttäjistä). Jälleenmyyjä näkee vain omat asiakkaansa (owner_id).

Salasanakäytäntö

Salasana vaaditaan tilaajaa luotaessa. Säännöt:

Vähintään 8 merkkiä

Vähintään 1 iso kirjain (A-Z)

Vähintään 1 erikoismerkki (!@#$%^&* jne.)

Koskee käyttöliittymää ja API:ta. Päivityksen yhteydessä salasana on valinnainen, mutta jos se annetaan, sen on täytettävä säännöt.

Asetukset

Tasonautomaattivaraus &amp; Turvallisuus

Kapasiteetti + tiedostojärjestelmän automaattinen tunnistus: kun vapaata NVMe-asemaa valitaan pudotusvalikosta, kapasiteetti (Gt) luetaan komennolla lsblk -bn -o SIZE ja nykyinen tiedostojärjestelmä komennolla blkid (koko levyn varmuuskopio). Lomake näyttää arvot vain luku -tilassa — ei manuaalista syöttöä, ei virheitä.

Tason tyhjennysmekanismi — jatkuva peilailu

StorageTierFlush GenServer toimii 60 s välein. Sen sijaan että odotettaisiin tuntikohtaisen hakemiston 'vanhenemista' ja siirrettäisiin se 5 Gt:n eränä, segmentit siirtyvät RAID-järjestelmään jatkuvasti, pitäen 2 tunnin kuuman ikkunan NVMe-asemalla nopeaa 'viimeaikaista kelausta' varten. Nämä kaksi vaihetta ovat erillisiä — kopiointi ja poistaminen ovat erillisiä, varmistettuja toimintoja.

Miksi jatkuva peilailu voittaa 'odota 60 min, siirrä eränä': (1) RAID-kuorma on tasainen — ei 5 Gt:n purkaantumisia tuntirajalla, vain 7 Mt:n segmenttien virtaus; (2) Suurin osa kuumasta datasta on jo RAID:lla — katastrofin sattuessa menetetään vain viimeiset minuutit; (3) Poistaminen on varmistettu tiedostokohtaisesti — osittainen peilausvirhe havaitaan ennen kuin NVMe-tietoja menetetään.

Kesken olevan segmentin turvallisuus: peilailu poimii vain tiedostoja, jotka ovat vanhempia kuin MIRROR_MIN_AGE_MINUTES komennolla find -mmin +5. FFmpeg:n kirjoittama segmenttitiedosto ei näy listassa — osittaisia kirjoituksia ei siirretä.

Asennuskohtainen säätö (.env)

500–1000

Mitoitussääntö:

DVR-esikatselu-kalenteri

DVR-esikatselu-välilehti näyttää palvelinpuolella renderöidyn kalenterin, joka korostaa vain ne päivät, joilta levyllä on tallennuksia. Skannaus kattaa kaikki tasot (write_buffer + read_cache + archive + legacy), joten NVMe:ltä RAID:lle juuri siirretty segmentti pysyy näkyvissä ilman viivettä.

Tallennuksia sisältävät päivät ovat klikattavia (sininen) — napsauttaminen täyttää päivämäärä-/aikasyötteen kyseiselle päivälle klo 00:00; käyttäjä valitsee sitten tunnin. Päivät ilman tallennuksia ovat himmentyneitä ja toimimattomia.

Toteutettu Stream.available_dvr_days/1:ssä komennolla find -mindepth 4 -maxdepth 4 -type d jokaisessa tier-liitäntäpisteessä; deduplikoitu eri tasojen välillä (päivä näytetään kerran, vaikka sillä olisi segmenttejä useilla tasoilla siirtoikkunan aikana).

B2C-soitin API

Yleiskatsaus

B2C (Business-to-Consumer) API tarjoaa tunnistautumisen ja streamin käyttöoikeuden loppukäyttäjän soitinsovelluksille. Käyttäjät tunnistautuvat käyttäjänimellä/salasanalla ja saavat aikarajoitetun auth-tunnisteen myöhempiä pyyntöjä varten.

Tunnistautuminen

Tunnistaudu käyttäjänä ja hanki auth_token myöhempiä API-kutsuja varten.

Metodi

Päätepiste

Pyyntörunko

Parametri

Tyyppi

Pakollinen

Kuvaus

Kyllä

Käyttäjän kirjautumisnimi

Käyttäjän salasana

Esimerkki pyynnöstä

Vastauksen kentät

Onnistuminen (200)

Salattu todennusmerkkijono myöhemmille API-kutsuille

Merkkijono vanhentumisen päivämäärä/aika ISO 8601-muodossa

Esimerkki onnistumisvastauksesta

Virhe vastaus (403)

Virheen kuvausteksti

HTTP-tilakoodi

Esimerkki virhevastauksesta

Käyttäjätiedot

Hae tiedot tunnistautuneesta käyttäjästä auth-tunnisteen avulla.

Vastauksen kentät

Tunnistautuneen käyttäjän käyttäjänimi

Palvelimen sanoma (tyhjä jos ei mitään)

Todentamisen tila (1 = todennettava)

Tilin tila: aktiivinen, kielletty, poissa käytöstä, kokeiluversio

Tilin vanhentumispäivä (null = rajoittamaton)

Nykyisten aktiivisten yhteyksien määrä

Tilin luontipäivä ISO 8601 -muodossa

Sallittu enimmäismäärä samanaikaisia yhteyksiä

Lista sallituista lähtöstreamin muodoista

Käyttäjän omistajan/jälleenmyyjän palvelun nimi (null jos ei mitään)

Palvelun logo kuvan URL (null jos ei mitään)

Palveluntarjoajan tiivistetyn logon URL 208x208 (null jos ei ole)

Palvelimen nykyinen aika ISO 8601 -muodossa

Esimerkki pyynnöstä

Kategoriat

Hae kategoriat tyypin mukaan suodatettuna. Saatavilla olevat tyypit: live (streamit), vod (elokuvat), series (sarjat).

Kategorialityyppi: live, vod tai series

Luokan tunniste merkkijonona

Luokan näyttönimi

Yläluokan tunniste (0 jos juuri)

Sisällön MD5-tiiviste välimuistin mitätöintiä varten

Esimerkki pyynnöstä

VOD-tiedot

Hae yksityiskohtaiset tiedot tietystä VOD-nimikkeestä, mukaan lukien metatiedot ja virtalinkit.

VOD-streamin ID (UUID)

Info-objektin kentät

Kansikuva URL

TMDB-tunniste

Taustakuva URL

Genre-merkkijono

Juoni / kuvaus

Näyttelijät

Arvosana (0–10)

Ohjaajan nimi

Julkaisupäivä

Kesto sekunteissa

Kesto muotoiltuna merkkijonona

Taulukko kategoria-ID:istä

1 jos aikuisten sisältö, 0 muuten

VOD-objektin kentät

VOD-streamin ID

VOD-otsikko

Lisätty (ISO 8601)

Virtalinkkien URL:t

Video/audio-koodekin metatiedot

Sarjan tiedot

Hae sarjatiedot kaikilla tuotantokausilla ja jaksoilla, ryhmiteltynä kauden numeron mukaan.

Sarjan ID (UUID)

Kaudet-taulukon kentät

Kauden numero

Kauden näyttönimi

Jaksojen määrä kaudella

Kauden ensi-ilta

Kauden yleiskatsaus / kuvaus

Kauden kansikuva URL

Jaksojen objekti

Kartta, jossa avaimena on kauden numeromerkkijono. Kukin arvo on taulukko jaksoobjekteja.

Jaksoobjektin kentät

Jakson ID

TMDB-jakson ID

Jaksonumero kauden sisällä

Jakson otsikko

Lisätty (ISO 8601)

Kauden numero

Jakson tietoobjekti (sama rakenne kuin VOD-tiedot)

Virtalinkkien URL:t

Video/audio-koodekin metatiedot

Huomiot

Tunnisteen voimassaolo riippuu käyttäjäroolista: admin = 365 pv, muut = 30 pv|Poistetut käyttötilit eivät voi tunnistautua (palauttaa 403)|Jokainen onnistunut kirjautuminen päivittää käyttäjän last_login-aikaleiman|Tunnisteet ovat salattuja ja sisältävät user_id:n, käyttäjänimen, roolin ja vanhentumisen

Onnistuminen (200)

/auth-päätepisteestä saatu auth-tunniste