Files
Homelab--Bratonein-Kontroll…/Kapitel 11/Premium Rohtext.md

494 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Premium Simulcast, Aufzeichnung & Multichat mit OvenMediaEngine
Im Free-Kapitel hast du eine funktionsfähige RTMP-Struktur aufgebaut:
OvenMediaEngine (OME) empfängt Streams, leitet sie zuverlässig an eine Plattform weiter und wird über OvenStudio überwacht.
Damit ist die technische Basis gelegt ein stabiler Streaming-Server, der eigenständig arbeitet.
Im Premium-Teil erweitern wir dieses System zu einer vollwertigen Produktionsumgebung.
Du lernst, wie OME mehrere Plattformen gleichzeitig versorgt, Streams automatisch aufzeichnet und zentral gesteuert wird ergänzt durch einen lokal gehosteten Multichat, der alle Plattform-Chats in einer Oberfläche zusammenführt.
Das Ziel ist nicht mehr nur „senden können“, sondern **produzieren, überwachen und interagieren** alles lokal, ohne externe Dienste.
In diesem Kapitel behandeln wir:
1. **Simulcast-Konfiguration**
Mehrere RTMP-Ausgänge gleichzeitig Twitch, YouTube, Kick und weitere.
Effiziente Struktur, Ressourcen-Optimierung und Fehlerabsicherung.
2. **Automatische Aufzeichnung**
Parallele lokale Mitschnitte aller Streams mit automatischer Ablage und optionalem Upload in Nextcloud.
N8n sorgt für Kontrolle, Benachrichtigung und Wiederherstellung im Fehlerfall.
3. **Integration mit n8n & Vaultwarden**
OME-Statusüberwachung, Key-Rotation, automatische Neustarts und sichere Verwaltung aller Zugangsdaten ohne manuelle Eingriffe.
4. **Multichat-Server (lokal gehostet)**
Ein zentrales Chat-System bündelt Nachrichten aus Twitch, YouTube und Kick.
Anzeige direkt in OBS (Dock oder Browserquelle) oder TouchPortal.
Filter, Moderation und KI-Analyse lassen sich später über n8n erweitern.
> [!NOTE]
> Alle Erweiterungen basieren auf der bestehenden Installation aus dem Free-Kapitel.
> Die dort erstellte Grundkonfiguration bleibt unverändert und wird hier lediglich ergänzt.
> Stelle sicher, dass dein OME-Container betriebsbereit ist, bevor du mit diesem Abschnitt beginnst.
Mit diesen Erweiterungen wird dein RTMP-Server zu einem zentralen Baustein des gesamten UCC-Systems
eine eigenständige Streaming-Plattform, die Senden, Interaktion und Archivierung vollständig lokal abbildet.
---
## Simulcast mehrere Plattformen gleichzeitig streamen
Der größte Vorteil von OvenMediaEngine ist die Möglichkeit, dasselbe Eingangssignal gleichzeitig an mehrere Zielplattformen zu senden.
Damit erreichst du Twitch, YouTube, Kick oder jede andere RTMP-fähige Plattform in einem einzigen Durchlauf ohne externe Dienste wie Restream.io und ohne zusätzliche Cloudkosten.
### Ziel des Abschnitts
Du richtest OME so ein, dass es dein eingehendes RTMP-Signal automatisch an mehrere Ausgänge verteilt.
Jede Plattform erhält denselben Stream, aber mit eigenem Schlüssel und eigener Verbindung.
Die Verteilung erfolgt intern, ohne dass OBS oder dein Encoder mehrfach senden muss.
> [!NOTE]
> Für diesen Abschnitt benötigst du dieselbe OME-Installation wie im Free-Kapitel.
> Es wird lediglich die Konfiguration erweitert.
> Keine Neuinstallation nötig.
> [!IMPORTANT]
> Dein Stream wird nur **ein einziges Mal in OBS** gerendert und anschließend von OME **dupliziert**.
> Das bedeutet: keine zusätzliche CPU- oder GPU-Belastung durch Mehrfach-Streams.
> Dein Encoder arbeitet exakt wie vorher OME übernimmt die gesamte Verteilung im Hintergrund.
### Schritt 1 Struktur verstehen
OME arbeitet in Blöcken:
- **Input:** nimmt den Stream von OBS an
- **Application:** verwaltet, was mit dem Signal geschieht
- **Output:** legt fest, wohin es gesendet wird
Im Free-Kapitel hattest du nur **einen Output**.
Jetzt fügst du mehrere hinzu einen pro Plattform.
Beispielhafte Struktur:
```xml
<Application>
<Name>live</Name>
<Output>
<Target>
<Type>RTMP</Type>
<URL>rtmp://live.twitch.tv/app/</URL>
<StreamKey>TWITCH_KEY</StreamKey>
</Target>
<Target>
<Type>RTMP</Type>
<URL>rtmp://a.rtmp.youtube.com/live2/</URL>
<StreamKey>YOUTUBE_KEY</StreamKey>
</Target>
<Target>
<Type>RTMP</Type>
<URL>rtmp://fa.kick.com/live/</URL>
<StreamKey>KICK_KEY</StreamKey>
</Target>
</Output>
</Application>
```
Jeder dieser **Target-Blöcke** repräsentiert einen eigenen Livestream-Ausgang.
So kannst du beliebig viele Plattformen gleichzeitig bedienen begrenzt nur durch deine Upload-Bandbreite und CPU-Leistung.
> [!TIP]
> Beginne mit zwei Zielen (z. B. Twitch + YouTube).
> Prüfe die Systemlast, bevor du weitere Ausgänge hinzufügst.
> Ein stabiler Upload ist wichtiger als die Anzahl der Plattformen.
### Schritt 2 Horizontal und vertikal gleichzeitig senden
Viele Creator streamen parallel im **Querformat (16:9)** für Plattformen wie Twitch oder YouTube und im **Hochformat (9:16)** für TikTok, Shorts oder Reels.
Damit du beide Formate gleichzeitig senden kannst, nutzt du in OBS ein Plugin, das mehrere unabhängige RTMP-Streams erzeugt.
Das empfohlene Plugin heißt **Multiple RTMP Outputs Plugin**.
Es erweitert OBS um zusätzliche Sendeziele, die jeweils eine eigene Szene, Auflösung und Bitrate nutzen können.
So kannst du gleichzeitig horizontal und vertikal streamen mit nur einer laufenden OBS-Instanz.
#### Einrichtung in OBS
1) Öffne OBS und installiere das Plugin „Multiple RTMP Outputs“.
2) In den Einstellungen erscheint ein neuer Reiter **Multiple Output**.
3) Klicke auf **Add new target**.
4) Gib einen Namen ein, z. B. `Vertical`.
5) Trage folgende Werte ein:
- **Server:** `rtmp://<IP-deines-OME-Servers>/vertical`
- **Streamkey:** frei wählbar (z. B. `tiktok`)
- **Resolution:** 720×1280
- **FPS:** 30
- **Bitrate:** 35005000 kbps (abhängig von deiner Uploadrate)
6) Wähle im Feld **Video Source** deine vertikale Szene oder dein Hochkant-Layout.
Du kannst für diesen Stream ein eigenes Szenen-Setup nutzen, unabhängig von der Hauptszene.
In deiner OME-Konfiguration ergänzt du dazu eine zweite Application:
```xml
<Application>
<Name>vertical</Name>
<Output>
<Target>
<Type>RTMP</Type>
<URL>rtmp://a.rtmp.tiktok.com/live/</URL>
<StreamKey>TIKTOK_KEY</StreamKey>
</Target>
</Output>
</Application>
```
Damit empfängt OME zwei getrennte Signale:
- `/live` für den klassischen 16:9-Stream
- `/vertical` für den Hochkant-Stream
Beide laufen parallel, werden unabhängig verarbeitet und können an unterschiedliche Plattformen weitergegeben werden.
> [!TIP]
> Wenn du Platz sparen willst, kannst du die vertikale Szene mit geringerer Bitrate streamen.
> Mobile Plattformen benötigen deutlich weniger Bandbreite als YouTube oder Twitch.
---
## Automatische Aufzeichnung (Recording)
Neben der gleichzeitigen Übertragung an mehrere Plattformen kann OvenMediaEngine Streams auch lokal mitschneiden.
Das ist besonders nützlich, wenn du VODs sichern, Highlights schneiden oder Material für Shorts und Reels archivieren willst.
Die Aufnahme erfolgt direkt im OME-Container, ohne dass OBS zusätzlich aufzeichnen muss.
### Ziel des Abschnitts
Du richtest OME so ein, dass alle eingehenden Streams automatisch auf der Server-Seite gespeichert werden.
Jeder Streamlauf erzeugt eine eigenständige Videodatei im gewünschten Format.
So bleibt jedes Live-Event vollständig erhalten, unabhängig von Plattformen oder VOD-Beschränkungen.
> [!NOTE]
> Die Aufzeichnung geschieht serverseitig.
> Dein Encoder sendet weiterhin nur einen Stream OME übernimmt die Speicherung automatisch.
> Damit wird dein System weniger belastet als bei gleichzeitiger Aufnahme in OBS.
### Schritt 1 Aufnahme aktivieren
Die Funktion wird in der **Server.xml** innerhalb der jeweiligen Application definiert.
Unterhalb deines `<Application>`-Blocks fügst du einen Recording-Abschnitt ein:
```xml
<Application>
<Name>live</Name>
<Recording>
<Path>/data/recordings/</Path>
<Format>mp4</Format>
<SegmentDuration>3600</SegmentDuration>
<AutoStart>true</AutoStart>
</Recording>
<Output>
...
</Output>
</Application>
```
**Erläuterung:**
- **Path** Zielordner für alle Aufnahmen (muss existieren und Schreibrechte haben)
- **Format** Containerformat der Datei (`mp4`, `mkv` oder `flv`)
- **SegmentDuration** Dauer eines Abschnitts in Sekunden (3600 = 1 Stunde)
- **AutoStart** startet die Aufnahme automatisch, sobald der Stream eingeht
> [!TIP]
> Wenn du lieber manuell startest, setze `AutoStart` auf `false`.
> Du kannst die Aufnahme dann über OvenStudio per Klick aktivieren.
### Schritt 2 Speicherort und Rechte prüfen
Standardmäßig ist `/data/recordings/` ein interner Ordner im Container.
Du kannst ihn über eine gemountete Proxmox-Disk oder ein NFS-Share mit größerem Speicherplatz verbinden.
Prüfe anschließend, ob Schreibrechte vorhanden sind:
```bash
ls -ld /data/recordings/
```
Die Ausgabe sollte `drwxrwxr-x` oder ähnlich zeigen.
Wenn nicht, Rechte anpassen:
```bash
chmod 775 /data/recordings/
```
> [!NOTE]
> Für produktive Systeme empfiehlt sich ein separater Datenträger oder ein Mount-Punkt auf deinem Storage-Server.
> So verhinderst du, dass dein Container durch Aufnahmen vollläuft.
### Schritt 3 Aufnahme testen
1) Starte einen Test-Stream über OBS an deinen OME-Input (`/live`).
2) Warte 1020 Sekunden, bis OME die Session registriert.
3) Öffne den Aufnahmeordner und prüfe, ob dort eine Datei erstellt wird, z. B.
```
/data/recordings/live_2025-10-13_20-00-00.mp4
```
4) Stoppe den Stream OME schließt die Datei automatisch sauber ab.
Wenn die Datei korrekt abgespielt werden kann, funktioniert die Aufzeichnung.
> [!TIP]
> Kontrolliere regelmäßig die Speicherbelegung.
> OME löscht alte Aufnahmen nicht automatisch.
### Schritt 4 Automatische Verwaltung mit n8n
Ziel dieses Abschnitts:
Aufnahmen aus dem OvenMediaEngine-Container automatisch sichern, übertragen und anschließend löschen.
Die Automatisierung erfolgt mit n8n über SFTP, da OME und n8n in getrennten LXC-Containern laufen.
So bleibt der Aufnahme-Container schlank und deine VODs landen automatisch im Archiv (z. B. Nextcloud oder Storage-LXC).
> [!NOTE]
> Dieser Abschnitt setzt kein Admin-Wissen voraus.
> Du kannst alle Befehle exakt so kopieren und im Container ausführen.
> Wir verwenden den Benutzer `transfer` und Port 22.
### Vorbereitung SFTP-Verbindung zwischen OME und n8n herstellen
#### 1. SSH und Benutzer im OME-Container aktivieren
```bash
pct enter <ID_OME>
apt install openssh-server -y
adduser transfer
systemctl enable --now ssh
```
Passwort vergeben und bestätigen.
IP ermitteln:
```bash
ip a
```
Beispiel: `10.0.0.152`
Testen:
```bash
sftp transfer@10.0.0.152
```
Wenn das Login funktioniert, ist die Verbindung aktiv.
> [!TIP]
> Falls SSH nicht installiert ist: `apt install openssh-server -y`
#### 2. Aufnahme-Ordner freigeben
```bash
chown -R transfer:transfer /data/recordings
chmod 755 /data/recordings
```
Der Benutzer *transfer* darf lesen und schreiben, aber keine Systemänderungen vornehmen.
#### 3. SFTP-Credential in n8n anlegen
| Feld | Wert |
|------|------|
| Host | 10.0.0.152 |
| Port | 22 |
| Username | transfer |
| Password | (dein Passwort) |
| Protocol | SFTP |
| Host Fingerprint Check | deaktiviert (optional) |
Speichern → **Test Connection** → Success.
> [!NOTE]
> Optional kannst du stattdessen SSH-Keys nutzen
> (`/home/transfer/.ssh/authorized_keys`).
### Workflow-Überblick
1. Schedule Trigger Startzeit definieren
2. SFTP List Dateien anzeigen
3. SFTP Download Datei holen
4. Nextcloud Upload File Archivierung
5. If Node Upload-Erfolg prüfen
6. SFTP Delete Original löschen
7. Discord Send Message Benachrichtigung
👉 Screenshot geeignet: *n8n-Workflow mit 7 Nodes, beginnend bei Schedule Trigger.*
### Schritt 1 Schedule Trigger
| Feld | Wert |
|------|------|
| Trigger | Every day |
| Time | 03:00 |
| Timezone | Europe/Berlin |
Dieser Node startet den Workflow einmal pro Nacht.
### Schritt 2 SFTP (List Files)
| Feld | Wert |
|------|------|
| Operation | List |
| Remote Path | `/data/recordings` |
| Recursive | false |
| Return All | true |
| Credential | `sftp_ome` |
> [!NOTE]
> Dieser Node liefert `name`, `path`, `size`, `modifiedAt`.
### Schritt 3 SFTP (Download File)
| Feld | Wert |
|------|------|
| Operation | Download |
| Remote Path | `={{ $json.path }}` |
| Binary Property | `data` |
| Credential | `sftp_ome` |
Der Node speichert die Datei als Binary-Objekt `binary.data`.
### Schritt 4 Nextcloud (Upload File)
| Feld | Wert |
|------|------|
| Resource | File |
| Operation | Upload |
| Use Binary Data | true |
| Binary Property | `data` |
| Folder Path | `/UCC/Recordings/` |
| File Name | `={{ $json.name }}` |
| Credential | `nextcloud_main` |
> [!TIP]
> Dynamische Unterordner: `/UCC/Recordings/{{ $json.path.split('/').slice(-2, -1)[0] }}/`
### Schritt 5 If (Upload erfolgreich?)
| Feld | Wert |
|------|------|
| Mode | All rules must match |
| Value 1 | `={{ $json.fileId || $json.id }}` |
| Operation | Is empty |
| Negate | true |
**TRUE** = Upload ok → weiter zu Delete
**FALSE** = Fehler → stoppt Workflow
### Schritt 6 SFTP (Delete File) (optional)
| Feld | Wert |
|------|------|
| Operation | Delete |
| Remote Path | `={{ $json.path }}` |
| Credential | `sftp_ome` |
> [!TIP]
> Falls der Delete-Node keinen Pfad sieht, verwende einen Merge-Node (Mode: Pass-Through) zwischen Download und Upload, damit Metadaten erhalten bleiben.
### Schritt 7 Discord (Send Message) (optional)
| Feld | Wert |
|------|------|
| Resource | Message |
| Operation | Create |
| Channel ID | `123456789012345678` |
| Text | `=🎥 Upload abgeschlossen: {{$json.name}} → /Recordings` |
| Credential | `discord_bot_main` |
### Troubleshooting & Tipps
> [!NOTE]
> **Keine Dateien gefunden:** Pfad im SFTP-Node prüfen, Benutzerrechte kontrollieren (`ls -la /data/recordings`).
> **Upload fehlschlägt:** „Use Binary Data“ aktiv, Zielordner in Nextcloud existiert.
> **Delete funktioniert nicht:** Pfad fehlt → Merge Node zwischen Download und Upload setzen.
> **SFTP-Verbindung scheitert:** Port 22 offen, SSH-Dienst aktiv, Credential testen.
> **Laufende Aufnahmen:** Filter im SFTP-List-Node verwenden (`Modified Before = Now 10 min`).
Mit dieser Automatisierung werden alle neuen Aufnahmen nachts gesichert, optional gelöscht und du wirst über Discord benachrichtigt.
Der gesamte Prozess läuft serverseitig und vollständig autonom.
---
## Multichat Social Stream Ninja
Im Gegensatz zu vielen anderen unserer Systeme gibt es aktuell keine Lösung, mit der sich eine vollwertige Multichat-Plattform vollständig lokal (headless) hosten lässt.
Bis unsere eigene Umgebung fertig ist, setzen wir bewusst auf **Social Stream Ninja (SSN)**. SSN bündelt Chats mehrerer Plattformen in einer Oberfläche, bietet Moderation und stellt Links bereit, die wir in OBS als Dock einbinden können.
> [!NOTE]
> SSN ist eine Desktop-App (Windows, macOS, Linux). Unter Linux ist eine grafische Umgebung nötig. Ein Betrieb in einem LXC ohne GUI ist nicht sinnvoll.
## Installation
1. Lade die aktuelle Version von SSN:
https://github.com/steveseguin/ssn_app/releases
2. Installiere die Anwendung oder entpacke das Archiv.
3. Starte **Social Stream Ninja**.
4. Verbinde in der Oberfläche die benötigten Plattformen (z. B. Twitch, YouTube, Kick, Facebook je nach Verfügbarkeit).
5. Nach erfolgreicher Anmeldung erscheinen eingehende Nachrichten gesammelt im Hauptfenster.
> [!TIP]
> SSN speichert deine Verbindungen. Beim nächsten Start sind die Plattformen wieder aktiv, bis du sie trennst.
## Integration in OBS und TouchPortal
Für unser Setup nutzen wir primär das **Dock** in OBS (Moderation/Lesen in OBS). Das Overlay (reine Anzeige) ist optional.
### OBS Multichat als Dock einbinden
1. Öffne in SSN die **Dock / Moderator View**.
2. Kopiere die **Dock-URL** (Beispiel):
```
http://localhost:8090/dock
```
3. In **OBS**: **Ansicht → Docks → Benutzerdefiniertes Browser-Dock**.
4. Namen vergeben (z. B. `Multichat`) und die Dock-URL einfügen.
5. Mit **OK** bestätigen und das Dock andocken/platzieren.
6. Neue Nachrichten erscheinen nun direkt im OBS-Dock.
> [!NOTE]
> SSN muss im Hintergrund aktiv bleiben, sonst aktualisiert sich das Dock nicht. Dein Videostream wird weiterhin **nur einmal** in OBS gerendert; das Dock ist reine Chat-UI.
> [!TIP]
> Du kannst mehrere Docks anlegen (z. B. `Alle`, `Twitch`, `YouTube`) SSN bietet dafür Filter/Parameter in der URL (falls vorhanden).
### TouchPortal Chat mobil anzeigen
TouchPortal kann keine OBS-Browserquelle übernehmen. Zwei praktikable Varianten:
**Variante A Einfach (Browser auf dem Tablet/Phone)**
1. Tablet/Phone im selben Netzwerk wie der SSN-Rechner.
2. Im mobilen Browser die **Dock- oder Overlay-URL** öffnen:
```
http://<deine-ip>:8090/dock
```
3. Seite im Vordergrund lassen (Bildschirmsperre deaktivieren).
**Variante B TouchPortal mit WebView**
1. In TouchPortal ein **WebView-Plugin** installieren (Community-Plugin).
2. Eine Seite anlegen und ein **WebView-Element** hinzufügen.
3. SSN-URL eintragen (z. B. `http://<deine-ip>:8090/dock`) und speichern.
> [!NOTE]
> Je nach TouchPortal-Version/Plugin können Emojis/Animationen eingeschränkt sein. Wenn es ruckelt, nutze Variante A (Browser).
## Betrieb und Leistung
- SSN basiert auf Electron und benötigt RAM/CPU. Parallel zu OBS sind **8 GB RAM** Gesamtsystem als Untergrenze sinnvoll.
- Halte Emote-Animationen und visuelle Effekte moderat, wenn das System knapp ist.
- Lege das Moderations-Dock idealerweise auf ein Zweitgerät (Tablet/Notebook), um den Streaming-PC zu entlasten.
## Fehlerbehebung (kurz)
- **Dock leer:** SSN nicht aktiv oder Plattform abgemeldet → SSN öffnen, Verbindungen prüfen, Dock in OBS neu laden.
- **TouchPortal zeigt nichts:** IP prüfen, gleiches Netz sicherstellen, `localhost` durch lokale IP ersetzen.
- **Zäh/träge:** Effekte/Emotes in SSN reduzieren; nur ein Dock auf dem Streaming-PC offen halten.
- **HTTPS-Warnung:** Lokal mit `http://<ip>:port` arbeiten oder ein gültiges Zertifikat bereitstellen, wenn du per Domain zugreifst.
## Zusammenfassung
- SSN vereint mehrere Chats in einer Oberfläche und liefert eine Dock-URL für OBS.
- TouchPortal zeigt dieselbe URL im Browser oder per WebView.
- Der Stream wird weiterhin nur in OBS gerendert; SSN ist reine Chat-Bedienung/Anzeige.