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 является необязательной, если вы не заинтересованы в ее использовании.
Предварительные требования
- Сервер с установленным Debian 12.
- Пользователь без прав sudo с правами root.
- Простой брандмауэр (UFW) включен и работает.
- Полностью квалифицированные доменные имена (FQDN) для Matrix, Element и Coturn, указывающие на ваш сервер. Мы будем использовать
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 из его официального репозитория.
Установите репозиторий 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/. Ключи, сгенерированные вышеуказанной командой, позволят вашему домашнему серверу идентифицировать себя другим домашним серверам.
Теперь пришло время запустить сервер 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. Нажмите кнопку Войти, чтобы продолжить.

Нажмите ссылку Редактировать под Домашний сервер. Введите 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
Скопируйте тот же файл конфигурации элемента.
$ 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, и вам будет предложено сопоставить эмодзи. Как только вы подтвердите, вы получите следующую панель управления.

Заключение
Это завершает наше руководство по установке сервера чата Matrix Synapse вместе с Coturn и веб-клиентом Element с использованием Nginx в качестве прокси-сервера на машине Debian 12. Если у вас есть какие-либо вопросы, оставьте их в комментариях ниже.
Get new posts in your inbox
No spam. Unsubscribe anytime.