【2024年完全版】XMPPサーバー立て方・アカウント作り方 ~VPS・Cloudflare・Prosody・Nginx・Gajim~

技術部@Deep Sky Gate

1. XMPPって何ですか?

もし英語を読む気力があるのでしたら、以下のXMPP公式の「overview」(概要)を読んでもいいかも。https://xmpp.org/about/technology-overview/
もちろん読まなくても大丈夫。

XMPPはメールとSNSの中間みたいなメッセージ送信プロトコルです。どこか一つの会社が管理しているわけでもないので、(自分でサーバーを立てれば)垢BANの心配もなく、好きな人やグループとチャットできるサービスです。各個人がメールアドレスみたいなアカウントを持ち、SNSのようにチャットや会話ができる基幹システムです。

XMPPは1999年から存在し、JSからLinux、Windowsとあらゆるプラットフォームに対応している古典的通信プロトコルです。そのうえ、ZOOMWhatsAppといった世界的アプリケーションの根幹にも使われています。しかしながら、世間的なSNSの興隆にともなってXMPP自体を使う人口は少なくなり、2024年となってはインターネットの自由を尊ぶ一部の界隈の人にしか使われていません…。

それでもわたしは、自分たちで自分たちのフィールドを作るという心意気は好きです。
わたしも、XMPPを用いたとあるチャットグループに参加しています。
というか、XMPPについて日本語情報がなさすぎて悲しくない?

2. XMPPのしくみ

XMPP自体は何かのソフトやアプリケーションではなく、ただの通信プロトコルの名前です。

サーバーに専用ソフトウェアをインストールしてXMPP通信を使えるようにして、そのサーバーでアカウントを登録します。そしてそこで登録したアカウントを、別のクライアント側ソフトウェアで使います。

いまからやる例で言えば、Xserver VPSに「Prosody IM」というソフトウェアをインストールしてXMPP通信を利用するサーバーとします。そして、そのサーバー上で自分のXMPPアカウントをつくり、「Gajim」というアプリを自分のWindowsにダウンロードして、そのアカウントを読み込ませます。

メールアドレスを作るようなものです。GmailはGoogle社のサイトに行ってアカウントを作り、そして自分のOutlookとかのメールソフトに読み込ませますよね。アカウントを作る前の段階(サーバーを立てる段階)から、自分でやっちゃおうぜというのがXMPPです。

もちろん、メールと同じく、XMPPのアカウントは、サーバーが違ってもお互いに送受信ができます。

ともあれ、XMPPプロトコルにはサーバー用ソフトウェアとクライアント用ソフトウェアがあるんだということは知っておいてください。
そして、メールソフト同様にそれらのソフトウェアは様々な種類があり、XMPP公式から出されたものではないということにも注意してください。

詳しくはこちら。
https://xmpp.org/software/?platform=linux

3. ドメイン契約・Xserver VPS契約

XMPPのサーバーを立てるためにはもちろんドメイン名とサーバーが必要です。自宅サーバーでもいいですが、今回は上の記事で書いた通り、Xserver VPSを使います。ドメイン名はついでにX Domainでとっておきましょう。契約方法については、ぼくみたいなちゃらちゃらした人が書いてるサイトより他のサイトの方が信頼性が高いと思います。

OSは情報が多いUbuntu 22.04を用いておきます。

Xserver VPSの「コンソール」上では動かしづらいので、上記記事でも書きましたが、「Tera Term」というソフトを使って、遠隔接続します。
豆知識ですが、Tera Termの「Control」から「Always on top」という項目を選択すると、常に最前面表示されてストレスフリーです。

4. Cloudflareでサブドメイン設定

自分のドメインをCloudflare(いろいろネットワーク関係のやつでお世話になるサービス)に接続する(DNSレコードを設定する)方法は上の記事の途中にも書きましたし、他の日本語サイトもたくさんありますので省略。

ドメインのDNSレコードを設定し終わったときは、以下のような画面になるはずです。
(ぼくのドメインがdeep-sky-gate.netなのでこんな風になってます)

XMPPではメアドと同じく、アカウントが「example@gmail.com」のように、「ユーザー名@ドメイン名」という構成になるのでドメイン名が必要なのですが、ドメインを他で使ってるから、XMPPのとこではサブドメインで処理したいということもあるでしょう(というかそう思うのが普通です)。

右側の「Add record」からDNSレコードを追加します。

こんな風に、「Type」は「CNAME」にして、「Name」にはサブドメイン名(お好きに)を入れ、「Target」には、本ドメインを入れておきます。これで、サブドメインと本ドメインが同じIPアドレスで紐づきました。
そして一番大事なことですが、「Proxy status」を「DNS only」にしておいてください(デフォルトでは「Proxied」となっています)。
これをProxiedにしているせいでおかしくなることがあります。
セキュリティが心配だよってひとは一応Proxiedにしておいて、ダメだったら他の方法を考えてください。

5. Nginxでバーチャルホスト設定

