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]
|
||||
> 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