×

📺 IPTV

B2C · Xtream · Reseller

IPTV Benutzer verwalten

Archiv-Speicherstufen

Dreistufiges Archivsystem für 500+ gleichzeitige Clients. Konfigurieren Sie dies unter Konfiguration > Speicher > Speichertiers. Jeder Tier hat einen unabhängigen Lebenszyklus, eine Kapazitätsberechnung und ein Fallback-Verhalten.

Encoder — Hardware-Encoder-Status.

Schreibpuffer

2h Hot-Window (NVMe oder tmpfs)

-> Mirror (kontinuierlich)

Archiv-Flow — schreibt auf Speichertier.

50 TB, 14 Tage Aufbewahrung

-> Prefetch on Demand

Playback-Cache

1 TB warm cache, 500+ Clients

Clients — aktive IPTV-Streams.

Spiegeln, nicht verschieben

Segmente älter als mirror_min_age_minutes werden kontinuierlich auf RAID KOPIERT. Der Write-Buffer hält ein rollierendes 2h-Hot-Window, damit Spulen-zum-aktuellen Abspielen auf schnellem Speicher bleibt. Erst nach evict_age_minutes (und nur wenn verifiziert-gespiegelt) werden Segmente aus Write-Buffer gelöscht. RAID hat immer die Langzeit-Kopie – keine stündlichen Burst-Übertragungen.

Stufe

Zweck

Einstellungen

Schreibpuffer

Empfängt Segmente rund um die Uhr, hält ein 2-stündiges Hot-Window für schnelles Zurückspulen von aktuellen Inhalten und schützt das RAID vor zufälligem E/A. Das Gerät kann eine physische NVMe-Partition (Produktion) oder tmpfs (Dev/Test-Box ohne physische NVMe — siehe tmpfs-Abschnitt unten) sein.

device_path (Block-Gerät oder 'tmpfs'), tmpfs_size_pct (10-50 % MemAvailable bei tmpfs), mirror_min_age_minutes, evict_age_minutes, flush_threshold_percent (Flush-Trigger erzwingen)

HDD-RAID-Archiv

Langzeitspeicher für vollständige Aufbewahrung (Standard 14 Tage). Erhält kontinuierliche Spiegeltropfen vom Write-Buffer – sequentielle Schreibvorgänge, keine stündlichen Bursts. Übersteht Neustart. RAID übersteht Ausfall einer Festplatte.

retention_days, raid_device, nginx_location, min_free_percent

Playback-Cache (optional)

Lese-Cache für beliebte Dateien, die älter als 2 Stunden sind (z. B. EPG-Catch-up). Wird bei Bedarf aus dem Archiv befüllt, nachdem die Popularitätsschwelle überschritten wurde (3 Treffer / 5 Min.). Das Gerät kann NVMe oder tmpfs sein.

prefetch_hours, max_sessions, eviction_policy (session/lru/fifo)

Kapazitätsberechnung

live writes × 2h = Größe des write_buffer Hot-Fensters. Beispiel: 50 Streams × 8 Mbps × 2h ≈ 36 GB. Fügen Sie ~30 % Puffer für den Mirror-Trickle-Backlog hinzu → ~50 GB write_buffer reichen für 50 Streams. RAID für die vollständige Aufbewahrung: 50 × 8 Mbps × 14 Tage ≈ 6 TB.

Lesevorgänge (tier-aware lookup)

Stream.dvr_file_path/2 prüft Write-Buffer → Playback-Cache → Archiv der Reihe nach. Ein Segment im 2h-Hot-Window wird auch vom Write-Buffer mit nativen Geschwindigkeiten bereitgestellt, obwohl es auch auf RAID existiert. Nginx X-Accel-Redirect bedient Dateien direkt ohne Phoenix.

tmpfs-Virtualdisk (Dev/Test)

Jede Stufe kann ein RAM-gestütztes tmpfs Virtual Disk statt eines physischen Block-Geräts verwenden. Nützlich für Dev-Boxen ohne Ersatz-NVMe oder für ephemere Test-Umgebungen. Storage Tier Card Device Dropdown enthält eine 'tmpfs (virtuelles Disk aus RAM)'-Option, die den Geräte-Pfad-Selector durch einen Prozentsatz-Schieber ersetzt.

Größe in % freier RAM

Zuteilung wird als Prozentsatz des MemAvailable (aus /proc/meminfo) angegeben – Schritt 10, gültige Werte 10/20/30/40/50. Harte Untergrenze 10 % (Validierung lehnt darunter ab). Harte Obergrenze 50 %. Standard 30 %. Auf Host mit 100 GB MemAvailable: 10 % = 10 GB, 30 % = 30 GB, 50 % = 50 GB. Größe wird neu berechnet und live remountet, wenn der Schieber verschoben und gespeichert wird.

