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

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

Актуально для: SimpleTwo 0.9.x · Проверено: 13.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) — и делает это с того хоста, которому и предстоит ходить к партнёру, что важнее: curl с ноутбука администратора проверяет доступность из сети администратора, а не из сети установки.

2. Включение

Федерация — опция продукта, наравне с перепиской и конференциями: администратор включает её сам, и по умолчанию она выключена. Это единственный переключатель, после которого сообщения покидают организацию, поэтому он не включён «из коробки» ни в одной установке.

Консоль → Настройки → Опции продукта, строка «Федерация» — и Политика федерации сразу под ней:

  1. Домен этой установки — правая часть каждого здешнего адреса. Без него включить федерацию нельзя, и консоль откажет прямо в форме: подписывать сообщения и быть адресуемой установке без собственного имени нечем.
  2. Организации, с которыми обмениваемся сообщениями — по одной в строке. Отсюда принимается доставка; всё остальное получает federation_refused.
  3. Проверить партнёра — та же проверка, что раньше делалась руками через curl, но с того хоста, которому и предстоит ходить к партнёру. Она называет шаг, на котором всё сломалось: не отдался документ обнаружения — это координатор встречной стороны; нет публичного ключа — у них выключена федерация.
  4. Сохранить политику. Настройка уходит в службу переписки сразу, перезапускать ничего не нужно; строка состояния под карточкой показывает не то, что сохранила консоль, а то, что служба сообщает как действующее.

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

Что видно на стороне клиента

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

Переменные окружения — для установки без координатора

Прежний способ никуда не делся и остаётся для развёртывания, где консоли нет:

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

Сохранённая политика старше окружения. Как только консоль хоть раз сохранила политику, переменные перестают на что-либо влиять: администратор, выключивший федерацию в консоли, не должен получить её обратно при следующем перезапуске из переменной, которой он не видит. Пустой MSG_DOMAIN на установке, где консоль ничего не сохраняла, означает «все адреса локальные».

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

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федерация выключена: опция снята в «Опциях продукта» или не задан домен установки
403 при доставкеfederation_refusedдомен отправителя не внесён в список разрешённых на принимающей стороне
401 при доставкеfederation_refusedподпись не сходится: у принимающей стороны закеширован прежний ключ или домен отдаёт чужой messaging_url
Адрес с @ уходит в локальный поискдомен установки не задан: для неё все адреса локальные
Обмен работал и перестал после смены сертификатадокумент обнаружения или служба переписки недоступны по HTTPS с внешней стороны