B2C · Xtream · Reseller





Arhivske Razine Pohrane
Troslojni arhivski sustav za 500+ istovremenih klijenata. Konfigurirajte u Config > Storage > Storage Tiers. Svaki sloj ima neovisni životni ciklus, proračun kapaciteta i rezervno ponašanje.
Koder
Međuspremnik za pisanje
2h vrući prozor (NVMe ili tmpfs)
→ ogledalo (kontinuirano)
HDD RAID 5
50 TB, zadržavanje 14 dana
→ unaprijed dohvati na zahtjev
Predmemorija reprodukcije
1 TB tople predmemorije, 500+ klijenata
Klijenti
Segmenti stariji od mirror_min_age_minutes su KOPIRANI na RAID kontinuirano. Write_buffer drži pomičnu 2h vrući prozor tako da rewind-to-recent reprodukcija ostaje na brzoj pohrani. Samo nakon evict_age_minutes (i samo kada je provjeren-zrcaljen) su segmenti izbrisani iz write_buffer-a. RAID uvijek ima dugoročnu kopiju — bez satnih burst prijenosa.
Razina
Svrha
postavke
Pisalni medpomnilnik
Prima segmente 24/7, drži 2h vrući prozor za brzu reprodukciju nedavnog premotavanja unatrag, štiti RAID od nasumičnog IO-a. Uređaj može biti fizička NVMe particija (produkcija) ili tmpfs (dev/test box bez fizičkog NVMe-a — pogledajte tmpfs odjeljak u nastavku).
device_path (blok uređaj ili 'tmpfs'), tmpfs_size_pct (10-50% MemAvailable kada tmpfs), mirror_min_age_minutes, evict_age_minutes, flush_threshold_percent (sila flush okidač)
HDD RAID arhiva
Dugoročno spremište za potpunu retenciju (zadano 14 dana). Primi kontinuirani zrcalni tok sa write_buffer — sekvencijalni zapis, bez satnih valova. Održava se nakon ponovnog pokretanja. RAID održava kvar jedne disk-a.
retention_days, raid_device, nginx_location, min_free_percent
Playback Cache (opciono)
Predmemorija na strani za čitanje za popularne datoteke starije od 2 sata (npr. EPG nadoknada). Popunjava se iz arhive na zahtjev nakon praga popularnosti (3 pogotka / 5 min). Uređaj može biti NVMe ili tmpfs.
prefetch_hours, max_sessions, eviction_policy (session/lru/fifo)
uživo piše × 2h = veličina vrućeg prozora write_buffer. Primjer: 50 streamova × 8 Mbps × 2h ≈ 36 GB. Dodajte ~30% prostora za zrcalno curenje zaostatka → ~50 GB write_buffer dovoljno je za 50 streamova. RAID veličine za potpuno zadržavanje: 50 × 8 Mbps × 14 dana ≈ 6 TB.
Stream.dvr_file_path/2 sonda write_buffer → playback_cache → arhiv redom. Segment u 2h vrućem prozoru služi iz write_buffer-a pri nativnim brzinama čak iako postoji i na RAID-u. Nginx X-Accel-Redirect służi datotekama direktno bez prolaska kroz Phoenix.
Svaka razina može koristiti RAM-backed tmpfs virtualni disk umjesto fizičkog blok uređaja. Korisno za dev kutije bez rezervnog NVMe, ili za efemerne test okoline. Karta Storage Tier uređaja dropdown sadrži opciju 'tmpfs (virtualni disk iz RAM-a)' koja zamjenjuje selektora putanje uređaja s postotkom klizača.
Alokacija je navedena kao postotak MemAvailable (iz /proc/meminfo) — korak 10, valjane vrijednosti 10/20/30/40/50. Tvrda podloga 10% (validacija odbija dolje). Tvrda gornja granica 50%. Zadano 30%. Na domaćinu od 100 GB MemAvailable: 10% = 10 GB, 30% = 30 GB, 50% = 50 GB. Veličina se ponovno izračunava i ponovno montira na živo kada se klizač pomakne i spremi.
Ako bi izračunani cilj premašio 60% trenutnog MemAvailable, montiranje se odbija i razina ostaje offline (Stream.archive_path pada kroz sljedeću zdrave razine). Sprječava agresivnu postavku od ubijanja BEAM-a via OOM. Stražar pokreće i pri pokretanju i na svakom Save u UI-ju.
tmpfs živi u RAM-u — svaki sadržaj međuspremnika u tijeku se GUBIO kada se host ponovno pokrene. Unos fstab napisan u vrijeme pružanja ponovno montira prazne tmpfove automatski pri sljedećem pokretanju, ali stari segmenti se ne vraćaju. Zrcaljenje u arhivu nastavlja se normalno za sve što je već bilo zrcaljeno prije ponovnog pokretanja — gubi se samo zadnji nezrcaljeni prozor (obično < mirror_min_age_minute value). Za proizvodnju koristite fizički NVMe uređaj; tmpfs je zamišljen kao dev/test zamjena.
Upotrijebite tmpfs za write_buffer kada: (a) dev/test box nema rezervni NVMe, ali i dalje želite da cijeli DVR cjevovod radi za testiranje integracije, (b) operater želi potvrditi ponašanje zrcala + arhive bez kupnje NVMe unaprijed, (c) efemerno testiranje gdje je gubitak pri ponovnom pokretanju prihvatljiv. NEMOJTE koristiti tmpfs u proizvodnji — RAM je hlapljiv i nekoliko je skuplji od NVMe-a po GB zadržavanja.
Kada je write razina tmpfs, StorageTierFlush koristi tisnija zadana — mirror_min_age 2 min, evict_age 15 min (vs 5 min / 120 min za fizički NVMe). RAM je skuplji od diska tako da pomična vrući prozor drži manji. Nadjačaj putem MIRROR_MIN_AGE_MINUTES / EVICT_AGE_MINUTES env var ako trebam.
Razine se konfiguriraju jednom putem Konfiguracija > Pohrana > Razine pohrane i automatski se dodjeljuju — nema ručnog uređivanja mkfs/mount/fstab na glavnom računalu. StorageTier.ensure_all_provisioned/0 pokreće se pri svakom pokretanju sustava iz SystemInitializera i idempotentan je: već montirani slojevi se preskaču, uređaji koji nedostaju su bez operacija, tmpfs nivoi se ponovno postavljaju čisto nakon ponovnog pokretanja.
Pri prvom pokretanju (bez razine pisanja u DB), sustav automatski stvara tmpfs-podržan sloj pisanja s 30% MemAvailable dodjele, točka montiranja /mnt/nvme_write. To daje radni DVR cjevovod izvan kutije na bilo kojem hostu s dovoljno RAM-a. Operater može kasnije prebaciti uređaj na fizički NVMe putem korisničkog sučelja bez gubitka ostalih postavki razine.
Stream.archive_path/1 vraća prvu 'zdravu' razinu — write_buffer ako je mounted+writable+free_pct iznad sigurnosnog poda, inače se vraća u arhivu (degradirani način). Sigurnosni prag 20% za tmpfs (strogo RAM), 2% za blok uređaje. tier_health krajnja točka izlaže po sloju mounted/writable/free_pct za praćenje.
Promjena tmpfs_size_pct u UI pokreće umount + remount s novom veličinom na Save. Aktivna DVR pisanja su kratko pauzirana (montiranje prijelaza < 1 s). Preporuka: promijeni tmpfs veličinu samo kada je DVR write brzina niska, i razmotriti ponovno pokretanje stream-ova nakon što osiguraš da bi novo montiranje pobrali čisto.
Osnovni URL — OSTV Player
Polja paketa
API paketov
Pravila zaporke
API prodajalca
postavke
Korisnička polja
Upravljanje korisnicima
Osnovni URL — OSTV Player
Aplikacija OSTV Player korisnicima omogućuje promjenu osnovnog URL-a poslužitelja (API adrese). Ova funkcija dostupna je samo korisnicima s postavkom provider = root.
Razlog: Promjena osnovnog URL-a namijenjena je samo administratorima/root korisnicima kako bi mogli prebacivati između poslužitelja (npr. produkcija vs. testiranje). Redovni korisnici imaju fiksni osnovni URL i ne mogu ga promijeniti.
Polja korisnika
API za pakete
Vraća popis svih aktivnih paketa s cijenama i razdobljima naplate.
Popis korisnika upravljanja (preprodavači / pružatelji usluga).
Vraća saldo kredita za određenog korisnika upravljanja.
Polja paketa
API prodavača
API za preprodavače/pružatelje usluga. Autorizacija: Authorization: Bearer mtk_... (token iz Korisnici upravljanja). Preprodavač vidi samo vlastite klijente (owner_id).
Politika lozinki
Lozinka je obavezna pri stvaranju pretplatnika. Pravila:
Najmanje 8 znakova
Najmanje 1 veliko slovo (A-Z)
Najmanje 1 poseban znak (!@#$%^&* itd.)
Primjenjuje se na sučelje i API. Pri ažuriranju, lozinka je opcionalna, ali ako je navedena mora zadovoljiti pravila.
Postavke
Automatska dodjela razine i sigurnost
Automatsko otkrivanje kapaciteta + datotečnog sustava: kada se slobodni NVMe odabere iz padajućeg izbornika, kapacitet (GB) se čita iz lsblk -bn -o SIZE, a trenutni FS iz blkid (s povratom na cijeli disk). Obrazac prikazuje vrijednosti samo za čitanje — bez ručnog unosa, bez grešaka.
Mehanizam ispražnjavanja razine — kontinuirano zrcaljenje
StorageTierFlush GenServer pokreće se svake 60 sekundi. Umjesto čekanja da sat-direktorij 'zastari' i premještanja kao grupni 5GB, segmente kontinuirano prenosi na RAID dok zadržava prozor od 2h na NVMe za brzu 'nedavnu premotavanja' reprodukciju. Dvije faze su odvojene — kopiranje i brisanje su odvojene, verificirane operacije.
Zašto kontinuirano zrcaljenje pobjeđuje 'čekaj 60 min, grupno-premjesti': (1) Opterećenje RAID-a je ravnomjerno — bez grupnih 5GB na satnim granicama, samo kapanje segmenata od 7MB; (2) Većina vrućih podataka već je na RAID-u — oporavak od katastrofe gubi samo zadnje nekoliko minuta; (3) Iseljavanje je verificirano po datoteci — djelomični neuspjeh zrcaljenja otkrije se prije gubitka NVMe podataka.
Sigurnost segmenata u tijeku: zrcalo bira samo datoteke starije od MIRROR_MIN_AGE_MINUTES putem find -mmin +5. Datoteka segmenta koja se još uvijek upisuje od strane FFmpeg neće se pojaviti na popisu — nema šanse za prijenos s djelomičnim upisom.
Podešavanje po deployu (.env)
500–1000
Pravilo veličine:
DVR pregled kalendara
Kartica DVR pregleda prikazuje serverski renderiran kalendar koji ističe samo dane za koje postoje snimke na disku. Pretraživanje se izvodi po svakoj razini (write_buffer + read_cache + archive + legacy) tako da segment koji je upravo ispražnjen s NVMe na RAID ostaje vidljiv bez kašnjenja.
Dani sa snimkama su klikabilni (plavi) — klikom se unaprijed ispunjava unos datuma i vremena s tim danom u 00:00; korisnik zatim bira sat. Dani bez snimke su prigušeni i neaktivni.
Implementirano u Stream.available_dvr_days/1 putem find -mindepth 4 -maxdepth 4 -type d na svakom montiranom punktu razine; deduplicirano po razinama (dan se prikazuje jednom čak i ako ima segmenata na više razina tijekom prozora ispražnjavanja).
Pregled
B2C (Business-to-Consumer) API pruža autentifikaciju i pristup streamu za aplikacije igrača krajnjeg korisnika. Korisnici se autentificiraju korisničkim imenom/lozinkom i primaju vremenski ograničeni token autentifikacije za sljedeće zahtjeve.
Autentificirajte korisnika i nabavite auth_token za sljedeće API pozive.
metoda
Krajnja točka
Tijelo zahtjeva
Parametar
Vrsta
Potreban
Opis
Da
Korisničko ime za prijavu
Korisnička lozinka
Primjer Zahtjeva
Polja Odgovora
Uspješan odgovor (200)
Enkriptirani token autentifikacije za sljedeće API pozive
Datum/vrijeme isteka tokena u ISO 8601 formatu
Primjer uspješnog odgovora
Odgovor napake (403)
Poruka s opisom greške
HTTP status kod
Primjer odgovora na pogrešku
Dohvaćanje informacija o autentificiranom korisniku pomoću autentificiranog tokena.
Polja odgovora
Korisničko ime autentificiranog korisnika
Server poruka (prazna ako nema)
Status autentifikacije (1 = autentificiran)
Status računa: Aktivna, Zabranjena, Onemogućena, Trial
Datum isteka računa (nulto ako je neograničeno)
Broj trenutnih aktivnih veza
Datum kreiranja računa u formatu ISO 8601
Maksimalno dopušteno istodobno povezivanje
Popis dopuštenih formata izlaznog toka
Naziv dobavljača korisnikovog vlasnika/reseller (null ako nema)
URL dobavljačeve slike logotipa (null ako nema)
URL sažete slike logotipa pružatelja usluga 208x208 (nula ako nema)
Trenutno vrijeme poslužitelja u formatu ISO 8601
Primjer Zahtjeva
Dohvaćanje kategorija filtriranih prema vrsti. Dostupne vrste: uživo (streamovi), vod (filmovi), serije.
Vrsta kategorije: uživo, vod ili serija
ID kategorije kao string
Naziv kategorije za prikaz
ID roditeljske kategorije (0 ako je root)
MD5 hash sadržaja za poništenje predmemorije
Primjer Zahtjeva
Dohvati detaljne informacije za specifičnu VOD stavku, uključujući metapodatke i linkove stream-a.
ID VOD streama (UUID)
URL naslovne slike
TMDB identifikator
URL slike pozadine
Žanrovski niz
Parcela / opis
Članovi glavne uloge
Vrijednost ocjene (0-10)
Ime redatelja
Datum izlaska
Trajanje u sekundama
Trajanje kao formatirani niz
Niz ID-ova kategorija
1 ako je odraslih sadržaj, 0 inače
ID VOD streama
VOD naslov
Datum dodavanja (ISO 8601)
Linkovi URL-a Stream-a
Metapodaci video/audio kodeka
Dohvatite informacije o seriji s popisima cijele sezone i epizoda, grupirane prema broju sezone.
ID serije (UUID)
Broj sezone
Naziv sezone za prikaz
Broj epizoda u sezoni
Datum emitiranja sezone
Pregled sezone / opis
URL naslovne slike sezone
Karta označena nizom brojeva sezone. Svaka vrijednost je niz objekata epizode.
Polja objekata epizode
ID epizode
TMDB ID epizode
Broj epizode unutar sezone
Datum dodavanja (ISO 8601)
Broj sezone
Objekt informacije epizode (ista struktura kao VOD info)
Linkovi URL-a Stream-a
Metapodaci video/audio kodeka
Istek tokena ovisi o ulozi korisnika: admin = 365 dana, ostalo = 30 dana|Onemogućeni računi ne mogu se autentificirati (vraća 403)|Svaka uspješna prijava ažurira korisničku vremensku oznaku last_login|Tokeni su šifrirani i sadrže user_id, korisničko ime, ulogu i istek
Uspješan odgovor (200)
Auth token dobiven iz krajnje točke /auth