Пример docker-compose для развертывания сервера Matrix Synapse

Мы рассмотрим пошаговую настройку мессенджера Matrix в docker:

Предполагается, что у нас уже установлен Docker. В конце инструкции можно найти ссылки на полезные инструкции, в том числе, по установке последнего на различные системы.

Сценарий для запуска Matrix Synapse

Мы приведем пример docker-compose файла для развертывания 4 служб:

  1. synapse-app — само приложение Matrix.
  2. synapse-db — сервер баз данных. Будем использовать PostgreSQL.
  3. element — веб-интерфейс (веб-клиент).
  4. nginx — прокси для доступа к службам через веб. В соответствии с названием, в качестве реализации будем использовать NGINX.

Файл docker-compose

Для начала создадим каталог, где будем размещать инфраструктурные файлы приложения:

mkdir /opt/matrix

Перейдем в него:

cd /opt/matrix

Создадим docker-compose файл:

vi docker-compose.yml

  1. services:
  2. synapse-app:
  3. image: matrixdotorg/synapse:latest
  4. container_name: synapse-app
  5. hostname: synapse-app
  6. restart: unless-stopped
  7. environment:
  8. TZ: «Europe/Moscow»
  9. SYNAPSE_CONFIG_PATH: /data/homeserver.yaml
  10. volumes:
  11. — ./synapse_data:/data
  12. depends_on:
  13. — synapse-db
  14. synapse-db:
  15. image: docker.io/postgres:12-alpine
  16. container_name: synapse-db
  17. hostname: synapse-db
  18. restart: unless-stopped
  19. environment:
  20. TZ: «Europe/Moscow»
  21. POSTGRES_USER: synapse
  22. POSTGRES_PASSWORD: synapse_password-123
  23. POSTGRES_INITDB_ARGS: —encoding=UTF-8 —lc-collate=C —lc-ctype=C
  24. volumes:
  25. — ./pgsql_data:/var/lib/postgresql/data
  26. element:
  27. image: vectorim/element-web:latest
  28. hostname: element
  29. container_name: element
  30. restart: unless-stopped
  31. environment:
  32. TZ: «Europe/Moscow»
  33. volumes:
  34. — ./element_data/config.json:/app/config.json
  35. nginx:
  36. image: nginx
  37. hostname: nginx
  38. container_name: nginx
  39. restart: unless-stopped
  40. depends_on:
  41. — synapse-app
  42. — element
  43. environment:
  44. TZ: «Europe/Moscow»
  45. ports:
  46. — 80:80
  47. volumes:
  48. — ./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.remontka.com -e SYNAPSE_REPORT_STATS=no matrixdotorg/synapse:latest generate

* где matrix.remontka.com — доменное имя, по которому мы потом будем обращаться к серверу.

Теперь открываем сформированный конфигурационный файл:

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@remontka.com —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

EnglishRussianUkrainian