このガイドでは、Discourse の Voice プラグインを LiveKit メディアサーバーに接続する方法を説明します。デフォルトでは、音声通話はピアツーピアで実行されます。つまり、各参加者は自分の音声を他のすべての参加者に直接送信します。これは小規模なルームでは問題ありませんが、ルームの規模が拡大すると帯域幅の消費量も増加します。LiveKit を経由して通話をルーティングすることで、参加人数に関係なく、各参加者のアップロード帯域幅を一定に保つことができます。
前提条件
開始前に、以下の条件を満たしていることを確認してください。
- Voice プラグインが有効化された状態で動作している Discourse サイト
- 到達可能な LiveKit サーバーと、その API 認証情報。LiveKit をセルフホストするか、LiveKit Cloud のようなマネージドサービスを利用できます。
- Discourse サイトの管理者アクセス権限
ステップ 1 — Voice プラグインの有効化
Voice は Discourse にバンドルされています。管理画面 → 設定 → プラグイン に移動し、Voice (voice_enabled) の設定をオンにしてください。
ステップ 2 — LiveKit サーバーのプロビジョニングと認証情報の記録
LiveKit デプロイメントから以下の3つが必要です:WebSocket URL、API キー、API シークレット。
LiveKit Cloud を使用する場合、これらの手順は比較的簡単です。
- LiveKit Cloud ダッシュボードでプロジェクトを作成します。
- プロジェクトの 設定 → キー ページから、API キー と API シークレット を表示します。
- WebSocket URL を記録します(例:
wss://my-project.livekit.cloud)。
セルフホストされた LiveKit インストールの場合、それぞれのドキュメントを参照してください。
ステップ 3 — Discourse での LiveKit 接続の設定
管理画面 → プラグイン → Voice に移動し、設定を開いて LiveKit セクションに以下の情報を記入します。
| 設定項目 | 入力内容 |
|---|---|
voice_livekit_url |
WebSocket URL。例: wss://livekit.example.com(プレーン HTTP 環境では ws:// を使用)。 |
voice_livekit_api_key |
ステップ 2 で取得した API キー。 |
voice_livekit_api_secret |
ステップ 2 で取得した API シークレット。 |
voice_livekit_room_policy |
LiveKit を使用するルームの指定方法。 |
voice_livekit_room_policy 設定は、ルームがどのトランスポートを選択するかを決定します。
| ポリシー | 動作 |
|---|---|
disabled |
すべての通話がピアツーピアで実行されます(デフォルト)。 |
per_room |
ルームの作成者/管理者が、ルームフォーム内の メディアサーバー (SFU) を使用する チェックボックスを個別にオンにしてルームを有効にします。 |
all_rooms |
すべてのルームが LiveKit を経由してルーティングされます。 |
ステップ 5 — オプションの追加設定
これらの設定は統合を微調整するために使用します。
| 設定項目 | 目的 |
|---|---|
voice_livekit_room_prefix |
LiveKit 上のルーム名のネームスペースプレフィックス。複数のサイトが 1 つの LiveKit サーバーを共有している場合、サイトごとに一意のプレフィックスを設定してください。空の場合は、サイトのデータベース名がデフォルトとして使用されます。 |
voice_livekit_mesh_fallback |
LiveKit トークンの発行ができず、ルームが空の場合、参加の失敗ではなくピアツーピアメッシュで開始します。デフォルトではオフです — 静かな劣化は LiveKit の障害を隠す可能性があります。 |
voice_livekit_recording_enabled |
LiveKit で実行される通話の録音をルームモデレーターに許可します。録音は LiveKit Egress によって生成され、LiveKit デプロイメントのストレージ(S3、GCS、ローカルディスクなど)に保存されます。Discourse にアップロードされることはありません。 |
voice_livekit_recording_filepath |
LiveKit Egress に渡されるファイルパス。例: voice/{room_name}-{utc}。{room_name}、{room_id}、{time}、{utc} などのプレースホルダーをサポートします。ファイル拡張子は自動的に追加されます。 |
ステップ 6 — オプション: LiveKit ウェブフックの有効化
ウェブフックは、調整(リコンサイル)専用のバックストップです。参加者の接続が突然切断された場合やルームが終了した場合、ウェブフックにより、プラグインはハートビート TTL の経過を待たずに数秒以内にプレゼンスとルーム状態をクリーンアップできます。これらはオプションです — 配信できない場合でも通話は機能しますが、クリーンアップに少し時間がかかるようになります。
LiveKit サーバーで、ウェブフックエンドポイントを追加します(プラグインは、最初のウェブフックが到着するまで、その正確なスニペットを管理ダッシュボードに表示します):
# livekit.yaml
webhook:
api_key: <your-api-key>
urls:
- https://forum.example.com/voice/livekit/webhook
LiveKit を再起動します。配信は API シークレットで認証されるため、追加の共有シークレットを設定する必要はありません。
ステップ 7 — 統合の検証
Discourse Voice 管理ダッシュボードの確認
管理画面 → プラグイン → Voice → ダッシュボード に移動します。LiveKit の設定が 1 つでも存在すると、ダッシュボードにはライブチェック付きの LiveKit メディアサーバー ステータスカードが表示されます。
- 設定ステータス(どの設定が存在し、どのポリシーが有効か)
- キーペアでアクセストークンを署名できるかどうか
- サーバーに到達可能かどうか、およびアクティブなルームの数
- 最後の自動接続チェック
- ウェブフックが受信されているかどうか
更新 を使用して、オンデマンドでプローブを実行できます。
LiveKit が有効化された Voice プラグインのダッシュボードのスクリーンショットは以下の通りです:
LiveKit ダッシュボードの確認
LiveKit ダッシュボードにも通話の詳細が表示されます。例:

