B2C · Xtream · Reseller





Arkivlagringsnivåer
Trenivåers arkivsystem för 500+ samtidiga klienter. Konfigurera i Konfiguration > Lagring > Lagringsnivåer. Varje nivå har oberoende livscykel, kapacitetsberäkning och fallback-beteende.
Kodare
Skrivbuffert
2h varm tidsfönster (NVMe eller tmpfs)
→ spegla (kontinuerligt)
Arkivström — skriver till lagringsnivå.
50 TB, 14 dagars behållande
→ förhandsladda vid behov
Spelningscache
1 TB varm cache, 500+ klienter
Klienter
Segment äldre än mirror_min_age_minutes kopieras kontinuerligt till RAID. Skrivbufferten håller ett rullande 2h varmt tidsfönster så att återuppspelning till nyligen sker på snabb lagring. Endast efter evict_age_minutes (och endast när verifierad speglad) raderas segment från skrivbufferten. RAID har alltid långsiktig kopia — inga timvisa burstöverföringar.
Nivå
Syfte
Inställningar
Skrivbuffert
Receives segments 24/7, holds 2h hot window for fast recent-rewind playback, protects RAID from random IO. Enhet can be a physical NVMe partition (production) or tmpfs (dev/test box without physical NVMe — see tmpfs section below).
device_path (blockenhet eller 'tmpfs'), tmpfs_size_pct (10-50% MemAvailable när tmpfs), mirror_min_age_minutes, evict_age_minutes, flush_threshold_percent (tvinga flush-triggern)
HDD RAID Arkiv
Långsiktig lagring för full retention (standard 14 dagar). Mottar kontinuerlig spegling från write_buffer — sekventiell skrivning, inga timvisa burst. Överlever omstart. RAID överlever ett diskfel.
retention_days, raid_device, nginx_location, min_free_percent
Spelningcache (valfritt)
Read-side cache for popular files older than 2h (e.g. EPG catch-up). Populated from archive on demand after popularity threshold (3 hits / 5 min). Enhet can be NVMe or tmpfs.
prefetch_hours, max_sessions, eviction_policy (session/lru/fifo)
live writes × 2h = write_buffer hot window size. Example: 50 streams × 8 Mbps × 2h ≈ 36 GB. Lägg till ~30% headroom for mirror trickle backlog → ~50 GB write_buffer is enough for 50 streams. RAID sized for full retention: 50 × 8 Mbps × 14 days ≈ 6 TB.
Stream.dvr_file_path/2 undersöker write_buffer → playback_cache → arkiv i ordning. Ett segment i det 2h varma tidsfönstret serveras från write_buffer med nativ hastighet även om det också finns på RAID. Nginx X-Accel-Redirect serverar filer direkt utan att gå genom Phoenix.
Varje nivå kan använda en RAM-baserad tmpfs-virtuell disk istället för en fysisk blockenhet. Användbart för dev-maskiner utan ledig NVMe, eller för flyktiga testmiljöer. Dropdown-menyn för enhet på Storage Tier-kortet innehåller ett alternativ 'tmpfs (virtuell disk från RAM)' som ersätter enhetsvägsväljaren med en procentreglage.
Allocation is specified as a percentage of MemAvailable (from /proc/meminfo) — step 10, valid values 10/20/30/40/50. Svår floor 10% (validation rejects below). Svår ceiling 50%. Standard 30%. On a 100 GB MemAvailable host: 10% = 10 GB, 30% = 30 GB, 50% = 50 GB. Storlek is recomputed and remounted live when the slider is moved and saved.
If computed target would exceed 60% of current MemAvailable, the mount is refused and the tier remains offline (Stream.archive_path falls through to the next healthy tier). Prevents an aggressive setting from killing the BEAM via OOM. The guard runs both at boot and on every Spara in the UI.
tmpfs finns i RAM — allt buffertinnehåll som är under överföring FÖRLORAS när värden startar om. fstab-posten som skrivs vid provisionering monteras automatiskt om den tomma tmpfs vid nästa start, men gamla segment återvänder inte. Spegling till arkivet fortsätter normalt för allt som redan har speglats innan omstarten — endast det sista ospeglande fönstret (vanligtvis < mirror_min_age_minutes) förloras. För produktion, använd en fysisk NVMe-enhet; tmpfs är avsett som en dev/test-substitut.
Use tmpfs for write_buffer when: (a) dev/test box has no spare NVMe but you still want the full DVR pipeline körs 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.
När skrivnivån är tmpfs använder StorageTierFlush tightare standardvärden — mirror_min_age 2 min, evict_age 15 min (jämfört med 5 min / 120 min för fysisk NVMe). RAM är dyrare än disk så det rullande varma fönstret hålls mindre. Överskriv via MIRROR_MIN_AGE_MINUTES / EVICT_AGE_MINUTES miljövariabler vid behov.
Nivåer konfigureras en gång via Konfiguration > Lagring > Lagringsnivåer och provisioneras automatiskt — ingen manuell mkfs/mount/fstab-redigering på värden. StorageTier.ensure_all_provisioned/0 körs vid varje start från SystemInitializer och är idempotent: redan monterade nivåer hoppas över, saknade enheter är no-ops, tmpfs-nivåer monteras om rent efter omstart.
Vid första start (ingen skrivnivå i databasen) skapar systemet automatiskt en tmpfs-baserad skrivnivå med 30 % MemAvailable-allokering, monteringspunkt /mnt/nvme_write. Detta ger en fungerande DVR-pipeline direkt ur lådan på alla värdar med tillräckligt med RAM. Operatören kan senare växla enhet till en fysisk NVMe via gränssnittet utan att förlora andra nivåinställningar.
Stream.archive_path/1 returnerar den första 'hälsosamma' nivån — write_buffer om monterad+skrivbar+free_pct ovanför säkerhetsgränsen, annars faller tillbaka till arkiv (degraderat läge). Säkerhetsgräns 20 % för tmpfs (RAM-strict), 2 % för blockenheter. tier_health-endpointen exponerar per-nivå monterad/skrivbar/free_pct för övervakning.
Changing tmpfs_size_pct in UI triggers umount + remount with the new size on Spara. Aktiv DVR writes are briefly paused (mount transition < 1 s). Recommendation: change tmpfs size only when DVR write rate is low, and consider restarting streams after to ensure they pick up the new mount cleanly.
Bas-URL — OSTV Player
Paketfält
Paket-API
Lösenord Policy
Återförsäljar-API
Inställningar
Användarfält
Användarhantering
Bas-URL — OSTV Player
OSTV Player-applikationen låter användare ändra serverns bas-URL (API-adress). Denna funktion är bara tillgänglig för användare med provider satt till root.
Orsak: Att ändra bas-URL är avsett enbart för administratörer/root-användare så de kan växla mellan servrar (t.ex. produktion vs. test). Vanliga användare har en fast bas-URL och kan inte ändra den.
Användarfält
Paket-API
Returnerar en lista med alla aktiva paket med priser och faktureringsperioder.
Lista med hanteringsanvändare (återförsäljare / leverantörer).
Returnerar kreditbalans för en specifik hanteringsanvändare.
Paketfält
Återförsäljar-API
API för återförsäljare/leverantörer. Auktorisering: Authorization: Bearer mtk_... (token från Hantera Användare). Återförsäljaren ser bara sina egna klienter (owner_id).
Lösenordspolicy
Lösenord krävs vid skapande av prenumerant. Regler:
Minst 8 tecken
Minst 1 versal (A-Z)
Minst 1 specialtecken (!@#$%^&* etc.)
Gäller UI och API. Vid uppdatering är lösenord valfritt, men om det anges måste det uppfylla reglerna.
Inställningar
Tier Auto-provisionering & Säkerhet
Kapacitets- + filsystemets autodetektering: när en ledig NVMe väljs från listan läses kapacitet (GB) från lsblk -bn -o SIZE och aktuellt filsystem från blkid (med helskivefallback). Formuläret visar värdena skrivskyddat — ingen manuell inmatning, inga misstag.
Tier-tömningsmekanizm — Kontinuerlig spegel
StorageTierFlush GenServer körs var 60:e sekund. Istället för att vänta på att en timkatalog åldras och flytta den som ett 5 GB-burst, strömmar den segment till RAID kontinuerligt och håller ett 2-timmars hett fönster på NVMe för snabb tillbakaspolning.
Varför kontinuerlig spegling slår vänta 60 min, batchflytta: (1) RAID-belastningen är jämn — inga 5 GB-burstar vid timbegränsningar; (2) De flesta heta data finns redan på RAID; (3) Avlägsnandet verifieras per fil.
Säkerhet för pågående segment: spegeln hämtar bara filer äldre än MIRROR_MIN_AGE_MINUTES via find -mmin +5. En segmentfil som fortfarande skrivs av FFmpeg visas inte i listan.
Per-driftsättningsjustering (.env)
IPTV-bouquet-hantering
Storleksregel:
DVR-förhandsvisningskalender
DVR-förhandsvisningsfliken visar en serverrenderad kalender som markerar enbart de dagar för vilka inspelningar finns på disk. Skanningen körs över varje nivå (write_buffer + read_cache + archive + legacy).
Dagar med inspelningar är klickbara (blå) — ett klick fyller i datum/tid-inmatningen med den dagen kl. 00:00; användaren väljer sedan timme. Dagar utan inspelning är nedtonade och inaktiva.
Implementerat i Stream.available_dvr_days/1 via find -mindepth 4 -maxdepth 4 -type d på varje nivåmontage; deduplicerat över nivåer.
Översikt
B2C-API:t (Business-to-Consumer) tillhandahåller autentisering och strömåtkomst för slutanvändarspelarapplikationer. Användare autentiserar med användarnamn/lösenord och erhåller en tidsbegränsad auth_token för efterföljande begäranden.
Autentisera en användare och erhåll en auth_token för efterföljande API-anrop.
Metod
Slutpunkt
Begäranskropp
Parameter
Typ
Krävs
Beskrivning
Ja
Användarens inloggningsnamn
Användarlösenord
Exempel på begäran
Svarsfält
Framgång Response (200)
Krypterat autentiseringstoken för efterföljande API-anrop
Tokenens utgångsdatum/tid i ISO 8601-format
Example Framgång Response
Fel Response (403)
Fel description message
HTTP-statuskod
Example Fel Response
Hämta information om den autentiserade användaren med hjälp av autentiseringstoken.
Svarsfält
Användarnamn of the authenticated user
Servermeddelande (tomt om inget)
Autentiseringsstatus (1 = autentiserad)
Account status: Aktiv, Banned, Inaktiverad, Trial
Kontots utgångsdatum (null om obegränsat)
Antal nuvarande aktiva anslutningar
Kontots skapelsedatum i ISO 8601-format
Maximalt allowed simultaneous connections
Lista of allowed output stream formats
Leverantörens namn för användarens ägare/återförsäljare (null om ingen)
URL till leverantörens logotyp (null om ingen)
URL till leverantörens kollapslogotyp 208x208 (null om ingen)
Nuvarande servertid i ISO 8601-format
Exempel på begäran
Hämta kategorier filtrerade efter typ. Tillgängliga typer: live (strömmar), vod (filmer), serie.
Kategorityp: live, vod eller serie
Kategori-ID som sträng
Kategoriens visningsnamn
Överordnad kategori-ID (0 om rot)
MD5-hash av innehåll för cache-ogiltigförklaring
Exempel på begäran
Hämta detaljerad information för en specifik VOD-post, inklusive metadata och strömlänkar.
VOD-strömnings-ID (UUID)
URL till omslagsbild
TMDB-identifierare
URL till bakgrundsbild
Genresträng
Handling / beskrivning
Skådespelare
Betygsvärde (0-10)
Regissörens namn
Utgivningsdatum
Varaktighet in seconds
Varaktighet as formatted string
Matris med kategori-ID:n
1 om det är vuxeninnehåll, annars 0
VOD-strömnings-ID
VOD-titel
Datum added (ISO 8601)
URLer till strömlänkar
Metadata för video-/ljudcodec
Hämta serieinformation med fullständig säsong- och avsnittslista, grupperad efter säsongnummer.
Serie-ID (UUID)
Säsongsnummer
Säsongens visningsnamn
Antal avsnitt i säsongen
Säsongens sändningsdatum
Säsongens översikt / beskrivning
URL till säsongens omslagsbild
Kartan nycklas efter säsongens nummersträng. Värdena är en matris med avsnittsobjekt.
Fält i avsnittsobjekt
Avsnitts-ID
TMDB-avsnitts-ID
Avsnittsnummer inom säsongen
Datum added (ISO 8601)
Säsongsnummer
Avsnittsinformation (samma struktur som VOD-info)
Strömlänkar
Metadata för video-/ljudcodec
Token expiration depends on user role: admin = 365 days, other = 30 days|Inaktiverad accounts cannot authenticate (returns 403)|Each successful login updates the user's last_login timestamp|Tokens are encrypted and contain user_id, username, role and expiration
Framgång Response (200)
Autentiseringstoken som erhålls från /auth-slutpunkten