×

📺 IPTV

B2C · Xtream · Reseller

IPTV Manage Vartotojai

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

Mirror, not perkelti

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)

Talpa calc

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.

Skaitymai (pažinimas pagal sluoksnius)

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.

tmpfs Virtual Disk (dev/bandymas)

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.

Dydis in % free RAM

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.

OOM saugos apsauga

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.

Perkraunant išsaugoma

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.

Kada naudoti tmpfs

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.

Greitesnis išvalymas tmpfs

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.

Automatinis sluoksnių paruošimas ir saugumas

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.

Numatytasis boot seed

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.

Sveikata ir perjungimas

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.

Live dydis change

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

IPTV Manage Vartotojai

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.

B2C grotuvo API

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.

Autentifikacija

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

Vartotojo informacija

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

Kategorijos

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

VOD detalės

Retrieve detailed informacija for a specific VOD item, including metadata and srautas links.

VOD srautas ID (UUID)

Informacija Object Fields

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 objekto laukai

VOD srautas ID

VOD pavadinimas

Duomenys added (ISO 8601)

Srautas link URLs

Vaizdo įrašas/garsas codec metadata

Serijos detalės

Retrieve series informacija with full season and episode listings, grouped by season number.

Serijos ID (UUID)

Sezonų masyvo laukai

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

Epizodų objektas

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

Episode pavadinimas

Duomenys added (ISO 8601)

Sezono numeris

Episode informacija object (same structure as VOD informacija)

Srautas link URLs

Vaizdo įrašas/garsas codec metadata

Pastabos

Ž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