Мессенджер

Свой мессенджер на Matrix: Synapse, федерация и видеозвонки

03.07.2026  ·  Горун Евгений Вадимович

Задача

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

Почему Matrix

Matrix — открытый федеративный протокол: свой сервер полностью под контролем, а пользователи могут общаться с любым другим Matrix-сервером, как электронная почта между доменами. Homeserver — Synapse (эталонная реализация) с PostgreSQL. Клиент — Element X на iOS/Android.

Архитектура

Synapse и PostgreSQL живут в LXC-контейнере Proxmox на домашнем сервере. Наружу сервис опубликован через облачный узел с белым IP: nginx терминирует TLS (Let’s Encrypt), а до контейнера трафик идёт по WireGuard-туннелю. Федерация работает через стандартный порт 443 с делегацией через .well-known — дополнительные порты для неё не открывались. Регистрация — только по приглашениям (registration tokens), спам-ботам вход закрыт.

Звонки: MatrixRTC

Современный Element X использует для звонков стек MatrixRTC. На облачном узле развёрнуты LiveKit SFU (медиасервер, через который ходят аудио- и видеопотоки), сервис JWT-авторизации, связывающий Matrix-аккаунты с LiveKit, и coturn как TURN/STUN. Клиенты узнают о звонковом бэкенде автоматически — через .well-known. Итог: шифрованные звонки 1-на-1 и групповые видеоконференции без единого стороннего сервиса.

Эксплуатация

Администрирование — через веб-панель, доступную только с доверенного IP. Каждую ночь снимается дамп PostgreSQL и копия конфигурации с медиафайлами, реплицируется на второй узел, а отдельная проверка следит за свежестью копий и шлёт алерт в Telegram, если бэкап не пришёл; восстановимость дампа проверена реальным восстановлением. Сервер включён в общий мониторинг: Zabbix и Prometheus/Grafana.

Грабли, которые стоит знать

Две поймал и починил в процессе. Первая: пакеты Debian/Ubuntu автостартуют сервис с дефолтным конфигом раньше, чем вы запишете свой, а enable —now не перезапускает уже запущенный процесс — так TURN-сервер несколько минут прожил открытым релеем, пока рестарт не применил конфиг с аутентификацией. Вторая: у reverse-proxy для LiveKit критичен срез префикса пути — без него клиент стучится не в тот эндпоинт и звонок не устанавливается. Правило после этого проекта: записал конфиг — сделай restart и проверь эффективный конфиг по логу.

Итог

Полнофункциональный федеративный мессенджер со сквозным шифрованием и видеозвонками — на собственной инфраструктуре, под мониторингом и с проверяемыми бэкапами. Стек: Matrix Synapse, PostgreSQL, nginx, Let’s Encrypt, WireGuard, coturn, LiveKit, Proxmox LXC.

← Вся инфраструктура как код: 9 Ansible-ролей, которые пересоздают мой мониторинг за минутыКак я построил SaaS-мониторинг сайтов за один день →