Перейти к содержимому
Hogin Hogin
Назад

Свой Matrix + Element: мессенджер, который принадлежит вам

9 мин чтения

Telegram, WhatsApp, Signal — у всех у них один общий изъян: ваш аккаунт, ваши сообщения и правила игры находятся на чужом сервере. Matrix меняет саму конструкцию: это открытый протокол, по которому вы поднимаете свой сервер и общаетесь с кем угодно, как по электронной почте. Разберёмся, чем это лучше привычных мессенджеров и как поднять Matrix с веб-клиентом Element в Docker за один вечер.

Table of contents

Open Table of contents

Из чего обычно выбирают

Почти все популярные мессенджеры устроены одинаково — централизованно. 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 и любых других серверов.

Централизованный мессенджер против федерации Matrix

Главная проблема централизованных мессенджеров

Когда сервис централизован, у вас нет ни владения, ни гарантий. Это упирается в несколько вполне практических вещей:

Self-hosted Matrix снимает каждый из этих пунктов: контроль, данные и идентификатор — на вашей стороне.

Что меняет Matrix

Где лежат сообщения и ключи: облако мессенджера против вашего homeserver с E2EE

Про мосты стоит сказать отдельно — это то, что снимает главное возражение «но все мои контакты в Telegram». Поднимаете bridge (например, mautrix-telegram), и переписка из Telegram приходит к вам в Element как обычные комнаты. Один клиент — все сети сразу.

Мосты Matrix: один клиент для Telegram, WhatsApp, Signal, Discord и IRC

Сравнение в одной таблице

Matrix (self-hosted)TelegramSignalSlack / Discord
Кто контролирует сервервыкомпаниякомпаниякомпания
Данные хранятсяу васу ниху ниху них
E2EEда, по умолчаниютолько «секретные»данет
Привязка к номеруне нужнанужнанужнаemail
Федерацияданетнетнет
Мосты в другие сетиданетнетнет
Открытый коддачастичноданет
Ценасвой сервербесплатнобесплатноподписка

Платой за свободу здесь становится одно: сервер нужно поднять и обслуживать самому. Зато всё остальное — ваше.

Клиенты и зрелость экосистемы

Важно понимать, что Matrix — это не нишевый эксперимент. За протоколом стоит некоммерческий Matrix.org Foundation, а сам стандарт открыт и реализуется десятками независимых проектов. На Matrix перешли там, где цена ошибки высока: внутренние коммуникации французского правительства (проект Tchap), немецкого бундесвера и здравоохранения, ряда университетов. Если протокол доверяют государственные структуры, для личного сервера его зрелости тем более достаточно.

И поскольку клиент отвязан от сервера, вы не заперты в одном приложении:

Все они ходят на один и тот же ваш 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 — если сообщения ходят, федерация поднялась.

Подводные камни и обслуживание

Свой сервер — это не «поставил и забыл». Несколько вещей, которые стоит держать в голове:

Ничего из этого не сложно, но это та цена обслуживания, которой нет у облачного мессенджера. Зато и зависимости от чужого облака — тоже нет.

Итог

Matrix — это не «ещё один мессенджер», а смена самой модели: вместо аренды места в чужом облаке вы получаете свой узел в общей федеративной сети. Платой становится сервер, который нужно поднять и обслуживать. Взамен — владение данными, сквозное шифрование по умолчанию, идентификатор без привязки к номеру и мосты, через которые можно держать связь даже с теми, кто остался в Telegram и WhatsApp. Для команды или для семьи, которой важна приватность, этот размен почти всегда в плюс.


Поделиться:

Следующая статья
Деплой Astro на Cloudflare Pages: Git-интеграция и GitHub CI/CD