SOGo: общие календари между доменами mailcow
АйТи Фреш
Linux, Docker и DevOps

Как открыть общие календари и адресные книги SOGo между двумя доменами одного mailcow

Автор: , директор ООО «АйТи-Фреш» · · ~11 мин чтения
Мост видимости выстроен только между двумя доменами SOGo на общем mailcow, остальные домены остаются изолированными
SOGoDomainsVisibility строит мост между двумя конкретными доменами, а не открывает весь сервер целиком.

На одном mailcow часто крутится несколько доменов, и по умолчанию SOGo держит их изолированными — сотрудники разных доменов не находят друг друга в поиске. Если двум командам нужно делиться календарями, а остальные домены трогать нельзя, помогает параметр SOGoDomainsVisibility. Показываю точный синтаксис и что он реально открывает на кейсе PR-агентства с двумя брендовыми доменами.

По умолчанию домены в SOGo друг друга не видят — и это правильно

Когда я разворачиваю корпоративную почту на mailcow для компании с несколькими юрлицами или брендами, часто оказывается удобнее держать их как отдельные домены на одном сервере, а не разносить по разным инсталляциям. Это же поведение видно на мультитенантных площадках, где на одном mailcow живёт сразу несколько независимых клиентов. SOGo по умолчанию изолирует домены друг от друга: пользователь домена А не найдёт коллегу из домена Б ни в адресной книге, ни при попытке расшарить календарь — с точки зрения SOGo это два разных, ничем не связанных мира.

Это осознанное поведение, а не недоработка. На сервере, где почтовый провайдер или ИТ-подрядчик обслуживает несколько клиентов через один mailcow, изоляция доменов — это ровно то, что нужно по умолчанию: сотрудники клиента А не должны даже теоретически видеть в поиске сотрудников клиента Б. Проблема возникает только тогда, когда два домена на одном сервере принадлежат одной организации или связанным брендам и им действительно нужно делиться расписанием.

Я специально проверяю это поведение на каждом новом мультидоменном mailcow, который принимаю на обслуживание: завожу тестового пользователя в каждом домене и убеждаюсь, что поиск по адресной книге между ними действительно пустой. Один раз обнаружил, что предыдущий подрядчик клиента когда-то открыл видимость между всеми доменами разом «для удобства» и забыл об этом — сотрудники двух формально не связанных компаний годами могли видеть друг друга в общем поиске SOGo, просто никто не обращал внимания.

SOGoDomainsVisibility: где живёт настройка и как выглядит синтаксис

Параметр, который управляет видимостью доменов друг для друга, — SOGoDomainsVisibility, задаётся в конфиге data/conf/sogo/sogo.conf. По умолчанию значение — пустой массив, то есть та самая изоляция, описанная выше. Документация mailcow даёт пример для трёх доменов: SOGoDomainsVisibility = ((example.org, example.com, example.net));, а сама SOGo подтверждает формат — это массив массивов, где каждая внутренняя группа скобок описывает набор доменов, видимых друг другу.

Формат именно так и работает — группами, а не общим списком: можно указать несколько независимых групп в одном параметре, и домены из разных групп друг друга не увидят, даже если оба параметра заданы в одном SOGoDomainsVisibility. Например, ((brand-a.ru, brand-b.ru), (partner-x.ru, partner-y.ru)) — две отдельные пары, не связанные между собой. Именно эта возможность и решает задачу мультитенантного mailcow: открыть видимость только между нужными доменами, не трогая остальных клиентов на том же сервере.

После изменения sogo.conf настройка не подхватывается на лету — нужно перезапустить контейнер командой docker compose restart sogo-mailcow (или docker-compose restart sogo-mailcow для Standalone-версии Docker Compose). Я всегда проверяю после рестарта, что конфиг синтаксически корректен: sogo.conf — это plist-формат, и лишняя или недостающая скобка либо точка с запятой в SOGoDomainsVisibility ломает разбор файла, поэтому сразу после рестарта смотрю docker compose logs --tail=50 sogo-mailcow и открываю веб-интерфейс, а не считаю задачу выполненной по факту рестарта.

