管理ダッシュボードは、Bedrudインスタンスを管理するためのWebインターフェースを提供します。superadminはシステム統計の表示、ユーザーとルームの管理、インスタンス全体の設定、招待トークンの生成が行えます。
前提条件
- superadminアクセス: ユーザーの
accesses配列にsuperadminが含まれている必要があります。 - 初回管理者セットアップ: Bedrudのインストール後、CLI経由でユーザーを作成し昇格させます:
bedrud user create --email "admin@example.com" --password "securepassword" --name "Admin"
bedrud user promote --email "admin@example.com"最初のsuperadminを作成するWeb UIやAPIはありません。これはセキュリティ上の意図的な設計です。
管理パネルへのアクセス
superadminアクセスを取得すると、Bedrud Webアプリケーションの /dashboard/admin から管理パネルにアクセスできます。
ナビゲーション:
- サイドバーには「管理者」セクションが表示され、概要、ユーザー、ルーム、設定へのリンクがあります。このセクションはsuperadminにのみ表示されます。
- 右上のユーザードロップダウンには盾アイコン付きの「管理パネル」リンクが含まれています。
- 非管理者ユーザーが
/dashboard/admin/*のURLにアクセスしようとすると、自動的に/dashboardにリダイレクトされます。
概要ページ
/dashboard/admin の概要ページでは、主要なシステムメトリクスを含むダッシュボードが表示されます。
システム統計
以下のカードが表示されます:
- オンラインユーザー: 全ルームのユニークなアクティブ参加者の総数
- 総ルーム数: インスタンス上のルーム総数
- 総ユーザー数: 登録済みユーザーの総数
TLS証明書ステータス
サーバーのTLS証明書の状態を色分けインジケーターで表示します:
| ステータス | 色 | 意味 |
|---|---|---|
| 有効 | 緑 | 証明書は有効です |
| 期限切れ間近 | 黄 | 30日以内に期限切れ |
| 期限切れ | 赤 | 証明書の有効期限が切れています |
| 未設定 | 灰 | TLSが無効です |
証明書ステータスは5分ごとに更新されます。
グラフ
- ルーム作成数: 過去8週間のルーム作成数の棒グラフ
- 最近の登録: 最新のユーザー登録一覧
ユーザー管理
ユーザー一覧
/dashboard/admin/users のユーザー一覧では、登録済みの全ユーザーを検索・ソート可能なテーブルで表示します。
カラム:
- 名前: ユーザーの表示名
- メール: ユーザーのメールアドレス
- プロバイダー: 認証方式(local、google、github、guest、passkey)
- ロール: アクセスレベルバッジ。
superadminアクセスを持つユーザーは「Superadmin」と表示されます。 - 作成日: 登録日
- ステータス: アクティブ/BAN切り替え
操作:
- 検索: 検索バーに入力してユーザーを名前またはメールでフィルタリング(クライアントサイド)。
- ソート: 任意のカラムヘッダーをクリックしてソート。再度クリックで昇順/降順を切り替え。
- ページネーション: 大規模なユーザー一覧を閲覧するためのナビゲーションコントロール。
ユーザー操作
各ユーザー行にはクイック操作ボタンがあります:
- 昇格/降格:
["user"]と["user", "superadmin"]のアクセスレベルを切り替え。アクセスレベル列に表示されます。 - アクティブ/BAN: ユーザーのアカウントステータスを切り替え。BANされたユーザーはログインやトークンの更新ができません。
- 詳細表示: ユーザー行をクリックして詳細ビューを開きます。
ユーザー詳細
/dashboard/admin/users/:userId の詳細ページでは、完全なユーザープロフィールが表示されます。
表示情報:
- ユーザー名、メール、プロバイダー、登録日
- アクセスレベルバッジ(superadmin/user)
- ルーム作成アクティビティグラフ(8週間の履歴)
- ユーザーが作成したルームの一覧
操作:
- 昇格/降格: 詳細ヘッダー内の専用ボタン
- ユーザー削除: ユーザーとその全データを完全に削除。メール確認が必要です。削除ボタンは自分のアカウントでは非表示になります(自分自身を削除することはできません)。
削除は永続的かつ非同期です。 ユーザーを削除すると、そのユーザーの全ルーム、パスキー、設定も削除されます。リクエストは即座に返りますが、クリーンアップはバックグラウンドで実行されます。
ルーム管理
ルーム一覧
/dashboard/admin/rooms のルーム一覧では、インスタンス上の全ルームが表示されます。
カラム:
- ルーム名: ルーム識別子
- 公開範囲: 公開、非公開、または限定公開
- 最大参加者数: インライン編集可能 — 値をクリックして変更
- ステータス: アクティブまたは非アクティブ
- 作成日: ルーム作成日
操作:
- 検索: ルームを名前でフィルタリング(クライアントサイド)
- ソート: カラムヘッダーをクリックしてソート
- 一時停止: ルームを削除せずにアクティブな通話を終了
- 削除: カスケード削除でルームを完全に閉鎖
ルーム詳細
/dashboard/admin/rooms/:roomId の詳細ページでは、ルームの詳細な情報を確認できます。
ルーム設定:
- ルーム名、公開範囲モード、最大参加者数
- 永続モード切り替え: 有効にするとアイドル状態のルームの自動クリーンアップを防止します。これはsuperadminのみ利用可能で、ルーム作成者は変更できません。
ライブ参加者:
- 3秒ごとにポーリングするリアルタイム参加者リスト
- 参加者ごと: 名前、参加時刻、トラック情報(音声/ビデオ/画面共有)
- ビットレートグラフ: 音声・ビデオトラックのリアルタイムビットレートグラフ
- キック: 任意の参加者をルームから削除
- ミュート: 任意の参加者の音声トラックをミュート
システム設定
/dashboard/admin/settings の設定ページは9つのタブで構成されています。いずれかのタブを変更した後は「変更を保存」をクリックしてください(一般タブは登録モード変更時に自動保存されます)。
一般タブ
- 登録モード:
- オープン: 誰でもアカウントを登録可能
- 招待のみ: 新規ユーザーは有効な招待トークンが必要
- 閉鎖: 新規登録不可 — 既存ユーザーは引き続きログイン可能
- モード切り替え時に自動保存されます
招待トークン管理(一般タブ内):
トークンは招待のみモード時に誰が登録できるかを制御します。
- トークン生成: 特定のメールアドレスにトークンを固定する場合は任意のメールを入力し、有効期限(24時間、72時間、7日間、30日間)を選択します。
- トークン一覧: 全トークンをステータス付きで表示。未使用トークンは緑の「有効」バッジ、使用済みトークンは灰色の「使用済み」と表示されます。
- トークンコピー: コピーボタンをクリックして32文字のトークン値をクリップボードにコピーします。
- 失効: トークンを削除して使用を防止します。
認証タブ
- パスキー: FIDO2/WebAuthnパスワードレス認証の切り替え
- OAuthプロバイダー: Google、GitHub、Twitter OAuthの設定:
- クライアントID
- クライアントシークレット
- リダイレクトURL
各プロバイダーには独自の設定カードがあります。3つのフィールドすべてに入力するとプロバイダーが有効になります。
LiveKitタブ
- 外部LiveKit: 組み込みLiveKitの代わりに外部LiveKitサーバーを使用する切り替え
- ホスト: LiveKitサーバーのホストとポート(例:
127.0.0.1:7880) - APIキー: LiveKitサーバーAPIキー
- APIシークレット: LiveKitサーバーAPIシークレット
サーバータブ
- ポート: HTTPサーバーポート(デフォルト:
80) - ホスト: サーバーホスト名
- ドメイン: サーバードメイン
- メール: 管理者メール(ACME証明書登録に使用)
- TLS: 証明書ファイルでHTTPSを有効化
- ACME: Let’s Encrypt自動証明書管理を有効化
- リバースプロキシ: サーバーがプロキシの背後にあることを示す(クライアントIP検出に影響)
- 証明書パス: 手動TLS設定用の証明書ファイルとキーファイルのパス
- 証明書ステータス: 現在のTLS証明書の状態を示すインラインインジケーター
CORSタブ
- 許可されたオリジン: CORSオリジンのカンマ区切りリスト
- 許可されたヘッダー: 許可するリクエストヘッダーのカンマ区切りリスト
- 許可されたメソッド: 許可するHTTPメソッドのカンマ区切りリスト
- 認証情報の許可: クロスオリジンリクエストに認証情報を含める切り替え
- 最大年齢: CORSプリフライトレスポンスのキャッシュ期間(秒)
ルーム制限タブ
1ユーザーが作成できるアクティブルームの数を制御します:
- ユーザーあたりの最大ルーム数: 非superadminユーザーが作成できる最大アクティブルーム数(デフォルト: 100、0 = 無制限)。superadminはこの制限をバイパスします。
アップロード割り当てタブ
チャット画像アップロードのストレージ制限を制御します:
- ユーザーあたりの最大アップロードバイト数: 全ルームにわたるユーザーごとのストレージ割り当て(デフォルト: 524288000 = 500 MB、0 = 無制限)。superadminはこの制限をバイパスします。
- グローバルディスクしきい値: 全ユーザーの合計ストレージ上限。超過するとすべてのアップロードが拒否され、管理者が領域を解放するまで継続(デフォルト: 0 = 無制限)。この制限はsuperadminを含むすべてのユーザーに適用されます。
チャットアップロードタブ
チャット画像アップロードの保存方法を設定します:
- バックエンド:
disk(ローカルファイルシステム)、s3(S3互換ストレージ)、またはinline(base64埋め込み) - 最大アップロードバイト数: アップロードあたりの最大ファイルサイズ
- インライン最大: インライン/base64アップロードの最大サイズ
- ディスクディレクトリ:
diskバックエンドのアップロード用ローカルディレクトリ
S3設定(バックエンドが s3 の場合):
- エンドポイント、バケット、リージョン
- アクセスキー、シークレットキー
- 公開URL
ログタブ
- ログレベル:
trace、debug、info、warn、error。デバッグに便利 —debugに切り替えると詳細なログが表示され、本番環境ではinfoに戻します。
トラブルシューティング
「管理パネルが表示されない」
症状: サイドバーに管理者セクションが表示されず、ユーザードロップダウンに「管理パネル」リンクがありません。
原因: ログイン中のユーザーの accesses 配列に superadmin が含まれていません。
解決策: CLIでユーザーを昇格させます:
bedrud user promote --email "your-email@example.com"その後、一度ログアウトして再度ログインし、更新されたaccessesを含む新しいJWTを取得してください。
「設定が保存されない」
症状: 設定の保存は成功しますが、シークレット値が変更されていないように見えます。
原因: サーバーは更新リクエストで "••••••••" または空文字列が送信された場合、既存のシークレット値を保持します。これは意図的な設計で、非シークレットフィールドのみを変更する際にシークレットを誤って上書きするのを防ぎます。
解決策: 更新リクエストでマスクされたプレースホルダーではなく、実際のシークレット値を送信してください。
「自分のアカウントを削除できない」
症状: 自分のユーザー詳細ページで削除ボタンが非表示になっているか、APIが400エラーを返します。
原因: 安全のため自己削除はブロックされています。現在ログインしているアカウントを削除することはできません。
解決策: 別のsuperadminにアカウントを削除してもらうか、別のユーザーとしてCLIを使用してください。
「管理者URLにアクセスするとダッシュボードにリダイレクトされる」
症状: /dashboard/admin に直接アクセスすると /dashboard にリダイレクトされます。
原因: 管理者ガードルートがJWTの accesses 配列をチェックします。superadmin が欠落している場合、ガードがリダイレクトします。
解決策: アカウントにsuperadminアクセスがあることを確認してください。アクセスが最近変更された場合は、一度ログアウトして再度ログインし、JWTを更新してください。