Установка сервера 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. Обратите внимание на одноимённый раздел.
Список литературы
-
https://matrix-org.github.io/synapse/latest/setup/installation.html
-
https://matrix.org/docs/guides/understanding-synapse-hosting
Обратите внимание, что заметки могут обновляться со временем. Это может быть как исправление найденных ошибок, так и доработка содержания с целью более полного раскрытия темы. Информация об изменениях доступна в репозитории на github. Там же вы можете оставить в Issue ваши замечания по данной заметке.
Если данная заметка оказалась вам полезной, можете поблагодарить автора финансово.