B2C · Xtream · Reseller





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.
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)
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Ä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
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 & 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).
Ü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.
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
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 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
Detaillierte Informationen für ein bestimmtes VOD-Element abrufen, einschließlich Metadaten und Stream-Links.
VOD-ID (UUID)
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-Stream-ID
VOD-Titel
Hinzugefügt am (ISO 8601)
Stream-Link-URLs
Metadaten für Video-/Audio-Codec
Serieninformationen mit vollständiger Staffeln- und Episodenliste abrufen, gruppiert nach Staffelnnummer.
Serien-ID (UUID)
Staffelnnummer
Staffel-Anzeigename
Anzahl der Episoden in der Staffel
Ausstrahlungsdatum der Staffel
Staffel-Übersicht / Beschreibung
URL des Staffel-Coverbildes (null falls keines)
Nach Staffelnnummer-String keyed. Jeder Wert ist ein Array von Episoden-Objekten.
Episoden-Objektfelder
Episoden-ID
TMDB-Episoden-ID
Episodennummer innerhalb der Staffel
Hinzufügungsdatum (ISO 8601)
Staffelnummer
Episodeninformationsobjekt (gleiche Struktur wie VOD-Info)
Stream-Link-URLs
Video/Audio-Codec-Metadaten
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