Перейти к основному содержимому

Федерация между установками

Актуально для: SimpleTwo 0.9.x · Проверено: 08.09.2026

Федерация позволяет сотруднику написать человеку из другой организации по адресу вида имя@домен — не заводя ему гостевую учётную запись и не поднимая ничего общего посередине. Каждая сторона остаётся на своих серверах; между ними ходят только те сообщения, которые адресованы друг другу.

Это договор двух администраторов

Федерация включается с обеих сторон: каждая установка проверяет, что домен отправителя внесён в её собственный список разрешённых. Односторонняя настройка даст federation_refused на встречной стороне — и это правильное поведение, а не ошибка конфигурации.

1. Что нужно до включения

  1. Служба переписки доступна из интернета по HTTPS — принимающая сторона обращается к ней напрямую.
  2. Домен отдаёт документ обнаружения. Обращение к https://<домен>/.well-known/simpletwo.json должно вернуть JSON с полем messaging_url: именно так вторая сторона узнаёт, куда стучаться. Документ отдаёт координатор — тот, чьё имя стоит на этом домене.
  3. Согласие второй стороны. Обменяйтесь доменами и подтвердите, что каждый внесёт другого в список разрешённых.

Проверка готовности — одной командой, для каждого из двух доменов:

curl -fsS "https://<домен>/.well-known/simpletwo.json" | python3 -m json.tool

В ответе должно быть непустое messaging_url. Пусто или 404 — федерация не заработает: у принимающей стороны нет способа найти вашу службу переписки.

2. Включение

Федерация выключена, пока не заданы обе переменные окружения службы messaging:

MSG_DOMAIN=corp.example.ru
MSG_FEDERATION_ALLOW=partner.example.com,vendor.example.net
ПеременнаяСмысл
MSG_DOMAINдомен этой установки; он же правая часть адресов её пользователей
MSG_FEDERATION_ALLOWдомены, от которых эта установка принимает доставку, через запятую

Пустой MSG_DOMAIN означает «все адреса локальные»: обращение к федеративным маршрутам вернёт federation_disabled (HTTP 404), а адрес с @ будет разобран как локальное имя.

Ключи создавать не нужно: пара Ed25519 создаётся при первом запуске и хранится в базе службы. Публичная половина отдаётся наружу, приватная не покидает процесс.

Перезапустите службу и убедитесь, что она признаёт себя федеративной:

curl -fsS "https://chat.s2.<домен>/v1/federation/info" | python3 -m json.tool

Ожидаемый ответ — domain и pubkey. Пришёл 404 federation_disabled — переменные не доехали до процесса (частая причина: правка файла окружения без перезапуска).

3. Как выглядит доверие

клиент → своя служба переписки
│ подписывает конверт своим приватным ключом

https://<домен партнёра>/.well-known/simpletwo.json → messaging_url
<messaging_url>/v1/federation/info → публичный ключ партнёра

POST <messaging_url>/v1/federation/deliver → подпись + домен отправителя

Принимающая сторона делает три проверки в этом порядке: домен отправителя есть в её списке разрешённых, подпись сходится с публичным ключом этого домена, сообщение не приходило ранее (дубликаты отбрасываются по глобальному идентификатору). Общих секретов между организациями нет — ни паролей, ни выданных токенов, поэтому и отзывать при расставании нечего, кроме строки в списке.

Результат обнаружения кешируется на 10 минут: смена ключа на стороне партнёра доезжает сама, но не мгновенно.

4. Проверка живого обмена

  1. На стороне A сотрудник открывает контакты и вводит адрес имя@домен-B.
  2. Отправляет сообщение.
  3. На стороне B у адресата появляется разговор с отправителем имя@домен-A.

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

5. Что федерируется, а что нет

Федерируется: доставка сообщений, зеркальный разговор и состав его участников на принимающей стороне, отбрасывание повторов, аватар пользователя по запросу.

Не федерируется каталог. Прочитать список сотрудников другой организации нельзя, и это решение: адрес коллеги узнают от него самого, как узнают адрес электронной почты.

Пока не федерируется: присутствие (онлайн/занят), синхронизация состава групп между установками. Обмен сообщениями сейчас живёт внутри службы переписки; вынос внешней стороны в отдельную роль запланирован, и до него федеративный обмен стоит включать только с теми, с кем он действительно нужен.

Типовые отказы

СимптомКодВероятная причина
Все федеративные маршруты отвечают 404federation_disabledне заданы MSG_DOMAIN и MSG_FEDERATION_ALLOW либо служба не перезапущена
403 при доставкеfederation_refusedдомен отправителя не внесён в список разрешённых на принимающей стороне
401 при доставкеfederation_refusedподпись не сходится: у принимающей стороны закеширован прежний ключ или домен отдаёт чужой messaging_url
Адрес с @ уходит в локальный поискMSG_DOMAIN пуст: для этой установки все адреса локальные
Обмен работал и перестал после смены сертификатадокумент обнаружения или служба переписки недоступны по HTTPS с внешней стороны