OOM-Sicherheitswächter

Wenn berechnetes Ziel 60 % von aktuellen MemAvailable übersteigen würde, wird Mount verweigert und die Stufe bleibt offline (Stream.archive_path fällt auf nächste gesunde Stufe). Verhindert, dass eine aggressive Einstellung den BEAM via OOM killt. Der Wächter läuft sowohl beim Boot als auch bei jedem Speichern in der UI.

Neustart-Persistenz

tmpfs lebt im RAM — jeder im Puffer befindliche Inhalt geht beim Neustart des Hosts VERLOREN. Der beim Bereitstellen geschriebene fstab-Eintrag remountet das leere tmpfs beim nächsten Booten automatisch, aber alte Segmente werden nicht wiederhergestellt. Die Spiegelung ins Archiv wird für alles, was vor dem Neustart bereits gespiegelt wurde, normal fortgesetzt — nur das letzte nicht gespiegelte Fenster (typischerweise < mirror_min_age_minutes) geht verloren. Verwenden Sie für die Produktion ein physisches NVMe-Gerät; tmpfs ist als Dev/Test-Ersatz gedacht.

Wann tmpfs verwendet wird

Verwenden Sie tmpfs für write_buffer, wenn: (a) die Dev/Test-Box keine freie NVMe hat, Sie aber die vollständige DVR-Pipeline für Integrationstests ausführen möchten, (b) der Operator das Spiegel- und Archivverhalten validieren möchte, ohne im Voraus NVMe zu kaufen, (c) es sich um ephemere Tests handelt, bei denen Datenverlust beim Neustart akzeptabel ist. Verwenden Sie tmpfs NICHT in der Produktion — RAM ist flüchtig und pro GB Speicherkapazität um Größenordnungen teurer als NVMe.

Schnelleres Flushen für tmpfs

Wenn die Write-Stufe tmpfs ist, verwendet StorageTierFlush straffere Defaults – mirror_min_age 2 min, evict_age 15 min (vs 5 min / 120 min für physische NVMe). RAM ist teurer als Disk, also wird das rollende Hot-Window kleiner gehalten. Bei Bedarf über MIRROR_MIN_AGE_MINUTES / EVICT_AGE_MINUTES Umgebungsvariablen überschreiben.

Tier Auto-Provisioning & Sicherheit

Tiers werden einmalig über Konfiguration > Speicher > Speichertiers konfiguriert und automatisch bereitgestellt — keine manuelle Bearbeitung von mkfs/mount/fstab auf dem Host. StorageTier.ensure_all_provisioned/0 wird bei jedem Booten vom SystemInitializer ausgeführt und ist idempotent: bereits gemountete Tiers werden übersprungen, fehlende Geräte sind No-ops, tmpfs-Tiers werden nach dem Neustart sauber neu gemountet.

Standard-Boot-Seed

Beim ersten Booten (kein Write-Tier in der DB) erstellt das System automatisch ein tmpfs-basiertes Write-Tier mit einer Zuweisung von 30 % des verfügbaren Speichers (MemAvailable), Mountpoint /mnt/nvme_write. Dies bietet eine funktionierende DVR-Pipeline „out of the box“ auf jedem Host mit ausreichend RAM. Der Betreiber kann das Gerät später über die Benutzeroberfläche auf ein physisches NVMe umstellen, ohne andere Tier-Einstellungen zu verlieren.

Gesundheit & Failover

Stream.archive_path/1 gibt den ersten „gesunden“ Tier zurück — write_buffer, wenn er gemountet, beschreibbar und der freie Prozentsatz (free_pct) über dem Sicherheitswert liegt, andernfalls wird auf archive (degradierten Modus) zurückgegriffen. Sicherheitswert 20 % für tmpfs (RAM-streng), 2 % für Blockgeräte. Der Endpunkt tier_health gibt den gemounteten Zustand, die Beschreibbarkeit und free_pct pro Tier für Monitoring-Zwecke aus.

Live-Größenänderung

Ändern von tmpfs_size_pct in der UI löst Umount + Remount mit neuer Größe beim Speichern aus. Aktive DVR-Schreibvorgänge werden kurz pausiert (Mount-Übergang < 1 s). Empfehlung: tmpfs-Größe nur ändern, wenn DVR-Schreibrate niedrig ist, und Streams nach dem Neustart in Betracht ziehen, um sicherzustellen, dass sie die neue Mount sauber aufgreifen.

Basis-URL - OSTV Player

Paketfelder

Pakete-API

