Jitsi Meet(ネイティブ) から Caddy + Jitsi Meet(コンテナ)の構成に移行

CaddyをVPSに入れようと思ったが、443が既にJitsi Meetで使われていることに気づいた。ネイティブにインストールしており、内部的にはnginxが使われているはずだが、このままだとCaddyとバッティングしてしまう。

ということで、構成を練り直さないとなぁ、としこしこやりなおすことにした。

目次

全体の構成

元々の環境

  • ConoHa VPS, Ubuntu 24.04.3, 2GB RAM
    • 1.5GBくらい常に使っている頑張り屋
  • Jitsi Meet バージョン失念
  • docker 29.2.1

全体の構成は以下のようになる見込みだ。Geminiが10秒で描いた。

graph LR subgraph "Public Internet" Client[Client Browser] end subgraph "VPS Host" Caddy(Caddy Server) subgraph "Docker Bridge Network (172.18.0.x)" Web[Container: Web] Prosody[Container: Prosody] Jicofo[Container: Jicofo] JVB[Container: JVB] end end Client -- "Port 443" --> Caddy Caddy -- "Port 8000 (Internal)" --> Web Web -- "XMPP" --> Prosody Jicofo -- "Control" --> Prosody JVB -- "Signaling" --> Prosody Client -- "Port 10000/UDP (Direct)" --> JVB style Caddy fill:#f9f style Web fill:#bbf style JVB fill:#dfd

各役割についてもGeminiが10秒で書いた。

  • Caddy (Reverse Proxy)
    • SSL/TLS終端: Let's Encrypt等の証明書管理をすべて引き受けます。
    • ルーティング: 特定のドメインへのリクエストをJitsiのWebコンテナ(通常はポート8443や8080)へ転送します。
  • Jitsi Web (Nginx)
    • 静的ファイルの配信: Jitsi MeetのJavaScriptクライアントをブラウザに渡します。
    • 内部プロキシ: ブラウザからのAPIリクエストや外部通信(BOSH/WebSocket)を内部のProsodyへ中継します。
  • Jitsi Videobridge (JVB)
    • メディア通信: 映像・音声データをリアルタイムに中継します。
    • 注意点: この通信はオーバーヘッドを避けるため、通常はCaddyを通さず、UDP 10000番ポートでクライアントと直接通信します。ここが疎通しないと「自分は映るが相手が映らない」という現象が起きます。
  • Prosody & Jicofo
    • シグナリング: 会議室の作成、ユーザーの入室管理、誰がどの映像を見るかといった「制御信号」を処理します。ユーザーが直接意識することはありません。

手順

最悪もう一回パスワード発行したらいいでしょの精神はもちつつ、できればそのまま移行する。

JitsiMeet: 今の設定ファイルの確認

設定を見返すためにコピーしておく。

  • /etc/prosody/prosody/conf.d/独自ドメイン.cfg.lua: 認証とかの設定。ゲストありとかそういうの
    • authenticationで認証方式を確認する。今回は internal_hashedだった。
    • VirtualHostに geust.ドメインがある。ここでauthenticationがanonymousになっている。
  • /var/lib/prosody/ドメイン/accounts/: 作成したアカウントのdatファイルがある。.がURLエンコードの%2eになっている。
  • /etc/jitsi/meet/ドメイン-config.js: 主催者はパスワード必須でOKしたらみんな入れる、みたいな設定

Jitsi Meetの停止

とりあえず停止。

sudo systemctl stop nginx jitsi-videobridge2 jicofo prosody

ポート解放の確認。

sudo ss -tulpn | grep -E ':80|:443'

Caddyのインストール

インストールコマンド。

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg
chmod o+r /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

その後の動作確認は以前の記事を参照。

Caddyfileの作成

/etc/caddy/Caddyfileを以下のようにする。

ドメイン名 {
    # 後のステップで立てるDocker版Jitsiへ転送
    reverse_proxy localhost:8000
}

設定の反映。

sudo systemctl reload caddy

Jitsiパッケージの削除

もう後戻りできない。

Self-Hosting Guide - Debian/Ubuntu server | Jitsi Meet

sudo apt purge jigasi jitsi-meet jitsi-meet-web-config jitsi-meet-prosody jitsi-meet-turnserver jitsi-meet-web jicofo jitsi-videobridge2
sudo apt autoremove

これの削除だが、後になってnginxやapacheなどがゾンビのように蘇ってきてCaddyと443を奪い合うなどあった。僕の手順にミスがあったのか……複数回実行してきっちり削除できていることを確認したほうがいいかも。ってか最初AIにきいたんだけど普通に嘘コマンド教えられたので、まぁこのへんの作業はやっぱりちゃんとドキュメントあたらんとどうにもならんね。

この状態でポートがcaddyになっているかを確認。

sudo ss -tulpn | grep -E ':80|:443'

結果

udp   UNCONN 0      0                                                *:443              *:*    users:(("caddy",pid=91842,fd=10))                      
tcp   LISTEN 0      4096                                             *:80               *:*    users:(("caddy",pid=91842,fd=11))                      
tcp   LISTEN 0      4096                                             *:443              *:*    users:(("caddy",pid=91842,fd=4)) 

良さそう。

ちなみにこの時点で1.4-1.5GBくらい使っていたRAMが1.27GBくらいに。もうちょっと減るかと思ったけど……。

Docker版Jitsiのインストール

# 作業ディレクトリ(任意)に移動
cd ~
git clone https://github.com/jitsi/docker-jitsi-meet
cd docker-jitsi-meet

# 設定の雛形をコピー
cp env.example .env

.envを編集しよう。編集ポイント

# ドメイン名
PUBLIC_URL=https://meet.wobias.com

# Caddyから受けるためのポート(ホスト側の80/443はCaddyが使っているため、ずらす)
HTTP_PORT=8080
HTTPS_PORT=8443

# 証明書はCaddyが管理するので、Jitsi内蔵のLet's Encryptはオフ
ENABLE_LETSENCRYPT=0

# ホスト認証を有効
ENABLE_AUTH=1
AUTH_TYPE=internal

# ゲスト(URLのみ)を許可
ENABLE_GUESTS=1

# 例: 1.2.3.4 の部分を実際のVPSのIPに書き換える
JVB_ADVERTISE_IPS=あなたのVPSのグローバルIP

以下でコンポーネント間の通信パスワードが .env にいくらしい。

./gen-passwords.sh

うまくいきますように……。

docker compose up -d

ブラウザで https://ドメイン名でJitsi MeetのUIが開けたら万歳。

アカウントの追加

なんかドメインはどうあれ、内部的には meet.jitsi らしい。

docker compose exec prosody prosodyctl --config /config/prosody.cfg.lua register ユーザー名 meet.jitsi パスワード

動作確認

あとはみんなで入ったりなんだりしてOKだったらOK。sudo rebootも試した方がいいと思う。

参考記事

この記事をいいなと思っていただけた方、よければ高評価・チャンネル登録……はないので、コメント・SNSでシェア・ブックマーク、RSSフィード登録を、よろしくお願い致します。

コメント

コメントする

目次