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

# DevOps # Linux # Интернет
Дмитрий Моск — частный мастер
Был ли вам полезен этот скрипт?

Да            Нет