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サービスは、使用することに興味がない場合はオプションです。

前提条件

  1. Debian 12を実行しているサーバー。
  2. root権限を持つ非sudoユーザー。
  3. 簡単なファイアウォール(UFW)が有効で実行中。
  4. Matrix、Element、およびCoturnの完全修飾ドメイン名(FQDN)がサーバーを指していること。私たちはそれぞれの3つのサービスに対してmatrix.example.comelement.example.comcoturn.example.comを使用します。
  5. すべてが更新されていることを確認してください。 $ 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-devel

sudo dnf install postgresql16-devel

export PATH=$PATH:/usr/pgsql-16/bin

postgresql-contribパッケージには、いくつかの追加ユーティリティが含まれています。

バージョンを確認します。

$ psql --version
psql (PostgreSQL) 16.1

PostgreSQLデータベースを初期化します。

$ sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
Initializing database ... OK

PostgreSQLサービスを有効にします。

$ sudo systemctl enable postgresql-16

PostgreSQLサービスを開始します。

$ sudo systemctl start postgresql-16

PostgreSQLサービスの状態を確認します。

$ 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 synapsedb

postgresアカウントから退出します。

$ 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-devel

Synapse用のディレクトリを作成します。

$ mkdir -p ~/synapse

指定されたディレクトリにPython仮想環境を作成します。

$ virtualenv -p python3 ~/synapse/env

仮想環境をアクティブにします。

$ source ~/synapse/env/bin/activate

最新のpipsetuptoolsのバージョンを持っていることを確認します。

(env) $ pip install --upgrade pip
(env) $ pip install --upgrade setuptools

Matrix Synapseをインストールします。

(env) $ pip install "matrix-synapse[postgres]"

これにより、PyPIからSynapseがダウンロードされ、使用するPythonライブラリが~/synapse/envフォルダーの仮想環境にインストールされます。また、SynapseがPostgreSQLサーバーに接続するために必要なPostgreSQL Pythonライブラリもインストールされます。上記のコマンドは、pip install matrix-synapsepip 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//synapse/homeserver.yamlファイルで後で変更できます。上記のコマンドによって生成されたキーは、他のホームサーバーに対して自分のホームサーバーを識別するために使用されます。

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-mainline

Nginxをインストールします。

$ sudo dnf install nginx -y

インストールを確認します。

$ nginx -v
nginx version: nginx/1.25.3

Nginxサーバーサービスを有効にして開始します。

$ 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 -y

Snapサービスを有効にして開始します。

$ sudo systemctl enable snapd --now

Snapコアパッケージをインストールし、Snapdのバージョンが最新であることを確認します。

$ sudo snap install core
$ sudo snap refresh core

Snapdが動作するために必要なリンクを作成します。

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

Certbotをインストールします。

$ sudo snap install --classic certbot

Certbotコマンドが/usr/binディレクトリにシンボリックリンクを作成することで実行できることを確認します。

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Certbotのバージョンを確認します。

$ 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 4096

Certbotの更新スケジューラーサービスを確認します。

$ systemctl list-timers

dnf-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 1

Nginxが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-reload

Matrix Synapseサービスを有効にします。

$ sudo systemctl enable matrix-synapse

Matrix 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.conf

include /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 successful

Nginxサービスを再起動します。

$ sudo systemctl restart nginx

ステップ10 - Coturnのインストール

音声およびビデオ通話を有効にするために、NATの周りでリレーを使用するトラバーサル(TURN)サーバーをインストールする必要があります。この目的のためにCoturnパッケージをインストールします。この機能が必要ない場合は、このステップをスキップできます。

Coturnをインストールします。

$ sudo dnf install coturn

TURNおよび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 --reload

Turn(coturn.example.com)のSSL証明書を生成します。

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d coturn.example.com

Coturnの認証シークレットを生成します。

$ 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-relay

Coturnのために作成した証明書の場所を設定する必要があります。

# 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 coturn

Synapse構成(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です。サインインボタンをクリックして進みます。

Element Web Login Page

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

Element Client Custom Homeserver

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

Element Custom Homeserver Login

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

Matrix Secure Backup

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

Element Security Phrase

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

Element Confirm Security Phrase

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

Element Security Key Popup

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

続行ボタンをクリックして進みます。

Element Password Verify

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

Element Web Client Dashboard

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

Create a Private Room in Matrix

高度なメニューを展開してオプションを選択することで、メンバーをドメインに制限できます。ルームを作成ボタンをクリックしてルームの作成を完了します。

ステップ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 successful

Nginxサービスを再起動します。

$ sudo systemctl restart nginx

Elementにアクセスする前に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アプリにログインしていることを確認し、絵文字の文字を一致させるように求められます。確認が完了すると、次のダッシュボードが表示されます。

Self Hosted Element Dashboard

結論

これで、Debian 12マシン上でNginxをプロキシサーバーとして使用してMatrix SynapseチャットサーバーとCoturnおよびElementウェブクライアントをインストールする方法に関するチュートリアルが終了しました。質問がある場合は、下のコメントに投稿してください。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。