Как я поднял свой личный Matrix-мессенджер
Я давно хотел иметь свой собственный семейный мессенджер, без зависимостей от Telegram/WhatsApp на случай, если один из них станет не доступен.
Мне нужен был простой вариант: сообщения, фото, файлы. Звонки и видео для меня были избыточными, поэтому всю усложняющую историю с coturn я сразу отбросил.
В итоге я развернул Matrix Synapse в Docker. Всё работает стабильно, шифрование есть, и самое главное - всё хранится у меня на домашнем сервере, в роли которого выступает старенький неттоп на Intel Core i3 7100T, на нем же крутится система умного дома Home Assistant, а так же медиасерверы Jellyfin и Navidrome.
Так как получил предложение написать об этом пост, рассказываю как это реализовывал.
1. Для начала давайте сперва поговорим, что такое Matrix и зачем он нужен
Matrix - это защищённый протокол обмена сообщениями.
Он похож на Telegram, но:
полностью открытый
работает на вашем железе, либо на вашем облачном сервере
переписка шифруется на устройстве
Мы будем поднимать сервер Synapse (основная реализация Matrix) на Docker
2. Docker Сompose
Matrix может работать на SQLite, но лучше взять PostgreSQL - он надёжнее.
Вот минимальный рабочий docker-compose.yml:
services:
synapse:
image: matrixdotorg/synapse:latest
container_name: matrix-synapse
restart: unless-stopped
environment:
SYNAPSE_SERVER_NAME: chat.example.net
SYNAPSE_REPORT_STATS: "no"
volumes:
- ./synapse:/data
depends_on:
- postgres
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "3"
networks:
- internal
postgres:
image: postgres:14
container_name: matrix-postgres
restart: unless-stopped
environment:
POSTGRES_DB: synapse_db_r72m
POSTGRES_USER: synuser_k84t
POSTGRES_PASSWORD: dN8vQ3pL7wS1zFgB9rT2
POSTGRES_INITDB_ARGS: "--encoding=UTF8 --lc-collate=C --lc-ctype=C"
volumes:
- ./postgres:/var/lib/postgresql/data
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "3"
networks:
- internal
networks:
internal:
driver: bridge
Всё, что вам нужно - создать папку с проектом и положить этот файл туда. Там же в дальнейшем появятся папки с конфигурациями самого сервера и сервера баз данных. Логин, пароль и имя базы созданы рандомно, вы их можете поменять на свои. Так же замените chat.example.net на ваш домен.
3. Генерация начального конфига
Synapse в самом начале нужно инициализировать:
docker compose run --rm synapse generate
Появится папка synapse/ с файлом homeserver.yaml.
Там находим блок базы данных и меняем его на PostgreSQL, блок с SQLite можно закомментировать:
database:
name: psycopg2
args:
user: synuser_k84t
password: dN8vQ3pL7wS1zFgB9rT2
database: synapse_db_r72m
host: matrix-postgres
port: 5432
Это всё.
4. Запуск сервера
docker compose up -d
5. HTTPS + домен (основной вариант)
Самый нормальный способ пробросить сервер наружу - через домен и HTTPS.
Я использую Nginx Proxy Manager (NPM), но подойдёт любой прокси.
Важно: Nginx Proxy Manager должен быть в одной Docker-сети с Matrix-сервером.
Synapse по умолчанию создаёт свою сеть - она называется так же, как папка с проектом, с суффиксом _internal (если не меняли compose файл). Если NPM не подключён к этой сети, он просто не увидит контейнер matrix-synapse и проксирование работать не будет.
Чтобы подключить NPM к нужной сети:
docker network connect <имя_сети_internal> <контейнер_NPM>
Создаём Proxy Host на matrix-synapse:8008
Получаем SSL-сертификат
Добавляем два обязательных пути .well-known:
location /.well-known/matrix/server {
add_header Content-Type application/json;
return 200 '{"m.server": "chat.example.net:443"}';
}
location /.well-known/matrix/client {
add_header Content-Type application/json;
return 200 '{"m.homeserver": {"base_url": "https://chat.example.net"}}';
}
Не забудьте заменить chat.example.net на ваш домен.
Проверяем прямо на сервере, или в консоли вашего компа:
Ответ должен быть таким:
{"m.homeserver":{"base_url":"https://chat.example.net"}}
6. Если домен не нужен, то можно работать по HTTP и IP
Просто пробрасываете порт наружу и подключаетесь к серверу вот так:
http://server-ip:8008/
Matrix всё равно шифрует переписку, поэтому содержимое сообщений никто не увидит.
Минусы:
Element может ругнуться
федерации (общения с другими серверами) не будет
Для семейного чата идеальный упрощённый вариант.
После можно зайти через браузер. Если сервер успешно поднялся, вы увидите такую страницу:
7. Создание администратора
Первого пользователя я создавал так:
docker exec -it matrix-synapse \
register_new_matrix_user \
-c /data/homeserver.yaml \
-a \
http://matrix-synapse:8008
(matrix-synapse:8008 — адрес внутри Docker-сети)
8. Создание обычного пользователя
docker exec -it matrix-synapse \
register_new_matrix_user \
-c /data/homeserver.yaml \
--no-admin \
http://matrix-synapse:8008
9. Важное замечание о паролях при создании пользователей
При создании пользователей через CLI нельзя использовать в пароле символы UTF-16, иначе Synapse выдает ошибку:
UnicodeEncodeError: 'utf-8' codec can't encode character '\udce3'
10. Как узнать свой токен для админских команд
Для работы с API нужен токен доступа.
Получить его проще всего через CLI-авторизацию.
Шаг 1. Выполнить вход через API:
docker exec -it matrix-synapse curl -s -X POST \
-H "Content-Type: application/json" \
-d '{"type":"m.login.password","user":"ВАШ_ЛОГИН","password":"ВАШ_ПАРОЛЬ"}' \
http://localhost:8008/_matrix/client/r0/login
Шаг 2. В ответе найдите поле:
"access_token": "syt_xxxxxxx..."
11. Полезные команды с токеном
Проверить, кто вы:
docker exec -it matrix-synapse curl -H "Authorization: Bearer ВАШ_ТОКЕН" \
http://localhost:8008/_matrix/client/r0/account/whoami
Список пользователей:
docker exec -it matrix-synapse curl -H "Authorization: Bearer ВАШ_ТОКЕН" \
http://localhost:8008/_synapse/admin/v2/users
Список комнат:
docker exec -it matrix-synapse curl -H "Authorization: Bearer ВАШ_ТОКЕН" \
http://localhost:8008/_synapse/admin/v1/rooms
Удалить комнату:
docker exec -it matrix-synapse curl -X DELETE \
-H "Authorization: Bearer ВАШ_ТОКЕН" \
http://localhost:8008/_synapse/admin/v1/rooms/ROOM_ID
Деактивация пользователя:
docker exec -it matrix-synapse curl -s -X PUT \
-H "Authorization: Bearer ВАШ_ТОКЕН" \
-H "Content-Type: application/json" \
-d '{"deactivated": true}' \
"http://localhost:8008/_synapse/admin/v2/users/@user:chat.example.net"
Получить список устройств пользователя:
docker exec -it matrix-synapse curl -s \
-H "Authorization: Bearer ВАШ_ТОКЕН" \
"http://localhost:8008/_synapse/admin/v2/users/@user:chat.example.net/devices"
Удалить конкретное устройство:
docker exec -it matrix-synapse curl -s -X DELETE \
-H "Authorization: Bearer ВАШ_ТОКЕН" \
"http://localhost:8008/_synapse/admin/v2/users/@user:chat.example.net/devices/ИДЕНТИФИКАТОР_УСТРОЙСТВА"
12. Подключение с телефона
На телефон ставим приложение Element (iOS/Android) и настраиваем подключение к другому серверу.
Если у вас HTTPS и домен:
Если вы работаете по IP:
http://server-ip:8008/
Далее вводите имя пользователя и пароль, затем через поиск находите второго пользователя:
@имя
И отправляете ему приглашение. Второй пользователь принимает приглашение и создается комната, в которой вы можете общаться.
Важно: Сохраните в настройках клиента ключи восстановления, чтобы в следующий раз восстановить зашифрованные сообщения, иначе не получится их прочитать.
13. Немного про звонки
Звонки и видео требуют настроенный TURN-сервер (coturn).
Он поднимается отдельно, настраивается не сложно, но это уже другая тема.
Для обычной текстовой переписки не нужен вообще.
14. Итог
Matrix - это несложно.
Он даёт вам:
свой личный мессенджер
без рекламы
без чужих серверов
с нормальным шифрованием
с хранением данных у вас
Для семьи или небольшой группы - идеальный вариант.









