Bedrud ドキュメント

Bedrud はメインサーバーと組み込み LiveKit メディアサーバーの両方に YAML 設定ファイルを使用します。

関連項目: クイックスタート | インストール | デプロイメントガイド | Docker ガイド

本番環境の最低設定

デフォルト設定は開発用として機能します。本番環境では /etc/bedrud/config.yaml で以下の値を変更してください:

auth:
  jwtSecret: "change-to-random-string-32-chars"
  sessionSecret: "change-to-another-random-string"

変更後に再起動します:

sudo systemctl restart bedrud livekit

完全なリファレンスは以下をご覧ください。


サーバー設定

場所: server/config.yaml(開発)または /etc/bedrud/config.yaml(本番)

完全なリファレンス

server:
  port: 8090                    # HTTP ポート
  host: "localhost"             # バインドアドレス
  maxParticipantsLimit: 1000    # Hard ceiling for room capacity (0 = unlimited). Env: SERVER_MAX_PARTICIPANTS_LIMIT
  maxRoomsPerUser: 100          # Max active rooms per user (0 = unlimited). Env: SERVER_MAX_ROOMS_PER_USER
 
database:
  type: "sqlite"                # データベースタイプ: sqlite または postgres
  path: "data.db"               # SQLite データベースファイルのパス
 
logger:
  level: "debug"                # ログレベル: debug, info, warn, error。アプリログとSQLクエリログの両方を制御。
  outputPath: ""                # ログファイルのパス(空 = stdout)
 
livekit:
  host: "http://localhost:8090/livekit"  # 外部 LiveKit URL
  internalHost: "http://127.0.0.1:7880"  # 内部 LiveKit URL
  apiKey: "devkey"              # LiveKit API キー (auto-generated if empty)
  apiSecret: "devsecret"        # LiveKit API シークレット
 
auth:
  jwtSecret: "your-jwt-secret"           # JWT トークン署名用シークレット
  tokenDuration: 24                       # トークン有効期限(時間)
  sessionSecret: "your-session-secret"    # セッションクッキー用シークレット
  frontendURL: "http://localhost:8090"    # フロントエンド URL(OAuth リダイレクト用)
  passkeyChallengeTTL: 5                # Passkeyチャレンジの有効期限(分)
 
  # OAuth プロバイダー(任意)
  google:
    clientId: ""
    clientSecret: ""
  github:
    clientId: ""
    clientSecret: ""
  twitter:
    clientKey: ""
    clientSecret: ""
 
cors:
  allowedOrigins: "http://localhost:8090,http://localhost:3000"  # カンマ区切り
  allowedHeaders: "Origin, Content-Type, Accept, Authorization"
  allowedMethods: "GET, POST, PUT, DELETE, OPTIONS"
  allowCredentials: true
 
rateLimit:
  authMaxRequests: 10       # Max auth requests per window (login, register, refresh, passkey). 0 = disable
  authWindowSecs: 60         # Auth rate limit window in seconds
  guestMaxRequests: 5        # Max guest join requests per window. 0 = disable
  guestWindowSecs: 60        # Guest rate limit window in seconds
 
chat:
  maxUploadBytesPerUser: 524288000       # Per-user upload quota (500 MB). 0 = unlimited. Env: CHAT_MAX_UPLOAD_BYTES_PER_USER
  globalDiskThresholdBytes: 0            # Global storage ceiling across all users. 0 = unlimited. Env: CHAT_GLOBAL_DISK_THRESHOLD_BYTES
  maxMessageCount: 10000                 # Max chat messages kept per room (0 = unlimited). Env: CHAT_MAX_MESSAGE_COUNT
  messageTTLHours: 2160                  # Purge messages older than this in hours (0 = forever). 2160 = 90 days. Env: CHAT_MESSAGE_TTL_HOURS
 
 
recording:
  maxFileSizeMB: 2048           # Max recording file size in MB (0 = unlimited). Env: RECORDING_MAX_FILE_SIZE_MB
  storageDir: "./data/recordings"  # Local storage path for disk-backed recordings. Env: RECORDING_STORAGE_DIR
  maxRecordingsPerRoom: 100     # Max total recordings per room (0 = unlimited). Env: RECORDING_MAX_PER_ROOM
 
