はじめに
Bedrudバックエンドは**Go 1.24+**で記述されたシングルバイナリのミーティングプラットフォームです。メディアサーバー、ウェブフロントエンド、TURNサーバーなど、すべての依存関係が1つの実行可能ファイルに埋め込まれています。
主要技術
- コアフレームワーク: Fiber v2(ゼロアロケーションルーター、ExpressライクなAPI)。
- データベース層: GORM(SQLite(標準)とPostgreSQL(本番)をサポート)。
- メディアエンジン: LiveKit(兄弟バイナリとして埋め込み)。
- 認証システム: JWT、OAuth2(Google/GitHub/Twitter)、パスワードレスFIDO2パスキーをサポートする多層認証。
- 埋め込み静的アセット: Go 1.16+の
embedパッケージを使用してReactフロントエンド(SSRプリレンダリングされたクライアントアセット)をバンドル。 - デプロイ: systemdオーケストレーションとACME(Let’s Encrypt)サポートを備えた統合Debian/Ubuntu自動インストーラー。
なぜこのアーキテクチャなのか
WebRTCプラットフォームは通常、シグナリング、TURN、ウェブサービング、データベース管理に別々のサービスを実行します。Bedrudは以下の方法でこれらを1つのバイナリに統合しています:
- 抽出: 実行時にメディアサーバーバイナリを展開します。
- プロキシ: メディアトラフィックをメインのHTTP(S)ポート経由でプロキシします。
- 自動化: バイナリ自体を通じてOSレベルの設定(SSL、systemd)を自動化します。
高レベルアーキテクチャ
バックエンドは標準的な階層アーキテクチャに従っています:
- サーバー層 (
internal/server): Fiberアプリ、ルート、ミドルウェアを設定します。 - ハンドラ層 (
internal/handlers): HTTPリクエストとレスポンスを管理します。 - リポジトリ層 (
internal/repository): GORMを使用してデータベースクエリを処理します。 - モデル層 (
internal/models): データベーステーブルとGo構造体を定義します。 - サービス/ロジック層: シンプルさのためにハンドラとリポジトリに統合され、
internal/authやinternal/livekitなどの特殊なパッケージが存在します。
メインエントリポイント
アプリケーションはserver/cmd/bedrud/main.goから起動します。3つのメインモードがあります:
run: フルミーティングサーバーを起動します。livekit: 組み込みメディアサーバーのみを起動します。install: Debian/Ubuntuシステムにサーバーを自動設定します。
ドキュメントセクション
- コード構造: どこに何があるのか?
- データベースとモデル: データはどのように保存されるのか?
- 認証: ユーザーはどのようにログインするのか?
- APIハンドラ: リクエストはどのように処理されるのか?
- LiveKit統合: ビデオサーバーはどのように機能するのか?
- WebRTC接続性: クライアントはどのようにメディア接続を確立するのか?(STUN/ICE/TURN/SFU)
- TURNサーバー: TURNリレーアーキテクチャ、設定、トラブルシューティング
- インストールとデプロイ: 自動インストーラーはどのように機能するのか?