概要
- Prosody をDockerで構築し、 XMPPによる連合型メッセージング を実現した手順まとめ。
- ファイル共有・音声通話・エンドツーエンド暗号化 に対応。
- DNS設定・TLS証明書・Docker Compose構成 から詳細に解説。
- セキュリティやクライアント連携 までカバー。
- 自己ホスト型メッセージング の実用的な導入事例。
Prosody+Dockerによる自前XMPPサーバー構築メモ
- Signal 中心の生活から、 自己ホスト型メッセージング への移行経緯。
- Signalは便利だが 単一事業者依存 のリスク。
- XMPPは 連合型プロトコル で複数サーバー間の自動連携が可能。
- サーバーデータは 自分のハードウェア に保存。
- Monal・Conversations など、近年のクライアントは使いやすさ向上。
前提条件
- Docker・Docker Compose 導入済みサーバー。
- 独自ドメイン 保有。
- TLS証明書 (Let’s Encrypt推奨)。
DNS設定
- SRVレコード でクライアントや他サーバーからの発見性確保。
- _xmpp-client._tcp.xmpp.example.com → ポート5222
- _xmpp-server._tcp.xmpp.example.com → ポート5269
- Aレコード でxmpp.example.comをサーバーIPへ。
- ファイルアップロード用 にupload.xmpp.example.com、 グループチャット用 にconference.xmpp.example.comのCNAME/Aレコード推奨。
TLS証明書取得
- Let’s Encrypt+Cloudflare DNSチャレンジ で自動取得。
- certbotをDockerで実行、cloudflare.iniにAPIトークン記載。
- 取得後、 証明書のパーミッション修正 必須。
- 月次自動更新のcron設定 推奨。
Docker構成例
- docker-compose.yml 例
- prosodyim/prosody:13.0イメージ利用。
- ポート5222(クライアント用)、5269(連合用)を公開。
- 設定ファイル・証明書はread-onlyでマウント。
- ボリュームでユーザーデータ・メッセージアーカイブ 保持。
Prosody設定
-
有効化モジュール例
- "carbons":全デバイス間のメッセージ同期。
- "smacks":ストリーム管理で不安定な接続でもメッセージ損失防止。
- "cloud_notify":プッシュ通知対応。
- "mam":サーバー側のメッセージ履歴管理。
-
セキュリティ設定
- c2s/s2s通信の 暗号化必須。
- 自己署名証明書のサーバーは連携拒否 (s2s_secure_auth有効)。
- 登録無効化 で手動アカウント発行。
-
エンドツーエンド暗号化(OMEMO)
- サーバー設定不要、 クライアント側で有効化。
- Monal・Conversations・Gajim等が標準サポート。
-
メッセージアーカイブ
- 1年間保存、アーカイブはデフォルト有効。
-
ファイルアップロード
- 内部HTTP(5280)で提供、TLS終端は Caddy等のリバースプロキシ で対応。
- http_external_urlで外部URL指定。
-
仮想ホスト・コンポーネント設定
- VirtualHostで証明書指定。
- conference(MUC)でグループチャット、uploadでファイル共有。
- ファイルサイズ10MB、保存期間30日制限。
リバースプロキシ設定
- Caddy例
- xmpp.example.com { reverse_proxy xmpp:5280 }
- HTTPS経由でファイルアップロードURLを提供。
アカウント作成
- コマンドラインから手動発行
- docker exec -it xmpp prosodyctl adduser ユーザー名@xmpp.example.com
ファイアウォール
- 必要ポート開放
- 5222(クライアント)、5269(連合)、80/443(プロキシ用)。
音声・ビデオ通話対応
-
TURN/STUNサーバー(coturn)導入
- NAT越え通信 に必須。
- Prosodyと 共有シークレット で連携。
- Dockerではnetwork_mode: host推奨(ポート転送不可のため)。
- 必要ポート(3478, 5349, 49152-49200/udp)開放。
-
Prosody設定追加
- "turn_external"モジュール有効化。
- VirtualHost内でTURNサーバー情報設定。
推奨クライアント
-
iOS :Monal(オープンソース、プッシュ通知対応)
-
Android :Conversations(定番)
-
デスクトップ :Gajim(Linux/Windows)、Monal(macOS)
-
いずれも OMEMO暗号化・ファイル共有・グループチャット・音声/ビデオ通話 対応。
検証・診断
- prosodyctl check でDNS・TLS・接続・モジュール設定を自動診断。
- XMPP Compliance Tester で機能充足率チェック。
総括
- Docker2コンテナ+リバースプロキシ のみでシンプル運用。
- ファイル共有・メッセージ履歴・プッシュ通知・グループチャット・音声通話 を網羅。
- Signalと併用しつつ、 自己ホスト環境の安心感 を確保。
- Docker環境があれば週末プロジェクトに最適 な実践例。