queue:
  pollInterval: 500              # ms between job polls. Env: QUEUE_POLL_INTERVAL
  maxAttempts: 3                 # retries before marking failed. Env: QUEUE_MAX_ATTEMPTS
  concurrency: 1                 # worker goroutines. Env: QUEUE_CONCURRENCY
 
email:
  smtpHost: ""                    # SMTP server hostname. Env: EMAIL_SMTP_HOST
  smtpPort: 587                   # SMTP server port. Env: EMAIL_SMTP_PORT
  username: ""                    # SMTP username. Env: EMAIL_USERNAME
  password: ""                    # SMTP password. Env: EMAIL_PASSWORD
  fromAddress: ""                 # From address. Env: EMAIL_FROM_ADDRESS
  fromName: "Bedrud"              # From display name. Env: EMAIL_FROM_NAME
  tlsSkipVerify: false       # Skip TLS certificate validation. Env: EMAIL_TLS_SKIP_VERIFY
  smtpsMode: false           # Direct TLS (SMTPS, port 465). Env: EMAIL_SMTPS_MODE

主要設定

データベース

デフォルトでは、Bedrud は設定された path の SQLite ファイルを使用します。高い同時実行性が求められる本番環境では、接続文字列を指定して PostgreSQL に切り替えてください。PostgreSQL 使用時、path フィールドにはファイルパスではなく接続文字列を指定します:

database:
  type: "postgres"
  path: "postgres://user:password@localhost:5432/bedrud?sslmode=disable"

認証

jwtSecret はアクセストークンとリフレッシュトークンの署名に使用されます。本番環境ではデフォルト値から変更してください。

OAuth プロバイダー は任意です。設定しない場合、UI にソーシャルログインボタンは表示されません。各プロバイダーは、該当サービスで OAuth アプリを登録し、クライアント ID とシークレットを提供する必要があります。

CORS

allowedOrigins 文字列(カンマ区切り)には、フロントエンドを提供する URL を含める必要があります。開発環境では http://localhost:3000 です。本番環境ではドメイン(例: https://meet.example.com)を設定します。

レート制限

レート制限は、認証エンドポイントをブルートフォース攻撃やDoS攻撃から保護します。2つのバケット:

  • 認証エンドポイント(ログイン、登録、リフレッシュ、パスキー ログイン/サインアップ)— デフォルト: IPあたり60秒に10リクエスト
  • ゲスト参加 — デフォルト: IPあたり60秒に5リクエスト

rateLimitセクションを省略するとデフォルト値が適用されます。authMaxRequests: 0 または guestMaxRequests: 0 を設定すると無効化できます。

Chat History

Bedrud applies advisory retention limits to in-room chat messages. Since LiveKit — the real-time media layer — does not persist data channel messages server-side, these limits are enforced on the client:

  • maxMessageCount — caps the number of chat messages held in memory and sessionStorage per room. When exceeded, the oldest messages are trimmed. Default: 10000. Set to 0 for unlimited.
  • messageTTLHours — messages older than this threshold are purged from the local cache. Default: 2160 (90 days). Set to 0 to keep messages indefinitely.

Chat messages in Bedrud are transmitted exclusively through LiveKit data channels and are not stored on the server. The retention limits above control how many messages the frontend keeps in memory and sessionStorage. A dedicated chat history service (with server-side persistence) would be needed for true history across sessions — this is tracked as a future enhancement.

Recordings

Room recording is controlled by the RecordingsEnabled system setting (toggle in admin Settings → General). When enabled:

  • Moderators can start/stop composite MP4 recordings from the meeting controls bar
  • Recordings are stored alongside chat uploads using the configured storage backend (disk/S3)
  • Each room has a per-room recordingsAllowed toggle that must also be enabled
  • Failed/pending recordings over 7 days old are automatically cleaned up daily
  • Non-persistent rooms have a configurable per-room recording cap (maxRecordingsPerRoom) to prevent abuse
  • After a room is deleted, the recording creator can still access their recordings from the same room URL