Passwortrichtlinie

Reseller-API

Einstellungen

Benutzerfelder

Benutzerverwaltung

IPTV Benutzer verwalten

Basis-URL — OSTV-Player

Die OSTV-Player-Anwendung ermöglicht es Benutzern, die Server-Basis-URL (API-Adresse) zu ändern. Diese Funktion ist nur für Benutzer mit Provider-Einstellung 'root' verfügbar.

Grund: Das Ändern der Basis-URL ist nur für Administratoren/Root-Benutzer vorgesehen, damit diese zwischen Servern wechseln können (z.B. Produktion vs. Test). Normale Benutzer haben eine feste Basis-URL und können diese nicht ändern.

Benutzerfelder

Pakete-API

Gibt eine Liste aller aktiven Pakete mit Preisen und Abrechnungszeiträumen zurück.

Liste der Verwaltungsbenutzer (Wiederverkäufer / Anbieter).

Gibt das Guthaben für einen bestimmten Verwaltungsbenutzer zurück.

Paketfelder

Wiederverkäufer-API

API für Wiederverkäufer/Anbieter. Autorisierung: Authorization: Bearer mtk_... (Token von Benutzer verwalten). Wiederverkäufer sehen nur ihre eigenen Kunden (owner_id).

Kennwortrichtlinie

Kennwort ist beim Erstellen eines Abonnenten erforderlich. Regeln:

Mindestens 8 Zeichen

Mindestens 1 Großbuchstabe (A-Z)

