Matrix Chat · 23 min read · Oct 27, 2025

Как установить и создать чат-сервер с использованием Matrix Synapse и Element на Rocky Linux 9

Matrix — это открытый стандарт для децентрализованной и сквозной шифрованной связи. Это набор серверов и услуг, которые общаются друг с другом, используя стандартизированный API, который синхронизируется в реальном времени. Он использует домашние серверы для хранения информации об учетных записях и истории чата. Если один домашний сервер выходит из строя, другие серверы могут продолжать общение без проблем благодаря природе децентрализации. Вы можете использовать домашний сервер Matrix, размещенный кем-то другим, или разместить свой собственный, чтобы сохранить контроль над своими данными.

В этом руководстве вы узнаете, как установить и создать чат-сервер с использованием Synapse, реализации домашнего сервера Matrix. Element — это веб-клиент Matrix, построенный с использованием Matrix React SDK. Это позволит вам предложить чат Matrix в Интернете. Вы также можете использовать сервер с любым другим клиентом Matrix. Мы также установим сервер Coturn для включения голосовых и видеозвонков. Служба Coturn является необязательной, если вы не заинтересованы в ее использовании.

Предварительные требования

  1. Сервер с установленным Debian 12.
  2. Пользователь без прав sudo с правами root.
  3. Простой брандмауэр (UFW) включен и работает.
  4. Полностью квалифицированные доменные имена (FQDN) для Matrix, Element и Coturn, указывающие на ваш сервер. Мы будем использовать matrix.example.com, element.example.com и coturn.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 из его официального репозитория.

Установите репозиторий RPM PostgreSQL.

$ 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 не имеет предварительно собранного пакета для дистрибутивов на основе CentOS, таких как Rocky Linux. Поэтому мы установим его как модуль Python из PyPI.

Первый шаг — установить предварительные требования, необходимые для работы Synapse. Нам также нужен репозиторий EPEL, который включает пакет python3-virtualenv.

$ 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

Убедитесь, что у вас последняя версия pip и setuptools.

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

Установите Matrix Synapse.

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

Это загрузит Synapse из PyPI и установит его вместе с используемыми им библиотеками Python в виртуальную среду в папке ~/synapse/env. Он также установит библиотеку Python для PostgreSQL, необходимую для подключения Synapse к серверу PostgreSQL. Вышеуказанная команда является комбинацией команд 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 в качестве его значения. Это будет адрес вашего домашнего сервера.

Вы можете выбрать, хотите ли вы отправлять анонимизированную статистику о вашем домашнем сервере обратно в Matrix через переменную --report-stats. Выберите 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

Для производственной среды рекомендуется запускать сервер Synapse с использованием прокси Nginx.

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

Нам нужно установить Certbot для генерации SSL-сертификата. Мы будем использовать установщик пакетов Snapd для этого. Поскольку Rocky Linux не поставляется с ним, установите установщик Snapd. Он требует репозиторий EPEL (Дополнительные пакеты для корпоративного Linux), чтобы работать. Но поскольку мы уже установили его на шаге 3, мы можем сразу перейти к делу.

Установите пакет Snapd.

$ sudo dnf install snapd -y

Включите и запустите службу Snap.

$ sudo systemctl enable snapd --now

Установите пакет Snap core и убедитесь, что ваша версия 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 на вашем сервере.

Сгенерируйте сертификат группы Диффи-Хеллмана.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Проверьте службу планировщика обновления Certbot.

$ systemctl list-timers

Вы найдете 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

Создайте и откройте файл matrix-synapse.service в каталоге /etc/systemd/system/ для редактирования.

$ sudo nano /etc/systemd/system/matrix-synapse.service

Вставьте следующий код в него. Замените переменную username на вашего пользователя Linux, под которым вы установили Synapse.

# Это предполагает, что Synapse был установлен пользователем с именем username.
# Это предполагает, что Synapse был установлен в виртуальной среде в
# домашнем каталоге пользователя: `/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

# отрегулируйте коэффициент кэша, если необходимо
# 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 на пароль пользователя PostgreSQL, который вы создали на шаге 3. Замените localhost на IP-адрес вашего сервера, если вы размещаете базу данных в другом месте.

database:
  name: psycopg2
  args:
    user: synapse
    password: 'your-password'
    database: synapsedb
    host: localhost
    cp_min: 5
    cp_max: 10

По умолчанию Synapse включает индикаторы присутствия, которые показывают, если человек в сети. Это может вызвать высокую загрузку ЦП, поэтому вы можете отключить его. Вставьте следующую строку в конец.

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

  # Если почтовый сервер не требует аутентификации, пропустите эти 2 строки
  smtp_user: '[email protected]'
  smtp_pass: 'password'

  # Необязательно, требовать шифрования с помощью STARTTLS
  require_transport_security: true

  app_name: 'HowtoForge Example Chat'  # определяет значение для %(app)s в notif_from и теме письма
  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

