Федерация между установками
Актуально для: SimpleTwo 0.9.x · Проверено: 13.09.2026
Федерация позволяет сотруднику написать человеку из другой организации по адресу вида
имя@домен — не заводя ему гостевую учётную запись и не поднимая ничего общего посередине.
Каждая сторона остаётся на своих серверах; между ними ходят только те сообщения, которые
адресованы друг другу.
Федерация включается с обеих сторон: каждая установка проверяет, что домен отправителя
внесён в её собственный список разрешённых. Односторонняя настройка даст federation_refused
на встречной стороне — и это правильное поведение, а не ошибка конфигурации.
1. Что нужно до включения
- Служба переписки доступна из интернета по HTTPS — принимающая сторона обращается к ней напрямую.
- Домен отдаёт документ обнаружения. Обращение к
https://<домен>/.well-known/simpletwo.jsonдолжно вернуть JSON с полемmessaging_url: именно так вторая сторона узнаёт, куда стучаться. Документ отдаёт координатор — тот, чьё имя стоит на этом домене. - Согласие второй стороны. Обменяйтесь доменами и подтвердите, что каждый внесёт другого в список разрешённых.
Проверка готовности — одной командой, для каждого из двух доменов:
curl -fsS "https://<домен>/.well-known/simpletwo.json" | python3 -m json.tool
В ответе должно быть непустое messaging_url. Пусто или 404 — федерация не заработает: у
принимающей стороны нет способа найти вашу службу переписки.
То же самое делает кнопка Проверить партнёра в карточке политики (§2) — и делает это с
того хоста, которому и предстоит ходить к партнёру, что важнее: curl с ноутбука
администратора проверяет доступность из сети администратора, а не из сети установки.
2. Включение
Федерация — опция продукта, наравне с перепиской и конференциями: администратор включает её сам, и по умолчанию она выключена. Это единственный переключатель, после которого сообщения покидают организацию, поэтому он не включён «из коробки» ни в одной установке.
Консоль → Настройки → Опции продукта, строка «Федерация» — и Политика федерации сразу под ней:
- Домен этой установки — правая часть каждого здешнего адреса. Без него включить федерацию нельзя, и консоль откажет прямо в форме: подписывать сообщения и быть адресуемой установке без собственного имени нечем.
- Организации, с которыми обмениваемся сообщениями — по одной в строке. Отсюда
принимается доставка; всё остальное получает
federation_refused. - Проверить партнёра — та же проверка, что раньше делалась руками через
curl, но с того хоста, которому и предстоит ходить к партнёру. Она называет шаг, на котором всё сломалось: не отдался документ обнаружения — это координатор встречной стороны; нет публичного ключа — у них выключена федерация. - Сохранить политику. Настройка уходит в службу переписки сразу, перезапускать ничего не нужно; строка состояния под карточкой показывает не то, что сохранила консоль, а то, что служба сообщает как действующее.
Ключи создавать не нужно: пара 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 минут: смена ключа на стороне партнёра доезжает сама, но не мгновенно.