Что такое 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