Bedrud ドキュメント

Bedrud は Go サーバー、3つのクライアントアプリケーション、Python Bot エージェント、共有パッケージを含むモノレポです。このページでは各コンポーネントの関係について説明します。

全体図

flowchart TB
    subgraph Clients ["Clients"]
        Web["Web<br/>React"]
        Android["Android<br/>Compose"]
        iOS["iOS<br/>SwiftUI"]
        Desktop["Desktop<br/>Rust + Slint"]
    end
 
    subgraph Server ["Bedrud Server"]
        Router["Fiber HTTP Router<br/>/api/auth/* /api/room/* /api/admin/*"]
        DB["GORM / SQLite<br/>(or PostgreSQL)"]
        LKSDK["LiveKit Protocol SDK<br/>(token generation, room management)"]
        LiveKit["Embedded LiveKit<br/>Media Server (WebRTC)"]
    end
 
    Clients -->|"REST API + WebSocket"| Router
    Router --> DB
    Router --> LKSDK
    LKSDK --> LiveKit

コンポーネント

サーバー(server/

Go バックエンドは Bedrud の中核です。以下を処理します。

  • REST API - 認証、ルーム管理、管理者操作
  • 静的ファイル配信 - コンパイル済み Web フロントエンドは //go:embed で組み込まれる
  • LiveKit インテグレーション - LiveKit Protocol SDK を使用してトークンを生成し、ルームを管理
  • 組み込み LiveKit サーバー - メディアサーバーバイナリが子プロセスとして実行

サーバーは Fiber Web フレームワーク(Node.js の Express.js に類似)と GORM ORM レイヤーを使用しています。開発には SQLite、本番には PostgreSQL をサポートします。

詳細は サーバーアーキテクチャ を参照してください。

Web フロントエンド(apps/web/

TanStack Start、TailwindCSS v4、shadcn/ui で構築された React アプリケーションです。本番環境ではサーバー側でプリレンダリングされ、クライアントアセットが Go バイナリに組み込まれます。

主な機能:

  • LiveKit Client SDK によるビデオ会議 UI
  • 自動トークンリフレッシュ付き JWT ベースの認証
  • ユーザーとルーム管理用の管理者ダッシュボード
  • 一貫したコンポーネントライブラリを備えたデザインシステム

詳細は Web フロントエンド を参照してください。

Android アプリ(apps/android/

Jetpack ComposeKotlin で構築されたネイティブ Android アプリです。依存性注入に Koin、HTTP 通信に Retrofit を使用しています。

主な機能:

  • LiveKit Android SDK によるフルビデオ会議エクスペリエンス
  • ピクチャーインピクチャーモード
  • ディープリンク handling(bedrud.com/m/*bedrud.com/c/*
  • Android の ConnectionService による通話管理
  • マルチインスタンスサポート(複数サーバーへの接続)

詳細は Android アプリ を参照してください。

iOS アプリ(apps/ios/

SwiftUI で構築されたネイティブ iOS アプリです。安全な認証情報保存に KeychainAccess、メディア処理に LiveKit Swift SDK を使用しています。

主な機能:

  • フルビデオ会議エクスペリエンス
  • マルチインスタンスサポート
  • ディープリンク handling
  • Keychain ベースの安全な保存

詳細は iOS アプリ を参照してください。

デスクトップアプリ(apps/desktop/

RustSlint UI ツールキットで構築されたネイティブ Windows および Linux デスクトップアプリケーションです。ランタイム依存関係なしの単一バイナリにコンパイルされます。

主な機能:

  • LiveKit Rust SDK によるフルビデオ会議エクスペリエンス
  • ネイティブ Windows(Direct3D 11)および Linux(OpenGL/Vulkan)レンダリング
  • マルチインスタンスサポート(複数の Bedrud サーバーへの接続)
  • 安全な認証情報保存のための OS キーリング統合

詳細は デスクトップアプリ を参照してください。

Bot エージェント(agents/

Bot として会議ルームに参加し、メディアコンテンツをストリーミングする Python スクリプト:

  • Music エージェント - オーディオファイルの再生
  • Radio エージェント - インターネットラジオ局のストリーミング
  • Video Stream エージェント - ビデオコンテンツ(HLS、MP4)の共有

詳細は Bot エージェント を参照してください。

認証フロー

sequenceDiagram
    participant Client
    participant Server
    participant Database
 
    Client->>Server: POST /api/auth/login
    Server->>Database: verify credentials
    Database-->>Server: credentials valid
    Server-->>Client: access + refresh JWT
 
    Client->>Server: GET /api/room/list
    Note right of Server: "Authorization: Bearer <access_token>"
    Server-->>Client: room list

すべての認証済みリクエストは Authorization ヘッダーで JWT トークンを使用します。Web フロントエンドの authFetch ラッパーがトークンの付与と自動リフレッシュを処理します。

サポートされる認証方式:

方式エンドポイント説明
Email/PasswordPOST /api/auth/login従来の認証情報
登録POST /api/auth/register新規アカウント作成
ゲストPOST /api/auth/guest-login名前のみで一時アクセス
OAuthGET /api/auth/:provider/loginGoogle、GitHub、Twitter
パスキーPOST /api/auth/passkey/*FIDO2/WebAuthn 生体認証

会議接続フロー

sequenceDiagram
    participant C as Client
    participant S as Bedrud Server
    participant LK as LiveKit SFU
 
    C->>S: POST /api/room/join
    S->>S: Validate permissions
    S->>C: LiveKit JWT token
    C->>LK: WebSocket connect (with token)
    LK->>C: SDP offer + join response
 
    Note over C,LK: ICE connectivity check
    C->>LK: Host + STUN + TURN candidates
 
    alt Direct path (UDP)
        C-->>LK: Media via UDP 50000-60000
    else TURN relay
        C-->>LK: Media via TURN relay
    end
 
    Note over C,LK: Audio/video tracks flow through SFU
  1. クライアントが REST API を経由してルームへの参加をリクエスト
  2. サーバーが権限を検証し、署名付き LiveKit トークンを生成
  3. クライアントがトークンを使用して LiveKit に WebSocket で直接接続
  4. ICE が候補(host、STUN、TURN)を収集し、最適なパスを選択
  5. 音声/ビデオトラックが LiveKit の SFU を通じて流れる

完全な接続スタックについては WebRTC 接続 を参照してください。

データモデル

User

フィールド説明
IDuintプライマリキー
Emailstring一意のメールアドレス
Namestring表示名
Passwordstringハッシュ化されたパスワード(OAuth/ゲストの場合は空)
Avatarstringアバター URL
Providerstring認証プロバイダー(localgooglegithubtwitterguest
Rolestringuser または admin

Room

フィールド説明
IDuintプライマリキー
AdminIDuint外部キー → User.ID(ルーム作成者)
Namestringルーム名 / URL スラッグ
IsPublicboolゲストが招待なしで参加可能か
ChatEnabledboolルーム内チャットが有効か
VideoEnabledboolビデオが許可されているか
Participants[]Userルーム内の現在のユーザー

Passkey

フィールド説明
IDuintプライマリキー
UserIDuint外部キー → User.ID
CredentialID[]byteWebAuthn 認証情報 ID
PublicKey[]byteWebAuthn 公開鍵
Counteruint32WebAuthn 署名カウンター

RefreshToken

フィールド説明
Tokenstringリフレッシュトークン文字列
UserIDuint外部キー → User.ID
ExpiresAttimeトークン有効期限タイムスタンプ

デプロイメントアーキテクチャ

本番環境では、Bedrud は2つの systemd サービスとして実行されます。

サービスバイナリ目的
bedrud.servicebedrud --runAPI サーバー + 組み込み Web フロントエンド
livekit.servicebedrud --livekitWebRTC メディアサーバー

両方とも単一のバイナリで管理されます。Traefik または別のリバースプロキシが TLS 終端とトラフィックルーティングを処理します。

セットアップ手順については デプロイメントガイド を参照してください。

主要な用語

これらの用語はアーキテクチャドキュメント全体に登場します。

用語正式名称意味
SFUSelective Forwarding Unit各参加者からのストリームを受信して他の参加者に転送するメディアサーバー。クライアントは互いではなくサーバーに接続します。
SDPSession Description ProtocolWebRTC 接続パラメータ(コーデック、解像度、メディアタイプ)を記述するフォーマット。
ICEInteractive Connectivity Establishmentクライアントとサーバー間のすべての可能なネットワークパスを収集し、最適なものを選択するフレームワーク。
STUNSession Traversal Utilities for NATクライアントがパブリック IP アドレスを発見するのを支援する軽量プロトコル。ほとんどの接続で機能します。
TURNTraversal Using Relays around NAT直接接続が不可能な場合にすべてのメディアをサーバー経由でリレーするプロトコル。最後の手段で、帯域幅コストが最も高い。
NATNetwork Address Translationプライベートな内部アドレスをパブリックアドレスにマッピングするルーター機能。タイプによっては直接 WebRTC 接続を阻害します。
srflxServer ReflexiveSTUN 経由で発見されたクライアントのパブリック IP を表す ICE 候補のタイプ。
WebRTCWeb Real-Time Communicationリアルタイムの音声、ビデオ、データ転送のためのブラウザおよびモバイル API 標準。

関連項目