Сайт FSA
10.02.2023

Установка сервера Matrix Synapse

Эта заметка поможет вам установить свой собственный сервер сети Matrix в контейнере. О том, что такое Matrix и установке сервера без использования контейнеров я писал ранее. Если вы не знакомы с Matrix, рекомендую ознакомиться с предыдущей заметкой.

К тому моменту, как вы начнёте устанавливать свой сервер необходимо определиться с именем домена, т.к. он понадобится при запуске Matrix Synapse. В этой заметке в качестве этого домена будет использоваться example.org. В реальной жизни, если вам необходима федерация, необходимо приобрести домен.

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

В качестве образа для контейнера Matrix Synapse выберем официальный образ от разработчиков docker.io/matrixdotorg/synapse. Скачать его можно с помощью команды

podman pull matrixdotorg/synapse

Synapse может работать с базой SQLite, но использовать её можно, скорее, только для тестирования. Если вы собираетесь выводить ваш сервер в интернет, можете столкнуться с проблемами даже на самых ранних этапах. Поэтому лучше изначально использовать базу PostgreSQL. Можно использовать любой доступный образ для него. Выберем официальный образ docker.io/library/postgres:15-alpine.

podman pull postgres:15-alpine

Создание Pod для сервера Matrix Synapse

Все необходимые контейнеры для сервера Synapse разместим в pod с именем synapse. Сервер будет прослушивать порт 8008 без использования TLS. Создать pod можно командой

podman pod create --name matrix -p 8008:8008

Если ваша машина имеет белый IP адрес, то стоит ограничить прослушивание портов только адресом 127.0.0.1:

podman pod create --name matrix -p 127.0.0.1:8008:8008

После этого можно проверить его наличие с помощью команды

[~]$ podman pod list                              
POD ID        NAME        STATUS      CREATED        INFRA ID      # OF CONTAINERS
707397d2f7c2  matrix      Created     2 seconds ago  74de2d35e7ab  1

Создание контейнера с PostgreSQL

Создаём базу данных, при этом вместо SUPER_PASSWORD указываем сложный пароль для доступа к базе данных, который в дальнейшем необходимо будет добавить в конфигурацию сервера synapse.

podman run -d -it --pod matrix --name synapse-db \
    -e POSTGRES_USER=synapse \
    -e POSTGRES_PASSWORD=SUPER_PASSWORD \
    -e "POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C" \
    -v synapse-db-data:/var/lib/postgresql/data:Z \
    docker.io/library/postgres:15-alpine

Если необходимо что-то изменить в базе данных можно подключиться к контейнеру с PostgreSQL

podman exec -it synapse-db /bin/bash

а затем запустить оболочку psql. При запуске требуется ввести пароль, который был установлен ранее при создании контейнера с PostgreSQL.

psql -U synapse -W

Создание контейнера с Synapse и его настройка

Перед запуском контейнера с Synapse необходимо создать конфигурацию для него. Для создания образца файла можно создать одноразовый контейнер с аргументом generate. При этом необходимо указать минимум два параметра: SYNAPSE_SERVER_NAME - доменное имя вашего сервера и SYNAPSE_REPORT_STATS - ваше желание сообщать или нет статистику по вашему серверу разработчикам.

podman run -it --rm --mount type=volume,src=synapse-data,dst=/data \
    -e SYNAPSE_SERVER_NAME=example.org \
    -e SYNAPSE_REPORT_STATS=yes \
    matrixdotorg/synapse generate

В результате будет создана конфигурация примерно следующего содержания:

server_name: "example.org"
pid_file: /data/homeserver.pid
listeners:
  - port: 8008
    tls: false
    type: http
    x_forwarded: true
    resources:
      - names: [client, federation]
        compress: false
database:
  name: sqlite3
  args:
    database: /data/homeserver.db
log_config: "/data/example.org.log.config"
media_store_path: /data/media_store
registration_shared_secret: "R_S_SECRET"
report_stats: true
macaroon_secret_key: "MACAROON_SECRET_KEY"
form_secret: "FORM_SECRET"
signing_key_path: "/data/example.org.signing.key"
trusted_key_servers:
  - server_name: "matrix.org"

Изменяем настройки соединения с базой данных. В качестве host указываем наименование контейнера с PostgreSQl.

database:
  name: psycopg2
  txn_limit: 10000
  args:
    user: synapse
    password: SUPER_PASSWORD
    database: synapse
    host: synapse-db
    port: 5432
    cp_min: 5
    cp_max: 10

После этого можно запустить контейнер с synapse:

podman run -d -it --pod matrix --name synapse \
    --mount type=volume,src=synapse-data,dst=/data \
    matrixdotorg/synapse:latest

