×

📺 IPTV

B2C · Xtream · Reseller

IPTV administrer brugere

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

Mirror, ikke flyt

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)

Kapacitetsberegning

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.

Læsninger (tier-bevidst opslag)

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.

tmpfs-virtual disk (dev/test)

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.

Størrelse i % fri RAM

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.

OOM-sikkerhedsbarriere

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.

Genstart-persistens

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.

Når man skal bruge tmpfs

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.

Hurtigere flusning til tmpfs

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.

Lag-auto-provisioning & sikkerhed

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.

Standard opstart seed

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.

Sundhed & failover

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.

Live-størrelsesændring

Æ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

IPTV administrer brugere

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).

B2C-spiller-API

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.

Autentificering

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

Brugeroplysninger

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

Kategorier

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

VOD-detaljer

Hent detaljeret information for en bestemt VOD-genstand, herunder metadata og streamlinks.

VOD-stream-ID (UUID)

Infoobjektfelter

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-objektfelter

VOD-stream-ID

VOD-titel

Tilføjet dato (ISO 8601)

Stream-link-URL'er

Video-/lydkodekmetadata

Seriens detaljer

Hent serieinformation med fulde sæson- og afsnitslister, grupperet efter sæsonnummer.

Serie-ID (UUID)

Sæsoner-arrayfelter

Sæsonnummer

Sæsonens visningsnavn

Antal afsnit i sæsonen

Sæsonens udsendelsesdato

Sæsonens oversigt/beskrivelse

Sæsonens coverbilled-URL

Afsnitobjekt

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

Afsnits titel

Tilføjet dato (ISO 8601)

Sæsonnummer

Afsnitsinfoobjekt (samme struktur som VOD-info)

Stream-link-URL'er

Video-/lydkodekmetadata

Bemærkninger

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