matrixを構築する。

はじめに

最近、Discord の買収が危惧されている。
Fediverse を眺めていたら、matrixというチャットツールがあるらしい。
これを構築して見ようと思う。

matrix とは

matrix は、Slack や Discord のようなコミュニケーションツールであり、メッセージのやり取り、通話機能、E2E での通話暗号化、ブリッジ機能がある。

環境

OS: Ubuntu 20.04LTS
実行環境: Python3.9

1.実行環境の準備

公式のドキュメントに従い、実行環境を準備する。

terminal
sudo apt update && sudo apt upgrade
sudo apt install build-essential python3-dev libffi-dev python3-pip python3-setuptools sqlite3 libssl-dev virtualenv libjpeg-dev libxslt1-dev

私は、バックグラウンドアプリを構築する際は大体専用ユーザーを作るのが好きだ。

terminal
sudo adduser matrix
sudo gpasswd -a matrix sudo
su - matrix

2.matrix をインストールする。

matrix をインストールする。git から引っ張ってくるわけではないみたい。

terminal
mkdir -p ~/synapse
virtualenv -p python3 ~/synapse/env
source ~/synapse/env/bin/activate
pip install --upgrade pip
pip install --upgrade setuptools
pip install matrix-synapse

update する際はsource ~/synapse/env/bin/activate && pip install -U matrix-synapseを実行するといいらしい。

3.config の生成

matrix を設定していく。

terminal
cd ~/synapse
python -m synapse.app.homeserver \
--server-name my.domain.name \
--config-path homeserver.yaml \
--generate-config \
--report-stats=[yes|no]

my.domain.name は matrix を置きたい domain に変更する、
--report-stats=[yes|no]は yes か no を指定してあげないとだめだ。

4.matrix の設定

デフォルトでは SQLite を使用するらしいが、確かに SQLite は簡単ではあるが重いので Postres を使うようにする。

terminal
~/synapse/env/bin/pip install "matrix-synapse[postgres]"
sudo -u postgres bash
createuser --pwprompt synapse_user
psql
psql
CREATE DATABASE synapse
ENCODING 'UTF8'
LC_COLLATE='C'
LC_CTYPE='C'
template=template0
OWNER synapse_user;
quit;

synapse_user で指定したパスワードをhomeserver.yamldatabase:内に追加する。

homeserver.yaml
806
807
808
809
810
811
812
813
814
815
816
817
database:
name: psycopg2
args:
user: synapse_user

- password: secretpassword
+ password: <pass>
database: synapse
host: localhost
cp_min: 5
cp_max: 10

pb_hba.conf も変えておく。私の場合/etc/postgres/10/main/内にあった。

/etc/postgres/10/main/pg_hba.conf
- host synapse synapse_user ::1/128 md5

synapse_user にパスワードを指定していない場合、pg_hba.conf内に

/etc/postgres/10/main/pg_hba.conf
host all all ::1/128 ident

と書き足しておく。

homeserver.yamlを変更しておく。

homeserver.yaml
54
55
56
57

- server_name: "SERVERNAME"
+ server_name: matrix.slum.cloud

homeserver.yaml
68
69
70
71

- web_client_location: https://riot.example.com/
+ web_client_location: https://matrix.slum.cloud

5.nginx の設定

ドキュメントを参考に設定する。

/etc/nginx/sites-enabled/matrix.slum.cloud
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 443 http2;
listen [::]:443 http2;

// For the federation port
listen 8448 http2 ;
listen [::]:8448 http2 ;

server_name matrix.slum.cloud;

location / {
proxy_pass http://localhost:8008;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;

// Nginx by default only allows file uploads up to 1M in size
// Increase client_max_body_size to match max_upload_size defined in homeserver.yaml
client_max_body_size 50M;
}

}

certbot で証明書を取得したら、listen hoge http2に ssl を書き足しlisten hoge ssl http2のようにする。

/etc/nginx/sites-enabled/matrix.slum.cloud
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
server {

- listen 443 http2;
- listen [::]:443 http2;

+ listen 443 ssl http2;
+ listen [::]:443 ssl http2;


# For the federation port


- listen 8448 http2 ;
- listen [::]:8448 http2 ;

+ listen 8448 ssl http2 ;
+ listen [::]:8448 ssl http2 ;


server_name matrix.slum.cloud;

location / {
proxy_pass http://localhost:8008;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;

// Nginx by default only allows file uploads up to 1M in size
// Increase client_max_body_size to match max_upload_size defined in hom>
client_max_body_size 50M;
}

- ssl_certificate /etc/letsencrypt/live/matrix.slum.cloud/fullchain.pem;
- ssl_certificate_key /etc/letsencrypt/live/matrix.slum.cloud/privkey.pem;
}

再び matrix の config を開く。

homeserver.yaml
552
553
554
555
556
557
558
559
560
561
562
// TLS セクション内の tls_certificate_path と tls_private_key_path を先ほど取得した証明書のパスを書き込む

- #tls_certificate_path: "CONFDIR/SERVERNAME.tls.crt"
+ tls_certificate_path: "/etc/letsencrypt/live/matrix.slum.cloud/fullchain.pem"

// PEM-encoded private key for TLS
//

- #tls_private_key_path: "CONFDIR/SERVERNAME.tls.key"
+ tls_private_key_path: "/etc/letsencrypt/live/matrix.slum.cloud/privkey.pem"

6.実行する

terminal
cd ~/synapse
source env/bin/activate
synctl start

無事動いたらしい。matrix

ユーザーを作成しておく。

terminal
register_new_matrix_user -c homeserver.yaml http://localhost:8008

7.ログインする。

クライアントが必要っぽいのでelementから引っ張ってくる。

サインインを選択

Home Server を変更し認証情報を入力

ログインすることができあ

これで使うようにできた。

8.デーモン化する。

/etc/systemd/system/matrix.slum.cloud.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[Unit]
Description=Synapse Matrix homeserver
// If you are using postgresql to persist data, uncomment this line to make sure
// synapse starts after the postgresql service.
After=postgresql.service

[Service]
Type=notify
NotifyAccess=main
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-abort

User=matrix
Group=matrix

WorkingDirectory=/home/matrix/synapse
ExecStart=/home/matrix/synapse/env/bin/python -m synapse.app.homeserver --config-path=/home/matrix/synapse/homeserver.yaml
SyslogIdentifier=matrix-synapse

// adjust the cache factor if necessary
// Environment=SYNAPSE_CACHE_FACTOR=2.0

[Install]
WantedBy=multi-user.target

設定したら

terminal
sudo systemctl start matrix.slum.cloud
sudo systemctl enable matrix.slum.cloud

これでデーモン化することができる。

参考

Matrix の Homeserver、Synapse を Debian 10 にインストールする
Slack 系 分散 SNS「Matrix」を構築する
systemd

コメント