Вставьте следующий код в него.

# принудить HTTPS
server {
    # Порт клиента
    listen 80;
    listen [::]:80;
    server_name matrix.example.com;
    return 301 https://$host$request_uri;
}

server {
    server_name matrix.example.com;

    # Порт клиента
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;

    # Порт федерации
    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
    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 по умолчанию разрешает загрузку файлов только до 1M
            # Увеличьте client_max_body_size, чтобы соответствовать max_upload_size, определенному в homeserver.yaml
            client_max_body_size 50M;
    }
}

Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено. Вышеуказанная конфигурация работает при условии, что IP-адрес доменов example.com и matrix.example.com указывает на один и тот же сервер. Если это не так, используйте следующий файл конфигурации для сервера example.com.

server {
    server_name example.com;

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

    # Конфигурация TLS
    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;

    # Перенаправление
    location ~ ^(/_matrix|/_synapse/client) {
            return 301 "https://matrix.example.com$request_uri";
    }

    # Автоопределение домашнего сервера клиента
    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" } }';
    }

    # Делегирование домена
    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

Вам нужно будет установить сервер Traversal Using Relays around the 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

Сгенерируйте SSL-сертификат для Turn ( coturn.example.com).

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

# Обратите внимание, что use-auth-secret переопределяет некоторые части lt-cred-mech.
# Функция use-auth-secret зависит внутренне от lt-cred-mech, поэтому, если вы установите
# эту опцию, она автоматически включает lt-cred-mech внутренне
# так, как если бы вы включили обе.
#
# Обратите внимание, что вы можете использовать только один механизм аутентификации одновременно! Это потому, что,
# оба механизма проводят проверку имени пользователя и пароля разными способами.
#
# Используйте либо lt-cred-mech, либо use-auth-secret в конфигурации
# чтобы избежать путаницы.
#
use-auth-secret

Далее мы настроим переменную static-auth-secret со значением, которое мы создали выше. Нам также понадобится этот секрет для настройки Synapse позже.

# 'Статическое' значение секрета аутентификации (строка) только для TURN REST API.
# Если не установлено, то сервер turn
# попытается использовать 'динамическое' значение в таблице turn_secret
# в базе данных пользователей (если присутствует). Значение, хранящееся в базе данных, может быть изменено на лету
# отдельной программой, поэтому этот режим считается 'динамическим'.
#
static-auth-secret=u3ksgJ9X876sFMO00A8KabXwZvzVwCmV30wWvZ7DzGiepRwNRYSCTYzf2E8olNzdDHu7oO3XpT3l5bv5mVdhXEQ3pnoTWBquSVPFFBJtyD6y9gBxiMaD2TYTD2WohQLE9s7OKJVpkDeKTnZQnkmjrFadE3M9DRxPL1W5Lgdg6XLLKABgb5XGkutRgkJOV0JRH4sBYsot63fWq9mcGTm6nAMdIycvDVDOs7vhoeqRzcTbMF0wsfAHVJNhXpGGFDyZ

Следующее значение, которое нам нужно изменить, — это realm. Оно относится к домену, который мы выбрали для Coturn.

# Стандартный домен, который будет использоваться для пользователей, когда не найдено явное
# отношение origin/realm в базе данных или если TURN
# сервер не использует никакую базу данных (только настройки командной строки
# и файл userdb). Должен использоваться с механизмом долгосрочных учетных данных
# или с TURN REST API.
#
# Примечание: если стандартный домен не указан, то домен будет возвращен к имени хоста.
#       Если строка доменного имени пуста или установлена в '(None)', то она инициализируется как пустая строка.
#
realm=coturn.example.com

Далее определите количество сеансов и сеансов на пользователя. Выберите значение, которое подходит для вашего сервера.

# Квота на выделение на пользователя.
# стандартное значение 0 (без квоты, неограниченное количество сеансов на пользователя).
# Эта опция также может быть установлена через базу данных для конкретного домена.
#
user-quota=12

# Общая квота на выделение.
# стандартное значение 0 (без квоты).
# Эта опция также может быть установлена через базу данных для конкретного домена.
#
total-quota=1200

Далее нам нужно отключить TCP, так как VOIP использует UDP.

# Раскомментируйте, если не разрешены конечные точки TCP.
# По умолчанию конечные точки реле TCP включены (как в RFC 6062).
#
no-tcp-relay