YAML Reference:

  • maxFileSizeMB — maximum file size for a single recording in MB. 0 = unlimited. Default: 2048. Env: RECORDING_MAX_FILE_SIZE_MB
  • storageDir — directory for disk-backed recordings. Only used when S3 is not configured. Default: ./data/recordings. Env: RECORDING_STORAGE_DIR
  • maxRecordingsPerRoom — caps total recordings per room (all statuses: completed, failed, etc.). 0 = unlimited. Only enforced for non-persistent rooms. Default: 100. Env: RECORDING_MAX_PER_ROOM

See the Recordings Guide for full details.

キュー(ジョブシステム)

内部ジョブキューは、ユーザー/ルームの削除、一時停止、チャットアップロードなどの非同期バックグラウンドタスクを処理します。

  • pollInterval — ワーカーが新しいジョブをチェックする頻度(ミリ秒)。値を低くするとレイテンシが減少しますが、データベースクエリが増加します。
  • maxAttempts — ジョブが失敗とマークされるまでの最大再試行回数。再試行は指数バックオフを使用します(2^試行回数 * 5s、最大1時間)。
  • concurrency — ワーカーgoroutineの数。PostgreSQLでは高スループットのために増やせます。SQLiteは単一ワーカー(1接続)に制限されています。

メール通知

BedrudはSMTP経由でトランザクションメール(ウェルカム、パスワードリセット、ルーム招待)を送信できます。

  • smtpHost / smtpPort — SMTPサーバーアドレス。デフォルトはポート587(STARTTLS)。
  • username / password — SMTP認証情報。
  • fromAddress / fromName — 送信メールの送信者ID。
  • tlsSkipVerify — TLS証明書の検証をスキップ(自己署名証明書用)。
  • smtpsMode — ダイレクトTLS(SMTPS、ポート465)。

LiveKit 設定

場所: server/config/livekit.yaml(開発)または /etc/bedrud/livekit.yaml(本番)

port: 7880                      # LiveKit HTTP/WebSocket ポート
 
rtc:
  port_range_start: 50000       # UDP ポート範囲の開始
  port_range_end: 60000         # UDP ポート範囲の終了
  use_external_ip: true         # RTC に外部 IP を使用
 
turn:
  enabled: true
  domain: "localhost"
  tls_port: 5349
  udp_port: 3478
 
keys:
  devkey: "devsecret"           # サーバー設定と一致させること
 
logging:
  level: info
 
room:
  auto_create: true              # 参加者が参加したときにルームを自動作成
  empty_timeout: 60              # 空のルームを削除するまでの秒数
  departure_timeout: 60          # 全参加者が退室後、ルームを保持する秒数
  max_participants: 20           # ルームの最大参加者数(0 = 無制限)
  enable_remote_unmute: true     # 参加者のサーバー側ミュート解除を許可

livekit.yamlkeys は、サーバーの config.yamllivekit.apiKey および livekit.apiSecret と一致している必要があります。

RTC ポート範囲

LiveKit はメディアストリームに UDP ポートを使用します。デフォルト範囲 50000-60000 はほとんどのセットアップで機能します。ファイアウォールの背後で実行する場合は、これらのポートが開放されていることを確認してください。

アーキテクチャとトラブルシューティングについては WebRTC 接続性 を参照してください。

TURN サーバー

組み込み TURN サーバーは、制限的な NAT や企業ファイアウォールの背後にいるクライアントのメディアをリレーします。デフォルトでポート 3478 (UDP) と 5349 (TLS) で有効です。

TURN は最終手段のリレーです。ほとんどのクライアント(約 80%)は UDP で直接接続し、TURN を使用しません。TURN がアクティブになると、サーバーがすべてのリレーメディアの帯域幅を担います。

TLS 要件: TURN/TLS(ポート 5349)には有効な TLS 証明書が必要です。本番環境では、turn.tls_port: 443 を設定し、cert_file/key_file を証明書に指定するか、前面に Layer 4 ロードバランサーを配置して external_tls: true を設定します。

アーキテクチャ、設定詳細、帯域幅計算、トラブルシューティングについては TURN サーバーガイド を参照してください。

Webhook (切断検出)

Bedrud receives webhook events from LiveKit to detect when participants disconnect unexpectedly (e.g., browser crash, network drop) and mark them as inactive in the database.

Endpoint: POST /api/livekit/webhook

Authentication: Uses LiveKit JWT signing with the same apiKey/apiSecret. No separate secret needed.

Embedded LiveKit: When Bedrud manages its own LiveKit server (default), the webhook URL is auto-configured in the generated LiveKit YAML. No user action needed.

External LiveKit (Cloud or self-hosted with external: true): Manually configure the webhook URL in your LiveKit dashboard:

https://<your-domain>/api/livekit/webhook

Events handled:

EventAction
participant_disconnectedMarks participant as inactive in room_participants
room_finishedMarks all participants + room as inactive

If apiKey is left empty in config, a random keypair is generated at startup. The embedded LiveKit server and webhook handler both use the same generated key — no manual configuration needed.

ルーム設定

room: セクションはミーティングルームの動作を制御します:

  • auto_create - 参加者が参加したときにルームを自動作成(デフォルト: true
  • empty_timeout - 誰も参加しなかったルームを削除するまでの秒数(デフォルト: 60
  • departure_timeout - 全参加者が退室後、ルームをアクティブに保持する秒数(デフォルト: 60
  • max_participants - ルームの最大参加者数。制限なしにするには 0 を設定(デフォルト: 20
  • enable_remote_unmute - 参加者のサーバー側ミュート/ミュート解除を許可(デフォルト: true

キャパシティのチューニング:

  • 小規模チームミーティング: max_participants: 10-20
  • 大規模ウェビナー: max_participants: 100(または無制限の 0
  • リソース制約のあるサーバー: max_participants を下げて CPU/メモリ使用量を削減

環境変数

設定値は環境変数で上書きできます。命名規則はセクションごとのプレフィックスに従います:

Docker デプロイメントについては Docker ガイド を参照してください。

export SERVER_PORT=8090
export DB_PATH=/var/lib/bedrud/bedrud.db
export JWT_SECRET=production-secret
export LIVEKIT_HOST=http://localhost:8090/livekit
export LIVEKIT_API_KEY=prodkey
export LIVEKIT_API_SECRET=prodsecret

環境変数の完全リファレンス

環境変数YAML パス説明
SERVER_PORTserver.portHTTP リッスンポート
SERVER_ENABLE_TLSserver.enableTLSHTTPS を有効化(true/false
SERVER_CERT_FILEserver.certFileTLS 証明書のパス
SERVER_KEY_FILEserver.keyFileTLS 秘密鍵のパス
SERVER_DOMAINserver.domainドメイン名
SERVER_EMAILserver.emailLet’s Encrypt 用メールアドレス
SERVER_USE_ACMEserver.useACMELet’s Encrypt 自動取得を有効化(true/false
SERVER_TRUSTED_PROXIESserver.trustedProxiesカンマ区切りの信頼済みプロキシ IP
SERVER_PROXY_HEADERserver.proxyHeaderクライアント IP を読み取るヘッダー(例: X-Forwarded-For
DB_HOSTdatabase.hostデータベースホスト(PostgreSQL)
DB_PORTdatabase.portデータベースポート
DB_USERdatabase.userデータベースユーザー
DB_PASSWORDdatabase.passwordデータベースパスワード
DB_NAMEdatabase.dbnameデータベース名
DB_TYPEdatabase.typesqlite または postgres
DB_PATHdatabase.pathSQLite ファイルパスまたは PostgreSQL 接続文字列
LIVEKIT_HOSTlivekit.host外部 LiveKit URL
LIVEKIT_INTERNAL_HOSTlivekit.internalHost内部 LiveKit URL
LIVEKIT_API_KEYlivekit.apiKeyLiveKit API キー (auto-generated as gen-<32hex> if empty)
LIVEKIT_API_SECRETlivekit.apiSecretLiveKit API シークレット (64-char hex auto-generated if empty)
JWT_SECRETauth.jwtSecretJWT トークン署名用シークレット
AUTH_FRONTEND_URLauth.frontendURLOAuth リダイレクト用フロントエンド URL
AUTH_PASSKEY_CHALLENGE_TTLauth.passkeyChallengeTTLPasskeyチャレンジの有効期限(分)
CORS_ALLOWED_ORIGINScors.allowedOriginsカンマ区切りの許可オリジン
CORS_ALLOWED_HEADERScors.allowedHeaders許可リクエストヘッダー
CORS_ALLOWED_METHODScors.allowedMethods許可 HTTP メソッド
CORS_ALLOW_CREDENTIALScors.allowCredentials認証情報を許可(true/false
CORS_EXPOSE_HEADERScors.exposeHeadersブラウザに公開するヘッダー
CORS_MAX_AGEcors.maxAgeプリフライトキャッシュ期間(秒)
RATELIMIT_AUTH_MAXrateLimit.authMaxRequests認証リクエストの最大数(ウィンドウあたり)
RATELIMIT_AUTH_WINDOWrateLimit.authWindowSecs認証レート制限ウィンドウ(秒)
RATELIMIT_GUEST_MAXrateLimit.guestMaxRequestsゲスト参加リクエストの最大数(ウィンドウあたり)
RATELIMIT_GUEST_WINDOWrateLimit.guestWindowSecsゲストレート制限ウィンドウ(秒)
LIVEKIT_CONFIG_PATHlivekit.configPathPath to external LiveKit YAML config
LIVEKIT_NODE_IPlivekit.nodeIPExplicit node IP for embedded LiveKit RTC (disables STUN)
SERVER_CERT_ALGORITHMserver.certAlgorithmKey algorithm for cert generation: ed25519, ecdsa256, rsa2048, rsa4096
SERVER_MAX_PARTICIPANTS_LIMITserver.maxParticipantsLimitHard ceiling for room capacity (default 1000)
SERVER_MAX_ROOMS_PER_USERserver.maxRoomsPerUserMax active rooms per user (default 100, 0 = unlimited)
CHAT_MAX_UPLOAD_BYTES_PER_USERchat.maxUploadBytesPerUserPer-user upload quota in bytes (default 524288000, 0 = unlimited)
CHAT_GLOBAL_DISK_THRESHOLD_BYTESchat.globalDiskThresholdBytesGlobal upload storage ceiling in bytes (default 0 = unlimited)
CHAT_MAX_MESSAGE_COUNTchat.maxMessageCountMax chat messages kept per room (default 10000, 0 = unlimited)
CHAT_MESSAGE_TTL_HOURSchat.messageTTLHoursMax age of chat messages in hours (default 2160 = 90 days, 0 = forever)
QUEUE_POLL_INTERVALqueue.pollIntervalJob poll interval in ms (default 500)
QUEUE_MAX_ATTEMPTSqueue.maxAttemptsMax job retries before marking failed (default 3)
QUEUE_CONCURRENCYqueue.concurrencyWorker goroutine count (default 1)
EMAIL_SMTP_HOSTemail.smtpHostSMTP server hostname
EMAIL_SMTP_PORTemail.smtpPortSMTP server port (default 587)
EMAIL_USERNAMEemail.usernameSMTP username
EMAIL_PASSWORDemail.passwordSMTP password
EMAIL_FROM_ADDRESSemail.fromAddressFrom email address
EMAIL_FROM_NAMEemail.fromNameFrom display name (default “Bedrud”)
EMAIL_TLS_SKIP_VERIFYemail.tlsSkipVerifySkip TLS certificate validation for self-signed SMTP certs
EMAIL_SMTPS_MODEemail.smtpsModeEnable direct TLS (SMTPS) mode for port 465

本番環境チェックリスト

  • jwtSecretsessionSecret を強力なランダム値に変更
  • logger.levelinfo または warn に設定
  • TLS を設定(インストーラーまたはリバースプロキシ経由)
  • cors.allowedOrigins を本番ドメインに設定
  • 必要に応じて OAuth プロバイダーを設定
  • ファイアウォールで LiveKit RTC ポート範囲を開放
  • /var/log/bedrud/ のログローテーションを設定

本番環境の完全なセットアップについては、デプロイメントガイド を参照してください。