DockerでJitsi Meetをセルフホストする:ビデオ通話の主導権を取り戻そう

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

なぜビデオ通話のプライバシーを取り戻すべきなのか?

大手テック企業のプラットフォームでは、会議のメタデータが分析対象の「製品」として扱われることがよくあります。Plausible Analyticsのようにプライバシーを重視する動きがある中、パブリックプロバイダーで通話を開始するたびに、ログ、IPアドレス、利用パターンなどの情報が第三者に渡されてしまいます。筆者のProxmoxホームラボ・クラスターでは、暗号化されたストリームからアクセス制御に至るまで、スタック全体を自分で管理できる環境を求めていました。

Jitsi Meetは、ZoomやTeams、あるいはSlackからの脱却を支援するMattermostなどの代替として、最も信頼できるオープンソースの選択肢となりました。完全な暗号化を提供し、ゲストアカウントも不要で、Docker上で効率的に動作します。このデプロイをマスターすることは、HomepageでHomeLabを極める愛好家にとって一つの通過儀礼と言えるでしょう。単なるウェブサイトのホスティングを超え、低遅延のメディアブリッジやリアルタイムシグナリングの管理方法を学ぶことができます。

5分で始めるクイックスタート

すでにDockerとDocker Composeの準備ができているなら、基本的なインスタンスをほぼ即座に起動できます。この初期設定では自己署名証明書を使用します。ローカルでのテストには最適ですが、正規のドメインを追加するまではブラウザにセキュリティ警告が表示されます。

1. 公式リポジトリをクローンする

git clone https://github.com/jitsi/docker-jitsi-meet
cd docker-jitsi-meet

2. 環境設定を行う

Jitsiには環境変数のテンプレートが含まれています。それをコピーし、提供されているスクリプトを実行して、コンテナ間の内部通信用のユニークなパスワードを生成します。

cp env.example .env
./gen-passwords.sh

3. 永続化ディレクトリを作成する

コンテナを再起動しても設定が失われないようにする必要があります。設定データを保存するために、ホストマシン上に以下のフォルダを作成してください。

mkdir -p ~/.jitsi-meet-cfg/{web,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri}

4. スタックを起動する

docker-compose up -d

https://localhost:8443 またはサーバーのIPアドレスにアクセスします。「詳細設定」から「続行」をクリックして証明書の警告をバイパスし、インターフェースに入ります。

内部構造:各コンポーネントの連携

Jitsiは単一の巨大なアプリケーションではありません。複数のマイクロサービスが調和して動作しています。各パーツの役割を知っておくことで、音声が途切れたり接続に失敗したりした際のトラブルシューティングが格段に楽になります。

Webコンテナ (Nginx)

これがエントリポイントです。ブラウザに対してReactベースのフロントエンドを提供します。また、リバースプロキシとして機能し、他のバックエンドコンポーネントへトラフィックをインテリジェントにルーティングします。UIレイアウトの変更やロゴの差し替えを行う場合は、ここを操作します。

Prosody (シグナリングの頭脳)

Jitsiは、かつてのJabberチャットで使われていたプロトコルであるXMPPを使用してシグナリングを処理します。Prosodyは、ユーザーのプレゼンス、チャットメッセージ、セッションのセットアップを管理するサーバーです。全員を同じ仮想ルームに繋ぎ止める「接着剤」のような役割を果たします。

Jicofo (フォーカス)

Jitsi Conference Focusの略称で、参加者とブリッジ間のメディアセッションを管理します。リソースを割り当て、各参加者が正しいビデオストリームと通信できるように制御します。

JVB (力持ちの主役)

Jitsi Videobridge (JVB) は、実際のビデオおよびオーディオデータを処理します。サーバー側でビデオをミキシングしてCPUを消費する古いシステムとは異なり、JVBは単にビデオパケットをルーティングします。この効率性のおかげで、控えめなスペックのサーバーでも一度に数十人の接続を処理できます。

本番環境への準備

ローカル環境での構築は素晴らしい第一歩です。しかし、インターネット越しに友人や同僚と使用するには、ドメイン、SSL、および基本的なセキュリティ設定が必要です。

1. Let’s EncryptによるSSLの自動化

.env ファイルを開きます。HTTPS証明書を自動で処理するために、以下の行を更新してください。

HTTP_PORT=80
HTTPS_PORT=443
PUBLIC_URL=https://meet.yourdomain.com
ENABLE_LETSENCRYPT=1
[email protected]
LETSENCRYPT_DOMAIN=meet.yourdomain.com

2. 認証によるアクセス制限

デフォルトでは、URLを知っている人なら誰でも会議を開始できてしまいます。第三者に帯域幅を勝手に使われないよう、.env ファイルで内部認証を有効にします。

ENABLE_AUTH=1
AUTH_TYPE=internal

コンテナを再起動し、Prosodyコンテナ内で手動で管理者ユーザーを作成します。

docker-compose exec prosody prosodyctl --config /config/prosody.cfg.lua register username meet.jitsi password

3. 「映像が出ない」ファイアウォールの罠を解決する

新米管理者が最も頭を悩ませるのが「画面が真っ暗」になる問題です。これは通常、UniFi Network Applicationの設定時と同様に、必要なポートがブロックされているために起こります。ファイアウォールで以下のポートが許可されていることを確認してください。

  • 80/TCP: Let’s Encryptの更新に必要。
  • 443/TCP: Webインターフェース用の標準ポート。
  • 10000/UDP: ビデオおよび音声ストリーム用の重要な通信経路。
  • 3478/UDP: 制限の厳しいNAT環境での接続を補助(STUN)。

最適化と実践的なヒント

ハードウェア要件

16GBもの大容量メモリを積んだサーバーは必要ありません。JVBは驚くほど軽量です。筆者は、2GBのメモリと2つのCPUコアを搭載したVPS(DigitalOceanで月額12ドル程度)で、10人の通話をホストすることに成功しています。ボトルネックになるのはおそらく上りの帯域幅でしょう。720p HDストリーム1つにつき、約2.5 Mbpsの送信速度を見込んでおいてください。

モバイルアプリを活用する

JitsiのiOSおよびAndroidアプリは非常に優秀です。スマホのブラウザを使う必要はありません。アプリの設定を開き、「サーバーURL」を自分のドメインに変更するだけです。完全にプライベートなハードウェア上で動作させながら、ネイティブアプリの快適な体験が得られます。

カスタムブランディング

プラットフォームを自分好みにカスタマイズしましょう。~/.jitsi-meet-cfg/web ディレクトリにカスタムの interface_config.js ファイルをマッピングすることで、デフォルトのUIを上書きできます。Jitsiのロゴを非表示にしたり、背景色を変更したり、自分のブランド名に合わせてアプリ名を変更したりすることが可能です。

ラグの監視

通話が途切れ途切れになったら、内蔵の「スピーカー統計」を確認してください。Jitsiでは、各参加者のタイルに小さな接続状況バーが表示されます。一人の参加者だけが赤いバーになっている場合、問題はその人のWi-Fi環境にあり、サーバー側ではありません。これにより、パフォーマンスの問題をその場で簡単にデバッグできます。

独自のコミュニケーションツールをホスティングすることは、デジタル主権を確立する大きな一歩となります。Jitsiが動き始めれば、利便性のためにプライバシーを犠牲にする必要がないことに気づくでしょう。初期設定には多少の手間がかかりますが、それによって得られる安心感には十分な価値があります。

Share: