B2C · Xtream · Reseller





Archyvo saugykla Tiers
Three-tier archive system for 500+ concurrent clients. Konfigūruoti in Config > Saugykla > Saugykla Tiers. Each tier has independent lifecycle, talpa calc and failover behaviour.
Kodavimo įrenginys
Rašymo buferis
2 val. karštasis langas (NVMe arba tmpfs)
→ atspindėti (nuolatinis)
HDD RAID 5
50 TB, 14 dienos retention
→ išankstinis įkėlimas pagal poreikį
Atkūrimo talpykla
1 TB šiltas podėlis, 500+ klientų
Klientai
Segments older than mirror_min_age_minutes are COPIED to RAID continuously. The write_buffer holds a rolling 2h hot window so rewind-to-recent playback stays on fast saugykla. Only after evict_age_minutes (and only when verified-mirrored) are segments deleted from write_buffer. RAID always has the long-tail kopijuoti — no hourly burst transfers.
Sluoksnis
Paskirtis
Nustatymai
Rašymo buferis
Receives segments 24/7, holds 2h hot window for fast recent-rewind playback, protects RAID from random IO. Įrenginys can be a physical NVMe partition (production) or tmpfs (dev/bandymas box without physical NVMe — see tmpfs section below).
device_path (blokuoti įrenginys or 'tmpfs'), tmpfs_size_pct (10-50% MemAvailable when tmpfs), mirror_min_age_minutes, evict_age_minutes, flush_threshold_percent (force flush trigger)
HDD RAID archyvas
Long-tail saugykla for full retention (numatytasis 14 dienos). Receives continuous mirror trickle from write_buffer — sequential write, no hourly bursts. Survives reboot. RAID survives single disk failure.
retention_days, raid_device, nginx_location, min_free_percent
Atkūrimo talpykla (optional)
Read-side cache for popular failai older than 2h (e.g. EPG catch-up). Populated from archive on demand after popularity slenkstis (3 hits / 5 min). Įrenginys can be NVMe or tmpfs.
prefetch_hours, max_sessions, eviction_policy (sesija/lru/fifo)
live writes × 2h = write_buffer hot window dydis. Example: 50 srautai × 8 Mbps × 2h ≈ 36 GB. Pridėti ~30% headroom for mirror trickle backlog → ~50 GB write_buffer is enough for 50 srautai. RAID sized for full retention: 50 × 8 Mbps × 14 dienos ≈ 6 TB.
Srautas.dvr_file_path/2 probes write_buffer → playback_cache → archive in order. A segment in the 2h hot window is served from write_buffer at native speeds even though it also exists on RAID. Nginx X-Accel-Redirect serves failai directly without going through Phoenix.
Each tier can use a RAM-backed tmpfs virtual disk instead of a physical blokuoti įrenginys. Useful for dev boxes without spare NVMe, or for ephemeral bandymas environments. Saugyklos lygis card įrenginys dropdown contains a 'tmpfs (virtual disk from RAM)' option that replaces the įrenginys kelias selector with a procentas slider.
Allocation is specified as a procentas of MemAvailable (from /proc/meminfo) — step 10, valid values 10/20/30/40/50. Hard floor 10% (validation rejects below). Hard ceiling 50%. Numatytasis 30%. On a 100 GB MemAvailable host: 10% = 10 GB, 30% = 30 GB, 50% = 50 GB. Dydis is recomputed and remounted live when the slider is moved and saved.
If computed target would exceed 60% of dabartinis MemAvailable, the mount is refused and the tier remains offline (Srautas.archive_path falls through to the kitas healthy tier). Prevents an aggressive setting from killing the BEAM via OOM. The guard runs both at boot and on every Išsaugoti in the UI.
tmpfs lives in RAM — any in-flight buffer content is LOST when the host reboots. The fstab entry written at provision laikas re-mounts the empty tmpfs automatically on kitas boot, but old segments do not sugrįžti. Mirror to archive continues normally for everything that was already mirrored before the reboot — only the last unmirrored window (typically < mirror_min_age_minutes worth) is lost. For production, use a physical NVMe įrenginys; tmpfs is intended as a dev/bandymas substitute.
Use tmpfs for write_buffer when: (a) dev/bandymas box has no spare NVMe but you still want the full DVR pipeline veikia for integration testing, (b) operator wants to validate mirror + archive behaviour without buying NVMe up-front, (c) ephemeral testing where loss-on-reboot is acceptable. Do NOT use tmpfs in production — RAM is volatile and orders of magnitude more expensive than NVMe per GB of retention.
Kai rašymo sluoksnis yra tmpfs, StorageTierFlush naudoja griežtesnius numatytuosius nustatymus — mirror_min_age 2 min, evict_age 15 min (palyginti su 5 min / 120 min fiziniams NVMe). RAM yra brangesnė nei diskas, todėl bėgiojantis karštasis langas išlaikomas mažesnis. Per nustatykite per MIRROR_MIN_AGE_MINUTES / EVICT_AGE_MINUTES aplinkos kintamuosius, jei reikia.
Tiers are configured once via Config > Saugykla > Saugykla Tiers and provisioned automatically — no manual mkfs/mount/fstab editing on the host. StorageTier.ensure_all_provisioned/0 runs at every boot from SystemInitializer and is idempotent: already-mounted tiers are skipped, missing devices are no-ops, tmpfs tiers re-mount cleanly after reboot.
On first boot (no write tier in DB), the system auto-creates a tmpfs-backed write tier with 30% MemAvailable allocation, mount point /mnt/nvme_write. This gives a working DVR pipeline out-of-the-box on any host with enough RAM. Operator can later switch įrenginys to a physical NVMe via UI without losing other tier nustatymai.
Srautas.archive_path/1 returns the first 'healthy' tier — write_buffer if mounted+writable+free_pct above safety floor, otherwise falls back to archive (degraded mode). Safety floor 20% for tmpfs (RAM-strict), 2% for blokuoti devices. tier_health galinis taškas exposes per-tier mounted/writable/free_pct for monitoring.
Changing tmpfs_size_pct in UI triggers umount + remount with the naujas dydis on Išsaugoti. Aktyvu DVR writes are briefly paused (mount transition < 1 s). Recommendation: change tmpfs dydis only when DVR write rate is low, and consider restarting srautai after to ensure they pick up the naujas mount cleanly.
Bazinis URL — OSTV Player
Paketo laukai
Paketų API
Slaptažodis Policy
Pardavėjo API
Nustatymai
Vartotojo laukai
Vartotojų valdymas
Bazinis URL — OSTV grotuvas
OSTV grotuvo programa leidzia vartotojams keisti serverio bazini URL (API adresa). Si funkcija prieinama tik vartotojams, kuriu teikejjas nustatytas kaip root.
Priezastis: Bazinio URL keitimas skirtas tik administratoriams/root vartotojams, kad galetu perjungti tarp serveriu (pvz. gamybos ir testavimo). Iprasti vartotojai turi fiksuota bazini URL ir negali jo keisti.
Vartotojo laukai
Paketu API
Grazina visu aktyviu paketu su kainomis ir atsiskaitymo laikotarpiais sarasa.
Valdymo vartotoju (perpardaveju / teikeeju) sarasas.
Grazina konkretaus valdymo vartotojo kreditu balansa.
Paketo laukai
Perpardavejo API
API perpardavejams/teikejams. Autorizacija: Authorization: Bearer mtk_... (prieigos raktas is Valdyti vartotojus). Perpardavejas mato tik savo klientus (owner_id).
Slaptazodzio politika
Kuriant prenumeratoriu reikalingas slaptazodis. Taisykles:
Maziausiai 8 simboliai
Bent 1 didzioji raide (A-Z)
Bent 1 specialus simbolis (!@#$%^&* ir kt.)
Taikoma UI ir API. Atnaujinant slaptazodis neprivalomas, bet jei nurodytas, turi atitikti taisykles.
Nustatymai
Automatinis sluoksnio paruosimas ir sauga
Automatinis talpos ir failu sistemos aptikimas: kai is iskledziamojo saraso pasirenkamas laisvas NVMe, talpa (GB) nuskaitoma is lsblk -bn -o SIZE, o esama FS is blkid. Forma rodo tik skaitymo reiksmes — jokio rankinio ivedimo.
Sluoksnio isvalymo mechanizmas — nuolatinis kopijavimas
StorageTierFlush GenServer veikia kas 60s. Jis nuolat kopijuoja segmentus i RAID, palaikydamas 2h karsta langa NVMe greitam neseniai persukimui. Du etapai yra atskirti — kopijavimas ir trynimas yra atskiros, tikrintos operacijos.
Kodel nuolatinis kopijavimas lenkia paketini perkejima: (1) RAID apkrova lygi — jokie 5GB papliupai valandu sanduurose; (2) Dauguma karstu duomenu jau yra RAID; (3) Istrinimas tikrinamas failu — daliniai gedimai aptinkami pries pametant NVMe duomenis.
Saugumas vykdomu segmentams: kopijavimas renkasi tik failus senesnius nei MIRROR_MIN_AGE_MINUTES per find -mmin +5.
Derinimas kiekvienam diegimui (.env)
500-1000
Dydizio taisykle:
DVR perziuros kalendorius
DVR perziuros skirtukas rodo serveryje sugeneruota kalendoriu, kuriame paryskintos tik tos dienos, kurioms yra irasu diske.
Dienoms su irasais galima spusteleti (melyna) — spustelojus data is anksto irasoma i datos/laiko ivesti ta diena 00:00.
Igyvendinta Stream.available_dvr_days/1 per find -mindepth 4 -maxdepth 4 -type d kiekvienam sluoksnio prijungimo taskui.
Apžvalga
The B2C (Verslas su šalimis) API provides authentication and srautas access for end-vartotojas player applications. Vartotojai autentifikuoti with vartotojo vardas/slaptažodis and receive a laikas-limited auth žeton for subsequent requests.
Autentifikuoti a vartotojas and obtain an auth_token for subsequent API calls.
Metodas
Galinis taškas
Prašymas Kūnas
Parametras
Tipas
Būtina
Aprašas
Taip
Vartotojas prisijungti pavadinimas
Vartotojas slaptažodis
Example Prašymas
Atsakymas Fields
Sėkminga Atsakymas (200)
Encrypted authentication žeton for subsequent API calls
Žeton expiration duomenys/laikas in ISO 8601 formatas
Example Sėkminga Atsakymas
Klaida Atsakymas (403)
Klaida aprašas žinutė
HTTP būsena kodas
Example Klaida Atsakymas
Retrieve informacija about the authenticated vartotojas using the auth žeton.
Atsakymas Fields
Vartotojo vardas of the authenticated vartotojas
Serveris žinutė (empty if nė vienas)
Autentifikacijos būsena (1 = authenticated)
Account būsena: Aktyvu, Banned, Disabled, Trial
Account expiration duomenys (null if unlimited)
Number of dabartinis aktyvu connections
Account creation duomenys in ISO 8601 formatas
Maksimalus leistinas vienu metu vykdomų ryšių skaičius
List of allowed išvestis srautas formats
Provider pavadinimas of the vartotojas's owner/reseller (null if nė vienas)
URL of the provider logo image (null if nė vienas)
URL of the provider collapse logo image 208x208 (null if nė vienas)
Dabartinis serveris laikas in ISO 8601 formatas
Example Prašymas
Retrieve categories filtered by tipas. Available types: live (srautai), vod (movies), series.
Kategorija tipas: live, vod, or series
Kategorija ID as string
Kategorija display pavadinimas
Parent kategorija ID (0 if root)
MD5 heš of content for cache invalidation
Example Prašymas
Retrieve detailed informacija for a specific VOD item, including metadata and srautas links.
VOD srautas ID (UUID)
Viršelio paveikslėlio URL
TMDB identifikatorius
Fono paveikslėlio URL
Žanro eilutė
Plot / aprašas
Aktorių sąrašas
Rating vertė (0-10)
Director pavadinimas
Leidimas duomenys
Duration in sekundės
Trukmė formatuotu tekstu
Array of kategorija IDs
1, jei tai suaugusiems skirtas turinys, 0 – kitu atveju
VOD srautas ID
VOD pavadinimas
Duomenys added (ISO 8601)
Srautas link URLs
Vaizdo įrašas/garsas codec metadata
Retrieve series informacija with full season and episode listings, grouped by season number.
Serijos ID (UUID)
Sezono numeris
Season display pavadinimas
Epizodų skaičius sezone
Air duomenys of the season
Season apžvalga / aprašas
Sezono viršelio paveikslėlio URL
Map keyed by season number string. Each vertė is an array of episode objects.
Epizodo objekto laukai
Epizodo ID
TMDB epizodo ID
Epizodo numeris sezone
Duomenys added (ISO 8601)
Sezono numeris
Episode informacija object (same structure as VOD informacija)
Srautas link URLs
Vaizdo įrašas/garsas codec metadata
Žeton expiration depends on vartotojas vaidmuo: administratorius = 365 dienos, other = 30 dienos|Disabled accounts cannot autentifikuoti (returns 403)|Each successful prisijungti updates the vartotojas's last_login timestamp|Tokens are encrypted and contain user_id, vartotojo vardas, vaidmuo and expiration
Sėkminga Atsakymas (200)
Auth žeton obtained from /auth galinis taškas