Нам также нужно настроить расположение сертификатов, которые мы создали для Coturn.

# Файл сертификата.
# Используйте абсолютный путь или путь, относительный к
# файлу конфигурации.
# Используйте формат файла PEM.
#
cert=/etc/letsencrypt/live/coturn.example.com/fullchain.pem

# Файл закрытого ключа.
# Используйте абсолютный путь или путь, относительный к
# файлу конфигурации.
# Используйте формат файла PEM.
#
pkey=/etc/letsencrypt/live/coturn.example.com/privkey.pem

Далее нам нужно отключить трафик к частным IP-адресам и запретить пиры на многоадресных адресах для повышения безопасности.

# Флаг, который можно использовать для запрета пир на известных адресах широковещательной рассылки (224.0.0.0 и выше, и FFXX:*).
# Это дополнительная мера безопасности.
#
no-multicast-peers

...............

# Опция для разрешения или запрета конкретных IP-адресов или диапазонов IP-адресов.
# Если IP-адрес указан как разрешенный и запрещенный, то IP-адрес
# считается разрешенным. Это полезно, когда вы хотите запретить диапазон IP-адресов,
# за исключением нескольких конкретных IP-адресов в этом диапазоне.
#
# Это можно использовать, когда вы не хотите, чтобы пользователи сервера turn могли получить доступ
# к машинам, доступным через сервер turn, но которые в противном случае были бы недоступны из Интернета
# (например, когда сервер turn находится за NAT)
#
# Примеры:
# 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 на значение static-auth-secret из файла urnserver.conf.

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

Вы можете получить доступ к Matrix Chat, используя веб-клиент Element по адресу https://app.element.io. Нажмите кнопку Войти, чтобы продолжить.

Страница входа в Element Web

Нажмите ссылку Редактировать под Домашний сервер. Введите matrix.example.com в качестве вашего домашнего сервера.

Клиент Element Пользовательский Домашний Сервер

Если клиент правильно обнаруживает ваш домашний сервер, граница и текст станут зелеными, в противном случае они будут показаны красным. Нажмите Продолжить, чтобы продолжить.

Вход в Пользовательский Домашний Сервер Element

Введите имя пользователя и пароль, которые вы создали на шаге 8 при настройке Synapse. Нажмите кнопку Войти, чтобы войти. Вам будет предложено создать безопасную и зашифрованную резервную копию.

Безопасная резервная копия Matrix

Выберите опцию Введите фразу безопасности, чтобы создать фразу безопасности, которая будет требоваться каждый раз, когда вы входите. Нажмите Продолжить, чтобы продолжить.

Фраза безопасности Element

Введите фразу безопасности и нажмите кнопку Продолжить, чтобы продолжить. Вам будет предложено подтвердить ее снова на следующем экране.

Подтверждение фразы безопасности Element

Введите фразу еще раз и нажмите кнопку Продолжить, чтобы продолжить.

Всплывающее окно ключа безопасности Element

Вам будет предоставлен набор ключей безопасности, которые вы можете использовать, если забудете свою фразу безопасности. Нажмите кнопку Скачать, чтобы сохранить их.

Нажмите кнопку Продолжить, чтобы продолжить.

Проверка пароля Element

Вам будет предложено ввести пароль вашей учетной записи. Введите пароль и нажмите кнопку Продолжить, чтобы завершить настройку зашифрованной резервной копии.

Панель управления веб-клиента Element

Мы создали групповую чат-комнату с именем HowtoForge, используя кнопку Создать групповую беседу на главной странице. Вы получите следующее всплывающее окно, когда нажмете кнопку.

Создание частной комнаты в 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

Скопируйте тот же файл конфигурации элемента.

$ 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, когда будет предложено.

Сгенерируйте SSL-сертификат для клиента Element.

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

Нам нужно настроить параметры SELinux перед доступом к Element. Выполните следующие команды, чтобы разрешить Element работать.

$ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/element(/.*)?"
$ sudo restorecon -Rv /var/www/html/element/

Вы можете получить доступ к клиенту Element по адресу https://element.example.com в вашем браузере. Войдите, и вы попадете на панель управления приложения. Вам будет предложено подтвердить приложение с помощью https://app.element.io сначала, убедитесь, что вы вошли в оригинальное приложение Element, и вам будет предложено сопоставить эмодзи. Как только вы подтвердите, вы получите следующую панель управления.

Панель управления самостоятелного хостинга Element

Заключение

Это завершает наше руководство по установке сервера чата Matrix Synapse вместе с Coturn и веб-клиентом Element с использованием Nginx в качестве прокси-сервера на машине Debian 12. Если у вас есть какие-либо вопросы, оставьте их в комментариях ниже.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.