Федерация между установками
Актуально для: SimpleTwo 0.9.x · Проверено: 08.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. Включение
Федерация выключена, пока не заданы обе переменные окружения службы 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. Проверка живого обмена
- На стороне A сотрудник открывает контакты и вводит адрес
имя@домен-B. - Отправляет сообщение.
- На стороне B у адресата появляется разговор с отправителем
имя@домен-A.
Если сообщение не дошло, смотрите журнал службы переписки на принимающей стороне: там видно, какая из трёх проверок не прошла.
5. Что федерируется, а что нет
Федерируется: доставка сообщений, зеркальный разговор и состав его участников на принимающей стороне, отбрасывание повторов, аватар пользователя по запросу.
Не федерируется каталог. Прочитать список сотрудников другой организации нельзя, и это решение: адрес коллеги узнают от него самого, как узнают адрес электронной почты.
Пока не федерируется: присутствие (онлайн/занят), синхронизация состава групп между установками. Обмен сообщениями сейчас живёт внутри службы переписки; вынос внешней стороны в отдельную роль запланирован, и до него федеративный обмен стоит включать только с теми, с кем он действительно нужен.
Типовые отказы
| Симптом | Код | Вероятная причина |
|---|---|---|
| Все федеративные маршруты отвечают 404 | federation_disabled | не заданы MSG_DOMAIN и MSG_FEDERATION_ALLOW либо служба не перезапущена |
| 403 при доставке | federation_refused | домен отправителя не внесён в список разрешённых на принимающей стороне |
| 401 при доставке | federation_refused | подпись не сходится: у принимающей стороны закеширован прежний ключ или домен отдаёт чужой messaging_url |
Адрес с @ уходит в локальный поиск | — | MSG_DOMAIN пуст: для этой установки все адреса локальные |
| Обмен работал и перестал после смены сертификата | — | документ обнаружения или служба переписки недоступны по HTTPS с внешней стороны |