В самом файле sogo.conf, который поставляется с mailcow по умолчанию, уже есть закомментированный пример именно на две независимые группы: блок // SOGoDomainsVisibility = ( (domain1.tld, domain5.tld), (domain3.tld, domain2.tld) ); под комментарием «Multi-domain setup. Domains are isolated, you can define visibility options here». Я обычно не удаляю этот комментарий при правке, а дописываю рядом свою группу — так следующему администратору видно, что это штатный механизм mailcow, а не самодеятельность, оставленная кем-то без объяснений.

Схема группы видимости SOGoDomainsVisibility между двумя доменами на общем mailcow при сохранении изоляции остальных
Одна группа — одна связь; все домены вне группы остаются такими же изолированными, как и были.

Видимость — это не то же самое, что доступ к календарю

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

Реальный доступ к чужому календарю или адресной книге в SOGo всегда выдаётся вручную и децентрализованно: каждый пользователь сам, через список прав доступа (Access Control List) в интерфейсе SOGo, назначает конкретным коллегам права — причём для календаря отдельно по категориям событий (публичные, конфиденциальные, личные): только дата и время (DAndTViewer), полный просмотр (Viewer), ответ на приглашения (Responder) или редактирование (Modifier), плюс отдельные права на создание и удаление событий. В интерфейсе они называются «View the Date & Time», «View All», «Respond To», «Modify». Штатного механизма, которым администратор домена одним действием сделает календарь сотрудника общим для всех, в mailcow нет: роли по умолчанию (SOGoCalendarDefaultRoles) лишь подставляются, когда владелец сам добавляет человека в список доступа, а суперпользователь SOGoSuperUsernames — инструмент для служебных интеграций, а не для раздачи доступа. Решает владелец календаря.

SOGo дополнительно умеет уведомлять по почте о том, что права доступа к календарю или адресной книге изменились — за это отвечает параметр SOGoACLsSendEMailNotifications. Я включаю его на всех мультидоменных инсталляциях: это простой способ дать пользователю понять, что кто-то из другого домена только что получил доступ к его расписанию, и вовремя это заметить, если доступ выдали по ошибке.

Схема разницы между видимостью домена в SOGo и реальным доступом к календарю через ACL с ролями Viewer, Modifier, Responder
Видимость открывает поиск, а не календарь — доступ всегда выдаёт сам владелец, вручную.

Почему нельзя просто добавить все домены в одну группу

На мультитенантном mailcow, где под одной инсталляцией живут несколько независимых клиентов ИТ-подрядчика, соблазн решить любую заявку «сделайте видимость между доменами» одной большой группой — самая частая ошибка, которую я вижу у коллег. SOGoDomainsVisibility применяется на уровне всей инсталляции SOGo, а не персонально для конкретного пользователя: если добавить в одну группу три домена ради одной заявки, все пользователи всех трёх доменов внезапно смогут искать и добавлять друг друга — включая тех, для кого это вообще не планировалось.

Правильный подход — заводить отдельную минимальную группу под каждую реальную бизнес-потребность и ничего не добавлять «про запас». Если завтра появится четвёртый домен, которому нужна видимость с одним из уже сгруппированных, — это отдельное решение и отдельное изменение конфига, а не повод расширять существующую группу на всякий случай. Я документирую в конфиге sogo.conf комментарием, зачем именно создана каждая группа доменов и по чьей заявке — иначе через полгода никто не вспомнит, почему домены двух разных клиентов вдруг видят друг друга.

Отдельно стоит держать в голове, что видимость влияет и на автодополнение адресов при отправке письма или создании встречи в SOGo, не только на прямой поиск по адресной книге. Как только домен добавлен в общую группу, его пользователи начинают всплывать в автоподсказках у всех остальных участников группы — это удобно для команды, которой это нужно, и ровно поэтому же опасно, если в группу случайно попал домен постороннего клиента.

Кейс: PR-агентство «PR-гавань», 11 рабочих мест

У клиента — PR-агентства «PR-гавань» на 11 рабочих мест — на одном mailcow, который я же и обслуживаю, крутится несколько доменов: основной домен агентства, домен смежного бренда digital-подразделения, который агентство ведёт как отдельное юрлицо с частично тем же составом сотрудников, и ещё два домена совершенно других клиентов подрядчика, к агентству отношения не имеющих. Задача — чтобы дизайнеры и аккаунт-менеджеры видели общий календарь встреч между агентством и digital-брендом, но чтобы остальные два домена на сервере остались как были: полностью изолированными.

Решение заняло десять минут правки конфига: в SOGoDomainsVisibility добавил ровно одну группу из двух нужных доменов агентства, ничего не трогая для двух других клиентских доменов на этом же mailcow. После docker compose restart sogo-mailcow аккаунт-директор агентства расшарила свой календарь встреч с клиентами коллеге из digital-бренда с ролью Viewer — теперь при планировании общих питчей видно, что уже занято с обеих сторон, без звонков «а ты свободен в четверг».

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

Чек-лист из пяти шагов безопасного внедрения общей видимости доменов в SOGo на mailcow
Минимальная группа и проверка на тестовом пользователе — два шага, которые чаще всего пропускают в спешке.

Как внедрить это безопасно на своём mailcow

Порядок действий, которого я придерживаюсь на любой мультидоменной инсталляции: сначала фиксирую точный список доменов, которым реально нужна взаимная видимость, и ничего сверх этого списка. Затем открываю data/conf/sogo/sogo.conf, нахожу закомментированную или пустую строку SOGoDomainsVisibility и добавляю ровно одну группу из нужных доменов — по синтаксису массива массивов, как в примере документации. Отдельно проверяю, не попал ли по невнимательности в скобки домен, который туда не планировался: забытая пара внутренних скобок — ((a.ru, b.ru, c.ru)) вместо ((a.ru, b.ru), (c.ru, d.ru)) — объединит в одну группу домены, которые должны были остаться раздельными.

После правки — обязательный docker compose restart sogo-mailcow, и сразу проверка на тестовом пользователе из каждого затронутого домена: находится ли коллега из соседнего домена через поиск, и — отдельно — не открылся ли доступ к его календарю без явного расшаривания через ACL. Я всегда прошу представителя клиента подтвердить: именно эти домены и именно в эту сторону, потому что цена ошибки в мультидоменной группировке — это чужие календари, которые вдруг стали видны не той компании.

Для более сложных сценариев — когда доменов на площадке становится много, а комбинации видимости регулярно меняются, — я веду отдельный журнал изменений SOGoDomainsVisibility прямо рядом с общей пошаговой документацией развёртывания mailcow, которую готовлю для каждого сервера: так следующий администратор видит не только текущее состояние конфига, но и историю, зачем каждая группа появилась. Тот же принцип «минимально необходимая связность вместо общего котла» я использую и при переносе почты нескольких доменов на новый mailcow — разбирал его в статье про миграцию без потери писем, где 21 домен переезжал именно с сохранением изоляции между не связанными друг с другом клиентами.

И последнее, о чём часто забывают: изменение SOGoDomainsVisibility не требует остановки почты целиком, а затрагивает только контейнер sogo-mailcow. Postfix и Dovecot продолжают принимать и доставлять письма во время рестарта SOGo, так что менять эту настройку можно в рабочее время, не предупреждая всю компанию о плановых работах — недоступной на несколько секунд окажется только веб-почта и синхронизация календарей, а не приём писем.

Частые вопросы

SOGoDomainsVisibility сразу делает календари всех пользователей общими?

Нет. Параметр только делает пользователей соседнего домена видимыми и находимыми в поиске. Доступ к конкретному календарю или адресной книге владелец по-прежнему выдаёт вручную через ACL — просмотр, ответ на приглашения или редактирование.

Где именно находится настройка видимости доменов в SOGo?

В файле data/conf/sogo/sogo.conf, параметр SOGoDomainsVisibility. По умолчанию значение пустое — домены изолированы. После изменения нужен docker compose restart sogo-mailcow.

Можно ли открыть видимость только между двумя доменами из пяти на одном mailcow?

Да. SOGoDomainsVisibility — это массив массивов: можно завести группу ровно из двух нужных доменов, не затрагивая остальные домены на сервере.

Как узнать, что кто-то получил доступ к моему календарю из другого домена?

Включите SOGoACLsSendEMailNotifications — SOGo будет отправлять email-уведомление при изменении прав доступа к календарю или адресной книге.

Что будет, если добавить лишний домен в существующую группу видимости?

Все пользователи всех доменов этой группы смогут искать и добавлять друг друга — видимость применяется на уровне всей группы, не персонально. Расширять группу нужно осознанно и только по реальной заявке.

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Источники

© ООО «АйТи-Фреш» · Москва · Все статьи