Matrix — это золотой стандарт для децентрализованной, сквозной зашифрованной связи. Он используется в государственных системах обмена сообщениями, сообществах с открытым исходным кодом и организациях, ориентированных на конфиденциальность, по всему миру.
Однако для отдельного разработчика привлекательность часто лежит ближе к дому: объединение разрозненных чат-сетей (таких как Discord и Slack) в единый почтовый ящик или просто обеспечение того, чтобы история ваших разговоров хранилась на инфраструктуре, которую вы контролируете. Функционально Matrix работает как децентрализованная, согласованная в конечном счёте конечная машина. Вместо центрального сервера, рассылающего обновления, домашние серверы обмениваются подписанными JSON-событиями по HTTP, используя алгоритм разрешения конфликтов для слияния этих потоков в единое представление истории комнаты.
Но за его работу взимается «сбор» Традиционно эксплуатация домашнего сервера Matrix означала принятие на себя тяжёлой операционной нагрузки. Вы не просто устанавливаете программное обеспечение; вы становитесь системным администратором. Вам нужно арендовать виртуальные частные серверы (VPS), настраивать PostgreSQL под высокую нагрузку на запись, управлять Redis для кэширования, настраивать обратные прокси и заниматься ротацией TLS-сертификатов. Это громоздкий монстр с сохранением состояния, который требует постоянных затрат времени и денег, независимо от того, отправляете вы одно сообщение в день или миллион.
Мы хотели посмотреть, сможем ли мы полностью устранить этот сбор.
Спойлер: Мы смогли. В этой статье мы объясним, как мы портировали полноценный домашний сервер Matrix на Cloudflare Workers. Результат — бессерверная архитектура, где операции исчезают, стоимость падает до нуля в простое, и каждое соединение по умолчанию защищено постквантовой криптографией. Вы можете просмотреть исходный код и развернуть свой собственный экземпляр прямо из GitHub.
От Tuwunel к Workers
Нашей отправной точкой был Tuwunel — домашний сервер Matrix на Rust, предназначенный для традиционных развёртываний. PostgreSQL для хранения данных, Redis для кэширования, файловая система для медиафайлов. Перенос его на Workers означал пересмотр каждого предположения о хранилище, которое мы принимали как данность.
Хорошие новости: Rust компилируется в WebAssembly, а основная логика протокола Matrix — авторизация событий, разрешение состояния комнаты, криптографическая проверка — перенеслась напрямую. Крейт workers-rs служит мостом к среде выполнения Cloudflare.
Сложность заключалась в хранилище. Традиционные домашние серверы предполагают строгую согласованность через центральную SQL-базу данных. Cloudflare предлагает мощную альтернативу: Durable Objects. Этот примитив даёт нам строгую согласованность и атомарность, необходимые для разрешения состояния в Matrix, и при этом позволяет приложению работать на грани сети.
Вот как выглядит соответствие:
От монолита к бессерверной архитектуре
Переход на Cloudflare Workers даёт разработчику несколько преимуществ: простота развёртывания, меньшие затраты, низкая задержка и встроенная безопасность.
Простое развёртывание: Традиционное развёртывание Matrix требует подготовки сервера, администрирования PostgreSQL, управления кластером Redis, обновления TLS-сертификатов, настройки балансировщика нагрузки, инфраструктуры мониторинга и дежурства по вызовам.
С Workers развёртывание — это wrangler deploy. Мы сами занимаемся TLS, балансировкой нагрузки, защитой от DDoS и глобальным распределением. Так что не нужно патчить сервер, очищать базу данных или обновлять сертификаты.
Затраты на основе использования: Традиционные домашние серверы стоят денег, независимо от того, пользуется ими кто-то или нет. Сервер для небольшого сообщества, обрабатывающий несколько сотен запросов в день, всё равно требует типичный VPS стоимостью около $20/месяц, работающий 24/7.
Ценообразование Workers основано на запросах, поэтому домашние серверы с низким трафиком обходятся буквально в копейки. Когда активность возрастает во время оживлённых бесед, вы платите за то, что используете. Когда все ложатся спать, затраты стремятся к нулю.
Более низкая глобальная задержка: Традиционный домашний сервер Matrix в регионе us-east-1 добавляет более 200 мс задержки для пользователей в Азии или Европе. Каждый запрос синхронизации, отправленное сообщение и индикатор набора текста совершают полный круг до одного региона.
Workers, тем временем, работают в более чем 300 локациях по всему миру. Когда пользователь из Токио отправляет сообщение, Worker выполняется в Токио.
Встроенная безопасность: Домашние серверы Matrix могут быть привлекательными целями: они обрабатывают зашифрованную связь, хранят историю сообщений и аутентифицируют пользователей. Традиционные развёртывания требуют тщательного укрепления: настройки брандмауэра, ограничения частоты запросов, защиты от DDoS, правил WAF, фильтрации по репутации IP.
Мы предоставляем всё это по умолчанию. Worker никогда не видит атакующий трафик, потому что мы сначала его фильтруем. Для одного разработчика или небольшой команды достижение такого уровня защиты на Linux VPS — это работа на полный день. На Workers — это базовая среда.
Защита от квантовых угроз без сложностей
Вот о чём большинство операторов Matrix не задумываются: собрать сейчас, расшифровать позже.
Противник перехватывает ваш зашифрованный TLS-трафик сегодня и сохраняет его. Спустя годы, когда квантовые компьютеры смогут взломать классические алгоритмы обмена ключами, они расшифруют всё задним числом. Для платформы обмена сообщениями, обрабатывающей конфиденциальную связь, это не теоретическая угроза. Государственные агентства и хорошо финансируемые противники уже накапливают зашифрованный трафик.
К счастью, нам не пришлось защищаться от этого в одиночку. Cloudflare развернул гибридное постквантовое согласование ключей для всех соединений TLS 1.3 в октябре 2022 года. Каждое соединение с нашим Worker автоматически согласует X25519MLKEM768 — гибрид, сочетающий классический X25519 с ML-KEM, постквантовым алгоритмом, стандартизированным NIST.
Классическая криптография полагается на математические задачи, которые сложны для традиционных компьютеров, но тривиальны для квантовых компьютеров, работающих на алгоритме Шора. ML-KEM основан на задачах решёток, которые остаются сложными даже для квантовых компьютеров. Гибридный подход означает, что должны отказать оба алгоритма, чтобы соединение было скомпрометировано.
Путь сообщения через систему
Понимание того, где происходит шифрование, важно для архитектуры безопасности. Вот реальный путь, когда кто-то отправляет сообщение через наш домашний сервер:
Клиент отправителя берёт открытый текст сообщения и шифрует его с помощью Megolm — сквозного шифрования Matrix. Затем этот зашифрованный пакет оборачивается в TLS для передачи. В Cloudflare это TLS-соединение использует X25519MLKEM768, делая его устойчивым к квантовым атакам.
Worker завершает TLS-соединение, но то, что он получает, всё ещё зашифровано — это шифротекст Megolm. Мы сохраняем этот шифротекст в D1, индексируем его по комнате и временной метке и доставляем получателям. Но мы никогда не видим открытый текст. Сообщение «Привет, мир» существует только на устройстве отправителя и устройстве получателя.
Когда получатель синхронизируется, процесс идёт в обратном порядке. Он получает зашифрованный пакет по другому устойчивому к квантовым атакам TLS-соединению, а затем локально расшифровывает его с помощью своих сессионных ключей Megolm.
Два слоя, независимая защита
Это создаёт защиту в глубину за счёт двух слоёв шифрования, работающих независимо:
Транспортный слой (TLS) защищает данные в пути. Он шифруется на стороне клиента и расшифровывается на границе Cloudflare. С X25519MLKEM768 этот слой теперь постквантовый.
Прикладной слой (сквозное шифрование Megolm) защищает содержимое сообщения. Он шифруется на устройстве отправителя и расшифровывается только на устройствах получателей. Для этого используется классическая криптография Curve25519.
Вот почему эта архитектура важна: даже если сквозное шифрование Matrix в конечном итоге будет взломано квантовыми компьютерами, содержимое сообщения никогда не передавалось в форме, уязвимой для квантовых атак. TLS-слой, который нёс шифротекст сквозного шифрования, сам был защищён постквантово.
Постквантовый TLS действует как квантово-устойчивый конверт для всего, включая классический слой сквозного шифрования. Это даёт время протоколу Matrix перейти на постквантовые алгоритмы сквозного шифрования, не оставляя текущие сообщения уязвимыми для атак «собрать сейчас — расшифровать позже».
Кто что видит
Любой оператор домашнего сервера Matrix — будь то Synapse на VPS или эта реализация на Workers — может видеть метаданные: какие комнаты существуют, кто в них состоит, когда отправлялись сообщения. Это присуще работе сервера. Вы оператор; вы контролируете инфраструктуру.
Что не видит никто в цепочке инфраструктуры: содержание сообщений. Полезная нагрузка сквозного шифрования (E2EE) шифруется на устройствах отправителя еще до попадания в сеть. Cloudflare завершает TLS-сессию и передает запросы вашему Worker, но оба видят только шифротекст Megolm. Медиафайлы в зашифрованных комнатах шифруются на стороне клиента перед загрузкой. Приватные ключи никогда не покидают устройства пользователей.
Сервер обрабатывает шифротекст, а не разговоры. Это справедливо независимо от того, развертываете ли вы сервер самостоятельно на "голом железе" или запускаете на Workers.
Что потребовалось бы для традиционного развертывания
Для достижения постквантового TLS в традиционном развертывании Matrix потребовалось бы обновить OpenSSL или BoringSSL до версии, поддерживающей ML-KEM, правильно настроить приоритеты наборов шифров, протестировать совместимость клиентов во всех приложениях Matrix, отслеживать сбои согласования TLS, следить за развитием стандартов PQC и корректно обрабатывать клиенты, не поддерживающие PQC.
С Workers это происходит автоматически. Chrome, Firefox и Edge поддерживают X25519MLKEM768. Мобильные приложения, использующие встроенные TLS-стек платформы, наследуют эту поддержку. Уровень безопасности улучшается по мере расширения развертывания PQC от Cloudflare — никаких действий с нашей стороны не требуется.
Архитектура хранения, которая сделала это возможным
Ключевое понимание, полученное при портировании Tuwunel, заключалось в том, что разным данным нужны разные гарантии согласованности. Мы используем каждый примитив Cloudflare для того, что он делает лучше всего.
D1 для модели данных
D1 хранит все, что должно переживать перезапуски и поддерживать запросы: пользователей, комнаты, события, ключи устройств. Более 25 таблиц, охватывающих полную модель данных Matrix.
CREATE TABLE events (
event_id TEXT PRIMARY KEY,
room_id TEXT NOT NULL,
sender TEXT NOT NULL,
event_type TEXT NOT NULL,
state_key TEXT,
content TEXT NOT NULL,
origin_server_ts INTEGER NOT NULL,
depth INTEGER NOT NULL
);
Основой D1 является SQLite, что позволило перенести запросы Tuwunel с минимальными изменениями. Соединения, индексы и агрегации работают как ожидается.
Мы усвоили один трудный урок: eventual consistency (согласованность в конечном счете) D1 нарушает ограничения внешних ключей. Запись в таблицу rooms может быть не видна, когда последующая запись в events проверяет внешний ключ — разные реплики, разный взгляд на мир. Мы удалили все внешние ключи и обеспечиваем ссылочную целостность в коде приложения.
KV для временного состояния
Коды авторизации OAuth живут 10 минут. Токены обновления действуют в течение сессии. Ничему из этого не нужен SQL — нужен быстрый доступ по ключу-значению с автоматическим истечением срока действия.
// Store OAuth code with 10-minute TTL
kv.put(&format!("oauth_code:{}", code), &token_data)?
.expiration_ttl(600)
.execute()
.await?;
Глобальное распределение KV означает, что потоки OAuth работают быстро независимо от местоположения пользователей.
R2 для медиафайлов
Медиа Matrix напрямую сопоставляется с R2. Загрузите изображение, получите URL-адрес, адресованный по содержимому. Исходящий трафик бесплатен, что важно для протокола, где клиенты часто загружают одни и те же аватары и изображения.
Durable Objects для атомарности
Некоторые операции не допускают eventual consistency. Когда клиент запрашивает одноразовый ключ шифрования, этот ключ должен быть атомарно удален. Если два клиента запросят один и тот же ключ, установление зашифрованной сессии завершится неудачей.
Durable Objects обеспечивают однопоточное хранение с сильной согласованностью:
#[durable_object]
pub struct UserKeysObject {
state: State,
env: Env,
}
impl UserKeysObject {
async fn claim_otk(&self, algorithm: &str) -> Result<Option<Key>> {
// Атомарно внутри одного DO - гонки данных невозможны
let mut keys: Vec<Key> = self.state.storage()
.get("one_time_keys")
.await
.ok()
.flatten()
.unwrap_or_default();
if let Some(idx) = keys.iter().position(|k| k.algorithm == algorithm) {
let key = keys.remove(idx);
self.state.storage().put("one_time_keys", &keys).await?;
return Ok(Some(key));
}
Ok(None)
}
}
Мы используем UserKeysObject для управления ключами E2EE, RoomObject для событий в комнатах в реальном времени, таких как индикаторы набора текста и квитанции о прочтении, и UserSyncObject для очередей сообщений "на устройство". Все остальное проходит через D1.
Полное сквозное шифрование, полный OAuth
Сквозное шифрование — обязательное условие для безопасной связи. Наша реализация поддерживает полный стек E2EE Matrix: ключи устройств, ключи перекрестного подписания, одноразовые ключи, резервные ключи, резервное копирование ключей и обезвоженные устройства.
Современные клиенты Matrix используют OAuth 2.0/OIDC вместо устаревших потоков с паролями. Мы реализовали полноценного провайдера OAuth: динамическую регистрацию клиентов, авторизацию PKCE, токены JWT, подписанные RS256, обновление токенов с ротацией и стандартные конечные точки обнаружения OIDC.
curl https://matrix.example.com/.well-known/openid-configuration
{
"issuer": "https://matrix.example.com",
"authorization_endpoint": "https://matrix.example.com/oauth/authorize",
"token_endpoint": "https://matrix.example.com/oauth/token",
"jwks_uri": "https://matrix.example.com/.well-known/jwks.json"
}
Направьте Element или любой другой клиент Matrix на домен, и он автоматически обнаружит все необходимое.
Sliding Sync для мобильных устройств
Традильная синхронизация Matrix передает мегабайты данных при первоначальном подключении — каждая комната, каждое state-событие, недавняя лента для каждой. Это уничтожает заряд батареи мобильных устройств и тарифы на данные.
Sliding Sync позволяет клиентам запрашивать именно то, что им нужно. Вместо загрузки всего клиенты получают 20 самых последних комнат с минимальным состоянием. По мере прокрутки пользователи запрашивают дополнительные диапазоны. Сервер отслеживает позицию и отправляет только изменения (дельты).
В сочетании с выполнением на границе мобильные клиенты могут подключиться и отобразить список своих комнат менее чем за 500 мс — даже на медленных сетях.
Сравнение
Для домашнего сервера, обслуживающего небольшую команду:
|
|
Традиционный (VPS) |
Workers |
|---|---|---|
|
Ежемесячная стоимость (простой) |
$20-50 |
<$1 |
|
Ежемесячная стоимость (активность) |
$20-50 |
$3-10 |
|
Глобальная задержка |
100-300 мс |
20-50 мс |
|
Время на развертывание |
Часы |
Секунды |
|
Обслуживание |
Еженедельно |
Отсутствует |
|
Защита от DDoS |
Дополнительная стоимость |
Включена |
|
Постквантовый TLS |
Сложная настройка |
Автоматически |
*На основе открытых тарифов и метрик, опубликованных DigitalOcean, AWS Lightsail и Linode по состоянию на 15 января 2026 года.
Экономика становится еще лучше при масштабировании. Традиционные развертывания требуют планирования мощности и избыточного выделения ресурсов. Workers масштабируются автоматически.
Будущее децентрализованных протоколов
Когда мы начинали этот проект, цель была просто посмотреть, подойдут ли части друг другу. Может ли такой сложный и сохраняющий состояние протокол, как Matrix — разработанный для мощного "железа" и постоянных файловых систем — действительно работать на эфемерном, бессерверном граничном вычислении?
Ответ — да, но последствия больше, чем просто Matrix.
Сопоставив традиционные компоненты с состоянием с примитивами Cloudflare — Postgres с D1, Redis с KV, мьютексы с Durable Objects — мы доказали, что сложным приложениям не нужна сложная инфраструктура. Мы убрали операционную систему, управление базами данных и конфигурацию сети, оставив только логику приложения и сами данные.
Эта архитектура меняет парадигму самостоятельного хостинга. Она превращает «запуск сервера» из рутины в утилиту. Вы получаете суверенитет над своими данными без бремени владения инфраструктурой.
Matrix на Workers работает в продакшене уже сегодня, обрабатывая реальные зашифрованные коммуникации для нашей команды. Он быстр, дешев и, возможно, является одним из самых безопасных способов развернуть домашний сервер на сегодняшний день.