Kapitel 11/Premium Rohtext.md aktualisiert
This commit is contained in:
@@ -148,4 +148,264 @@ Beide laufen parallel, werden unabhängig verarbeitet und können an unterschied
|
|||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Wenn du Platz sparen willst, kannst du die vertikale Szene mit geringerer Bitrate streamen.
|
> 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.
|
> 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 10–20 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.
|
||||||
|
|||||||
Reference in New Issue
Block a user