Поиск по сайту:

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


На этой странице

  1. Предварительные условия
  2. Шаг 1. Настройка брандмауэра
  3. Шаг 2. Установите и настройте PostgreSQL
  4. Шаг 3 — Установите Matrix Synapse
  5. Шаг 4. Установите Nginx.
  6. Шаг 5 — Установите SSL
  7. Шаг 6 — Настройте SELinux
  8. Шаг 7. Создайте службу Matrix Systemd
  9. Шаг 8 — Настройка Matrix Synapse
  10. Шаг 9 — Настройка Nginx
  11. Шаг 10 — Установите Котурн
  12. Шаг 11 – Матрица доступа
  13. Шаг 12 — Установите элемент
  14. Шаг 13 — Настройка элемента
  15. Заключение

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 установить postgresql16-devel

экспортировать 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

Установите Матрикс Синапс.

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

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

Установите Нгинкс.

$ 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 и убедитесь, что ваша версия 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

Установите Сертбот.

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

# 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 паролем пользователя 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 при появлении запроса.

Создайте нового пользователя матрицы. Вам будет предложено ввести имя пользователя и пароль. Поскольку это первый пользователь, которого мы создаем, введите 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 '
  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 >"

Чтобы отключить проверку электронной почты, вставьте вместо этого следующую строку.

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 при появлении соответствующего запроса после завершения. Приведенная выше конфигурация работает при условии, что IP-адреса доменов example.com и matrix.example.com указывают на один и тот же сервер. Если это не так, используйте следующий файл конфигурации для сервера 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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-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 — Установите Котурн

Вам потребуется установить обход с использованием реле вокруг сервера NAT (TURN), чтобы обеспечить возможность голосовых и видеовызовов. Для этого установим пакет 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  -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

Следующее значение, которое нам нужно изменить, — это область. Это относится к домену, который мы выбрали для 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

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

# 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 значением static-auth-secret из файла \etc\coturn\turnserver.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 Chat с помощью веб-клиента Element по адресу https://app.element.io. Нажмите кнопку Войти, чтобы продолжить.

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

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

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

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

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

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

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

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

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

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

Вы можете ограничить участников доменом, развернув расширенное меню и выбрав соответствующий параметр. Завершите создание комнаты, нажав кнопку Создать комнату.

Шаг 12 — Установите элемент

Создайте каталог для 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 — Настройка элемента

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

$ 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"
},

Если вы хотите использовать свое имя вместо «Элемент» в названии сайта, измените название бренда.

"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  -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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-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 по URL-адресу https://element.example.com в своем браузере. Авторизуйтесь, и вы попадете в панель управления приложением. Сначала вам будет предложено подтвердить приложение с помощью https://app.element.io. Убедитесь, что вы вошли в исходное приложение Element, и вам будет предложено сопоставить символы эмодзи. После проверки вы получите следующую панель управления.

Заключение

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