Matrix Chat · 14 min read · Oct 27, 2025
Rocky Linux 9でMatrix SynapseとElementを使用してチャットサーバーをインストールおよび作成する方法

Matrixは、分散型およびエンドツーエンド暗号化通信のためのオープンスタンダードです。これは、標準化されたAPIを使用してリアルタイムで相互に通信するサーバーとサービスのコレクションです。アカウント情報とチャット履歴を保存するためにホームサーバーを使用します。1つのホームサーバーがダウンしても、分散化の性質により他のサーバーは問題なく通信を続けることができます。他の誰かがホストするMatrixホームサーバーを使用するか、自分のデータを管理するために自分自身のサーバーをホストすることができます。
このチュートリアルでは、Matrixのホームサーバー実装であるSynapseを使用してチャットサーバーをインストールおよび作成する方法を学びます。Elementは、Matrix React SDKを使用して構築されたMatrixウェブクライアントです。これにより、ウェブ上でMatrixチャットを提供できます。また、他のMatrixクライアントでもサーバーを使用できます。音声およびビデオ通話を有効にするためにCoturnサーバーもインストールします。Coturnサービスは、使用することに興味がない場合はオプションです。
前提条件
- Debian 12を実行しているサーバー。
- root権限を持つ非sudoユーザー。
- 簡単なファイアウォール(UFW)が有効で実行中。
- Matrix、Element、およびCoturnの完全修飾ドメイン名(FQDN)がサーバーを指していること。私たちはそれぞれの3つのサービスに対して
matrix.example.com、element.example.com、coturn.example.comを使用します。 - すべてが更新されていることを確認してください。
$ sudo dnf update
- システムに必要なパッケージがいくつかあります。
$ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -yこれらのパッケージのいくつかは、すでにシステムにインストールされている可能性があります。
ステップ1 - ファイアウォールの設定
パッケージをインストールする前に、最初のステップはHTTP、HTTPS、およびSynapse用のポートを開くためにファイアウォールを設定することです。Rocky LinuxはFirewalldファイアウォールを使用します。ファイアウォールの状態を確認します。
$ sudo firewall-cmd --state
runningファイアウォールは異なるゾーンで動作し、パブリックゾーンがデフォルトで使用されます。ファイアウォールでアクティブなすべてのサービスとポートをリストします。
$ sudo firewall-cmd --zone=public --list-all次の出力が表示されるはずです。
public
target: default
icmp-block-inversion: no
interfaces: enp1s0
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:ファイアウォールでHTTP、HTTPS、およびSynapseポートを開きます。
$ sudo firewall-cmd --zone=public --add-port=8448/tcp
$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=httpsファイアウォールの状態を再確認します。
$ sudo firewall-cmd --zone=public --list-all同様の出力が表示されるはずです。
public
target: default
icmp-block-inversion: no
interfaces: enp1s0
sources:
services: cockpit dhcpv6-client http https ssh
ports: 8448/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:すべての変更を永続化し、ファイアウォールを再読み込みして変更を有効にします。
$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reloadステップ2 - PostgreSQLのインストールと設定
Rocky Linux 9にはデフォルトでPostgreSQL 13が付属しています。私たちは公式リポジトリからPostgreSQL 16を使用します。
PostgreSQL RPMリポジトリをインストールします。
$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm組み込みのPostgreSQLモジュールを無効にします。
$ sudo dnf -qy module disable postgresql次に、以下のコマンドを使用してPostgreSQLをインストールできます。
$ sudo dnf install -y postgresql16-server postgresql16-contrib postgresql16-develsudo dnf install postgresql16-devel
export PATH=$PATH:/usr/pgsql-16/bin
postgresql-contribパッケージには、いくつかの追加ユーティリティが含まれています。
バージョンを確認します。
$ psql --version
psql (PostgreSQL) 16.1PostgreSQLデータベースを初期化します。
$ sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
Initializing database ... OKPostgreSQLサービスを有効にします。
$ sudo systemctl enable postgresql-16PostgreSQLサービスを開始します。
$ sudo systemctl start postgresql-16PostgreSQLサービスの状態を確認します。
$ sudo systemctl status postgresql-16
? postgresql-16.service - PostgreSQL 16 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; preset: disabled)
Active: active (running) since Tue 2024-01-30 11:55:26 UTC; 10s ago
Docs: https://www.postgresql.org/docs/16/static/
Process: 9610 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 9615 (postgres)
Tasks: 7 (limit: 12225)
Memory: 17.4M
CPU: 98ms
CGroup: /system.slice/postgresql-16.service
??9615 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
??9616 "postgres: logger "
??9617 "postgres: checkpointer "
??9618 "postgres: background writer "
??9620 "postgres: walwriter "
??9621 "postgres: autovacuum launcher "
??9622 "postgres: logical replication launcher "
Jan 30 11:55:26 matrix.example.com systemd[1]: Starting PostgreSQL 16 database server...
Jan 30 11:55:26 matrix.example.com postgres[9615]: 2024-01-30 11:55:26.482 UTC [9615] LOG: redirecting log output to logging collector process
Jan 30 11:55:26 matrix.example.com postgres[9615]: 2024-01-30 11:55:26.482 UTC [9615] HINT: Future log output will appear in directory "log".
Jan 30 11:55:26 matrix.example.com systemd[1]: Started PostgreSQL 16 database server.サービスがデフォルトで有効になって実行されていることが確認できます。
postgresシステムアカウントにログインします。
$ sudo -su postgres新しいデータベースユーザーとPostgreSQL用のデータベースを作成します。ユーザーを作成する際にパスワードを求められます。
$ createuser --pwprompt synapse
$ createdb --encoding=UTF8 --locale=C --template=template0 --owner=synapse synapsedbpostgresアカウントから退出します。
$ exitステップ3 - Matrix Synapseのインストール
Matrix Synapseは、Rocky LinuxのようなCentOSベースのディストリビューション用に事前構築されたパッケージを持っていません。したがって、PyPIからPythonモジュールとしてインストールします。
最初のステップは、Synapseが動作するために必要な前提条件をインストールすることです。python3-virtualenvパッケージを含むEPELリポジトリも必要です。
$ sudo dnf install epel-release
$ sudo dnf install --enablerepo=crb libtiff-devel libjpeg-devel libzip-devel \
freetype-devel libwebp-devel libxml2-devel libxslt-devel \
libpq-devel python3-virtualenv libffi-devel openssl-devel \
python3-devel libicu-devel
$ sudo dnf groupinstall "Development Tools"
$ sudo dnf install postgresql16-develSynapse用のディレクトリを作成します。
$ mkdir -p ~/synapse指定されたディレクトリにPython仮想環境を作成します。
$ virtualenv -p python3 ~/synapse/env仮想環境をアクティブにします。
$ source ~/synapse/env/bin/activate最新のpipとsetuptoolsのバージョンを持っていることを確認します。
(env) $ pip install --upgrade pip
(env) $ pip install --upgrade setuptoolsMatrix Synapseをインストールします。
(env) $ pip install "matrix-synapse[postgres]"これにより、PyPIからSynapseがダウンロードされ、使用するPythonライブラリが~/synapse/envフォルダーの仮想環境にインストールされます。また、SynapseがPostgreSQLサーバーに接続するために必要なPostgreSQL Pythonライブラリもインストールされます。上記のコマンドは、pip install matrix-synapseとpip install psycopg2コマンドの組み合わせです。
次のステップは、いくつかの基本設定を持つ構成ファイルを生成することです。Synapseディレクトリに移動します。
(env) $ cd ~/synapse次のコマンドを実行して構成ファイルを生成します。
(env) $ python -m synapse.app.homeserver \
--server-name matrix.example.com \
--config-path homeserver.yaml \
--generate-config \
--report-stats=[yes|no]--server-name変数の値は、Matrix IDの一部を形成します。その値としてMatrixドメイン名を入力します。これがあなたのホームサーバーアドレスとして機能します。
--report-stats変数を介して、ホームサーバーに関する匿名化された統計をMatrixに送信するかどうかを選択できます。選択に応じてyesまたはnoを選択してください。
次の出力が得られます。
Generating config file homeserver.yaml
Generating log config file /home/navjot/synapse/matrix.example.com.log.config which will log to /home/navjot/synapse/homeserver.log
Generating signing key file /home/navjot/synapse/matrix.example.com.signing.key
A config file has been generated in 'homeserver.yaml' for server name 'matrix.example.com'. Please review this file and customise it to your needs.これらの設定は、~/synapse/homeserver.yamlまたは/home/ファイルで後で変更できます。上記のコマンドによって生成されたキーは、他のホームサーバーに対して自分のホームサーバーを識別するために使用されます。
Matrixサーバーを実行する時間です。Synapseディレクトリ内にいて、仮想環境がアクティブであることを確認してください。
ホームサーバーを開始します。
(env) $ synctl start同様の出力が表示されるはずです。
This server is configured to use 'matrix.org' as its trusted key server via the
'trusted_key_servers' config option. 'matrix.org' is a good choice for a key
server since it is long-lived, stable and trusted. However, some admins may
wish to use another server for this purpose.
To suppress this warning and continue using 'matrix.org', admins should set
'suppress_key_server_warning' to 'true' in homeserver.yaml.
--------------------------------------------------------------------------------
started synapse.app.homeserver(homeserver.yaml)サーバーを停止するには、次のコマンドを実行します。
(env) $ synctl stop仮想環境を非アクティブにします。
(env) $ deactivateステップ4 - Nginxのインストール
本番環境では、Nginxプロキシを使用してSynapseサーバーを実行することをお勧めします。
Rocky Linux 9には古いバージョンのNginxが付属しています。最新バージョンをインストールするには、公式のNginxリポジトリを使用する必要があります。
/etc/yum.repos.d/nginx.repoファイルを作成して開きます。
$ sudo nano /etc/yum.repos.d/nginx.repo以下のコードを貼り付けます。
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true完了したら、Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。
Nginxメインラインをインストールするために、そのパッケージを有効にします。
$ sudo dnf config-manager --enable nginx-mainlineNginxをインストールします。
$ sudo dnf install nginx -yインストールを確認します。
$ nginx -v
nginx version: nginx/1.25.3Nginxサーバーサービスを有効にして開始します。
$ sudo systemctl enable nginx --nowサービスの状態を確認します。
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
Active: active (running) since Tue 2024-01-30 12:50:34 UTC; 4s ago
Docs: http://nginx.org/en/docs/
Process: 10810 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 10811 (nginx)
Tasks: 3 (limit: 12225)
Memory: 3.1M
CPU: 24ms
CGroup: /system.slice/nginx.service
??10811 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??10812 "nginx: worker process"
??10813 "nginx: worker process"ステップ5 - SSLのインストール
SSL証明書を生成するためにCertbotをインストールする必要があります。それにはSnapdパッケージインストーラーを使用します。Rocky Linuxにはそれが付属していないため、Snapdインストーラーをインストールします。これにはEPEL(Enterprise Linuxのための追加パッケージ)リポジトリが必要です。しかし、ステップ3で既にインストールしたので、直接進むことができます。
Snapdパッケージをインストールします。
$ sudo dnf install snapd -ySnapサービスを有効にして開始します。
$ sudo systemctl enable snapd --nowSnapコアパッケージをインストールし、Snapdのバージョンが最新であることを確認します。
$ sudo snap install core
$ sudo snap refresh coreSnapdが動作するために必要なリンクを作成します。
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.shCertbotをインストールします。
$ sudo snap install --classic certbotCertbotコマンドが/usr/binディレクトリにシンボリックリンクを作成することで実行できることを確認します。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbotCertbotのバージョンを確認します。
$ certbot --version
certbot 2.8.0次のコマンドを実行してSSL証明書を生成します。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d matrix.example.com上記のコマンドは、サーバーの/etc/letsencrypt/live/matrix.example.comディレクトリに証明書をダウンロードします。
Diffie-Hellmanグループ証明書を生成します。
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096Certbotの更新スケジューラーサービスを確認します。
$ systemctl list-timersdnf-makecache.timerの1つとしてsnap.certbot.renew.serviceがスケジュールされていることがわかります。
NEXT LEFT LAST PASSED UNIT ACTIVATES ----------------------------------------------------------------------------------------------------------------------------------
Tue 2024-01-30 14:37:50 UTC 29min left Tue 2024-01-30 13:05:13 UTC 1h 3min ago dnf-makecache.timer dnf-makecache.service
Tue 2024-01-30 15:13:00 UTC 1h 4min left - - snap.certbot.renew.timer snap.certbot.renew.service
Wed 2024-01-31 00:00:00 UTC 9h left Tue 2024-01-30 06:35:44 UTC 7h ago logrotate.timer logrotate.serviceプロセスのドライランを実行して、SSL更新が正常に機能しているかどうかを確認します。
$ sudo certbot renew --dry-runエラーが表示されない場合は、すべて設定完了です。証明書は自動的に更新されます。
ステップ6 - SELinuxの設定
SELinuxは、バイナリがユーザーのホームディレクトリにあるシステムサービスを実行するのを防ぎます。このため、Synapseのためにサービスファイルを作成すると、SELinuxによってブロックされます。この問題を回避するために、次のコマンドを実行してPythonバイナリをシステムサービスとして実行できるようにします。
$ sudo chcon -R -t bin_t /home/username/synapse/env/bin/python外部ホストへの接続を許可するポリシーを適用します。
$ sudo setsebool -P httpd_can_network_connect 1NginxがPostgreSQLへのアクセスを許可するポリシーを適用します。
$ sudo setsebool -P httpd_can_network_connect_db 1ステップ7 - Matrix Systemdサービスの作成
Synapseサービスの状態は再起動を跨いで保存されないため、サーバーを再起動すると手動でサーバーを起動する必要があります。この問題を回避するために、Systemdファイルを作成する必要があります。
その前に、Synapseサービスが停止していることを確認してください。
$ cd ~/synapse
$ source env/bin/activate
(env) $ synctl stop
(env) $ deactivate/etc/systemd/system/ディレクトリにmatrix-synapse.serviceファイルを作成して開きます。
$ sudo nano /etc/systemd/system/matrix-synapse.service以下のコードを貼り付けます。username変数を、SynapseをインストールしたLinuxシステムユーザーに置き換えます。
# This assumes that Synapse has been installed by a user named username.
# This assumes that Synapse has been installed in a virtualenv in
# the user's home directory: `/home/username/synapse/env`.
[Unit]
Description=Synapse Matrix homeserver
After=postgresql-16.service
[Service]
Type=notify
NotifyAccess=main
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-abort
WorkingDirectory=/home/username/synapse
ExecStart=/home/username/synapse/env/bin/python -m synapse.app.homeserver --config-path=/home/username/synapse/homeserver.yaml
SyslogIdentifier=matrix-synapse
# adjust the cache factor if necessary
# Environment=SYNAPSE_CACHE_FACTOR=2.0
[Install]
WantedBy=multi-user.target完了したら、Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。
サービスデーモンをリロードします。
$ sudo systemctl daemon-reloadMatrix Synapseサービスを有効にします。
$ sudo systemctl enable matrix-synapseMatrix Synapseサービスを開始します。
$ sudo systemctl start matrix-synapseサービスの状態を確認します。
$ sudo systemctl status matrix-synapse次の出力が表示されるはずです。
? matrix-synapse.service - Synapse Matrix homeserver
Loaded: loaded (/etc/systemd/system/matrix-synapse.service; enabled; preset: disabled)
Active: active (running) since Tue 2024-01-30 14:20:20 UTC; 5s ago
Main PID: 14687 (python)
Tasks: 8 (limit: 12225)
Memory: 77.6M
CPU: 3.527s
CGroup: /system.slice/matrix-synapse.service
??14687 /home/navjot/synapse/env/bin/python -m synapse.app.homeserver --config-path=/home/navjot/synapse/homeserver.yaml
Jan 30 14:20:16 matrix.example.com systemd[1]: Starting Synapse Matrix homeserver...
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: This server is configured to use 'matrix.org' as its trusted key server via the
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: 'trusted_key_servers' config option. 'matrix.org' is a good choice for a key
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: server since it is long-lived, stable and trusted. However, some admins may
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: wish to use another server for this purpose.
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: To suppress this warning and continue using 'matrix.org', admins should set
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: 'suppress_key_server_warning' to 'true' in homeserver.yaml.
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: --------------------------------------------------------------------------------
Jan 30 14:20:20 matrix.example.com systemd[1]: Started Synapse Matrix homeserver.ステップ8 - Matrix Synapseの設定
先に進む前に、最初に秘密の登録キーを作成します。このキーは安全に保管する必要があります。なぜなら、登録が無効になっている場合でも、新しいユーザーを登録できるようになるからです。
$ echo "registration_shared_secret: '$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)'"
registration_shared_secret: '1y75ja0RUxvbWcS6SdZhakenukUwHHEjOXWC9Mu3FpO0QenOnpKRsc6NBZSxuzPcHYsOEuIQziwVjSZcP87dlWK4ZkIGYniurMqNsCYL4xg5xXs4bJDuTJH2CUXab4U9liv399lmkIZFaMpJCLxV9lVWB9mKHILYsjeLgGY5wAARv1SiK07bFsQOwKJGFqIvsUXmxymx5QCNDzTHw8R4ShqZ7elnnZrbdYk4r2f7qogERNHvQaRV7IEYUIOtMhVP'上記の行から出力をコピーして保存します。
Matrixサーバーは/home/username/synapse/homeserver.yamlファイルを介して構成できます。編集のために開きます。
$ nano ~/synapse/homeserver.yamlファイルの下部に登録キーコマンドの出力を貼り付けます。
デフォルトでは、SynapseはSQLiteデータベースを使用するように構成されています。これを編集してPostgreSQLの資格情報を追加する必要があります。
ファイル内の次のセクションを見つけて、次のようにコメントアウトします。
#database:
# name: sqlite3
# args:
# database: /home/navjot/synapse/homeserver.dbその下に次のセクションを追加します。your-passwordフィールドを、ステップ3で作成したPostgreSQLユーザーのパスワードに置き換えます。データベースを別の場所でホストしている場合は、localhostをサーバーのIPアドレスに置き換えます。
database:
name: psycopg2
args:
user: synapse
password: 'your-password'
database: synapsedb
host: localhost
cp_min: 5
cp_max: 10デフォルトでは、Synapseはオンラインであるかどうかを示すプレゼンスインジケーターを有効にします。これによりCPU使用率が高くなる可能性があるため、無効にすることができます。次の行をファイルの下部に貼り付けます。
presence:
enabled: false完了したら、Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。
新しいMatrixユーザーを作成します。ユーザー名とパスワードを求められます。これは最初に作成するユーザーなので、ユーザーを管理者にするかどうか尋ねられたときにyesと入力します。ユーザーを作成するには仮想環境をアクティブにする必要があります。
$ cd ~/synapse
$ source env/bin/activate
(env) $ register_new_matrix_user -c homeserver.yaml http://localhost:8008
New user localpart [navjot]: navjot
Password:
Confirm password:
Make admin [no]: yes
Sending registration request...
Success!
(env) $ deactivate上記のコマンドではポート8008を使用していることがわかります。これはMatrix Synapseがリッスンするデフォルトのポートです。
デフォルトでは、新しいユーザーの登録は無効になっているため、上記のようにすべてのユーザーを手動で登録する必要があります。公開登録を開く場合は、homeserver.yamlファイルを編集することで可能です。
再度編集のために開きます。
$ nano ~/synapse/homeserver.yaml次の行をファイルの下部に貼り付けます。
enable_registration: trueデフォルトでは、Synapseはメール確認なしでの登録を許可しません。メール確認を有効にするには、次の行を貼り付けます。
registrations_require_3pid:
- email
email:
smtp_host: mail.example.com
smtp_port: 587
# If mail server has no authentication, skip these 2 lines
smtp_user: '[email protected]'
smtp_pass: 'password'
# Optional, require encryption with STARTTLS
require_transport_security: true
app_name: 'HowtoForge Example Chat' # defines value for %(app)s in notif_from and email subject
notif_from: "%(app)s <[email protected]>"メール確認を無効にするには、代わりに次の行を貼り付けます。
enable_registration_without_verification: true完了したら、Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。
設定を適用するためにSynapseを再起動します。
$ sudo systemctl restart matrix-synapseステップ9 - Nginxの設定
/etc/nginx/nginx.confファイルを編集のために開きます。
$ sudo nano /etc/nginx/nginx.confinclude /etc/nginx/conf.d/*.conf;の前に次の行を追加します。
server_names_hash_bucket_size 64;完了したら、Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。
/etc/nginx/conf.d/synapse.confファイルを作成して開きます。
$ sudo nano /etc/nginx/conf.d/synapse.conf以下のコードを貼り付けます。
# enforce HTTPS
server {
# Client port
listen 80;
listen [::]:80;
server_name matrix.example.com;
return 301 https://$host$request_uri;
}
server {
server_name matrix.example.com;
# Client port
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
# Federation port
listen 8448 ssl default_server;
listen [::]:8448 ssl default_server;
access_log /var/log/nginx/synapse.access.log;
error_log /var/log/nginx/synapse.error.log;
# TLS configuration
ssl_certificate /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/matrix.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/matrix.example.com/chain.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
resolver_timeout 2s;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
tcp_nopush on;
gzip on;
location ~ ^(/_matrix|/_synapse/client) {
proxy_pass http://localhost:8008;
proxy_http_version 1.1;
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;
}
}完了したら、Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。上記の構成は、example.comおよびmatrix.example.comのドメインのIPアドレスが同じサーバーを指していることを前提としています。そうでない場合は、example.comサーバー用の次の構成ファイルを使用します。
server {
server_name example.com;
listen 443 ssl http2;
listen [::]:443 ssl http2;
# TLS configuration
ssl_certificate /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/matrix.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/matrix.example.com/chain.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
resolver_timeout 2s;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
# Redirect
location ~ ^(/_matrix|/_synapse/client) {
return 301 "https://matrix.example.com$request_uri";
}
# Client homeserver autodiscovery
location /.well-known/matrix/client {
default_type application/json;
add_header Access-Control-Allow-Origin *;
return 200 '{ "m.homeserver": { "base_url": "https://matrix.example.com" } }';
}
# Domain delegation
location /.well-known/matrix/server {
default_type application/json;
add_header Access-Control-Allow-Origin *;
return 200 '{ "m.server": "matrix.example.com" }';
}
}Nginx構成ファイルの構文を確認します。
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulNginxサービスを再起動します。
$ sudo systemctl restart nginxステップ10 - Coturnのインストール
音声およびビデオ通話を有効にするために、NATの周りでリレーを使用するトラバーサル(TURN)サーバーをインストールする必要があります。この目的のためにCoturnパッケージをインストールします。この機能が必要ない場合は、このステップをスキップできます。
Coturnをインストールします。
$ sudo dnf install coturnTURNおよびUDPポートを開きます。
$ sudo firewall-cmd --zone=public --add-port=3478/{tcp,udp}
$ sudo firewall-cmd --zone=public --add-port=5349/{tcp,udp}
$ sudo firewall-cmd --zone=public --add-port=49152-65535/udp
$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reloadTurn(coturn.example.com)のSSL証明書を生成します。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d coturn.example.comCoturnの認証シークレットを生成します。
$ echo "static-auth-secret=$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)"
static-auth-secret=u3ksgJ9X876sFMO00A8KabXwZvzVwCmV30wWvZ7DzGiepRwNRYSCTYzf2E8olNzdDHu7oO3XpT3l5bv5mVdhXEQ3pnoTWBquSVPFFBJtyD6y9gBxiMaD2TYTD2WohQLE9s7OKJVpkDeKTnZQnkmjrFadE3M9DRxPL1W5Lgdg6XLLKABgb5XGkutRgkJOV0JRH4sBYsot63fWq9mcGTm6nAMdIycvDVDOs7vhoeqRzcTbMF0wsfAHVJNhXpGGFDyZ設定ファイルを編集するために開きます。
$ sudo nano /etc/coturn/turnserver.confファイルを通じて必要な設定を有効にします。まず、use-auth-secret行のコメントを外して認証方法を有効にします。
# Be aware that use-auth-secret overrides some parts of lt-cred-mech.
# The use-auth-secret feature depends internally on lt-cred-mech, so if you set
# this option then it automatically enables lt-cred-mech internally
# as if you had enabled both.
#
# Note that you can use only one auth mechanism at the same time! This is because,
# both mechanisms conduct username and password validation in different ways.
#
# Use either lt-cred-mech or use-auth-secret in the conf
# to avoid any confusion.
#
use-auth-secret次に、上記で作成した値でstatic-auth-secret変数を設定します。このシークレットは、後でSynapseを構成するためにも必要です。
# 'Static' authentication secret value (a string) for TURN REST API only.
# If not set, then the turn server
# will try to use the 'dynamic' value in the turn_secret table
# in the user database (if present). The database-stored value can be changed on-the-fly
# by a separate program, so this is why that mode is considered 'dynamic'.
#
static-auth-secret=u3ksgJ9X876sFMO00A8KabXwZvzVwCmV30wWvZ7DzGiepRwNRYSCTYzf2E8olNzdDHu7oO3XpT3l5bv5mVdhXEQ3pnoTWBquSVPFFBJtyD6y9gBxiMaD2TYTD2WohQLE9s7OKJVpkDeKTnZQnkmjrFadE3M9DRxPL1W5Lgdg6XLLKABgb5XGkutRgkJOV0JRH4sBYsot63fWq9mcGTm6nAMdIycvDVDOs7vhoeqRzcTbMF0wsfAHVJNhXpGGFDyZ次に変更する必要がある値はrealmです。これはCoturnのために選択したドメインを指します。
# The default realm to be used for the users when no explicit
# origin/realm relationship is found in the database, or if the TURN
# server is not using any database (just the commands-line settings
# and the userdb file). Must be used with long-term credentials
# mechanism or with TURN REST API.
#
# Note: If the default realm is not specified, then realm falls back to the host domain name.
# If the domain name string is empty, or set to '(None)', then it is initialized as an empty string.
#
realm=coturn.example.com次に、セッション数とユーザーごとのセッション数を定義します。サーバーに適した値を選択してください。
# Per-user allocation quota.
# default value is 0 (no quota, unlimited number of sessions per user).
# This option can also be set through the database, for a particular realm.
#
user-quota=12
# Total allocation quota.
# default value is 0 (no quota).
# This option can also be set through the database, for a particular realm.
#
total-quota=1200次に、VOIPはUDPであるため、TCPを無効にする必要があります。
# Uncomment if no TCP relay endpoints are allowed.
# By default TCP relay endpoints are enabled (like in RFC 6062).
#
no-tcp-relayCoturnのために作成した証明書の場所を設定する必要があります。
# Certificate file.
# Use an absolute path or path relative to the
# configuration file.
# Use PEM file format.
#
cert=/etc/letsencrypt/live/coturn.example.com/fullchain.pem
# Private key file.
# Use an absolute path or path relative to the
# configuration file.
# Use PEM file format.
#
pkey=/etc/letsencrypt/live/coturn.example.com/privkey.pem次に、プライベートIP範囲へのトラフィックを無効にし、マルチキャストアドレスのピアを禁止してセキュリティを向上させる必要があります。
# Flag that can be used to disallow peers on well-known broadcast addresses (224.0.0.0 and above, and FFXX:*).
# This is an extra security measure.
#
no-multicast-peers
...............
# Option to allow or ban specific ip addresses or ranges of ip addresses.
# If an ip address is specified as both allowed and denied, then the ip address is
# considered to be allowed. This is useful when you wish to ban a range of ip
# addresses, except for a few specific ips within that range.
#
# This can be used when you do not want users of the turn server to be able to access
# machines reachable by the turn server, but would otherwise be unreachable from the
# internet (e.g. when the turn server is sitting behind a NAT)
#
# Examples:
# denied-peer-ip=83.166.64.0-83.166.95.255
# allowed-peer-ip=83.166.68.45
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=192.88.99.0-192.88.99.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
denied-peer-ip=240.0.0.0-255.255.255.255
denied-peer-ip=::1
denied-peer-ip=64:ff9b::-64:ff9b::ffff:ffff
denied-peer-ip=::ffff:0.0.0.0-::ffff:255.255.255.255
denied-peer-ip=100::-100::ffff:ffff:ffff:ffff
denied-peer-ip=2001::-2001:1ff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=2002::-2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff完了したら、Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。
Coturnを再起動して設定を適用します。
$ sudo systemctl restart coturnSynapse構成(homeserver.yaml)ファイルを開いてCoturn設定を追加します。
$ nano ~/synapse/homeserver.yaml次の行を貼り付けます。turn_shared_secret値を、/etc/coturn/turnserver.confファイルのstatic-auth-secretの値に置き換えます。
turn_uris: [ "turn:coturn.example.com?transport=udp", "turn:coturn.example.com?transport=tcp" ]
turn_shared_secret: 'static-auth-secret'
turn_user_lifetime: 86400000
turn_allow_guests: True
# vim:ft=yaml完了したら、Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。
Synapseを再起動して変更を適用します。
$ sudo systemctl restart matrix-synapseステップ11 - Matrixにアクセス
Elementのウェブクライアントを使用してMatrixチャットにアクセスできます。URLはhttps://app.element.ioです。サインインボタンをクリックして進みます。

ホームサーバーの下にある編集リンクをクリックします。matrix.example.comをホームサーバーとして入力します。

クライアントがホームサーバーを正しく検出すると、境界とテキストが緑色になり、そうでない場合は赤色で表示されます。続行をクリックして進みます。

ステップ8でSynapseを構成する際に作成したユーザー名とパスワードを入力します。サインインボタンをクリックしてログインします。安全で暗号化されたバックアップを作成するように求められます。

セキュリティフレーズを入力オプションを選択して、ログインするたびに必要なセキュリティフレーズを作成します。続行をクリックして進みます。

セキュリティフレーズを入力し、続行ボタンをクリックして進みます。次の画面で再度確認するように求められます。

再度フレーズを入力し、続行ボタンをクリックして進みます。

セキュリティフレーズを忘れた場合に使用できるセキュリティキーのセットが提供されます。ダウンロードボタンをクリックして保存します。
続行ボタンをクリックして進みます。

アカウントのパスワードを求められます。パスワードを入力し、続行ボタンをクリックして暗号化バックアップの設定を完了します。

ホームページのグループチャット作成ボタンを使用して、HowtoForgeという名前のグループチャットルームを作成しました。ボタンをクリックすると、次のポップアップが表示されます。

高度なメニューを展開してオプションを選択することで、メンバーをドメインに制限できます。ルームを作成ボタンをクリックしてルームの作成を完了します。
ステップ12 - Elementのインストール
Element用のディレクトリを作成します。
$ sudo mkdir -p /var/www/html/element最新のElementリリースを取得するための新しいファイルを作成します。
$ sudo nano /var/www/html/element/update.sh以下の行を追加します。
#!/bin/sh
set -e
install_location="/var/www/html/element"
latest="
$(curl -I https://github.com/element-hq/element-web/releases/latest | awk -F '/' '/^location/ {print substr($NF, 1, length($NF)-1)}')
"
cd "$install_location"
[ ! -d "archive" ] && mkdir -p "archive"
[ -d "archive/element-${latest}" ] && rm -r "archive/element-${latest}"
[ -f "archive/element-${latest}.tar.gz" ] && rm "archive/element-${latest}.tar.gz"
wget "https://github.com/element-hq/element-web/releases/download/${latest}/element-${latest}.tar.gz" -P "archive"
tar xf "archive/element-${latest}.tar.gz" -C "archive"
[ -L "${install_location}/current" ] && rm "${install_location}/current"
ln -sf "${install_location}/archive/element-${latest}" "${install_location}/current"
ln -sf "${install_location}/config.json" "${install_location}/current/config.json"完了したら、Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。
ファイルを実行可能にします。
$ sudo chmod +x /var/www/html/element/update.shスクリプトを実行してElementをダウンロードします。
$ sudo /var/www/html/element/update.shステップ13 - Elementの設定
同じElement構成ファイルをコピーします。
$ sudo cp /var/www/html/element/current/config.sample.json /var/www/html/element/config.json構成ファイルを編集のために開きます。
$ sudo nano /var/www/html/element/config.json次の行を見つけます。
"m.homeserver": {
"base_url": "https://matrix-client.matrix.org",
"server_name": "matrix.org"
},デフォルトのMatrixホームサーバーアドレスをホームサーバーに変更し、server_name変数を削除します。
"m.homeserver": {
"base_url": "https://matrix.example.com",
"server_name": "example.com"
},ウェブサイトのタイトルにElementの代わりに自分の名前を使用したい場合は、ブランド名を変更します。
"brand": "HowtoForge Example Chat",disable_guests変数をtrueに設定して、ゲストがElementを使用できないようにします。
"disable_guests": true,完了したら、Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。
ElementクライアントのためにSSL証明書を生成します。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d element.example.com/etc/nginx/conf.d/element.confファイルを作成して開きます。
$ sudo nano /etc/nginx/conf.d/element.conf以下の行を貼り付けます。
server {
listen 80;
listen [::]:80;
server_name element.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name element.example.com;
root /var/www/html/element/current;
index index.html;
access_log /var/log/nginx/element.access.log;
error_log /var/log/nginx/element.error.log;
add_header Referrer-Policy "strict-origin" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
# TLS configuration
ssl_certificate /etc/letsencrypt/live/element.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/element.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/element.example.com/chain.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
resolver_timeout 2s;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
}完了したら、Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。
Nginx構成ファイルの構文を確認します。
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulNginxサービスを再起動します。
$ sudo systemctl restart nginxElementにアクセスする前にSELinux設定を構成する必要があります。次のコマンドを実行してElementの実行を許可します。
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/element(/.*)?"
$ sudo restorecon -Rv /var/www/html/element/ブラウザでhttps://element.example.comにアクセスしてElementクライアントにアクセスできます。ログインすると、アプリのダッシュボードに移動します。最初にhttps://app.element.ioでアプリを確認するように求められます。元のElementアプリにログインしていることを確認し、絵文字の文字を一致させるように求められます。確認が完了すると、次のダッシュボードが表示されます。

結論
これで、Debian 12マシン上でNginxをプロキシサーバーとして使用してMatrix SynapseチャットサーバーとCoturnおよびElementウェブクライアントをインストールする方法に関するチュートリアルが終了しました。質問がある場合は、下のコメントに投稿してください。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。