バーチャルホストというVTuberとホストを合体させたみたいな怪しい名前がありますが、一つのIPアドレスで複数のサイトを運用することができるという便利なシステムです。
Cloudflareでサブドメイン設定をしましたが、このままだとサブドメインも本ドメインもまったく同じ内容が表示されてしまいます。
それを回避するためにバーチャルホスト化するわけですね。

バーチャルホストを扱うソフトにはApacheやNginxがありますが、今回はNginxで行きたいと思います。Apacheでやってる人も多いので必要なら調べてね。

Nginxバージョンで一番まとまりがよさそうなのが以下の記事。
https://www.kagoya.jp/howto/cloud/webserver/vps-configuration/

(1) Nginx自体のインストール

ではまず、updateとupgrade。

sudo apt update
sudo apt upgrade

次に、nginxをインストールします。ほんとに親の顔より見た気がするsudo apt install。

sudo apt install nginx

そして、systemctlまわり。start nginxで起動。enable nginxで次回起動時に自動的に実行させます。最後に、status nginxでチェックして、下の画像のような「active」が出たら成功。

sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

(2) Nginxの設定

次に、バーチャルホスト化のために設定をいじっていきます。

cd /etc/nginx/sites-enabled/
sudo cp default deep-sky-gate.net
sudo cp default xmpp.deep-sky-gate.net

/etc/nginx/sites-enabled/ ディレクトリに移動して、「default」のファイルを「cp」(コピー)します。deep-sky-gate.net(ファイル名)とかのところは適当に変えてつけてください。

nano deep-sky-gate.net

nano(テキストエディタ)で、本ドメインの方の設定を編集します。
下の方の server_nameに、本ドメイン名を書きます。

server_name deep-sky-gate.net; 

同じく、サブドメインの方も。ただし、default_server の記述を消してください

nano xmpp.deep-sky-gate.net
listen 80;
listen [::]:80;
(中略)
server_name xmpp.deep-sky-gate.net; 

最後に、コピー元の「default」ファイルを消します。

sudo rm default

最後に、以下のコマンドを実行して、「configuration file /etc/nginx/nginx.conf test is successful」と表示されれば、ここまではOK。

sudo nginx -t && nginx -s reload

(3) Nginxで使うLet’s Encrypt(レッツエンクリプト)をインストール

XMPPでは、サイトをSSL化(暗号化)する必要があります。
そのために、Nginxと連携しているLet’s Encryptという便利なものをつかいましょう。

Nginx公式が方法を示してくれているのでこれに従います。
https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/

まずは、certbotというのをインストールします(これがLet’s Encrypt)

sudo apt update
sudo apt install certbot
sudo apt install python3-certbot-nginx

そして、以下のコマンドを実行します。ドメイン名は適宜置き換えてください。(ちゃんとnginx経由ということが確認できますね)

sudo certbot --nginx -d deep-sky-gate.net -d xmpp.deep-sky-gate.net

はじめてだと「Enter email address」とありますが、大丈夫です。適当にメアド入れときましょ。

そのあとに出てくるYes/Noクエスチョンは、ちゃんと文章を読んで答えましょう。2番目のやつはたぶんNoにしといたほうがいいです。

ともあれ、「Congratulations! You have successfully enabled HTTPS on https://deep-sky-gate.net and https://xmpp.deep-sky-gate.net」というような文字が出てきたら成功です。

そして、その上あたりに

Certificate is saved at: /etc/letsencrypt/live/(中略)/fullchain.pem
Key is saved at: /etc/letsencrypt/live/(中略)/privkey.pem

というようなパスが表示されると思います。必ずこのパスは控えておきましょう

(4) Nginx設定(再)

少しNginxの設定をし直します。(現在のパスが /etc/nginx/sites-enabled/ であることを確認してください) 

本ドメインの方で、少し書き換えるところがあります。

nano deep-sky-gate.net

server{
  (中略) 
    listen [::]:443 ssl default_server ipv6only=on; # managed by Certbot
    listen 443 ssl default_server; # managed by Certbot
  (後略)
}

server{}のカッコ内の最後に、いつの間にか何行か加わってるはずです。各行の最後を見てわかる通り、さっきのLet’s Encryptさんが勝手にやってくれたんですね。

本ドメインの方なので、listen 443 ssl のあとに「default_server」という文字を書き加えておきましょう。

サブドメインの方のファイルは何もしなくてOKです。

最後に、以下のコマンドを実行します。

sudo nginx -t && nginx -s reload

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

というアウトプットが出てきたらOKです。

他のテストも一応やっておきましょう。

sudo /etc/init.d/nginx configtest

Testing nginx configuration [ OK ]

というアウトプットが出てきたらOKです。

sudo service nginx restart

これでnginxの設定は終了です。ふぇぇ長い…。

6. サーバー側XMPPセットアップ

まず、XMPP通信を使えるように、サーバー側に専用ソフトウェアを用います。

サーバー用のソフトウェアがいくつかありますが、今回は「Prosody IM」を使います。

まずは公式ドキュメントを提示しておきますが、あまり公式を当てにしないでください。公式ドキュメントを当てにするなと言うのは前代未聞かもしれませんが、オープンソースですからね。わりと「わかってる人向け」に、大雑把に書かれてて、ぼくみたいな初心者がやったらかえって間違えます。
だから、ある程度慣れてきて、細かいことが知りたいなと思ったら見るのがいいでしょう。
https://prosody.im
https://prosody.im/doc

基本的に、以下の英語記事に沿ってやっていきます。
https://www.linuxbabe.com/ubuntu/prosody-xmpp-server-ubuntu-22-04

(1) Prosodyのインストール

sudo apt updateとupgradeはとりあえずやりましょう。

sudo apt update
sudo apt upgrade

echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/prosody.list

↑ echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/prosody.list

いきなりprosodyをsudo apt installせずに、この長いコードを打つのが最新版を手に入れるための正解です。公式ドキュメントにはめっちゃ端っこに書いてあります。
https://prosody.im/download/package_repository#other

たぶん1行出てくるだけで特に何も起こりませんが問題ありません。

次に、なんか認証っぽいことをします。

sudo wget https://prosody.im/files/prosody-debian-packages.key -O/etc/apt/trusted.gpg.d/prosody.gpg

そして念のためもういちどupdateとupgradeをかけます

sudo apt update
sudo apt upgrade

満を持してようやく、prosodyをinstall。

sudo apt install prosody

そしていつものsystemctlで、動いてるかどうかをチェック。

systemctl status prosody

無事に動いてたら、下のような画面が出てくるはず。

そして、起動時に実行されるようにsystemctlをいじります。

sudo systemctl enable prosody

(2) Prosodyの設定をいじる

以下のページを参考に。

https://prosody.im/doc/configure
https://www.linuxbabe.com/ubuntu/prosody-xmpp-server-ubuntu-22-04

まずは、テキストエディタのnanoを使って、Prosodyのコンフィグファイル(設定ファイル)をいじりに行きます。

sudo nano /etc/prosody/prosody.cfg.lua

設定に英語がいっぱい並んでいますが、ひるまずにがんばりましょう。

module_enabled = {}の中身は、必要な機能(モジュール)を選択できます。
「–HTTP modules」のところにある「bosh」ってやつは、左側の「–」(コメントアウト)を外して有効化しておくといいみたいです。

(↑一番下から3行目くらいのところ)

次に、一番下の方に行って、「Virtual Host」を探します。
そして、先ほどCloudflareのところで設定したサブドメインを入れておきます。
その下に、先ほど控えていた、Let’s Encryptのkeyとcertificateのパスを以下のようにコピペします。

最後に、なんか詠唱します。「prosody」ユーザーにLet’s Encryptの証明書をreadする権限を与えます。

sudo apt install acl
sudo setfacl -R -m u:prosody:rx /etc/letsencrypt/

(3) アカウントを作る

以下のようなコマンドを打って、アカウントを作ります。
prosodyctl adduser (ユーザー名)@(さっき設定したサブドメイン名)
といった感じです。

(ユーザー名)@(さっき設定したサブドメイン名)
の部分が、メールアドレス的な感じで、自分のアカウントになります。

sudo prosodyctl adduser habafugu@xmpp.deep-sky-gate.net

Enter new password:
にはそのアカウントで使うパスワードを入れます。

(4) Prosodyの設定完了

sudo prosodyctl check config
sudo systemctl restart prosody

コンフィグチェックをしてエラーがでなかったらよし。「All checks passed. congratulations!」と出るとおもいます。
その後、再起動しましょう。

7. クライアント側XMPPセットアップ

Windows, Max, Linuxのすべてで動く優秀なクライアントXMPPソフト(Outlookなどのメールソフトに相当するもの)に、「Gajim」があります。

Gajim
Gajim, a fully-featured XMPP chat client

GUIなのでコマンドラインとは違って比較的わかりやすいとは思います。

アカウントを追加するには、画面上部タブの「アカウント」で開く画面で「アカウントを追加」。

そこに、先ほど作ったアカウントと、パスワードを入れます。

うまくいけば、正常に追加されるはずです。

8. うまくいかないときは

①ファイアウォールの設定を確かめてみましょう。ポートに制限がかかっていたりするとたまに弾かれます。
②Let’s Encryptの設定をやり直してみましょう。
③Cloudflareのセキュリティまわりがおかしいことがあります。変にプロキシしてたり…。

Extra. 参考

ぼくの記事では足りないところが多いかもしれません。以下に参考になりそうな記事を貼っておきます。

https://ameblo.jp/ma-kodama/entry-10808010284.html
↑2011年情報。ejabberdはひょっとすると使えないかも。

↑こちらもprosodyを使用。

Epilogue

さて、無事XMPPを用いて通信可能になったと思います。

XMPPを使って通信をしようする人なんて、モールス通信をしようとする人よりも少ないのではないでしょうか。XMPPはセットアップしたのにテスト相手がいないなら、もしよければ、わたしのXMPPアカウントにテスト連絡送ってくださっても構いません。いつまでこのサーバーが持ってるかわかんないですけど。
habafugu@xmpp.deep-sky-gate.net

コメント

タイトルとURLをコピーしました