Telegram, WhatsApp, Signal — у всех у них один общий изъян: ваш аккаунт, ваши сообщения и правила игры находятся на чужом сервере. Matrix меняет саму конструкцию: это открытый протокол, по которому вы поднимаете свой сервер и общаетесь с кем угодно, как по электронной почте. Разберёмся, чем это лучше привычных мессенджеров и как поднять Matrix с веб-клиентом Element в Docker за один вечер.
Table of contents
Open Table of contents
- Из чего обычно выбирают
- Что значит «свой» и «федеративный»
- Главная проблема централизованных мессенджеров
- Что меняет Matrix
- Сравнение в одной таблице
- Клиенты и зрелость экосистемы
- Что нужно, чтобы поднять свой сервер
- Мини-пример: мост в Telegram
- Как проверить, что всё работает
- Подводные камни и обслуживание
- Итог
Из чего обычно выбирают
Почти все популярные мессенджеры устроены одинаково — централизованно. Telegram хранит переписку (кроме секретных чатов) на своих серверах в незашифрованном для себя виде. WhatsApp шифрует содержимое end-to-end, но принадлежит Meta, привязан к номеру телефона и собирает метаданные: кто, кому и когда писал. Signal — образец криптографии, но это тоже один центральный сервер и обязательная привязка к номеру. Slack и Discord удобны для команд, но это закрытые SaaS: ваши данные, история и доступ полностью под их контролем.
Объединяет их то, что вы — гость в чужом доме. Аккаунт могут заблокировать, сервис — уйти из страны, тарифы — поменяться, а историю переписки невозможно забрать и перенести.
Что значит «свой» и «федеративный»
Matrix — это не приложение, а открытый протокол обмена сообщениями (как HTTP — протокол веба). Сервер, который его реализует, называется homeserver; самая популярная реализация — Synapse. matrix.org — это всего лишь один из тысяч серверов, а не «главный».
Ключевое слово — федерация. Лучшая аналогия — электронная почта: у вас адрес @your-domain, вы держите свой почтовый сервер, но переписываетесь с кем угодно на gmail, на корпоративных доменах и так далее. В Matrix точно так же: ваш ID выглядит как @you:your-domain.com, сервер ваш, но вы состоите в общих комнатах с людьми с matrix.org, mozilla.org и любых других серверов.
Главная проблема централизованных мессенджеров
Когда сервис централизован, у вас нет ни владения, ни гарантий. Это упирается в несколько вполне практических вещей:
- Единая точка контроля. Аккаунт можно заблокировать без объяснений, а сервис — целиком заблокировать на уровне страны. Ваша переписка станет недоступной в один момент.
- Метаданные. Даже при сквозном шифровании содержимого централизованный сервер видит граф общения: кто, с кем, когда и как часто. Это зачастую ценнее самого текста.
- Привязка к номеру. Номер телефона — это и идентификатор, и точка деанонимизации, и единственный «ключ» от аккаунта.
- Нет переносимости. Забрать всю историю и перенести её на другой сервис обычно невозможно — вы заперты внутри.
Self-hosted Matrix снимает каждый из этих пунктов: контроль, данные и идентификатор — на вашей стороне.
Что меняет Matrix
- Федерация и владение. Сервер ваш, данные лежат на вашем диске. Никто не может «выключить» ваш аккаунт извне, пока работает ваш сервер.
- E2EE по умолчанию. Современный Element включает сквозное шифрование (алгоритмы Olm/Megolm) для личных и групповых чатов автоматически. Сервер хранит только шифртекст — расшифровать его могут лишь устройства участников.
- Идентификатор без номера телефона. Вы заводите логин вида
@you:your-domain.com. Никакой обязательной привязки к симке. - Открытый протокол и выбор клиентов. Element — самый известный клиент, но не единственный: есть FluffyChat, Cinny, SchildiChat, нативные приложения под все платформы. Протокол открыт — vendor lock-in отсутствует.
- Мосты (bridges). Matrix умеет «прорастать» в другие сети: Telegram, WhatsApp, Signal, Discord, Slack, IRC. Вы пишете из одного клиента, а сообщения ходят в обе стороны.
Про мосты стоит сказать отдельно — это то, что снимает главное возражение «но все мои контакты в Telegram». Поднимаете bridge (например, mautrix-telegram), и переписка из Telegram приходит к вам в Element как обычные комнаты. Один клиент — все сети сразу.
Сравнение в одной таблице
| Matrix (self-hosted) | Telegram | Signal | Slack / Discord | |
|---|---|---|---|---|
| Кто контролирует сервер | вы | компания | компания | компания |
| Данные хранятся | у вас | у них | у них | у них |
| E2EE | да, по умолчанию | только «секретные» | да | нет |
| Привязка к номеру | не нужна | нужна | нужна | |
| Федерация | да | нет | нет | нет |
| Мосты в другие сети | да | нет | нет | нет |
| Открытый код | да | частично | да | нет |
| Цена | свой сервер | бесплатно | бесплатно | подписка |
Платой за свободу здесь становится одно: сервер нужно поднять и обслуживать самому. Зато всё остальное — ваше.
Клиенты и зрелость экосистемы
Важно понимать, что Matrix — это не нишевый эксперимент. За протоколом стоит некоммерческий Matrix.org Foundation, а сам стандарт открыт и реализуется десятками независимых проектов. На Matrix перешли там, где цена ошибки высока: внутренние коммуникации французского правительства (проект Tchap), немецкого бундесвера и здравоохранения, ряда университетов. Если протокол доверяют государственные структуры, для личного сервера его зрелости тем более достаточно.
И поскольку клиент отвязан от сервера, вы не заперты в одном приложении:
- Element — флагман: веб, десктоп и мобильные приложения, полный E2EE и Secure Backup. То, что мы и поднимаем.
- SchildiChat — форк Element с более «телеграмным» интерфейсом и лентой чатов.
- Cinny и FluffyChat — лёгкие и приятные клиенты, если Element кажется тяжеловатым.
- nheko, Fractal — нативные десктопные клиенты для тех, кто не любит Electron.
Все они ходят на один и тот же ваш homeserver — можно пользоваться разными на разных устройствах одновременно.
Что нужно, чтобы поднять свой сервер
Минимальный production-набор: домен, небольшой VPS (хватит 2 ГБ RAM), reverse proxy с TLS и три контейнера — Synapse, PostgreSQL и Element. Пройдём по шагам.
1. Сгенерируйте конфиг Synapse. Этот разовый запуск создаёт homeserver.yaml и ключи в каталоге ./synapse-data:
docker run -it --rm \
-v $(pwd)/synapse-data:/data \
-e SYNAPSE_SERVER_NAME=your-domain.com \
-e SYNAPSE_REPORT_STATS=no \
matrixdotorg/synapse:latest generate
Обратите внимание: SYNAPSE_SERVER_NAME — это часть после : в вашем ID (@you:your-domain.com), а не хост, где физически крутится сервер. Их можно развести через .well-known (см. ниже).
2. Переключите Synapse на PostgreSQL. По умолчанию сгенерируется SQLite — для прода не годится. Откройте synapse-data/homeserver.yaml и замените блок database:
database:
name: psycopg2
args:
user: synapse
password: change-me-please
database: synapse
host: postgres
cp_min: 5
cp_max: 10
3. Опишите docker-compose.yml — три сервиса в одной сети:
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: synapse
POSTGRES_PASSWORD: change-me-please
POSTGRES_DB: synapse
# Synapse требует именно такую локаль:
POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=C"
volumes:
- ./postgres:/var/lib/postgresql/data
synapse:
image: matrixdotorg/synapse:latest
restart: unless-stopped
depends_on: [postgres]
volumes:
- ./synapse-data:/data
ports:
- "8008:8008" # клиентский HTTP — прячем за reverse proxy
element:
image: vectorim/element-web:latest
restart: unless-stopped
volumes:
- ./element-config.json:/app/config.json:ro
ports:
- "8080:80"
4. Настройте веб-клиент Element. Минимальный element-config.json указывает клиенту на ваш homeserver:
{
"default_server_config": {
"m.homeserver": {
"base_url": "https://matrix.your-domain.com",
"server_name": "your-domain.com"
}
},
"brand": "My Chat"
}
5. Выдайте TLS через reverse proxy. Caddy получает сертификаты Let’s Encrypt автоматически — двух блоков достаточно (отдельный поддомен под API и под веб-клиент):
matrix.your-domain.com {
reverse_proxy localhost:8008
}
chat.your-domain.com {
reverse_proxy localhost:8080
}
6. Включите делегирование через .well-known. Чтобы ID были красивыми (@you:your-domain.com), а сервер жил на поддомене matrix., отдайте два файла с корневого домена. По адресу https://your-domain.com/.well-known/matrix/server:
{ "m.server": "matrix.your-domain.com:443" }
И по https://your-domain.com/.well-known/matrix/client (с заголовком Access-Control-Allow-Origin: *):
{ "m.homeserver": { "base_url": "https://matrix.your-domain.com" } }
7. Запустите и создайте администратора:
docker compose up -d
# создать первого пользователя (флаг -a = админ)
docker compose exec synapse \
register_new_matrix_user -u admin -a -c /data/homeserver.yaml http://localhost:8008
Готово: открываете https://chat.your-domain.com, логинитесь под admin — и у вас свой мессенджер.
Мини-пример: мост в Telegram
Главное возражение против переезда — «но все мои контакты в Telegram». Мост это решает: переписка из Telegram приходит в Element как обычные комнаты, и отвечать можно прямо оттуда. Возьмём mautrix-telegram — добавим четвёртый контейнер в тот же docker-compose.yml:
mautrix-telegram:
image: dock.mau.dev/mautrix/telegram:latest
restart: unless-stopped
depends_on: [postgres, synapse]
volumes:
- ./mautrix-telegram:/data
Порядок действий короткий. Первый запуск контейнера создаёт config.yaml — впишите в него api_id и api_hash (берутся на my.telegram.org) и адрес homeserver. Второй запуск генерирует registration.yaml — файл, которым мост «представляется» Synapse. Подключите его в homeserver.yaml:
app_service_config_files:
- /data/telegram-registration.yaml
Перезапустите Synapse, напишите боту @telegrambot:your-domain.com команду login — и ваши Telegram-чаты подтянутся в Element. Точно так же ставятся мосты в WhatsApp, Signal и Discord — каждый это отдельный appservice по той же схеме.
Как проверить, что всё работает
Сначала убедитесь, что клиентский API отвечает наружу:
curl https://matrix.your-domain.com/_matrix/client/versions
# {"versions":["r0.6.1","v1.1", ... ]}
Затем проверьте, что .well-known отдаётся с корневого домена:
curl https://your-domain.com/.well-known/matrix/server
# {"m.server":"matrix.your-domain.com:443"}
И главный тест — федерация. Откройте federationtester.matrix.org, введите your-domain.com и убедитесь, что все галочки зелёные. Это значит, что другие серверы Matrix видят ваш и могут с ним общаться. После этого войдите в Element, создайте комнату и пригласите кого-нибудь с @user:matrix.org — если сообщения ходят, федерация поднялась.
Подводные камни и обслуживание
Свой сервер — это не «поставил и забыл». Несколько вещей, которые стоит держать в голове:
- Регистрация по умолчанию закрыта — так и оставьте. Открытая регистрация без капчи моментально привлекает спам-ботов. Приглашайте людей вручную через
register_new_matrix_userили включите регистрацию по токенам. - Бэкапы — это база и
synapse-data. Делайте дамп PostgreSQL и сохраняйте каталогsynapse-dataцеликом: там лежатsigning.keyи.well-known-логика. Потеря ключа подписи означает потерю идентичности сервера для всей федерации. - Включите Secure Backup в Element. E2EE означает, что ключи живут на устройствах. Без включённого ключевого бэкапа (Secure Backup) потеря телефона = потеря доступа к истории зашифрованных чатов. Это настраивается в самом клиенте за минуту.
- Обновляйтесь осознанно.
docker compose pull && docker compose up -dобновит образы, но перед мажорными версиями Synapse читайте upgrade notes: иногда требуются миграции схемы БД. - Следите за ресурсами. Федерация с крупными публичными комнатами заметно нагружает CPU и память — первый join в большую комнату может занять минуты и съесть гигабайт RAM. Для личного сервера на пару десятков человек 2–4 ГБ хватает с запасом.
Ничего из этого не сложно, но это та цена обслуживания, которой нет у облачного мессенджера. Зато и зависимости от чужого облака — тоже нет.
Итог
Matrix — это не «ещё один мессенджер», а смена самой модели: вместо аренды места в чужом облаке вы получаете свой узел в общей федеративной сети. Платой становится сервер, который нужно поднять и обслуживать. Взамен — владение данными, сквозное шифрование по умолчанию, идентификатор без привязки к номеру и мосты, через которые можно держать связь даже с теми, кто остался в Telegram и WhatsApp. Для команды или для семьи, которой важна приватность, этот размен почти всегда в плюс.