Пример 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:latest
- container_name: synapse-app
- hostname: synapse-app
- restart: unless-stopped
- environment:
- TZ: "Europe/Moscow"
- SYNAPSE_CONFIG_PATH: /data/homeserver.yaml
- volumes:
- - ./synapse_data:/data
- depends_on:
- - synapse-db
- synapse-db:
- image: docker.io/postgres:12-alpine
- container_name: synapse-db
- hostname: synapse-db
- restart: unless-stopped
- environment:
- TZ: "Europe/Moscow"
- POSTGRES_USER: synapse
- POSTGRES_PASSWORD: synapse_password-123
- POSTGRES_INITDB_ARGS: --encoding=UTF-8 --lc-collate=C --lc-ctype=C
- volumes:
- - ./pgsql_data:/var/lib/postgresql/data
- element:
- image: vectorim/element-web:latest
- hostname: element
- container_name: element
- restart: unless-stopped
- environment:
- TZ: "Europe/Moscow"
- volumes:
- - ./element_data/config.json:/app/config.json
- nginx:
- image: nginx
- hostname: nginx
- container_name: nginx
- restart: unless-stopped
- depends_on:
- - synapse-app
- - element
- environment:
- TZ: "Europe/Moscow"
- ports:
- - 80:80
- volumes:
- - ./nginx_data/conf.d/element.conf:/etc/nginx/conf.d/element.conf
Описание сценария
На что стоит обратить особое внимание:
Строки | Описание |
---|---|
3 - 14 | Сервис приложения Matrix Synapse. |
10 | Путь до файла конфигурации внутри контейнера. |
16 - 27 | Сервис баз данных на базе PostgreSQL. |
24 | При инициализации базы будет создана учетная запись synapse. |
25 | При инициализации базы будет создан пароль synapse_password-123 для учетной записи, указанной в опции POSTGRES_USER. |
29 - 37 | Контейнер для веб-клиента. |
39 - 52 | Веб сервер. Он будет принимать запросы и перенаправлять их на веб-клиент element. |
* примеры работы с docker-compose можно увидеть в инструкции Шпаргалка по работе с docker-compose.
Настройка
Прежде чем запускать контейнеры, выполним предварительные настройки.
Сгенерируем конфигурационный файл для matrix. Для этого выполним команду generate внутри контейнера:
docker run -it --rm -v ./synapse_data:/data -e SYNAPSE_SERVER_NAME=matrix.dmosk.ru -e SYNAPSE_REPORT_STATS=no matrixdotorg/synapse:latest generate
* где matrix.dmosk.ru — доменное имя, по которому мы потом будем обращаться к серверу.
Теперь открываем сформированный конфигурационный файл:
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.
Создадим каталог:
mkdir -p element_data
Скачаем конфигурационный файл для element и перенесем его в созданный каталог:
curl -sLO https://develop.element.io/config.json
mv config.json element_data/
Создадим каталог:
mkdir -p nginx_data/conf.d
Создадим конфигурационный файл для веб-клиента element:
vi nginx_data/conf.d/element.conf
server {
listen 80 default_server;
#listen 443 ssl default_server;
#listen 8448 ssl default_server;
server_name matrix.domain.ru;
location ~ /.well-known {
root /usr/share/nginx/html;
allow all;
}
#ssl_certificate cert.pem;
#ssl_certificate_key cert.pem;
#if ($scheme = 'http') {
#return 301 https://$host$request_uri;
#}
location / {
proxy_pass http://element;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~ ^(/_matrix|/_synapse/) {
proxy_pass http://synapse-app: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 100M;
proxy_http_version 1.1;
}
}
Запуск и проверка
Запустим контейнеры с помощью docker-compose:
docker-compose up -d
Можно попробовать отправить http-запрос:
curl http://127.0.0.1
Если мы не получили никакой ошибки, значит все хорошо.
Создадим нового пользователя 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 вольюма (отмечено желтым):
...
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
Перезапускаем контейнеры, которых коснулись изменения (nginx):
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@dmosk.ru --webroot-path /usr/share/nginx/html/ -d matrix.domain.ru
* в нашем примере предполагается, что для доступа к сервису будет использоваться доменное имя matrix.domain.ru.
Открываем конфигурационный файл для элемента:
vi nginx_data/conf.d/element.conf
Добавим строки, помеченные желтым:
server {
listen 80 default_server;
listen 443 ssl default_server;
listen 8448 ssl default_server;
server_name matrix.domain.ru;
location ~ /.well-known {
root /usr/share/nginx/html;
allow all;
}
ssl_certificate /etc/letsencrypt/live/matrix.domain.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/matrix.domain.ru/privkey.pem;
if ($scheme = 'http') {
return 301 https://$host$request_uri;
}
...
* обратите внимание, что в директивах 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
image: awesometechnologies/synapse-admin:latest
build:
context: admin_data/.
args:
- REACT_APP_SERVER=https://matrix.domain.ru
- BASE_PATH=/admin
restart: unless-stopped
environment:
TZ: "Europe/Moscow"
* где:
- 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;
}
Перечитываем конфигурацию nginx:
docker exec nginx sh -c "nginx -t && nginx -s reload"
Проверяем работу админки, перейдя по ссылке https://matrix.domain.ru/admin.
Однако, в моем случае, панель выдавала различные ошибки. Необходимо было полностью остановить контейнеры и запустить их снова:
docker-compose down && docker-compose up -d