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
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
- server_name: "SERVERNAME"
+ server_name: matrix.slum.cloud
homeserver.yaml
68
69
- 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
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
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
// 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

コメント