Bedrudはリアルタイムのビデオ・オーディオ通信にLiveKitを使用しています。LiveKitがSFU(Selective Forwarding Unit)メディアサーバーを提供し、Bedrudは認証、ルーム管理、管理者コントロールを処理します。
埋め込みモードと外部モード
Bedrudは2つのLiveKitデプロイモードをサポートしています:
- 埋め込みモード(デフォルト): バックエンドが内部的にLiveKitサーバープロセスを起動・管理します。追加のインフラストラクチャは不要です - バックエンドがLiveKitプロセスのライフサイクルを管理します。
- 外部モード: Bedrudは別のLiveKitサーバーまたはクラスターに接続します。水平スケーリングやマネージドLiveKit Cloudインスタンスの使用時に便利です。
外部モードの設定
外部LiveKitサーバーを使用するには、config.yamlに以下のキーを設定します:
livekit:
host: "livekit.example.com:7880"
api_key: "your-api-key"
api_secret: "your-api-secret"
embedded: falseembeddedがfalseの場合、Bedrudは組み込みLiveKitバイナリの起動をスキップします。APIキーとシークレットは外部サーバーの認証情報と一致する必要があります。
LiveKitクラスターのセットアップと設定については、LiveKitドキュメントを参照してください。
仕組み
1. ルーム作成
ユーザーがBedrudでルームを作成しても、サーバーは直ちにLiveKitルームを作成しません。LiveKitルームは最初の参加者が参加した時にオンデマンドで作成されます。
2. Join Token
ユーザーがミーティングに参加する際:
-
フロントエンドが
/api/room/joinにリクエストを送信します。 -
バックエンドはユーザーがそのルームに参加する権限を持っているか検証します。
-
バックエンドはAPIキーとシークレットを使用して署名付きJWT(Join Token)を生成します。
-
トークンには以下が含まれます:
- ルーム名。
- ユーザーのアイデンティティ(表示名)。
- 権限 - 例えば、ユーザーが音声を配信できるか、画面共有できるか。
-
フロントエンドはこのトークンを受け取り、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経由で新しいトークンを要求する必要があります。
関連情報
- TURNサーバーガイド - TURNアーキテクチャ、設定、TLS、トラブルシューティング
- WebRTC接続性 - STUN/ICE/TURN/SFU接続スタックの全体像
- アーキテクチャ概要 - システムアーキテクチャ全体