1572

Как я поднял свой личный 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>

  1. Создаём Proxy Host на matrix-synapse:8008

  2. Получаем SSL-сертификат

  3. Добавляем два обязательных пути .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 на ваш домен.

Проверяем прямо на сервере, или в консоли вашего компа:

curl -L https://chat.example.net/.well-known/matrix/client

Ответ должен быть таким:

{"m.homeserver":{"base_url":"https://chat.example.net"}}

6. Если домен не нужен, то можно работать по HTTP и IP

Просто пробрасываете порт наружу и подключаетесь к серверу вот так:

http://server-ip:8008/

Matrix всё равно шифрует переписку, поэтому содержимое сообщений никто не увидит.

Минусы:

  • Element может ругнуться

  • федерации (общения с другими серверами) не будет

Для семейного чата идеальный упрощённый вариант.

После можно зайти через браузер. Если сервер успешно поднялся, вы увидите такую страницу:

Как я поднял свой личный Matrix-мессенджер

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 и домен:

https://chat.example.net

Если вы работаете по IP:

http://server-ip:8008/

Далее вводите имя пользователя и пароль, затем через поиск находите второго пользователя:

@имя

И отправляете ему приглашение. Второй пользователь принимает приглашение и создается комната, в которой вы можете общаться.

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

13. Немного про звонки

Звонки и видео требуют настроенный TURN-сервер (coturn).
Он поднимается отдельно, настраивается не сложно, но это уже другая тема.
Для обычной текстовой переписки не нужен вообще.

14. Итог

Matrix - это несложно.
Он даёт вам:

  • свой личный мессенджер

  • без рекламы

  • без чужих серверов

  • с нормальным шифрованием

  • с хранением данных у вас

Для семьи или небольшой группы - идеальный вариант.

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества