×

📺 IPTV

B2C · Xtream · Reseller

IPTV Hantera Användare

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

Spegla, inte flytta

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)

Kapacitetsberäkning

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.

Läsningar (nivåmedveten sökning)

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.

tmpfs Virtuell Disk (dev/test)

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.

Storlek in % free RAM

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.

OOM-säkerhetsvakt

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.

Starta om persistence

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.

När man ska använda tmpfs

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.

Snabbare flush för tmpfs

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.

Automatisk provisionering & säkerhet för nivåer

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.

Standard boot seed

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.

Hälsa & failover

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.

Live-storleksändring

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

Hantera IPTV-användare

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 &amp; 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.

B2C Spelare API

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

Autentisering

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

Användarinformation

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

Kategorier

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

VOD-detalj

Hämta detaljerad information för en specifik VOD-post, inklusive metadata och strömlänkar.

VOD-strömnings-ID (UUID)

Fält i info-objektet

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

Fält i VOD-objektet

VOD-strömnings-ID

VOD-titel

Datum added (ISO 8601)

URLer till strömlänkar

Metadata för video-/ljudcodec

Seriedetaljer

Hämta serieinformation med fullständig säsong- och avsnittslista, grupperad efter säsongnummer.

Serie-ID (UUID)

Fält i säsongsmatrisen

Säsongsnummer

Säsongens visningsnamn

Antal avsnitt i säsongen

Säsongens sändningsdatum

Säsongens översikt / beskrivning

URL till säsongens omslagsbild

Avsnittsobjekt

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

Avsnittstitel

Datum added (ISO 8601)

Säsongsnummer

Avsnittsinformation (samma struktur som VOD-info)

Strömlänkar

Metadata för video-/ljudcodec

Anteckningar

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