Теперь сервер прослушивает порт 8008.

Создание новых пользователей на сервере отключено по умолчанию. Поэтому чтобы создать сервер подключимся к контейнеру с Synapse:

podman exec -it synapse /bin/bash

Зарегистрируем нового пользователя:

root@synapse:/# register_new_matrix_user -c /data/homeserver.yaml
New user localpart [root]: fsa
Password: 
Confirm password: 
Make admin [no]:
Sending registration request...
Success!

Обеспечиваем автозапуск контейнеров

Сгенерировать Unit файлы для systemd можно с помощью команды. Разместить их нужно в ~/.config/systemd/user/ пользователя, от имени которого запускаются контейнеры.

cd ~/.config/systemd/user/
podman generate systemd --new --files --name matrix

Будет создано несколько файлов:

/home/user/.config/systemd/user/pod-matrix.service
/home/user/.config/systemd/user/container-synapse-db.service
/home/user/.config/systemd/user/container-synapse.service
/home/user/.config/systemd/user/container-focused_noyce.service

Основным является pod-matrix.service. От него зависят все остальные юниты, поэтому чтобы сервис стартовал автоматически достаточно активировать только pod-matrix.service:

systemctl enable --user pod-matrix.service

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

sudo loginctl enable-linger username

В качестве username укажите необходимого пользователя.

Обновление компонентов сервера

Обновление легко выполняется путём повторного скачивания образов:

podman pull matrixdotorg/synapse
podman pull postgres:15-alpine

После этого необходимо просто перезапустить контейнеры путём перезапуска pod:

systemctl restart --user mod-matrix

Вывод сервера в интернет с помощью nginx

Чтобы обеспечить федерацию и безопасный доступ к серверу ваших пользователей необходимо использовать TLS соединение, поэтому необходимо получить сертификат. Самый простой способ сделать это на уровне системы без контейнера. В качестве сервера будем использовать сервер nginx, который и будет использовать эти сертификаты.

Установите сервер nginx и клиента certbot как это делается в вашей операционной системе. Это потребует привилегий root.

Оптимальным способом получения сертификатов является DNS Challenge, поскольку он позволяет выпускать Wildcard сертификаты. Для этого требуется установить плагин для вашего DNS провайдера. Одним из популярных является Cloudflare. Получить сертификат можно с помощью команды:

certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/cloudflare.ini -d example.org,*.example.org

Для вашей аутентификации необходимо предоставить ранее полученный токен, который сохраняется в файл, например, /root/cloudflare.ini:

dns_cloudflare_api_token = "API_TOKEN"

Конфигурация виртуального хоста для проксирования запросов на сервер synapse. В примере указано включить прослушивание портов 8448 и 443 по протоколам IPv4 и IPv6.

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

    listen 8448 ssl default_server;
    listen [::]:8448 ssl default_server;

    server_name matrix.example.org;

    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem;

    root /var/www/matrix/webroot;
    index index.html;

    location ~* ^(\/_matrix|\/_synapse\/client) {
        proxy_pass http://127.0.0.1:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;

        client_max_body_size 10M;
    }
}

Чтобы переадресовывать запросы по протоколу http, можно добавить следующие настройки

server {
    listen 80;
    listen [::]:80 default_server;
    server_name matrix.example.org;
    return 301 https://$server_name$request_uri;
}

Что немаловажно, можно разместить сервер nginx на другой машине и использовать между машинами VPN туннель. Например, можно использовать дешёвый VPS сервер с белым IP адресом, а сервер Synapse разместить у себя дома. В этом случае все запросы будут попадать на вашу машину через VPN туннель. Для домашнего сервера даже не нужен белый IP адрес. В этом случае в секции proxy_pass необходимо указать адрес вашего сервера Synapse в туннеле.

...
    location ~* ^(\/_matrix|\/_synapse\/client) {
        proxy_pass http://[fd00::2]:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;

        client_max_body_size 10M;
    }
...

Настройка обнаружения сервера на домене

О том как настроить обнаружение вашего сервера на домене я писывал в своей предыдущей заметке про Matrix. Обратите внимание на одноимённый раздел.

Список литературы

  1. https://matrix-org.github.io/synapse/latest/setup/installation.html

  2. https://matrix.org/docs/guides/understanding-synapse-hosting


Обратите внимание, что заметки могут обновляться со временем. Это может быть как исправление найденных ошибок, так и доработка содержания с целью более полного раскрытия темы. Информация об изменениях доступна в репозитории на github. Там же вы можете оставить в Issue ваши замечания по данной заметке.


Если данная заметка оказалась вам полезной, можете поблагодарить автора финансово.