Мы рассмотрим пошаговую настройку мессенджера 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.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