B2C · Xtream · Reseller





Arkivlagringsniveauer
Trelags arkivsystem til 500+ samtidige klienter. Konfigureres i Konfiguration > Lager > Lagerlagre. Hvert lag har uafhængig livscyklus, kapacitetsberegning og fallback-adfærd.
Encoder
Skrivebuffer
2t hotvindue (NVMe eller tmpfs)
→ mirror (kontinuerlig)
HDD RAID 5
50 TB, 14 dages beholdelse
→ prefetch on demand
Afspilningscache
1 TB warm cache, 500+ klienter
Klienter
Segmenter ældre end mirror_min_age_minutes kopieres til RAID kontinuerligt. Write_buffer holder et rullende 2t hotvindue, så omspilning-til-nylig afspilning forbliver på hurtigt lager. Kun efter evict_age_minutes (og kun når verificeret-mirrored) slettes segmenter fra write_buffer. RAID har altid langtidskopien — ingen timevise burst-overførsler.
Lag
Formål
Indstillinger
Skrivebuffer
Modtager segmenter 24/7, holder 2t hotvindue til nylig-omspilningsafspilning, beskytter RAID mod tilfældig IO. Enhed kan være en fysisk NVMe-partition (produktion) eller tmpfs (dev/test-vært uden fysisk NVMe — se tmpfs-sektionen nedenfor).
device_path (blockenhed eller 'tmpfs'), tmpfs_size_pct (10-50 % MemAvailable når tmpfs), mirror_min_age_minutes, evict_age_minutes, flush_threshold_percent (tving flusstrigger)
HDD RAID-arkiv
Langtidslager til fuld beholdelse (standard 14 dage). Modtager kontinuerlig mirror-trickle fra write_buffer — sekventiel skrivning, ingen timevise burst. Overlever genstart. RAID overlever enkelt diskfejl.
retention_days, raid_device, nginx_location, min_free_percent
Afspilningscache (valgfrit)
Læsningssidecache til populære filer ældre end 2t (f.eks. EPG-catch-up). Population fra archive on demand efter popularitetstrøskel (3 hits / 5 min). Enhed kan være NVMe eller tmpfs.
prefetch_hours, max_sessions, eviction_policy (session/lru/fifo)
live skriver × 2t = skrivebuffer-hotvinduesstørrelse. Eksempel: 50 streams × 8 Mbps × 2t ≈ 36 GB. Tilføj ~30 % reserve til mirror-trickle-backlog → ~50 GB write_buffer er nok til 50 streams. RAID dimensioneret til fuld beholdelse: 50 × 8 Mbps × 14 dage ≈ 6 TB.
Stream.dvr_file_path/2 probe skrivebuffer → playback_cache → archive i rækkefølge. Et segment i 2t hotvinduet serveres fra write_buffer med native hastigheder, selvom det også findes på RAID. Nginx X-Accel-Redirect serverer filer direkte uden at gå gennem Phoenix.
Hvert lag kan bruge en RAM-understøttet tmpfs-virtuel disk i stedet for en fysisk blockenhed. Nyttig til dev-værter uden ledig NVMe, eller til ephemera testmiljøer. Storage Tier-kort enhedens rullemenu indeholder et 'tmpfs (virtuel disk fra RAM)'-valg, der erstatter enhedsstievælgeren med en procentglatpol.
Allokering er angivet som en procentdel af MemAvailable (fra /proc/meminfo) — trin 10, gyldige værdier 10/20/30/40/50. Hård bundgrænse 10 % (validering afviser under). Hård loftgrænse 50 %. Standard 30 %. På en 100 GB MemAvailable-vært: 10 % = 10 GB, 30 % = 30 GB, 50 % = 50 GB. Størrelse genberegnes og remonteres live, når glatpolen flyttes og gemmes.
Hvis beregnet mål ville overstige 60 % af nuværende MemAvailable, nægtes montage, og lagret forbliver offline (Stream.archive_path falder igennem til næste sunde lag). Forhindrer, at en aggressiv indstilling dræber BEAM via OOM. Guard-kører både ved opstart og ved hvert gem i UI.
tmpfs lever i RAM — alt in-flight bufferindhold GAVES, når værten genstarter. Fstab-posten skrevet ved provisionering genmonterer den tomme tmpfs automatisk ved næste opstart, men gamle segmenter returnerer ikke. Mirror til archive fortsætter normalt for alt, der allerede er mirroret før genstarten — kun den sidste umirrorete vindue (typisk < mirror_min_age_minutes) går tabt. Til produktion, brug en fysisk NVMe-enhed; tmpfs er beregnet som dev/test-substitut.
Brug tmpfs til write_buffer når: (a) dev/test-vært ikke har en ledig NVMe, men du stadig vil have den fulde DVR-pipeline kørende til integrations测试, (b) operatør vil validere mirror + archive-adfærd uden at købe NVMe på forhånd, (c) ephemera test, hvor tab ved genstart er acceptabelt. Brug IKKE tmpfs i produktion — RAM er flygtigt og af størrelsesordenen dyrere end NVMe per GB af beholdelse.
Når write-lageret er tmpfs, bruger StorageTierFlush strammere standardværdier — mirror_min_age 2 min, evict_age 15 min (vs. 5 min / 120 min for fysisk NVMe). RAM er dyrere end disk, så det rullende hotvindue holdes mindre. Overskriv via MIRROR_MIN_AGE_MINUTES / EVICT_AGE_MINUTES env-variabler, hvis nødvendigt.
Lagrene konfigureres én gang via Konfiguration > Lager > Lagerlagre og provisioneres automatisk — ingen manuel mkfs/mount/fstab-redigering på værten. StorageTier.ensure_all_provisioned/0 køres ved hver opstart fra SystemInitializer og er idempotent: allerede-monterede lag springes over, manglende enheder er no-ops, tmpfs-lag monteres rent om efter genstart.
Ved første opstart (ingen write-lager i DB) opretter systemet automatisk et tmpfs-understøttet write-lager med 30 % MemAvailable-allokering, monteringspunkt /mnt/nvme_write. Dette giver en fungerende DVR-pipeline out-of-the-box på enhver vært med nok RAM. Operatøren kan senere skifte enhed til en fysisk NVMe via UI uden at miste andre lagerindstillinger.
Stream.archive_path/1 returnerer det første 'sunde' lag — write_buffer, hvis monteret+skriveligt+free_pct over sikkerhedsfundament, ellers fallback til archive (degraderet tilstand). Sikkerhedsfundament 20 % for tmpfs (RAM-stram), 2 % for blockenheder. tier_health-endpoint udsætter per-lag monteret/skriveligt/free_pct til overvågning.
Ændring af tmpfs_size_pct i UI uløser umount + remount med den nye størrelse ved gem. Aktive DVR-skrivesæt pause kortvarigt (montageovergang < 1 s). Anbefaling: ændr tmpfs-størrelse kun, når DVR-skrivehastighed er lav, og overvej at genstarte streams efter for at sikre, at de henter det nye montage rent.
Basis-URL — OSTV Player
Pakkefelter
Pakke-API
Adgangskodepolitik
Videresælger-API
Indstillinger
Brugerfelter
Brugeradministration
Basis-URL — OSTV-afspiller
OSTV-afspillerapplikationen giver brugere mulighed for at ændre serverens basis-URL (API-adresse). Denne funktion er kun tilgængelig for brugere med udbyder sat til root.
Årsag: Ændring af basis-URL er kun beregnet til administratorer/root-brugere, så de kan skifte mellem servere (f.eks. produktion vs. test). Almindelige brugere har en fast basis-URL og kan ikke ændre den.
Brugerfelter
Pakke-API
Returnerer en liste over alle aktive pakker med priser og faktureringsperioder.
Liste over administrationsbrug (forhandlere / udbydere).
Returnerer kreditsaldo for en bestemt administrationsbruger.
Pakkefelter
Forhandler-API
API for forhandlere/udbydere. Autorisering: Authorization: Bearer mtk_... (token fra Administrer brugere). Forhandleren ser kun egne klienter (owner_id).
Adgangskodepolitik
Adgangskode er påkrævet ved oprettelse af abonnent. Regler:
Minimum 8 tegn
Mindst 1 stort bogstav (A-Z)
Mindst 1 specialtegn (!@#$%^&* osv.)
Gælder for UI og API. Ved opdatering er adgangskode valgfri, men skal hvis angivet overholde reglerne.
Indstillinger
Tier auto-klargøring og sikkerhed
Kapacitet + filsystem auto-registrering: når en ledig NVMe vælges fra rullelisten, læses kapacitet (GB) fra lsblk -bn -o SIZE og aktuel FS fra blkid (med hel-disk-fallback). Formularen viser værdierne skrivebeskyttet — ingen manuel indtastning, ingen fejl.
Tier Flush-mekanisme — Kontinuerlig spejling
StorageTierFlush GenServer kører hvert 60s. I stedet for at vente på at en time-mappe 'forældes' og flyttes som en 5GB-pakke, overfører den segmenter til RAID løbende mens det holder et 2-timers hot-vindue på NVMe til hurtig 'nylig tilbagespoling'. De to faser er frakoblede — kopiering og sletning er separate, verificerede operationer.
Hvorfor kontinuerlig spejling slår 'vent 60 min, batch-flyt': (1) RAID-belastning er jævn — ingen 5GB-pakker ved timegrænser, blot en strøm af 7MB-segmenter; (2) de fleste hot-data er allerede på RAID — disaster recovery mister kun de seneste få minutter; (3) sletning verificeres per fil — en delvis spejlingsfejl opdages inden NVMe-data mistes.
Sikkerhed for igangværende segmenter: spejlingen henter kun filer ældre end MIRROR_MIN_AGE_MINUTES via find -mmin +5. En segmentfil der stadig skrives af FFmpeg vises ikke i listen — ingen risiko for overførsel af delvis skrift.
Per-deployment tuning (.env)
500-1000
Størrelsesregel:
DVR forhåndsvisningskalender
DVR Forhåndsvisnings-fanen viser en server-renderet kalender der kun fremhæver dage med eksisterende optagelser på disken. Scanningen køres på tværs af alle tiers (write_buffer + read_cache + archive + legacy), så et segment der netop er overført fra NVMe til RAID forbliver synligt uden forsinkelse.
Dage med optagelser er klikbare (blå) — klik udfylder på forhånd datetime-inputtet med den dag kl. 00:00; brugeren vælger derefter timen. Dage uden optagelse er nedtonede og inaktive.
Implementeret i Stream.available_dvr_days/1 via find -mindepth 4 -maxdepth 4 -type d på hvert tier-mount; deduplikeret på tværs af tiers (en dag vises én gang selvom den har segmenter i flere tiers under et flush-vindue).
Oversigt
B2C (Business-to-Consumer) API'en giver autentificering og stream-adgang til slutbruger-spillerapplikationer. Brugere autentificerer med brugernavn/adgangskode og modtager et tidsbegrænset auth-token til efterfølgende anmodninger.
Autentificér en bruger og få en auth_token til efterfølgende API-kald.
Metode
Endepunkt
Anmodningskrop
Parameter
Type
Obligatorisk
Beskrivelse
Ja
Brugerens login-navn
Brugeradgangskode
Eksempel på anmodning
Svarfelter
Succesrespons (200)
Krypteret autentificeringstoken til efterfølgende kald
Token-udløbsdato/tid på ISO 8601-format
Eksempel på succesrespons
Fejlrespons (403)
Fejlbeskrivelsesmeddelelse
HTTP-statuskode
Eksempel på fejlrespons
Hent oplysninger om den autentificerede bruger ved hjælp af auth-token.
Svarfelter
Brugernavn for den autentificerede bruger
Serverbesked (tom hvis ingen)
Autentificeringsstatus (1 = autentificeret)
Kontostatus: aktiv, bandlyst, deaktiveret, prøve
Konto-udløbsdato (null hvis ubegrænset)
Antal nuværende aktive forbindelser
Kontooprettelsesdato på ISO 8601-format
Maks. tilladte samtidige forbindelser
Liste over tilladte output stream-formater
Providernavn for brugerens ejer/forhandler (null hvis ingen)
URL for providerlogo-billede (null hvis ingen)
URL for provider-sammenklapningslogo-billede 208x208 (null hvis ingen)
Nuværende servers tid på ISO 8601-format
Eksempel på anmodning
Hent kategorier filtreret efter type. Tilgængelige typer: live (streams), vod (film), series (serier).
Kategoritype: live, vod eller serie
Kategori-ID som streng
Kategoriens visningsnavn
Overordnede kategori-ID (0 hvis rod)
MD5-hash af indhold til cache-ugyldiggørelse
Eksempel på anmodning
Hent detaljeret information for en bestemt VOD-genstand, herunder metadata og streamlinks.
VOD-stream-ID (UUID)
Omslagsbilled-URL
TMDB-identifikator
Baggrundsbilled-URL
Genre-streng
Handlingsbeskrivelse / beskrivelse
Medvirkende
Bedømmelsesværdi (0-10)
Instruktørens navn
Udgivelsesdato
Varighed i sekunder
Varighed som formatteret streng
Array af kategori-ID'er
1 hvis voksenindhold, ellers 0
VOD-stream-ID
VOD-titel
Tilføjet dato (ISO 8601)
Stream-link-URL'er
Video-/lydkodekmetadata
Hent serieinformation med fulde sæson- og afsnitslister, grupperet efter sæsonnummer.
Serie-ID (UUID)
Sæsonnummer
Sæsonens visningsnavn
Antal afsnit i sæsonen
Sæsonens udsendelsesdato
Sæsonens oversigt/beskrivelse
Sæsonens coverbilled-URL
Kort nøglet efter sæsonnummerstreng. Hver værdi er et array af afsnitsobjekter.
Afsnitsobjektfelter
Afsnits-ID
TMDB-afsnits-ID
Afsnitsnummer inden for sæsonen
Tilføjet dato (ISO 8601)
Sæsonnummer
Afsnitsinfoobjekt (samme struktur som VOD-info)
Stream-link-URL'er
Video-/lydkodekmetadata
Token-udløb afhænger af brugerrolle: admin = 365 dage, andre = 30 dage|Deaktiverede konti kan ikke autentificere (returnerer 403)|Hver vellykket login opdaterer brugerens last_login-tidsstempel|Tokens er krypterede og indeholder user_id, brugernavn, rolle og udløb
Succesrespons (200)
Auth-token opnået fra /auth-endpoint