Bedrud verwendet LiveKit für die Echtzeit-Video- und Audiokommunikation. LiveKit stellt den SFU-Medienserver (Selective Forwarding Unit) bereit, während Bedrud die Authentifizierung, Raumverwaltung und Admin-Kontrollen übernimmt.
Eingebettet vs. Extern
Bedrud unterstützt zwei LiveKit-Bereitstellungsmodi:
- Eingebetteter Modus (Standard): Das Backend startet und verwaltet einen LiveKit-Server-Prozess intern. Es ist keine zusätzliche Infrastruktur erforderlich – das Backend verwaltet den gesamten LiveKit-Prozess-Lebenszyklus.
- Externer Modus: Bedrud verbindet sich mit einem separaten LiveKit-Server oder -Cluster. Dies ist nützlich für horizontale Skalierung oder bei Verwendung einer verwalteten LiveKit Cloud-Instanz.
Konfiguration des externen Modus
Um einen externen LiveKit-Server zu verwenden, setzen Sie die folgenden Schlüssel in config.yaml:
livekit:
host: "livekit.example.com:7880"
api_key: "your-api-key"
api_secret: "your-api-secret"
embedded: falseWenn embedded auf false gesetzt ist, überspringt Bedrud das Starten des eingebetteten LiveKit-Binaries. Der API-Schlüssel und das Secret müssen mit den Anmeldeinformationen des externen Servers übereinstimmen.
Für die Einrichtung und Konfiguration eines LiveKit-Clusters lesen Sie bitte die LiveKit-Dokumentation.
Funktionsweise
1. Raumerstellung
Wenn ein Benutzer einen Raum in Bedrud erstellt, erstellt der Server nicht sofort einen LiveKit-Raum. LiveKit-Räume werden bei Bedarf erstellt, wenn der erste Teilnehmer beitritt.
2. Join Tokens
Wenn ein Benutzer einem Meeting beitritt:
-
Das Frontend sendet eine Anfrage an
/api/room/join. -
Das Backend verifiziert, dass der Benutzer die Berechtigung hat, diesem Raum beizutreten.
-
Das Backend verwendet seinen API Key und Secret, um ein signiertes JWT (Join Token) zu generieren.
-
Das Token enthält:
- Den Raumnamen.
- Die Identität des Benutzers (Anzeigename).
- Berechtigungen – beispielsweise, ob der Benutzer Audio veröffentlichen oder seinen Bildschirm freigeben darf.
-
Das Frontend erhält dieses Token und verbindet sich direkt mit dem LiveKit-Medienport (Standard
7880).
3. Raumsteuerung (Admin)
Das Backend verwendet das LiveKit Go SDK, um administrative Aktionen durchzuführen:
- Kick: Trennt einen Teilnehmer.
- Mute: Schaltet das Mikrofon eines Teilnehmers stumm.
- Berechtigungen: Ändert in Echtzeit, was ein Teilnehmer tun kann.
Netzwerkarchitektur
- API-Port (8090/443): Verwaltet HTTP-Anfragen und WebSocket-Signalisierung für den Verbindungsaufbau.
- Medienport (7880): Verwaltet Video- und Audiodaten über WebRTC-Protokolle. ICE/TCP-Fallback verwendet Port 7881, wenn UDP blockiert ist.
- TURN-Port (3478 UDP / 5349 TLS): Leitet Medien für Clients hinter restriktiven NATs oder Firewalls weiter. Siehe TURN-Server-Leitfaden.
Für Firewall- und Port-Anforderungen siehe WebRTC-Konnektivität.
Fehlerbehandlung
LiveKit nicht erreichbar
Wenn der LiveKit-Server nicht erreichbar ist, kann die Token-Generierung dennoch erfolgreich sein (Tokens werden lokal mit dem API-Schlüssel und Secret erstellt). Der Client kann sich jedoch nicht mit dem Medienserver verbinden. Symptome:
- Der Client erhält ein gültiges Join-Token, aber die WebRTC-Verbindung läuft ab.
- Das LiveKit SDK sendet ein
Reconnecting-Ereignis oder einen Verbindungsfehler.
Prüfung: Vergewissern Sie sich, dass der LiveKit-Server läuft (systemctl status livekit) und der Host/Port in config.yaml korrekt ist.
Absturz des eingebetteten LiveKit-Prozesses
Im eingebetteten Modus gilt Folgendes, wenn der LiveKit-Kindprozess abstürzt:
- Der Bedrud-API-Server läuft weiter (Räume können aufgelistet werden, Benutzer können sich anmelden).
- Aktive Meetings verlieren die Medienverbindung.
- Neue Beitrittsanfragen generieren Tokens, aber Clients können sich nicht verbinden.
Prüfung: Überprüfen Sie die Logs unter /var/log/bedrud/bedrud.log oder führen Sie journalctl -u livekit -f aus, um Absturzdetails zu erhalten.
Token-Ablauf
LiveKit-Join-Tokens haben ein kurzes Gültigkeitsfenster. Wenn ein Client zu lange zwischen dem Empfang des Tokens und dem Verbinden wartet, läuft das Token ab. Der Client muss ein neues Token über /api/room/join anfordern.
Siehe auch
- TURN-Server-Leitfaden – TURN-Architektur, Konfiguration, TLS und Fehlerbehebung
- WebRTC-Konnektivität – vollständiger STUN/ICE/TURN/SFU-Konnektivitäts-Stack
- Architekturübersicht – vollständige Systemarchitektur