Пример docker-compose для развертывания сервера Matrix Synapse
Обновлено:
Опубликовано:
Мы рассмотрим пошаговую настройку мессенджера Matrix в docker:
Сценарий docker-compose для настройки и запуска Matrix Synapse
Пример docker-compose
Описание
Редактирование конфигурации
Запуск Matrix Synapse
Настройка HTTPS
Веб-интерфейс для управления учетными записями
Предполагается, что у нас уже установлен Docker. В конце инструкции можно найти ссылки на полезные инструкции, в том числе, по установке последнего на различные системы.
Сценарий для запуска Matrix Synapse
Мы приведем пример docker-compose файла для развертывания 4 служб:
- synapse-app — само приложение Matrix.
- synapse-db — сервер баз данных. Будем использовать PostgreSQL.
- element — веб-интерфейс (веб-клиент).
- nginx — прокси для доступа к службам через веб. В соответствии с названием, в качестве реализации будем использовать NGINX.
Файл docker-compose
Для начала создадим каталог, где будем размещать инфраструктурные файлы приложения:
mkdir /opt/matrix
Перейдем в него:
cd /opt/matrix
Создадим docker-compose файл:
vi docker-compose.yml
- services:
- synapse-app:
- image: matrixdotorg/synapse:${SA_VER}
- container_name: synapse-app
- hostname: synapse-app
- restart: unless-stopped
- environment:
- TZ: ${TIMEZONE}
- SYNAPSE_CONFIG_PATH: /data/homeserver.yaml
- secrets:
- - pg_password
- volumes:
- - ./synapse_data:/data
- depends_on:
- synapse-db:
- condition: service_healthy
- synapse-db:
- image: docker.io/postgres:${PG_VER}-alpine
- container_name: synapse-db
- hostname: synapse-db
- restart: unless-stopped
- environment:
- TZ: ${TIMEZONE}
- POSTGRES_USER: ${PG_USER}
- POSTGRES_DB: ${PG_DBNAME}
- POSTGRES_PASSWORD_FILE: /run/secrets/pg_password
- POSTGRES_INITDB_ARGS: --encoding=UTF-8 --lc-collate=C --lc-ctype=C
- secrets:
- - pg_password
- volumes:
- - ./pgsql_data:/var/lib/postgresql/data
- healthcheck:
- test: ["CMD-SHELL", "pg_isready -U ${PG_USER} -d ${PG_DBNAME}"]
- interval: 5s
- timeout: 5s
- retries: 5
- element:
- image: vectorim/element-web:${EL_VER}
- hostname: element
- container_name: element
- restart: unless-stopped
- environment:
- TZ: ${TIMEZONE}
- volumes:
- - ./element_data/config.json:/app/config.json
- nginx:
- image: nginx:${NG_VER}-alpine
- hostname: nginx
- container_name: nginx
- restart: unless-stopped
- depends_on:
- - synapse-app
- - element
- environment:
- TZ: ${TIMEZONE}
- ports:
- - 80:80
- volumes:
- - ./nginx_data/conf.d/element.conf:/etc/nginx/conf.d/element.conf
- healthcheck:
- test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://127.0.01/ || exit 1"]
- interval: 10s
- timeout: 5s
- retries: 3
- start_period: 5s
- secrets:
- pg_password:
- file: ./secrets/pg_password.txt
Описание сценария
На что стоит обратить особое внимание:
| Строки | Описание |
|---|---|
| 3 - 17 | Сервис приложения Matrix Synapse. |
| 10 | Путь до файла конфигурации внутри контейнера. |
| 19 - 38 | Сервис баз данных на базе PostgreSQL. |
| 26 | При инициализации базы будет создана учетная запись synapse. |
| 28 | При инициализации базы будет создан пароль из секрета pg_password. |
| 40 - 48 | Контейнер для веб-клиента. |
| 50 - 69 | Веб сервер. Он будет принимать запросы и перенаправлять их на веб-клиент element. |
| 71 - 73 | Секрет, который хранит пароли в файлах. В нашем примере создается только один пароль, который мы используем для базы PostgreSQL. |
* примеры работы с docker-compose можно увидеть в инструкции Шпаргалка по работе с docker-compose.
Файлы env и secrets
В сценарии используются переменные и секреты. Создадим соответствующие файлы.
Файл для системных переменных:
vi .env
EL_URL=matrix.dmosk.ru
SA_VER=v1.149.1
PG_VER=16
EL_VER=v1.12.12
NG_VER=1.29
PG_USER=synapse
PG_DBNAME=synapse
TIMEZONE=Europe/Moscow
* обязательно укажите URL (EL_URL) для портала, по которому будет отвечать приложение.
** также необходимо указать актуальные версии:
- SA_VER — приложение Synapse (matrixdotorg/synapse).
- PG_VER — PostgreSQL (postgres).
- EL_VER — веб приложение Element (vectorim/element-web).
- NG_VER — веб-сервер NGINX (nginx).
Создадим каталог и файл с паролем PostgreSQL:
mkdir secrets
vi secrets/pg_password.txt
synapse_password-123
* пароль должен храниться в файле без лишних пробелов и переносов строк.
Настройка приложений
Прежде чем запускать контейнеры, выполним предварительные настройки для synapse, element и веб-сервера nginx.
Synapse app
Сгенерируем конфигурационный файл для matrix. Для этого выполним команду generate внутри контейнера:
source .env
docker run -it --rm -v ./synapse_data:/data -e SYNAPSE_SERVER_NAME=${EL_URL} -e SYNAPSE_REPORT_STATS=no matrixdotorg/synapse:${SA_VER} generate
Теперь открываем сформированный конфигурационный файл:
vi synapse_data/homeserver.yaml
Полностью заменим раздел database:
...
database:
name: psycopg2
txn_limit: 10000
args:
user: synapse
password: synapse_password-123
database: synapse
host: synapse-db
port: 5432
cp_min: 5
cp_max: 10
...
* в нашем примере мы указываем:
- будет использоваться база PostgreSQL (psycopg2).
- сервер находится в контейнере synapse-db.
- подключаемся под пользователем synapse с паролем synapse_password-123 (рекомендуется заменить его на свой; такой же пароль должен быть задан в секрете docker).
Element
Создадим каталог:
mkdir -p element_data
Создадим конфигурационный файл для element:
vi element_data/config.json
{
"default_server_config": {
"m.homeserver": {
"base_url": "https://matrix.dmosk.ru",
"server_name": "matrix.dmosk.ru"
},
"m.identity_server": {
"base_url": ""
}
},
"brand": "Element",
"show_labs_settings": false,
"bug_report_endpoint_url": null,
"posthog": false,
"sentry": false,
"allow_guests": false,
"disable_guests": true,
"guest_registrations_url": null
}
* обязательно замените доменное имя сервиса на свое.
NGINX
Создадим каталог:
mkdir -p nginx_data/conf.d
Создадим конфигурационный файл для веб-клиента element:
vi nginx_data/conf.d/element.conf
server {
listen 80;
server_name matrix.dmosk.ru;
# Для получения SSL сертификатов (Certbot)
location ~ /.well-known/acme-challenge {
root /usr/share/nginx/html;
allow all;
}
# Важно для федерации! Позволяет другим серверам найти ваш Synapse
location /.well-known/matrix/server {
default_type application/json;
return 200 '{"m.server": "$host:443"}';
}
location /.well-known/matrix/client {
default_type application/json;
add_header Access-Control-Allow-Origin *;
return 200 '{"m.homeserver": {"base_url": "https://$host"}}';
}
# API Synapse
location ~ ^(/_matrix|/_synapse/client|/_synapse/admin) {
proxy_pass http://synapse-app:8008;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 100M;
proxy_http_version 1.1;
}
# Веб-клиент Element
location / {
proxy_pass http://element;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Запуск и проверка
Запустим контейнеры с помощью docker-compose:
docker-compose up -d
Можно попробовать отправить http-запрос:
curl -I --resolve ${EL_URL}:80:127.0.0.1 http://${EL_URL}/
Мы должны получить код 200:
HTTP/1.1 200 OK
...
Создадим нового пользователя matrix:
docker exec -it synapse-app register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008
Система потребует ввода логина (можно оставить root), а также пароль и указание, должен ли данный пользователь быть администратором:
New user localpart [root]:
Password:
Confirm password:
Make admin [no]: yes
* в нашем примере создана административная учетная запись.
Мы должны увидеть:
Sending registration request...
Success!
Matrix готов к работе.
Использование SSL
Для настройки работы мессенджера по HTTPS нам нужно немного изменить настройки контейнера и получить сертификат. В нашем примере будем использовать бесплатный сертификат от Let's Encrypt.
Открываем файл:
vi docker-compose.yml
Добавляем проброс порта 443 и 2 вольюма (отмечено желтым), а также вносим небольшие изменения для healthcheck:
...
nginx:
...
ports:
- 80:80
- 443:443
volumes:
- ./nginx_data/conf.d/element.conf:/etc/nginx/conf.d/element.conf
- ./nginx_data/well-known:/usr/share/nginx/html
- /opt/letsencrypt:/etc/letsencrypt
healthcheck:
test: ["CMD-SHELL", "wget --no-check-certificate --no-verbose --tries=1 --spider https://127.0.0.1/ || exit 1"]
Перезапускаем контейнеры (для надежности, все):
docker-compose down && docker-compose up -d
Теперь запустим команду для получения сертификата от Let's Encrypt:
docker run -it --rm --name certbot -v "/opt/letsencrypt:/etc/letsencrypt" -v "/opt/matrix/nginx_data/well-known:/usr/share/nginx/html" certbot/certbot certonly --webroot --agree-tos --email postmaster@${EL_URL} --webroot-path /usr/share/nginx/html/ -d ${EL_URL}
* в нашем примере предполагается, что для доступа к сервису будет использоваться доменное имя из переменной EL_URL (прочитана с помощью source из фала .env).
Открываем конфигурационный файл для элемента:
vi nginx_data/conf.d/element.conf
Добавим строки, помеченные желтым и удалим одну (красным):
server {
listen 80;
server_name matrix.dmosk.ru;
return 301 https://$host$request_uri;
}
server {
listen 80;
listen 443 ssl;
server_name matrix.domain.ru;
ssl_certificate /etc/letsencrypt/live/matrix.dmosk.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/matrix.dmosk.ru/privkey.pem;
...
* обратите внимание, что в директивах ssl_certificate и ssl_certificate_key мы указываем путь до ключей. У вас эти пути будут отличаться.
Проверяем корректность конфигурации и перезапускаем nginx в докере:
docker exec nginx sh -c "nginx -t && nginx -s reload"
Установка административной панели
Для быстрого управления аккаунтами Matrix может быть использована админ-консоль synapse-admin. Загружаем соответствующий проект:
git clone https://github.com/Awesome-Technologies/synapse-admin.git admin_data
Открываем наш композ файл:
vi docker-compose.yml
Дописываем новый сервис:
...
synapse-admin:
container_name: synapse-admin
hostname: synapse-admin
build:
context: admin_data/.
args:
- REACT_APP_SERVER=https://${EL_URL}
- BASE_PATH=/admin
restart: unless-stopped
environment:
TZ: ${TIMEZONE}
healthcheck:
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://127.0.0.1/ || exit 1"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
...
* где:
- REACT_APP_SERVER — URL адрес сервера Matrix.
- BASE_PATH — путь до админки.
Применяем изменения:
docker-compose up -d --build
Открываем конфигурационный файл nginx:
vi nginx_data/conf.d/element.conf
Дописываем еще один location:
...
# Админ панель для управления пользователями
location /admin {
proxy_pass http://synapse-admin/;
proxy_set_header X-Forwarded-For $remote_addr;
}
...
Полностью перезапускаем контейнеры (для надежности):
docker-compose down && docker-compose up -d
Проверяем работу админки, перейдя по ссылке https://matrix.dmosk.ru/admin/.
В качестве логина с паролем вводим учетную запись администратора, созданную на раннем этапе. В качестве адреса сервера указываем URL, на котором работает элемент.