Mindestens 1 Sonderzeichen (!@#$%^&* usw.)

Gilt für UI und API. Bei Aktualisierung ist das Kennwort optional, muss jedoch bei Angabe die Regeln erfüllen.

Einstellungen

Tier-Auto-Provisionierung &amp; Sicherheit

Kapazitäts- + Dateisystem-Automerkennung: Bei Auswahl einer freien NVMe aus dem Dropdown wird die Kapazität (GB) aus lsblk -bn -o SIZE und das aktuelle Dateisystem aus blkid gelesen (mit Gesamtlaufwerk-Fallback). Das Formular zeigt die gelesenen Werte schreibgeschützt — keine manuelle Eingabe, keine Fehler.

Tier-Flush-Mechanismus — Kontinuierlicher Spiegel

StorageTierFlush GenServer läuft alle 60s. Statt auf ein Stundenverzeichnis zu warten, das 'ausläuft' und als 5-GB-Burst verschoben wird, überträgt er Segmente kontinuierlich auf RAID, während ein 2-Stunden-Hotfenster auf NVMe für schnellen Rückspul-Zugriff erhalten bleibt. Die zwei Phasen sind entkoppelt — Kopieren und Löschen sind separate, verifizierte Operationen.

Warum kontinuierlicher Spiegel 'Warte 60min, Batch-Verschieben' übertrifft: (1) RAID-Last ist gleichmäßig — keine 5-GB-Bursts an Stundengrenzen, nur kontinuierlicher 7-MB-Segmentstrom; (2) Die meisten Hot-Daten sind bereits auf RAID — bei Katastrophenwiederherstellung gehen nur wenige Minuten verloren; (3) Auslagerung wird pro Datei verifiziert — ein partieller Spiegelfehler wird erkannt, bevor NVMe-Daten verloren gehen.

Sicherheit laufender Segmente: Der Spiegel wählt nur Dateien aus, die älter als MIRROR_MIN_AGE_MINUTES sind, via find -mmin +5. Eine Segmentdatei, die noch von FFmpeg geschrieben wird, erscheint nicht in der Liste — kein Risiko einer Teilschreib-Übertragung.

Bereitstellungsspezifische Feinabstimmung (.env)

IPTV-Bouquet-Verwaltung

Größenregel:

DVR-Vorschau-Kalender

Der DVR-Vorschau-Tab zeigt einen serverseitig gerenderten Kalender, der nur die Tage hervorhebt, für die Aufnahmen auf der Festplatte vorhanden sind. Der Scan läuft über alle Tiers (write_buffer + read_cache + archive + legacy), damit ein Segment, das gerade von NVMe auf RAID übertragen wurde, sofort sichtbar bleibt.

Tage mit Aufnahmen sind anklickbar (blau) — Klicken füllt das Datumseingabefeld mit diesem Tag um 00:00 vor; der Benutzer wählt dann die Stunde. Tage ohne Aufnahme sind abgeblendet und inaktiv.

Implementiert in Stream.available_dvr_days/1 via find -mindepth 4 -maxdepth 4 -type d auf jedem Tier-Mount; tier-übergreifend dedupliziert (ein Tag wird nur einmal angezeigt, auch wenn er während eines Flush-Fensters Segmente in mehreren Tiers hat).

B2C-Player-API

Übersicht

Die B2C-API (Business-to-Consumer) bietet Authentifizierung und Stream-Zugang für Endbenutzer-Player-Anwendungen. Benutzer authentifizieren sich mit Benutzername/Passwort und erhalten ein zeitlich begrenztes Auth-Token für nachfolgende Anfragen.

Authentifizierung

Benutzer authentifizieren und ein auth_token für nachfolgende API-Aufrufe erhalten.

Methode

Endpunkt

Anfragekörper

Parameter

Typ

Erforderlich

Beschreibung

Ja

Benutzer-Login-Name

Benutzerpasswort

Beispielanfrage

Antwortfelder

Erfolgsantwort (200)

Verschlüsseltes Authentifizierungs-Token für nachfolgende API-Aufrufe

Token-Verfallsdatum/Zeit im ISO 8601 Format

Beispiel: Erfolgsantwort

Fehler-Antwort (403)

Fehlerbeschreibungstext

HTTP-Statuscode

Beispiel: Fehlerantwort

Benutzer-Info

Informationen über den authentifizierten Benutzer mit dem Auth-Token abrufen.

Antwortfelder

Benutzername des authentifizierten Benutzers

Server-Nachricht (leer wenn keine)

Authentifizierungsstatus (1 = authentifiziert)

Kontostatus: Aktiv, Verboten, Deaktiviert, Testversion

Konto-Verfallsdatum (null wenn unbegrenzt)

Anzahl aktueller aktiver Verbindungen

Konto-Erstellungsdatum im ISO 8601-Format

Maximal erlaubte gleichzeitige Verbindungen

Liste der erlaubten Ausgabe-Stream-Formate

Anbietername des Eigentümers/Reseller des Benutzers (null wenn keine)

URL des Provider-Logo-Bildes (null wenn keine)

URL des Provider-Collapse-Logo-Bildes 208x208 (null falls keines)

Aktuelle Serverzeit im ISO 8601-Format

Beispielanfrage

Kategorien

Kategorien nach Typ filtert abrufen. Verfügbare Typen: live (Streams), vod (Filme), series (Serien).

Kategorietyp: live, vod oder series

Kategorie-ID als String

Kategorie-Anzeigename

Parent-Kategorie-ID (0 wenn Root)

MD5-Hash des Contents zur Cache-Invalidierung

Beispielanfrage

VOD-Details

Detaillierte Informationen für ein bestimmtes VOD-Element abrufen, einschließlich Metadaten und Stream-Links.

VOD-ID (UUID)

VOD-Titel

Coverbild-URL

TMDB-Bezeichner

Backdrop-Bild-URL

Genre-String

Handlung / Beschreibung

Cast-Mitglieder

Bewertungswert (0-10)

Regisseurname

Veröffentlichungsdatum

Dauer in Sekunden

Dauer als formatierter String

Array von Kategorie-IDs

1 wenn erwachsener Inhalt, 0 sonst

VOD-Objektfelder

VOD-Stream-ID

VOD-Titel

Hinzugefügt am (ISO 8601)

Stream-Link-URLs

Metadaten für Video-/Audio-Codec

Serien-Details

Serieninformationen mit vollständiger Staffeln- und Episodenliste abrufen, gruppiert nach Staffelnnummer.

Serien-ID (UUID)

Staffeln-Array-Felder

Staffelnnummer

Staffel-Anzeigename

Anzahl der Episoden in der Staffel

Ausstrahlungsdatum der Staffel

Staffel-Übersicht / Beschreibung

URL des Staffel-Coverbildes (null falls keines)

Episodes-Objekt

Nach Staffelnnummer-String keyed. Jeder Wert ist ein Array von Episoden-Objekten.

Episoden-Objektfelder

Episoden-ID

TMDB-Episoden-ID

Episodennummer innerhalb der Staffel

Episodentitel

Hinzufügungsdatum (ISO 8601)

Staffelnummer

Episodeninformationsobjekt (gleiche Struktur wie VOD-Info)

Stream-Link-URLs

Video/Audio-Codec-Metadaten

Hinweise

Token-Verfall hängt von der Benutzerrolle ab: Admin = 365 Tage, andere = 30 Tage|Deaktivierte Konten können sich nicht authentifizieren (gibt 403 zurück)|Jeder erfolgreiche Login aktualisiert den last_login-Zeitstempel des Benutzers|Tokens sind verschlüsselt und enthalten user_id, Benutzername, Rolle und Verfallsdatum

Erfolgsantwort (200)

Auth-Token zur Autorisierung nachfolgender Anfragen