erster docker release

This commit is contained in:
Patrick Asmus
2026-09-15 18:10:57 +02:00
parent 794156a088
commit 9fa589789e
21 changed files with 3182 additions and 71 deletions
+65
View File
@@ -0,0 +1,65 @@
# REST-API
Alle Funktionen des Web-UI sind auch per REST-API verfügbar. Basis-URL: `http://<host>:8484`
## Endpunkte
### System
| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| `GET` | `/api/health` | Health Check (kein Auth nötig) |
| `GET` | `/api/config` | Konfiguration lesen |
| `PUT` | `/api/config` | Konfiguration speichern |
### Jobs
| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| `GET` | `/api/jobs` | Alle Jobs auflisten |
| `POST` | `/api/jobs` | Neuen Job erstellen |
| `GET` | `/api/jobs/:id` | Job-Details abrufen |
| `PUT` | `/api/jobs/:id` | Job aktualisieren |
| `DELETE` | `/api/jobs/:id` | Job löschen |
| `POST` | `/api/jobs/:id/record` | Job-Aufnahme starten |
### Schnellaufnahme
| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| `POST` | `/api/quick-record` | Schnellaufnahme starten |
```json
{
"url": "rtmp://example.com/live/stream",
"name": "Meine Aufnahme",
"stream_type": "auto",
"max_duration": 3600
}
```
### Aufnahmen
| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| `GET` | `/api/recordings` | Alle Aufnahmen (Parameter: `active_only`, `limit`) |
| `GET` | `/api/recordings/:id` | Aufnahme-Status |
| `POST` | `/api/recordings/:id/stop` | Aufnahme stoppen |
| `POST` | `/api/recordings/:id/extend?minutes=30` | Aufnahme verlängern |
| `POST` | `/api/recordings/:id/unlimited` | Zeitlimit entfernen |
### Logs
| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| `GET` | `/api/logs` | Protokoll (Parameter: `limit`, `level`) |
## Authentifizierung
Bei aktiviertem Auth wird Basic Authentication verwendet:
```bash
curl -u admin:passwort http://localhost:8484/api/jobs
```
Der Health-Endpunkt (`/api/health`) ist immer ohne Auth erreichbar.
+57
View File
@@ -0,0 +1,57 @@
# Aufnahmen
## Aktive Aufnahmen
Das Dashboard zeigt alle laufenden Aufnahmen mit:
- Laufzeit
- Dateigröße
- Verbleibende Zeit (bei Zeitlimit)
- Segment-Anzahl (bei Segment-Splitting)
## Aufnahme verlängern
Laufende Aufnahmen können verlängert werden:
- **+15 / +30 / +60 / +120 Minuten** — Schnellauswahl
- **Eigene Dauer** — Beliebige Minutenzahl eingeben
- **Unbegrenzt** — Zeitlimit komplett entfernen
## Aufnahme stoppen
Über den **Stoppen**-Button im Dashboard. Die Aufnahme wird sauber beendet (SIGINT → ffmpeg finalisiert die Datei).
## Reconnect
Bei Verbindungsabbrüchen versucht der Recorder automatisch, die Verbindung wiederherzustellen. Konfigurierbar über:
- `recording.max_retries` — Maximale Versuche (Standard: 5)
- `recording.retry_delay` — Wartezeit zwischen Versuchen (Standard: 5 Sekunden)
Bei jedem Reconnect wird eine neue Datei angelegt, um Datenverlust zu vermeiden.
## Segment-Splitting
Lange Aufnahmen können automatisch in Teile zerlegt werden. Die Segment-Dauer wird pro Job in Minuten konfiguriert.
Beispiel: Bei 60 Minuten Segment-Dauer wird eine 3-stündige Aufnahme in 3 Dateien aufgeteilt:
```
Sendung_20260915_200000_seg000.mp4
Sendung_20260915_200000_seg001.mp4
Sendung_20260915_200000_seg002.mp4
```
## Ausgabeformate
Das Format wird automatisch anhand des Stream-Typs gewählt:
| Stream-Typ | Standard-Format |
|------------|----------------|
| RTMP, HLS, HTTP | mp4 |
| MP3 | mp3 |
| AAC | aac |
| OGG | ogg |
| FLAC | flac |
Kann pro Job manuell überschrieben werden (z.B. `mkv`, `ts`).
## Speicherort
Aufnahmen werden unter `data/recordings/<job-name>/` gespeichert (im Container: `/app/data/recordings/`). Der Pfad ist über `recording.download_path` konfigurierbar.
+58
View File
@@ -0,0 +1,58 @@
# Jobs
Jobs sind vorkonfigurierte Aufnahme-Vorlagen. Jeder Job definiert einen Stream, optional einen Zeitplan und Plugin-Einstellungen.
## Job erstellen
Im Web-UI unter **Jobs → + Neuer Job**.
### Pflichtfelder
| Feld | Beschreibung |
|------|-------------|
| **Name** | Eindeutiger Name (wird als Ordnername verwendet) |
| **Stream-URL** | URL des Streams (RTMP, HLS, HTTP, etc.) |
### Optionale Felder
| Feld | Beschreibung |
|------|-------------|
| **Typ** | Automatisch erkannt aus URL. Manuell wählbar: RTMP, HLS, MP3, AAC, OGG, HTTP |
| **Ausgabeformat** | Dateiendung. Leer = automatisch (mp4 für Video, mp3 für Audio) |
| **Max. Dauer** | Zeitlimit in Minuten. Entfällt bei Zeitplan mit Endzeit |
| **Segment-Dauer** | Aufnahme in Teile zerlegen (Minuten pro Segment) |
| **Extra ffmpeg Argumente** | Zusätzliche ffmpeg-Parameter (z.B. `-b:a 192k`) |
## Zeitplan
Aktiviert automatische Aufnahmen zu festgelegten Zeiten.
| Feld | Beschreibung |
|------|-------------|
| **Einmalig** | Nur einmal am angegebenen Datum ausführen |
| **Datum** | Datum für einmalige Aufnahme |
| **Tage** | Wochentage: `*` (täglich), `Mo-Fr`, `Sa,So`, `Mo,Mi,Fr` |
| **Startzeit** | Aufnahme-Beginn (HH:MM) |
| **Endzeit** | Aufnahme-Ende (HH:MM) — Dauer wird automatisch berechnet |
Wenn Start- und Endzeit gesetzt sind, wird die Aufnahmedauer automatisch berechnet. Das Feld "Max. Dauer" wird dann nicht benötigt.
### Tage-Syntax
| Eingabe | Bedeutung |
|---------|-----------|
| `*` | Jeden Tag |
| `Mo-Fr` | Montag bis Freitag |
| `Sa,So` | Samstag und Sonntag |
| `Mo,Mi,Fr` | Montag, Mittwoch, Freitag |
| `Mo-Mi,Fr` | Montag bis Mittwoch und Freitag |
Unterstützt: `Mo/Mon/Montag`, `Di/Tue/Dienstag`, `Mi/Wed/Mittwoch`, `Do/Thu/Donnerstag`, `Fr/Fri/Freitag`, `Sa/Sat/Samstag`, `So/Sun/Sonntag`
## Manuelle Aufnahme
Jobs können auch manuell über den **Aufnehmen**-Button gestartet werden, unabhängig vom Zeitplan.
## Schnellaufnahme
Für einmalige Aufnahmen ohne Job: **Dashboard → + Schnellaufnahme**. URL eingeben, optional Name und Dauer angeben, sofort starten.
+65
View File
@@ -0,0 +1,65 @@
# Konfiguration
## config.yml
Die Konfiguration liegt in `data/config.yml` und kann über das Web-UI unter **Einstellungen** bearbeitet werden.
Beim ersten Start wird die Datei automatisch mit Standardwerten erstellt. Eine Vorlage mit Kommentaren findet sich in `config/config.yml.dist`.
## Abschnitte
### Aufnahme
| Parameter | Standard | Beschreibung |
|-----------|----------|-------------|
| `recording.download_path` | `/app/data/recordings` | Speicherort für Aufnahmen |
| `recording.max_retries` | `5` | Max. Reconnect-Versuche bei Verbindungsabbruch |
| `recording.retry_delay` | `5` | Wartezeit (Sekunden) zwischen Reconnect-Versuchen |
### Authentifizierung
| Parameter | Standard | Beschreibung |
|-----------|----------|-------------|
| `auth.enabled` | `false` | Basic Auth aktivieren |
| `auth.username` | `admin` | Benutzername |
| `auth.password` | `stream-recorder` | Passwort |
### NTFY
| Parameter | Standard | Beschreibung |
|-----------|----------|-------------|
| `ntfy.url` | _(leer)_ | NTFY Topic-URL (z.B. `https://ntfy.sh/mein-topic`) |
| `ntfy.token` | _(leer)_ | Bearer-Token für authentifizierte Topics |
| `ntfy.events` | `error` | Kommaseparierte Events: `start`, `stop`, `error`, `upload` |
### Plik
| Parameter | Standard | Beschreibung |
|-----------|----------|-------------|
| `plik.url` | _(leer)_ | Plik-Server URL (z.B. `https://plik.example.com`) |
| `plik.api_key` | _(leer)_ | API Key für authentifizierte Uploads |
| `plik.ttl` | `30d` | Aufbewahrungsdauer der Uploads (`30d`, `12h`, etc.) |
## Beispiel
```yaml
recording:
download_path: /app/data/recordings
max_retries: 5
retry_delay: 5
auth:
enabled: true
username: admin
password: mein-passwort
ntfy:
url: https://ntfy.sh/stream-recorder
token: ""
events: start,stop,error,upload
plik:
url: https://plik.example.com
api_key: ""
ttl: 30d
```
+85
View File
@@ -0,0 +1,85 @@
# Plugins
Plugins erweitern den Recorder um zusätzliche Funktionen. Alle Plugins sind pro Job einzeln aktivierbar.
## NTFY-Benachrichtigungen
Push-Nachrichten per [ntfy.sh](https://ntfy.sh) bei verschiedenen Events.
### Einrichtung
1. **Einstellungen → NTFY URL**: Topic-URL eintragen (z.B. `https://ntfy.sh/mein-topic`)
2. **Einstellungen → Events**: Kommaseparierte Liste der gewünschten Events
3. **Pro Job**: Checkbox „Benachrichtigungen (NTFY)" aktivieren
### Events
| Event | Tag | Beschreibung |
|-------|-----|-------------|
| `start` | 🔴 | Aufnahme gestartet |
| `stop` | ✅ | Aufnahme beendet |
| `error` | 🚨 | Fehler oder Verbindungsabbruch |
| `upload` | 📤 | Plik-Upload abgeschlossen (mit Link) |
### Authentifizierung
Für private Topics kann ein Bearer-Token in den Einstellungen hinterlegt werden.
---
## Plik-Upload
Automatischer Upload von Aufnahmen auf einen [Plik](https://github.com/root-gg/plik)-Server nach Aufnahme-Ende.
### Einrichtung
1. **Einstellungen → Plik URL**: Server-URL eintragen
2. **Einstellungen → TTL**: Aufbewahrungsdauer (Standard: `30d`)
3. **Pro Job**: Checkbox „Plik-Upload" aktivieren
### Optionen pro Job
| Option | Beschreibung |
|--------|-------------|
| **Plik-Upload** | Upload nach Aufnahme-Ende aktivieren |
| **Nach Upload löschen** | Lokale Datei nach erfolgreichem Upload entfernen |
### Links
Nach dem Upload werden zwei URLs generiert:
- **Browser-URL**: `https://plik.example.com/#/?id=UPLOAD_ID` — Übersichtsseite mit In-Browser-Wiedergabe
- **Download-URL**: Direkter Datei-Download
Bei aktiviertem NTFY wird die Browser-URL in der Push-Nachricht mitgeschickt.
### Segment-Upload
Bei Segment-Splitting werden alle Segmente einzeln hochgeladen. Die NTFY-Nachricht enthält die Anzahl der hochgeladenen Segmente.
---
## Euer-Radio Metadata-Monitor
Erkennt automatisch, ob eine bestimmte Show live sendet, indem der Stream-Titel via `ffprobe` abgefragt wird. Wenn das konfigurierte Pattern nicht mehr im Titel erscheint, wird die Aufnahme nach einer Karenzzeit gestoppt.
### Einrichtung
Pro Job im Web-UI:
| Option | Standard | Beschreibung |
|--------|----------|-------------|
| **Show-Pattern** | _(leer)_ | Text, der im Stream-Titel vorkommen muss (z.B. Sendungsname) |
| **Karenzzeit** | 5 Min. | Wie lange gewartet wird, nachdem das Pattern verschwunden ist |
| **Poll-Intervall** | 30 Sek. | Wie oft der Stream-Titel abgefragt wird |
### Funktionsweise
1. Der Monitor fragt regelmäßig den Stream-Titel per `ffprobe` ab
2. Solange das Pattern im Titel vorkommt, läuft die Aufnahme weiter
3. Wenn das Pattern verschwindet, startet die Karenzzeit
4. Taucht das Pattern innerhalb der Karenzzeit wieder auf, wird der Timer zurückgesetzt
5. Läuft die Karenzzeit ab, wird die Aufnahme gestoppt
### Anwendungsfall
Ideal für Streams mit wechselnden Shows (z.B. Internet-Radio), bei denen die Aufnahmedauer nicht vorher feststeht. Der Stream-Titel zeigt an, welche Show gerade läuft, und der Monitor erkennt automatisch das Ende.