Установка Matrix сервера Synapse в Docker

Что такое Matrix?

Matrix — открытый протокол для мгновенных сообщений, целью которого является защищённое общение между пользователями. Matrix является федеративным протоколом, то есть пользователь с сервера A может общаться с пользователями сервера B, а также подключиться к групповым чатам на других серверах.

Основной и эталонной реализацией сервера Matrix на текущий момент является серве Synapse.

Требования для установки Synapse

Для установки Synapse на хостовом сервере требуется белый IP-адрес и установленные Docker и Docker Compose.

Также для корректной работы Matrix-сервера потребуется любое доменное имя. Зарегистрировать своё собственное доменное имя можно, например, у регистратора beget.com

Установка Docker и Docker Compose на примере Debian 13

На чистой системе с Debian 13 по умолчанию не установлен Docker, для его установки первым делом необходимо обновить кэш пакетного менеджера и установить пакеты ca-certificates и curl:

apt update
apt install ca-certificates curl

Далее добавляем официальный GPG-ключ и репозиторий Docker:

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF

apt update

После чего устанавливаем все необходимые пакеты для работы Docker:

apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Установка, настройка и запуск Synapse:

Для хранения данных базы данных, конфигурационных файлов и сертификатов создадим директорию /opt/matrix:

mkdir /opt/matrix/
cd /opt/matrix/

В данной директории необходимо создать файл compose.yml со следующим содержанием:

services:  
 synapse:    
   image: ghcr.io/element-hq/synapse:latest  
   restart: unless-stopped  
   environment:  
     - SYNAPSE_CONFIG_PATH=/data/homeserver.yaml  
   volumes:  
     - ./files:/data  
   depends_on:  
     - db  
     - traefik  
   labels:  
     - traefik.enable=true  
     - traefik.http.routers.matrix-synapse.entryPoints=matrix  
     - traefik.http.routers.matrix-synapse.rule=Host(`example.com`)  
     - traefik.http.routers.matrix-synapse.service=synapse  
     - traefik.http.routers.matrix-synapse.priority=1  
     - traefik.http.routers.matrix-synapse.tls=true  
     - traefik.http.routers.http-synapse.entryPoints=http  
     - traefik.http.routers.http-synapse.rule=Host(`example.com`)  
     - traefik.http.middlewares.https_redirect.redirectscheme.scheme=https  
     - traefik.http.middlewares.https_redirect.redirectscheme.permanent=true  
     - traefik.http.routers.http-synapse.middlewares=https_redirect  
     - traefik.http.routers.https-synapse.entryPoints=https  
     - traefik.http.routers.https-synapse.rule=Host(`example.com`)  
     - traefik.http.routers.https-synapse.service=synapse  
     - traefik.http.routers.https-synapse.tls=true  
     - traefik.http.services.synapse.loadbalancer.server.port=8008  
     - traefik.http.routers.https-synapse.tls.certResolver=le-ssl  
  
 db:  
   image: postgres:17-alpine  
   restart: unless-stopped  
   volumes:  
     - ./postgres:/var/lib/postgresql/data  
   environment:  
     - POSTGRES_PASSWORD=${DB_PASS}  
     - POSTGRES_USER=${DB_USER}  
     - POSTGRES_DB=${DB_NAME}  
     - POSTGRES_INITDB_ARGS=--encoding=UTF8 --locale=C  
 traefik:  
   image: traefik:v3.6  
   restart: unless-stopped  
   ports:  
     - '80:80'  
     - '443:443'  
     - '8448:8448'  
   volumes:  
     - /run/docker.sock:/var/run/docker.sock:ro  
     - ./certs:/certs  
     - ./dynamic:/dynamic:ro  
   command:  
     - "--entrypoints.http.address=:80"  
     - "--entrypoints.http.http.redirections.entrypoint.to=https"  
     - "--entrypoints.http.http.redirections.entrypoint.scheme=https"  
     - "--entrypoints.http.http.redirections.entrypoint.permanent=true"  
     - "--entrypoints.https.address=:443"  
     - "--entrypoints.https.http.tls=true"  
     - "--entrypoints.https.observability.accessLogs=true"  
     - "--entrypoints.https.observability.tracing=true"  
     - "--entrypoints.matrix.address=:8448"  
     - "--entrypoints.matrix.http.tls=true"  
     - "--entrypoints.matrix.observability.accessLogs=true"  
     - "--entrypoints.matrix.observability.tracing=true"  
     - "--providers.docker=true"  
     - "--providers.docker.exposedbydefault=false"
     - "--certificatesresolvers.le-ssl.acme.httpchallenge.entrypoint=http"  
     - "--certificatesresolvers.le-ssl.acme.email=admin@example.com"  
     - "--certificatesresolvers.le-ssl.acme.storage=/certs/acme.json"  
     - "--accesslog=true"

В данном compose.yml вместо example.com укажите ваше доменное имя, а вместо admin@example.com — вашу электронную почту.

В качестве reverse-proxy сервера используется Traefik, который прослушивает входящие соединения на 80, 443 и 8448 портах (8448 порт необходим для связи между Matrix-серверами). Также Traefik будет автоматически перевыпускать бесплатный SSL Let’s Encrypt сертификат для обеспечения защиты. При обращении к серверу по 80 порту без HTTPS Traefik будет делать переадресацию (редирект) на 443 порт с HTTPS:

- traefik.http.routers.http-synapse.entryPoints=http  
- traefik.http.routers.http-synapse.rule=Host(`example.com`)  
- traefik.http.middlewares.https_redirect.redirectscheme.scheme=https  
- traefik.http.middlewares.https_redirect.redirectscheme.permanent=true  
- traefik.http.routers.http-synapse.middlewares=https_redirect  

Далее необходимо создать файл /opt/matrix/.env, в котором будут заданы переменные для создания базы данных PostgreSQL:

DB_PASS=your_password  
DB_USER=synapse  
DB_NAME=synapse

Вместо your_password укажите ваш пароль, который будет использован при создании базы данных и для подключения к ней.

После этого генерируем конфигурационный файл:

docker run -it --rm -v /opt/matrix/files:/data -e SYNAPSE_SERVER_NAME=example.com -e SYNAPSE_REPORT_STATS=no ghcr.io/element-hq/synapse:latest generate

Вместо example.com используйте ваше доменное имя. Конфигурационный файл будет доступен по пути /opt/matrix/files/homeserver.lan. По умолчанию в концигурационном файле указано использовать базу данных в формате SQLite, которая записывает информацию в файл. К сожалению, данный формат баз данных подходит только для тестирования, однако для корректной работы лучше использовать PostgreSQL. Соответственно необходимо изменить данные строчки:

database:
  name: sqlite3
  args:
    database: /path/to/homeserver.db

На эти:

database:  
 name: psycopg2  
 args:  
   user: synapse  
   password: password  
   dbname: synapse  
   host: db  
   port: 5432  
   cp_min: 5  
   cp_max: 10

В параметре password укажите ваш пароль для базы данных, который вы задали в файле /opt/matrix/.env.

После этого запускаем Synapse (Traefik и PostgreSQL запустятся автоматически):

docker compose up -d

Далее создадим пользователя, который будет иметь права администратора:

docker compose exec synapse register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml -u user -p 'password' -a

Вместо user можно указать любое удобное вам имя пользователя (однако оно должно быть в нижнем регистре), а вместо password неообходимо указать любой другой пароль.

На этом установка Synapse завершена. После установки вы можете подключиться к своему серверу через любой удобный вам клиент, например официальный клиент Element. Проверить связь с другими серверами вы можете через сервис federationtester.matrix.org