以下の内容はQiitaにNakayaが投稿した「MatrixのHomeserver、SynapseをDebian 10にインストールする」の記事をそのまま移植したものです。
私は前々からIMなどに興味があり、XMPPなどを好んで使ってたりしてきたのですが、まえから気になっていたmatrixというチャットプロトコルがあり、試してみたいと思って最近matrix-jp.net というサーバを立てました。
https://en.wikipedia.org/wiki/Matrix_(protocol) をざっくりまとめると
詳しいMatrixの概要については先程述べたとおり、後でまとめようと思います。また公式サイトにも詳細はあります。
今回の記事ではSynapseのインストールのみに焦点を当てます。そのため、SSHやLet's Encrypt、Webサーバなどの導入や設定に関しては他の記事を読んでください。 また、SynapseではAnsibleやDockerを用いての構築方法を紹介していますが、今回は用いません。 この記事は私がインストールした方法を再構成したものです。再構成がうまくいっていない可能性があるので問題があったのであれば場合は連絡をください。基本的にはSynapse公式のインストール方法を踏襲しているので、詳細はそちらに詳しいです。 Debian以外のLinuxディストリビューションやBSDへのインストール方法もSynapse公式が紹介していますので他ディストリビューションでもできます。
おおかたの順序はこのようになっています。
始めに、今回用いたソフトウェアのバージョンを列挙しておきます。
$ uname -vm #1 SMP Debian 4.19.37-5 (2019-06-19) x86_64
$ sudo nginx -v nginx version: nginx/1.14.2
$ sudo ufw version ufw 0.36 Copyright 2008-2015 Canonical Ltd.
$ sudo psql --version psql (PostgreSQL) 11.5 (Debian 11.5-1+deb10u1)
$ apt list | grep matrix-synapse-py3 matrix-synapse-py3/unknown,now 1.3.1+buster1 amd64 [installed]
SynapseはPython3製であり、PyPIにも登録されています。そのためpipからでも導入は可能です。 その他にも御膳立てされた状態(prebuilt)で提供されているものもDebian公式リポジトリとSynapse公式aptリポジトリでパッケージが提供されています。しかし、Debian公式リポジトリmainのSynapseはバージョンが0.99とやや遅いので、ここではSynapse公式リポジトリからインストールすることにします。
まず、依存パッケージをインストール。
$ sudo apt update $ sudo apt upgrade $ sudo apt-get install build-essential python3-dev libffi-dev \ python-pip python-setuptools sqlite3 \ libssl-dev python-virtualenv libjpeg-dev libxslt1-dev
次にSynapse公式リポジトリをaptに登録。
sudo apt install -y lsb-release wget apt-transport-https sudo wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/matrix-org.list
Synapseをインストール。
$ sudo apt update $ sudo apt-get install matrix-synapse-py3
これでSynapseのインストールは完了です。
私はNginxを用いていますが、もちろんApacheなどでもリバースプロキシできます。
https://ssl-config.mozilla.org/ と Matrixの公式設定の例を組み合わせて適当な名前にして保存。
sudo nginx -t
して問題がなければnginxリスタートしてnginxの設定は完了です。
nginx設定後に私はCertBotを動かして証明書を取得しました。
Synapseのデフォルト設定ではSQLiteがデータベースとして設定されていますが、PostgreSQLも利用できます。ここではPostgreSQLのuserとdatabaseの作成を行っていこうと思います。Synapseにデータベースの場所を記述するのは次項で解説します。
まず、Synapseのデータを操作するsynapse_userというユーザを作ります。
su - postgres createuser --pwprompt synapse_user
次にPostgreSQLのコンソールを立ち上げ、synapse_userを所有者とする以下のデータベースを作成します。
psql=# CREATE DATABASE synapse ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' template=template0 OWNER synapse_user;
参考リンク: https://github.com/matrix-org/synapse/blob/master/docs/postgres.rst
homeserver.yaml
はSynapseの設定を記述されているファイルです。Synapseのaptリポジトリ経由でインストールした場合、/etc/matrix-synapse/homeserver.yaml
にあります。
まずは
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1
の結果をregistration_shared_secret
の値に入れます(ちなみにこの値がバレるとAdminアカウントが勝手に作られてしまうそうなので厳重に管理してください[要出典])。
次にenable_registration: true
に設定してください(でないと自身のアカウントも作れなくなってしまうみたいです[要検証])。
3つ目にhomeserver.yaml
の以下のような部分を探してきて、コメントアウトしてください。
- port: 8448 type: http tls: true resources: - names: [client, federation]
homeserver.yaml
にはdatabase:
というパラメータがあります。そこにデータベースのホスト、ポート、ユーザ名、パスワードを書いていきます。ちなみにパラメータはpsycopg2.connect()
に準拠しているらしいです。
参考リンク: https://github.com/matrix-org/synapse/blob/master/docs/postgres.rst
サーバ間での通信もTLSによって暗号化されるようためには鍵が必要なようなのですが、これには2つ方法があります。
私はnginxの項で述べた通り、すでにLet's Encryptから鍵を取得したので後者の方法を取りたいと思います。
ます取得した鍵をコピーしてきます。
$ sudo cp /etc/letsencrypt/live/{yourdomain}/fullchain.pem /etc/matrix-synapse/fullchain.pem $ sudo cp /etc/letsencrypt/live/{yourdomain}/privkey.pem /etc/matrix-synapse/privkey.pem
matrix-synapse-py3
パッケージはmatrix-synapse.serviceを同梱しています。
また、matrix-synapse.serviceを実行するのはmatrix-synapseユーザです。なので、コピーしてきた鍵をグループに所有させてpermission deniedさせるのを防ごうという感じです。
$ sudo groupadd matrix
$ sudo usermod -G matrix
/etc/matrix-synapse
をrootからmatrixグループに所有者を変更$ sudo chown -R root:matrix /etc/matrix-synapse
homeserver.yaml
を開いて、tls_certificate_path
にfullchain.pem
のパスを、tls_private_key_path
にprivkey.pem
のパスを書くtls_certificate_path: /etc/matrix-synapse/fullchain.pem tls_private_key_path: /etc/matrix-synapse/privkey.pem
matrix-synapse.service
をrestartする$ sudo systemctl restart matrix-synapse
matrix-synapse.serviceが動作していることを確認して、以下のコマンドを実行してください。
$ sudo register_new_matrix_user -u {youruserid} -p {yourpassword} -c /etc/matrix-synapse/homeserver.yaml http://localhost
他のサーバーとやりとりをするには
/.well-known/matrix/server/
にjsonを配置する
の2つの方法があります。ちなみに、先に/.well-known/matrix/server/
を覗いてみて何もなかったらSRVを見にいくようになっているみたいです。
以下の表のようにSRVレコードを登録します。
項目 | 内容 |
---|---|
Name | _matrix._tcp.{yourdomain} |
Target | {yourdomain} |
Port | 443 |
Priority | 10 |
Weight | 5 |
https://matrix.org/federationtester/api/report?server_name={yourdomain}
を確認して、エラーがなければ成功です。
今回取り扱わなかったものが以下のように幾つかあります。これらも公式Docsを参照すれば導入できると思いますので是非やってみてください。
matrixはサーバもクライアントもspecが公開されているので、それぞれいくつもの実装があります(もちろんSynapse以外にもサーバ実装は存在します)。また、クライアント向けSDKやBotフレームワークが豊富にあります。是非開発にしてみてもいいかもしれません。ここにクライアント、サーバ、Botフレームワークの一覧があります、いろいろ試してもいいでしょう。
ところで、matrix-jp.netには#matrix-research:matrix-jp.netや#negao_room:matrix-jp.netなどの部屋があり、わちゃわちゃやっているので是非来てみてください。
といってもまだクライアントの説明がまだですけど……。それは近々どこかに書きたいと思います。
ではでは、よいMatrixライフを!