Пример 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:${SA_VER}
  5.     container_name: synapse-app
  6.     hostname: synapse-app
  7.     restart: unless-stopped
  8.     environment:
  9.       TZ: ${TIMEZONE}
  10.       SYNAPSE_CONFIG_PATH: /data/homeserver.yaml
  11.     secrets:
  12.       - pg_password
  13.     volumes:
  14.       - ./synapse_data:/data
  15.     depends_on:
  16.       synapse-db:
  17.         condition: service_healthy
  18.  
  19.   synapse-db:
  20.     image: docker.io/postgres:${PG_VER}-alpine
  21.     container_name: synapse-db
  22.     hostname: synapse-db
  23.     restart: unless-stopped
  24.     environment:
  25.       TZ: ${TIMEZONE}
  26.       POSTGRES_USER: ${PG_USER}
  27.       POSTGRES_DB: ${PG_DBNAME}
  28.       POSTGRES_PASSWORD_FILE: /run/secrets/pg_password
  29.       POSTGRES_INITDB_ARGS: --encoding=UTF-8 --lc-collate=C --lc-ctype=C
  30.     secrets:
  31.       - pg_password
  32.     volumes:
  33.       - ./pgsql_data:/var/lib/postgresql/data
  34.     healthcheck:
  35.       test: ["CMD-SHELL", "pg_isready -U ${PG_USER} -d ${PG_DBNAME}"]
  36.       interval: 5s
  37.       timeout: 5s
  38.       retries: 5
  39.  
  40.   element:
  41.     image: vectorim/element-web:${EL_VER}
  42.     hostname: element
  43.     container_name: element
  44.     restart: unless-stopped
  45.     environment:
  46.       TZ: ${TIMEZONE}
  47.     volumes:
  48.       - ./element_data/config.json:/app/config.json
  49.  
  50.   nginx:
  51.     image: nginx:${NG_VER}-alpine
  52.     hostname: nginx
  53.     container_name: nginx
  54.     restart: unless-stopped
  55.     depends_on:
  56.       - synapse-app
  57.       - element
  58.     environment:
  59.       TZ: ${TIMEZONE}
  60.     ports:
  61.       - 80:80
  62.     volumes:
  63.       - ./nginx_data/conf.d/element.conf:/etc/nginx/conf.d/element.conf
  64.     healthcheck:
  65.       test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://127.0.01/ || exit 1"]
  66.       interval: 10s
  67.       timeout: 5s
  68.       retries: 3
  69.       start_period: 5s
  70.  
  71. secrets:
  72.   pg_password:
  73.     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) для портала, по которому будет отвечать приложение.
** также необходимо указать актуальные версии:

Создадим каталог и файл с паролем 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, на котором работает элемент.

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

Да            Нет

Дмитрий Моск
— IT-специалист.
Настройка серверов, услуги DevOps.

Заказать настройку контейнеризации

Нужна бесплатная консультация?

Скрипты

Файл docker-compose для развертывания Nginx Proxy Manager

Пример файла docker-compose для запуска контейнеров с сервером Grafana Loki

Пример файла docker-compose.yml для запуска и настройки Portainer

Пример файла docker-compose для развертывания чат-платформы Matrix Synapse на Linux

Пример скрипта на bash для копирования данных Clickhouse с кластера на кластер

Пример и описание скрипта для отправки сообщения в телеграм канал

Как развернуть контейнеры с веб-сервером для Laravel при помощи файла docker-compose

Другие скрипты

Все статьи

Нужен скрипт? Опишите его назначение:





Реклама