Discourse Voice mit LiveKit integrieren

Dieser Leitfaden beschreibt, wie man das Voice-Plugin von Discourse mit einem LiveKit-Mediaserver verbindet. Standardmäßig laufen Sprachanrufe Peer-to-Peer: Jeder Teilnehmer sendet sein Audio direkt an alle anderen Teilnehmer. Das funktioniert hervorragend für kleine Räume, aber der Bandbreitenbedarf steigt mit der Raumgröße. Die Weiterleitung der Anrufe über LiveKit hält den Upload jedes Teilnehmers konstant, unabhängig davon, wie viele Personen beitreten.

Voraussetzungen

Stelle sicher, dass du vor Beginn Folgendes hast:

  • Eine Discourse-Instanz, auf der das Voice-Plugin aktiviert ist
  • Einen erreichbaren LiveKit-Server mit seinen API-Zugangsdaten. Du kannst LiveKit selbst hosten oder ein Managed-Angebot wie LiveKit Cloud nutzen.
  • Administrationsrechte auf deiner Discourse-Instanz.

Schritt 1 – Voice-Plugin aktivieren

Voice wird mit Discourse ausgeliefert. Gehe zu Admin → Einstellungen → Plugins und
aktiviere die Einstellung Voice (voice_enabled).

Schritt 2 – LiveKit-Server bereitstellen und Zugangsdaten notieren

Du benötigst drei Dinge aus deiner LiveKit-Installation: die WebSocket-URL, den
API-Schlüssel und das API-Geheimnis.

Diese Schritte sind mit LiveKit Cloud relativ unkompliziert:

  1. Erstelle ein Projekt im LiveKit Cloud-Dashboard.
  2. Zeige auf der Seite Einstellungen → Schlüssel des Projekts den API-Schlüssel und das
    API-Geheimnis an.
  3. Notiere die WebSocket-URL (z. B. wss://my-project.livekit.cloud).

Für selbst gehostete LiveKit-Installationen siehe bitte die jeweilige Dokumentation.

Schritt 3 – LiveKit-Verbindung in Discourse konfigurieren

Gehe zu Admin → Plugins → Voice, öffne die Einstellungen und fülle den LiveKit-Bereich aus:

Einstellung Was einzutragen ist
voice_livekit_url Die WebSocket-URL, z. B. wss://livekit.example.com (oder ws:// für Labs mit reinem HTTP).
voice_livekit_api_key Der API-Schlüssel aus Schritt 2.
voice_livekit_api_secret Das API-Geheimnis aus Schritt 2.
voice_livekit_room_policy Welche Räume LiveKit verwenden.

Die Einstellung voice_livekit_room_policy bestimmt, wie Räume einen Transport auswählen:

Richtlinie Verhalten
disabled Alle Anrufe laufen Peer-to-Peer (Standard).
per_room Raum-Ersteller/-Verwalter aktivieren Räume individuell über ein Häkchen bei Mediaserver (SFU) verwenden im Raumformular.
all_rooms Jeder Raum wird über LiveKit weitergeleitet.

Schritt 5 – Optionale zusätzliche Einstellungen

Mit diesen Einstellungen lässt sich die Integration feinjustieren:

Einstellung Zweck
voice_livekit_room_prefix Namensraum-Präfix für Raumnamen auf LiveKit. Bei mehreren Instanzen, die einen LiveKit-Server teilen, ein einzigartiges Präfix pro Instanz setzen. Leer bedeutet Standardmäßig der Datenbankname der Instanz.
voice_livekit_mesh_fallback Wenn kein LiveKit-Token ausgestellt werden kann und der Raum leer ist, Start auf dem Peer-to-Peer-Mesh statt einer fehlgeschlagenen Teilnahme. Standardmäßig deaktiviert – stille Degradation kann einen LiveKit-Ausfall verbergen.
voice_livekit_recording_enabled Erlaubt Raum-Moderatoren, Anrufe aufzunehmen, die auf LiveKit laufen. Aufnahmen werden von LiveKit Egress erstellt und im Speicher deiner LiveKit-Installation (S3, GCS, lokale Festplatte) gespeichert – nicht auf Discourse hochgeladen.
voice_livekit_recording_filepath Der Dateipfad, der an LiveKit Egress übergeben wird, z. B. voice/{room_name}-{utc}. Unterstützt Platzhalter wie {room_name}, {room_id}, {time}, {utc}; die Dateierweiterung wird automatisch hinzugefügt.

Schritt 6 – Optional: LiveKit-Webhooks aktivieren

Webhooks dienen als reine Rekonkordierungs-Sicherheitsmaßnahme. Wenn die Verbindung eines Teilnehmers abrupt abbricht oder ein Raum endet, ermöglichen Webhooks dem Plugin, Präsenz- und Raumstatus innerhalb von Sekunden aufzuräumen, anstatt auf das Ablaufen der Heartbeat-TTL zu warten. Sie sind optional – wenn sie nicht zugestellt werden können, funktionieren Anrufe weiterhin, der Aufräumprozess dauert nur etwas länger.

Füge auf dem LiveKit-Server den Webhook-Endpunkt hinzu (das Plugin zeigt das genaue Snippet auf seinem Admin-Dashboard an, bis der erste Webhook eingeht):

# livekit.yaml
webhook:
  api_key: <your-api-key>
  urls:
    - https://forum.example.com/voice/livekit/webhook

Starte LiveKit neu. Zustellungen werden mit dem API-Geheimnis authentifiziert –
es muss kein zusätzlicher gemeinsamer Schlüssel konfiguriert werden.

Schritt 7 – Integration überprüfen

Discourse Voice Admin-Dashboard prüfen

Gehe zu Admin → Plugins → Voice → Dashboard. Sobald eine LiveKit-Einstellung
vorhanden ist, zeigt das Dashboard eine LiveKit Mediaserver-Statuskarte mit
Live-Prüfungen an:

  • Konfigurationsstatus (welche Einstellungen vorhanden sind und die aktive Richtlinie),
  • ob Zugriffstokens mit dem Schlüsselpaar signiert werden können,
  • ob der Server erreichbar ist und wie viele Räume aktiv sind,
  • die letzte automatische Verbindungsprüfung,
  • ob Webhooks empfangen werden.

Verwende Aktualisieren, um eine manuelle Prüfung durchzuführen.

Hier ist ein Screenshot des Voice-Plugin-Dashboards mit aktiviertem LiveKit:

LiveKit-Dashboard prüfen

Auch im LiveKit-Dashboard gibt es Details zu den Anrufen. Hier ist ein Beispiel:

3 „Gefällt mir“