Bedrud ドキュメント

Bedrudはリアルタイムのビデオ・オーディオ通信にLiveKitを使用しています。LiveKitがSFU(Selective Forwarding Unit)メディアサーバーを提供し、Bedrudは認証、ルーム管理、管理者コントロールを処理します。

埋め込みモードと外部モード

Bedrudは2つのLiveKitデプロイモードをサポートしています:

  1. 埋め込みモード(デフォルト): バックエンドが内部的にLiveKitサーバープロセスを起動・管理します。追加のインフラストラクチャは不要です - バックエンドがLiveKitプロセスのライフサイクルを管理します。
  2. 外部モード: Bedrudは別のLiveKitサーバーまたはクラスターに接続します。水平スケーリングやマネージドLiveKit Cloudインスタンスの使用時に便利です。

外部モードの設定

外部LiveKitサーバーを使用するには、config.yamlに以下のキーを設定します:

livekit:
  host: "livekit.example.com:7880"
  api_key: "your-api-key"
  api_secret: "your-api-secret"
  embedded: false

embeddedfalseの場合、Bedrudは組み込みLiveKitバイナリの起動をスキップします。APIキーとシークレットは外部サーバーの認証情報と一致する必要があります。

LiveKitクラスターのセットアップと設定については、LiveKitドキュメントを参照してください。

仕組み

1. ルーム作成

ユーザーがBedrudでルームを作成しても、サーバーは直ちにLiveKitルームを作成しません。LiveKitルームは最初の参加者が参加した時にオンデマンドで作成されます。

2. Join Token

ユーザーがミーティングに参加する際:

  1. フロントエンドが/api/room/joinにリクエストを送信します。

  2. バックエンドはユーザーがそのルームに参加する権限を持っているか検証します。

  3. バックエンドはAPIキーとシークレットを使用して署名付きJWT(Join Token)を生成します。

  4. トークンには以下が含まれます:

    • ルーム名。
    • ユーザーのアイデンティティ(表示名)。
    • 権限 - 例えば、ユーザーが音声を配信できるか、画面共有できるか。
  5. フロントエンドはこのトークンを受け取り、LiveKitメディアポート(デフォルト7880)に直接接続します。

3. ルームコントロール(管理者)

バックエンドはLiveKit Go SDKを使用して管理操作を実行します:

  • キック: 参加者を切断します。
  • ミュート: 参加者のマイクを強制的にミュートします。
  • 権限: 参加者の権限をリアルタイムで変更します。

ネットワークアーキテクチャ

  • APIポート (8090/443): HTTPリクエストと通話セットアップ用のWebSocketシグナリングを処理します。
  • メディアポート (7880): WebRTCプロトコルを使用してビデオ・オーディオデータを処理します。ICE/TCPフォールバックはUDPがブロックされた場合にポート7881を使用します。
  • TURNポート (3478 UDP / 5349 TLS): 制限的なNATやファイアウォールの背後にあるクライアントのメディアをリレーします。TURNサーバーガイドを参照してください。

ファイアウォールとポートの要件については、WebRTC接続性を参照してください。

エラーハンドリング

LiveKitに接続できない場合

LiveKitサーバーに接続できない場合、トークン生成は成功する可能性があります(トークンはAPIキーとシークレットを使用してローカルで作成されます)。ただし、クライアントはメディアサーバーに接続できません。症状:

  • クライアントは有効なjoin tokenを受け取りますが、WebRTC接続がタイムアウトします。
  • LiveKit SDKがReconnectingイベントまたは接続エラーを出力します。

確認: LiveKitサーバーが実行中であること(systemctl status livekit)と、config.yamlのホスト/ポートが正しいことを確認してください。

埋め込みLiveKitプロセスのクラッシュ

埋め込みモードでLiveKit子プロセスがクラッシュした場合:

  • Bedrud APIサーバーは実行を継続します(ルームの一覧表示、ユーザーのログインは可能)。
  • アクティブなミーティングはメディア接続を失います。
  • 新しい参加リクエストはトークンを生成しますが、クライアントは接続できません。

確認: /var/log/bedrud/bedrud.logでログを確認するか、クラッシュの詳細についてはjournalctl -u livekit -fを実行してください。

トークンの有効期限

LiveKit join tokenの有効期間は短めに設定されています。クライアントがトークンを受信してから接続までの間に時間がかかりすぎると、トークンが期限切れになります。クライアントは/api/room/join経由で新しいトークンを要求する必要があります。

関連情報