Hope Mail Server — Руководство администратора
Руководство описывает администрирование Hope Mail Server (HopeDB): домены и ящики, маршрутизацию почты, TLS-сертификаты, очереди, журналы и обслуживание. Развёртывание описано отдельно в Развёртывание.
1. Архитектура в двух словах
HopeDB состоит из:
- Почтового сервера (hopedb-server, Rust) — REST API (HTTPS, 8443) для веб-клиента и админки, а также SMTP (25 / submission 587), IMAP (143), POP3 (110), CalDAV/CardDAV (8090, HTTPS) и ActiveSync/EAS (8092, HTTPS).
- Ядра-хранилища (hopedb-core) — журнал (WAL) метаданных и blob-хранилище тел писем на диске.
- Веб-приложений (hopedb-web): apps/admin — панель администратора, apps/client — веб-почта.
Внешняя почтовая «граница» (антиспам, SPF/DKIM/DMARC, публичный MX) выносится в сопутствующий продукт Hope MSG Gateway; HopeDB отвечает за внутреннее хранение почты, доступ клиентов и групповые функции.
2. Доступ в админку
Админ-панель — это приложение apps/admin, обращающееся к REST API сервера. Вход выполняется учётной записью администратора (роль с соответствующими правами). Права роли определяют доступные разделы и доменный скоуп — администратор может быть ограничен своим набором доменов.
Путеводитель: «Начало работы» и подсказки
В панель встроен путеводитель (как в HopeDC). У него две части.
1. Панель «Начало работы» — чек-лист первичной настройки сервера. Кнопка «Начало работы N/M» — в шапке панели; N/M — сколько обязательных пунктов выполнено. При первом входе полного администратора панель открывается сама. Каждый пункт объясняет, зачем он нужен и где настраивается; «Перейти» открывает нужный раздел.
| Пункт | Когда считается выполненным |
|---|---|
| Почтовый домен | Создан домен, кроме служебного localhost |
| Почтовые ящики | В домене есть хотя бы один ящик |
| Сертификат TLS от УЦ | Загружен свой сертификат вместо самоподписанного (Настройки сервера → TLS-сертификат) |
| Исходящая почта | Включён SMTP-коннектор или подключён шлюз Hope MSG Gateway |
| Резервное копирование | Включено расписание резервных копий сервера |
| Учётные записи панели | Кроме admin заведена ещё хотя бы одна учётка панели |
| Сетевой доступ | Включён белый список адресов админки и в нём есть активные записи |
| Двухфакторная аутентификация | В политике 2FA включена обязательная 2FA для глобальных администраторов |
| Служба каталогов (необязательно) | Подключён хотя бы один коннектор каталога |
| Лицензия (необязательно) | Загружена действующая лицензия |
| Кластер HA (необязательно) | Кластер включён |
Состояние пунктов определяется по реальным настройкам при каждом открытии панели. Если пункт сделан иначе, чем проверяет панель, полный администратор может нажать «Отметить»; ручные отметки общие для сервера и снимаются кнопкой «Снять отметку». Чек-лист виден только полному администратору.
2. Подсказки по страницам — пошаговые экскурсии. При первом открытии каждого раздела (и каждой вкладки рабочей области домена) панель подсвечивает ключевые элементы и объясняет, что с ними делать. Управление: «Далее» / «Назад» (или стрелки ←/→), «Пропустить» или Esc — закрыть подсказку этой страницы, «Не показывать подсказки» — выключить их для своей учётной записи. Кнопка «?» в шапке в любой момент повторяет подсказку текущей страницы. Повторить все подсказки заново — ссылка внизу панели «Начало работы».
Подсказки видят все пользователи панели, но только по доступным им разделам. Прогресс (пройденные подсказки, выключены ли они, открывался ли чек-лист) хранится на сервере отдельно для каждой учётной записи в onboarding.json каталога данных (права 0600), поэтому в другом браузере подсказки повторно не показываются.
API. GET /api/onboarding — состояние путеводителя текущей учётки (и чек-лист — для полного администратора). POST /api/onboarding с полем action: tour_done (+id), tours_reset, tours_off, tours_on, checklist_seen, mark (+id, done; только полный администратор).
Тема оформления и язык панели
В шапке панели, рядом с переключателем RU/EN, — переключатель темы из трёх кнопок: ☀ «Светлая тема», ☾ «Тёмная тема», 🖥 «Как в системе» (следует настройке ОС и меняется вместе с ней). Тема меняется сразу, без перезагрузки, с плавным переходом; при открытии страницы нет вспышки светлого экрана.
Тема и язык — личные настройки учётной записи. Они хранятся на сервере и восстанавливаются при входе с любого браузера и устройства; на общем компьютере у каждого администратора своя тема. При первом входе учётки тема светлая (а не та, что выбрал предыдущий пользователь в этом браузере), а язык запоминается тот, с которым вошли. Страница входа одинакова в обеих темах.
Настройки хранятся в ui_prefs.json каталога данных (права 0600). В кластере файл не реплицируется: настройки хранятся на узле, где их выбрали.
API. GET /api/prefs → { "theme": "", "lang": "" } текущей учётки (пусто — не выбирали). POST /api/prefs с полями theme (light | dark | system) и/или lang (ru | en); другие значения — ошибка 400.
3. Домены
Раздел управления доменами позволяет добавлять обслуживаемые почтовые домены (company.ru). Для каждого домена задаётся:
- имя домена;
- признак изолированного blob-хранилища (isolated_blobs) — тела писем домена хранятся в отдельном пространстве имён (полезно для мультитенантности и раздельного удаления данных).
Домен должен присутствовать в системе, иначе приём почты для его адресов и создание ящиков невозможны.
4. Ящики (mailboxes)
Для каждого домена создаются ящики. Параметры ящика:
- local_part и домен (итоговый адрес local_part@domain);
- пароль (хранится как bcrypt-хэш; локальная аутентификация принимает только $-хэши);
- квота (МБ);
- признак активности (is_active) и «мягкое удаление» (deleted_at);
- привязка к почтовой базе (database_id).
Занятое место по ящику считается автоматически. Пользователь может сам сменить пароль и настроить подпись/автоответ/алиасы из веб-клиента.
Пароли. У локальных ящиков пароль хранится как bcrypt-хэш. Ящики домена, привязанного к HopeDC, входят паролем домена (раздел 4а). Ящики на внешней аутентификации AD/LDAP без HopeDC через веб-почту не пускаются.
4а. Домен на HopeDC: вход по паролю домена
Почтовый домен можно привязать к каталогу HopeDC. Тогда пользователи входят в почту своим доменным паролем во всех протоколах: IMAP, POP3, SMTP (587), веб-почта, ActiveSync, CalDAV/CardDAV. Раздавать отдельные почтовые пароли не нужно.
Как проверяется пароль. Hope Mail делает LDAP simple bind к HopeDC по LDAPS. HopeDC сверяет пароль со своим хранилищем; отключённую учётную запись не пускает. Пароли приложений (раздел 2FA веб-почты) работают и для таких ящиков.
Настройка («Службы каталогов» → каталог HopeDC):
| Поле | Значение |
|---|---|
| Адрес API HopeDC | https://<hopedc>:9444 |
| Realm (домен) | DNS-имя домена Windows/HopeDC, например corp.local |
| Сервисная учётка и пароль | учётка панели HopeDC (например, admin) или доменная; нужна для чтения каталога |
| Адрес LDAPS HopeDC | по умолчанию тот же хост, порт 636 |
| Сертификаты HopeDC | кнопка «Получить и закрепить» сохраняет отпечатки SHA-256 сертификатов API и LDAPS (подходит для самоподписанных). Пустое поле — проверка по системному хранилищу. Сверьте отпечаток с журналом HopeDC |
| Вход в почту по паролю домена | включает проверку паролей через HopeDC |
| Режим перехода | пока Windows-DC ещё работают: если пароля пользователя нет в HopeDC, Hope Mail просит HopeDC проверить его через AD (HopeDC запоминает пароль), затем повторяет вход |
| Создавать ящики автоматически | ящик создаётся при первом входе и синхронизацией — по атрибуту mail; адреса smtp: из proxyAddresses становятся алиасами |
| Синхронизация ящиков | период (15 мин … 24 ч) или «только при первом входе» |
Затем создайте почтовый домен с источником «HopeDC» и выберите этот каталог. Имя почтового домена может отличаться от домена Windows (corp.ru при домене corp.local): ящики ищутся по почтовым адресам учёток.
Чем можно входить: почтовый адрес или алиас (ivanov@corp.ru), UPN (ivanov@corp.local), логин (ivanov) или CORP\ivanov.
Защита и кэш. - 5 неверных паролей за 15 минут блокируют вход в ящик на 15 минут (событие пишется в журнал домена). HopeDC сам перебор пока не ограничивает. - Успешный вход запоминается в памяти на 5 минут (почтовые клиенты переподключаются часто). Если HopeDC недоступен, ранее подтверждённый пароль принимается до 12 часов. - Синхронизация ящики не удаляет и не отключает. Отключённая в каталоге учётка не может войти, а почта на её адрес продолжает приниматься — как у Exchange.
Состояние перехода (кнопка «Переход» у каталога): сколько пользователей с почтой, сколько ящиков, у скольких пароль уже есть в HopeDC. Списки: кто ещё не входил, у кого есть адрес, но нет ящика, ящики без учётки в каталоге, отключённые учётки с ящиками. Там же «Синхронизировать сейчас» и «Проверить вход пользователя» — тот же путь, что у IMAP/SMTP, с пошаговым разбором.
Переход с MS AD + Exchange
- Подключите HopeDC к AD (интеграция в HopeDC). Создайте каталог HopeDC в Hope Mail с включённым режимом перехода и автосозданием ящиков.
- Создайте почтовый домен (например,
corp.ru) с источником HopeDC. Ящики появятся по атрибутамmail/proxyAddresses. - Перенесите содержимое ящиков и переключайте пользователей на Hope Mail — см. раздел 4б. Каждый вход в почту сохраняет пароль пользователя в HopeDC — следите за долей «Пароль в HopeDC» в окне «Переход».
- Когда все переключены — «Завершить переезд» (4б), выведите Exchange, затем примите роль KDC в HopeDC и отключите Windows-DC. Пользователи с паролем в HopeDC продолжают входить; остальным сбросьте пароль в HopeDC.
- После «Отключить от AD» в HopeDC выключите режим перехода в каталоге Hope Mail.
MSG Gateway к домену не подключается.
HopeDC v129: без корневого CA домена HopeDC при каждом перезапуске создаёт новый сертификат LDAPS. После перезапуска HopeDC вход в почту остановится с ошибкой «сертификат сервера изменился» — закрепите отпечаток заново («Получить и закрепить») или временно задайте
HOPE_LDAP_INSECURE_TLS=1. Исправление запрошено у команды HopeDC.
4б. Переход с Exchange: перенос ящиков и сосуществование
Домен → «Переход с Exchange». Поддерживаются Exchange 2013, 2016, 2019 (EWS, аутентификация NTLM или Basic). Пользователи переезжают партиями: содержимое копируется заранее, затем пользователь переключается, и почта начинает доставляться в Hope Mail. Пока переезд не завершён, почта неперенесённых пользователей продолжает ходить через Exchange — письма не теряются ни в одну сторону.
Что переносится
| Exchange | Hope Mail |
|---|---|
| Входящие, Отправленные, Черновики, Удалённые | соответствующие системные папки |
| Нежелательная почта | системная папка «Спам» |
| Пользовательские папки (с вложенностью) | папки с теми же именами |
| Отметка «прочитано», высокая важность, дата получения, вложения | сохраняются (письмо переносится в исходном MIME) |
| Календарь (по умолчанию) | календарь пользователя: разовые и повторяющиеся события, события на весь день, участники, изменённые и удалённые экземпляры серии |
| Контакты | адресная книга: имя, организация, должность, адреса почты, телефоны, заметка |
| Задачи | задачи: тема, описание, срок, «выполнено», высокая важность |
Не переносятся: Исходящие, журнал, заметки, «Дни рождения», кэш получателей, архивный ящик (In-Place Archive), общедоступные папки, правила и делегирование ящика, вложения у событий и задач, флажки «к исполнению» у писем, почтовые адреса контактов. Повторы «вторник и четверг» переносятся как еженедельная серия по дню начала, «второй вторник месяца» — как ежемесячная по дате; такие серии проверьте после переноса. Письма крупнее лимита (по умолчанию 50 МБ) пропускаются и учитываются в счётчике «пропущено».
Перенос повторяемый: уже перенесённые элементы запоминаются (exchmig/<id>.ids в каталоге настроек), повторный запуск («Догрузить») докачивает только новое.
Подготовка Exchange
- Сервисная учётка (например
CORP\svc_hope) с правом олицетворения. Один раз в Exchange Management Shell:powershell New-ManagementRoleAssignment -Name "HopeMail-Impersonation" -Role ApplicationImpersonation -User "CORP\svc_hope" - EWS доступен с сервера Hope Mail:
https://<сервер Exchange>/EWS/Exchange.asmx. Если сертификат Exchange выдан внутренним CA или самоподписанный — «Получить и закрепить» в настройках закрепит его отпечаток SHA-256. - SMTP Exchange (порт 25) принимает почту от сервера Hope Mail: в Exchange 2013–2019 для этого достаточно стандартного коннектора приёма «Default Frontend» — письма приходят как от внешнего отправителя на принятые домены.
- Домен маршрутизации — служебный домен, по которому Exchange отдаёт в Hope Mail почту уже переключённых пользователей, например
hope.corp.ru. Его не нужно публиковать в DNS и не нужно заводить в Hope Mail как почтовый домен: Hope Mail сам принимает адресалогин@hope.corp.ruи доставляет их в ящиклогин@corp.ru. - Скрипт для Exchange («Пользователи» → «Скрипт»): блок «1. Один раз» создаёт в Exchange коннектор отправки «Hope Mail (переезд)» на адрес Hope Mail для домена маршрутизации и разрешает в него автопересылку. Этот блок нужен при любом способе переадресации — без него Exchange не знает, куда слать почту домена маршрутизации, и блокирует пересылку наружу. Если транспортных серверов несколько, добавьте к
New-SendConnectorпараметр-SourceTransportServers.
Настройки
| Поле | Назначение |
|---|---|
| Адрес EWS, аутентификация, сервисная учётка, пароль | подключение к Exchange. NTLM — по умолчанию в Exchange; Basic — если на виртуальном каталоге EWS включён только Basic. Пароль хранится на сервере и в интерфейсе не показывается |
| Отпечаток сертификата | пусто — проверка по системному хранилищу; иначе закреплённый отпечаток |
| SMTP Exchange, порт, шифрование | куда пересылать почту неперенесённых пользователей. «STARTTLS без проверки сертификата» — для внутреннего Exchange с самоподписанным сертификатом |
| MX на время переезда | MX → MSG → Hope Mail: вся интернет-почта приходит в Hope Mail; переключённым доставляется сразу, остальные пересылаются в Exchange. MX остаётся на Exchange: интернет-почта приходит в Exchange, и он пересылает в Hope почту переключённых через домен маршрутизации. Маршрутизация в Hope Mail одинакова для обоих вариантов — переключатель описывает схему и подсказки |
| Домен маршрутизации, адрес Hope Mail для Exchange | см. «Подготовка». Адрес Hope Mail подставляется в скрипт как smart host |
| Как Exchange отдаёт почту переключённых | Правило EWS (по умолчанию): при переключении Hope Mail сам создаёт в ящике Exchange правило «Hope Mail: переадресация (переезд)» на адрес домена маршрутизации и удаляет его при возврате. Скрипт PowerShell: переадресация Set-Mailbox -ForwardingSmtpAddress на уровне сервера — пользователь её не видит и не может удалить; подходит, если правила в ящиках запрещены политикой. Можно включить оба |
| Что переносить, лимит письма, ящиков одновременно | содержимое переноса; параллельность — сколько ящиков копируется одновременно (по умолчанию 2) |
| Сосуществование включено | пока включено, письма для неперенесённых пользователей и для неизвестных адресов домена уходят в Exchange (неизвестный адрес получит NDR от Exchange). Без этого флага переключать пользователей нельзя |
«Сохранить и проверить» с тестовым ящиком проверяет вход в EWS и олицетворение (видно число элементов во входящих, календаре, контактах и задачах), доступ к правилам и приветствие SMTP Exchange. Настройки меняет только глобальный администратор; администратор домена видит вкладку и может переносить и переключать пользователей своего домена.
Порядок переезда
- Настройте и проверьте подключение, выполните в Exchange блок «1. Один раз» из скрипта, включите сосуществование.
- Если выбран вариант «MX → MSG → Hope Mail» — переведите MX домена на MSG/Hope Mail. До первого переключения вся почта по-прежнему оказывается в Exchange.
- Перенести — фоновое копирование выбранных ящиков; ход виден в таблице (папка, элементы, ошибки). Объёмные ящики переносите заранее, за день-два до переключения.
- Переключить — Hope Mail делает финальную догрузку, отмечает пользователя как переключённого (с этого момента почта ему доставляется в Hope Mail), ставит правило EWS и ещё раз догружает то, что успело прийти в Exchange за время переключения. Если выбран скрипт — выполните строки
Set-Mailboxдля переключённых. - Пользователи настраивают почтовые клиенты на Hope Mail (Autodiscover/Autoconfig) и входят тем же паролем домена.
- Вернуть — откат пользователя на Exchange: правило EWS удаляется, почта снова идёт в Exchange. Перенесённое в Hope Mail остаётся. Строку отката
Set-Mailbox … $nullиз скрипта выполните вручную. - Когда переключены все — Завершить переезд: сосуществование выключается, почта домена больше не пересылается в Exchange. Если кто-то не переключён, Hope Mail предупредит и предложит «Завершить принудительно». После этого переведите MX на Hope Mail (если ещё не сделано) и выводите Exchange.
Защита от петель: письмо, уже пересланное Hope Mail в Exchange, помечается заголовком X-Hope-Coexist; если Exchange вернёт его обратно, Hope Mail доставит его локально и запишет предупреждение в журнал. Переносы, переключения и завершение пишутся в журнал событий домена (категория EXCHANGE). Незавершённые задания после перезапуска сервера продолжаются; в кластере перенос выполняет только лидер.
5. Маршрутизация исходящей почты — коннекторы (Send Connectors)
Раздел Коннекторы задаёт, как отправлять письма во внешние домены (аналог Send Connector в MS Exchange).
Коннектор описывает:
- адресные пространства (домены получателей, к которым он применяется; * — по умолчанию);
- способ доставки: smart host (переслать на указанный релей/шлюз) или DNS/MX (прямая доставка по MX-записям получателя);
- параметры узла (хост, порт), при необходимости — учётные данные.
При отправке письма сервер подбирает коннектор по домену получателя. Если подходящего коннектора нет, письмо помечается «нет коннектора» и не уходит — пользователь видит подсказку. Для внутренних адресатов доставка идёт напрямую в ящик, минуя коннекторы.
Хранится в smtp_connectors.json.
6. Очереди исходящей почты
Раздел Очереди показывает письма, ожидающие внешней доставки. Для каждого элемента видны отправитель, получатель, тема, статус и попытки. Очередь обрабатывается фоново; повторные попытки выполняются автоматически. Хранится в smtp_queue.json.
7. Приём внешней почты
Входящий SMTP (порт 25) принимает письма только для существующих локальных ящиков (open-relay запрещён). Полученное письмо кладётся во «Входящие» получателя, к нему применяются пользовательские правила и, при включённом автоответчике, отправляется автоответ (с защитой от циклов). Приём фиксируется в журнале домена (действие SMTP_IN).
При доставке сервер добавляет заголовок Return-Path с конвертным отправителем. В папку «Спам» (системная папка 4, в IMAP — Junk с флагом \Junk) сразу попадают письма отправителей из личного списка блокировки получателя и письма с меткой антиспама шлюза X-Spam-Flag: YES; правила и автоответ к ним не применяются. Отправители из списка блокировки организации (раздел «Жалобы на спам») отклоняются уже на MAIL FROM с кодом 550.
Алиасы адресов учитываются при приёме: письмо на алиас попадает в основной ящик.
7а. Жалобы на спам
Раздел «Жалобы на спам» (только глобальный администратор). Сотрудник жалуется кнопкой «Это спам» в веб-почте или переносом письма в папку «Спам» по IMAP (Outlook, Thunderbird, телефоны). Тогда:
- Письмо переносится в «Спам», отправитель попадает в личный список блокировки сотрудника — его следующие письма этому сотруднику сразу идут в «Спам». Сотрудник видит и правит список в «Настройках» веб-почты; «Не спам» снимает блокировку и отзывает жалобу.
- Жалоба появляется в разделе: одна строка на отправителя, счётчик сотрудников и шкала до порога, кто и когда пожаловался, тема последнего письма, пример письма (.eml).
- Когда пожаловалось N разных сотрудников (по умолчанию 3, настраивается), отправитель автоматически попадает в список блокировки организации: его письма отклоняются при приёме (550). Отключается флажком «Автоматически блокировать…».
Действия администратора: «Заблокировать» (в список блокировки сразу, без порога), «Не спам» (жалоба закрыта, блокировка, поставленная по жалобам, снимается), удалить. Внизу раздела — сам список блокировки организации: записи по жалобам и ручные, адрес или домен через @ (@example.com).
Особенности:
- Блокируется точный адрес отправителя (spammer@gmail.com), а не домен: один спамер с бесплатной почты не перекрывает почту всем её пользователям.
- Ключ жалобы — конвертный отправитель (Return-Path), иначе адрес из From. Если они различаются, в личный список попадают оба.
- Адреса собственных доменов автоматически не блокируются (жалоба на коллегу остаётся на рассмотрении).
- Данные — spam_complaints.json (жалобы, настройки, список блокировки) и blocked_senders.json (личные списки) в каталоге настроек DB_DATA_DIR.
- Передача на шлюз Hope MSG Gateway. Если перед Hope Mail стоит шлюз, жалобы можно передавать ему: тогда порог считается на шлюзе, и заблокированный отправитель отклоняется ещё на входе в организацию. Настройка — «Настройки сервера → Шлюз MSG»: адрес API шлюза (https://<шлюз>:6443), ключ интеграции (создаётся на шлюзе: «Карантин писем → Жалобы пользователей → Создать ключ»), «Получить и закрепить» для самоподписанного сертификата шлюза, флажок «Передавать жалобы на спам», затем «Проверить соединение» — оно входит в API шлюза по ключу. Передаются жалобы и отзывы («Не спам») вместе с примером письма до 512 КБ; жалобы на адреса своих доменов не передаются. Если шлюз недоступен, жалобы ждут в очереди (spam_complaints.json) и отправляются повторно до 3 суток; состояние видно вверху раздела «Жалобы на спам» и у каждой строки. Локальный порог и список блокировки Hope Mail при этом продолжают работать. Если на шлюзе включён белый список IP для API, добавьте туда адрес Hope Mail.
8. TLS-сертификаты и submission
Раздел TLS управляет сертификатом, которым защищаются STARTTLS-соединения (submission 587, входящий 25, IMAP 143, POP3 110), REST API (8443), CalDAV/CardDAV (8090) и ActiveSync/EAS (8092).
Возможности: - Загрузка «настоящего» сертификата из УЦ — файлы сертификата и приватного ключа (PEM). Заменяет самоподписанный, применяется «на лету» без перезапуска. - Генерация CSR (запроса на сертификат) прямо в админке — с указанием CN, организации, страны и списка SAN. Полученный CSR отправляется в удостоверяющий центр, выданный сертификат затем загружается обратно. - Просмотр статуса текущего сертификата.
Файлы сертификата/ключа хранятся в каталоге TLS сервера. Submission-порт (587) требует TLS и SMTP AUTH (PLAIN/LOGIN).
Постоянный самоподписанный сертификат. Если свой сертификат не загружен, сервер один раз генерирует самоподписанный и сохраняет его на диск (DB_DATA_DIR/selfsigned_cert.pem и selfsigned_key.pem). Он не меняется при перезапусках, поэтому единожды принятое в браузере исключение остаётся действительным. Для продакшена загрузите сертификат от УЦ.
8а. Защищённые соединения и безопасность
Начиная с этой версии, значения по умолчанию — безопасные; ослаблять их следует осознанно и только когда это оправдано (например, за TLS-терминирующим прокси на loopback). Управление — через переменные окружения (полный перечень в Развёртывание).
- HTTPS по умолчанию для REST API (8443,
HOPE_API_TLS), CalDAV/CardDAV (8090,HOPE_DAV_TLS) и ActiveSync/EAS (8092,HOPE_EAS_TLS). Эти протоколы аутентифицируют по паролю (HTTP Basic / JWT), поэтому без TLS их можно перехватить. - JWT-секрет. Токены сессий подписываются секретом из
HOPE_JWT_SECRET; если он не задан — генерируется случайный и сохраняется вDB_DATA_DIR/jwt_secret.key. Встроенного «секрета по умолчанию» больше нет. В кластере задайте один общийHOPE_JWT_SECRETна всех узлах, иначе токен одного узла не примут остальные. - CORS. По умолчанию к API допускаются только источники с
localhost/127.0.0.1. Для доступа к админке/почте с внешнего адреса перечислите их вHOPE_CORS_ORIGINS(через запятую). Раньше по умолчанию допускался любой источник (*). - AD/LDAP. TLS-сертификат контроллера домена проверяется. Для внутреннего AD с самоподписанным сертификатом проверку можно отключить
HOPE_LDAP_INSECURE_TLS=1(небезопасно, только для изолированного стенда). - HopeDC. Отправка учётных данных на удалённый контроллер домена по
http://запрещена (loopback иhttps://— разрешены). Осознанное исключение —HOPE_DC_INSECURE_HTTP=1. HTTPS API и LDAPS HopeDC проверяются по закреплённому отпечатку SHA-256 или по системному хранилищу сертификатов. LDAP без TLS к удалённому HopeDC запрещён (исключение —HOPE_DC_INSECURE_LDAP=1);HOPE_LDAP_INSECURE_TLS=1отключает и проверку сертификата LDAPS HopeDC. - Доставка в Hope MSG Gateway не откатывается на незашифрованное соединение, если STARTTLS не поднялся. Открытый канал возможен только при явном выборе
security = noneв коннекторе. - Приём почты от Hope MSG Gateway (
/internal/messages/receive) закрыт по умолчанию: требуется общий секретHOPE_INTERNAL_TOKEN(в заголовкеX-Internal-Token), одинаковый на HopeDB и в шлюзе. Без секрета эндпоинт отклоняет запросы — иначе через него можно было бы впрыснуть письмо в любой ящик. Канал шифруется TLS (API по HTTPS).
Белые списки IP («Настройки сервера → Сетевой доступ»)
Два списка: «Доступ к панели администратора» и «Доступ к API». Оба действуют на весь порт админки (8443) и на порт веб‑почты: запрос пропускается, если адрес клиента есть хотя бы в одном включённом списке. Запись — адрес (192.0.2.10, 2001:db8::1), подсеть CIDR (192.0.2.0/24) или маска (192.0.2.*).
- Тумблер и список — черновик: добавлять, выключать и удалять записи можно и при выключенном ограничении. Действовать изменения начинают после кнопки «Сохранить»; «Отмена» возвращает сохранённое состояние.
- Под списком показан ваш адрес, каким его видит сервер, и кнопка «Добавить мой адрес», если его нет в списке.
- Защита от самоблокировки. Сервер не сохраняет изменение, после которого адрес администратора, нажавшего «Сохранить», потеряет доступ: включить ограничение без своего адреса или удалить и выключить запись, по которой вы сейчас работаете, нельзя. Панель предупреждает об этом заранее.
- Доступ с самого сервера (127.0.0.1, ::1) разрешён всегда. Если доступ всё же потерян (например, сменился ваш внешний адрес), зайдите через SSH‑туннель:
ssh -L 8443:127.0.0.1:8443 <сервер>, затем откройтеhttps://127.0.0.1:8443/и исправьте список. - За обратным прокси (nginx) прокси обязан передавать адрес клиента:
proxy_set_header X-Real-IP $remote_addr;иproxy_set_header X-Forwarded-For $remote_addr;во всехlocation, ведущих на Hope Mail. Без этого все запросы через nginx выглядят как пришедшие с самого сервера (127.0.0.1) и белый список их пропускает — ограничение фактически не работает. Заголовки учитываются только от доверенных прокси изHOPE_MAIL_TRUSTED_PROXIES(по умолчанию 127.0.0.1 и ::1); прокси на другой машине добавьте туда. Проверка: при входе через прокси строка «Ваш адрес» под списком должна показывать адрес рабочего места, а не127.0.0.1. Подробно — Развёртывание, п. 6.1.
Аварийный доступ. Если в системе не осталось активного суперпользователя или утерян пароль admin, задайте HOPE_ADMIN_RESET=<новый-пароль> и перезапустите сервер — учётная запись admin будет создана/сброшена как суперадминистратор. Сразу после входа снимите переменную, иначе пароль будет сбрасываться при каждом запуске. Удалить единственного активного суперпользователя система не даёт (защита от блокировки доступа).
9. Журналы и мониторинг (SIEM)
Раздел журналов/SIEM показывает события домена: приём и отправку почты, ошибки доставки, действия администратора. Записи содержат домен, актора, сообщение и уровень (SUCCESS/INFO/ERROR). Журнал полезен для расследования проблем доставки и аудита.
10. Лицензия и лицензионное соглашение
Редакции и ключ
Без ключа сервер работает в редакции Free (3 домена, 3 почтовые базы, 100 ящиков в домене). Редакции Standard и Enterprise включаются подписанным ключом лицензии; ограничения и функции задаёт ключ, типовые значения — в Приложении 1 к лицензионному соглашению. Кластер (HA) — только Enterprise.
Ключ привязан к серверу через отпечаток: SHA‑256 от идентификатора ОС (/etc/machine-id) и идентификатора установки (install_id в каталоге данных). Получить ключ: «Настройки сервера → Лицензия» → «Сформировать .req файл» → отправить файл вендору или партнёру → вставить полученный ключ и нажать «Применить». Сервер не обращается к вендору ни при активации, ни при проверке ключа.
- Отпечаток меняется при переустановке ОС, смене
machine-idили каталога данных — тогда нужен новый ключ. - Раньше отпечаток считался по переменной
HOSTNAME; у службы systemd её нет, поэтому отпечаток был одинаковым у всех серверов. Ключ старого формата, установленный до обновления, при первом запуске новой версии привязывается к этому серверу (license.bind) и продолжает работать. Перенесённый на другой сервер — не принимается. Новые ключи выпускаются только по новому отпечатку.
Окончание срока ключа. Удалённого отключения нет. Когда срок истёк, действует редакция Free: уже созданные домены, базы и ящики обслуживаются (в том числе сверх ограничений Free), настроенный кластер продолжает работать, но создавать объекты сверх Free и менять настройки кластера нельзя. В разделе «Лицензия» появляется предупреждение, в «Кластере» — пояснение. На продление лицензионное соглашение даёт 30 дней (п. 3.7).
Лицензионное соглашение (EULA)
Текст соглашения встроен в сервер. При первом входе в панель (и после выхода новой редакции) вместо разделов открывается окно с текстом, галочкой «Я прочитал(а)… принимаю от имени организации… подтверждаю полномочия» и кнопками «Принимаю» / «Не принимаю» (выход).
- Принять может только полный администратор (роль с правом
*). Остальные видят «Соглашение должен принять полный администратор панели». - Пока соглашение не принято, API панели отвечает
428с"code": "eula_required", кроме входа и выхода, проверки прав, двухфакторной аутентификации своей учётки и самого соглашения. - Почта работает всегда: SMTP, IMAP, POP3, CalDAV/CardDAV, ActiveSync, веб‑почта (
/api/user/*), приём от шлюза (/internal/*), межузловые эндпоинты кластера и проверкиhealth/readyот принятия не зависят. - Факт принятия — редакция, SHA‑256 текста, учётная запись, IP‑адрес, браузер и время — записывается в
eula_acceptance.jsonкаталога данных (права 0600) и в журнал событий. У каждого узла кластера своя запись: соглашение принимается на каждом узле. - Раздел «Лицензия» показывает карточку «Лицензионное соглашение»: кто и когда принял, кнопка «Открыть соглашение». Публичная страница с текстом —
https://<сервер>:<порт>/eula, ссылка на неё есть на странице входа. - В английском интерфейсе текст показывается на русском с пометкой, что юридически действует русский текст.
- Для автоматизированных стендов: переменная
HOPE_MAIL_EULA_ACCEPTED=1в юните считает соглашение принятым (в карточке это видно).
Документы «Лицензионное соглашение» (EULA.html) и «Компоненты третьих лиц» (THIRD_PARTY.html, THIRD_PARTY_NOTICES.txt) входят в комплект документации. Перечень компонентов в продукт не встраивается и предоставляется по запросу.
11. Пользовательские данные и файлы состояния
Данные хранятся в каталоге DB_DATA_DIR (по умолчанию ./hopedb_data) в JSON-файлах и WAL, тела писем — в BLOB_DATA_DIR (./hopedb_blobs). Ключевые файлы:
| Файл | Назначение |
|---|---|
| WAL по доменам | метаданные писем, ящиков, доменов, ролей |
smtp_connectors.json |
коннекторы исходящей почты |
smtp_queue.json |
очередь внешней доставки |
aliases.json |
алиасы адресов (alias → id ящика) |
user_prefs.json |
подписи, автоответы пользователей |
folders.json |
пользовательские папки |
inbox_rules.json |
правила обработки входящих |
imap_state.json |
UID-карта IMAP (UIDVALIDITY) |
calendar_events.json |
события календаря |
calendar_shares.json |
доступы к общим календарям |
reminder_sent.json |
дедупликация отправленных напоминаний |
contacts.json |
контакты пользователей |
tasks.json, notes.json |
задачи и заметки |
| TLS-каталог | tls_cert.pem, tls_key.pem (загруженный серт УЦ) |
selfsigned_cert.pem, selfsigned_key.pem |
постоянный самоподписанный серт (если свой не загружен) |
jwt_secret.key |
секрет подписи JWT (если не задан HOPE_JWT_SECRET) — не выкладывать в VCS |
hopedc_integration.json, gateway_config.json |
настройки интеграций (секреты вырезаются при чтении через API) |
directory_connectors.json |
каталоги («Службы каталогов»), в том числе отпечатки сертификатов HopeDC |
ui_prefs.json |
тема оформления и язык панели по учётным записям |
dir_links.json |
связь ящиков с учётками каталога HopeDC (логин, UPN, DN, алиасы из proxyAddresses) |
Все файлы состояния — часть резервной копии. См. раздел бэкапов в Развёртывание.
12. Обслуживание
- Резервное копирование. Регулярно копируйте
DB_DATA_DIRиBLOB_DATA_DIRцеликом (желательно при остановленном сервере или атомарным снапшотом ФС). - Ротация журналов. Журналы домена растут — предусмотрите архивирование.
- Компакция WAL. Удаление писем оставляет «тумбстоны» в WAL; периодическая компакция (в разработке) уменьшит объём. Пока используйте резервные копии и следите за местом.
- Смена сертификата. Загружайте новый сертификат до истечения текущего — применение происходит без перезапуска.
- Проверка доступа клиентов. После изменений TLS проверьте подключение по IMAP/SMTP/DAV живым клиентом.
Обновление из панели и номера выпусков
Выпуски нумеруются, как в HopeDC: v22, v23, … Номер виден в разделе «Настройки сервера → Обновления», в шапке панели и в ответе hope-mail-server --version (hope-mail-server 22 (semver=22.0.0)). Пакет обновления называется hope-mail-server_v22.gz, в манифесте номер пишется без буквы: "version": "22" (с буквой v22 тоже принимается). До v22 версии были вида 1.0.21; v22 считается новее 1.0.21, а пакет 1.0.21 на v22 распознаётся как откат на старую версию.
Манифест онлайн-источника:
{
"stable": { "version": "22", "url": "hope-mail-server_v22.gz", "sha256": "<SHA-256 файла .gz>", "notes": "v22: …" },
"beta": { "version": "23-beta", "url": "…", "sha256": "…", "notes": "…" }
}
Обновление с 1.0.21 до v22. Онлайн — как обычно: сервер 1.0.21 возьмёт номер 22 из манифеста. Из архива (закрытый контур) — в поле «Версия» укажите 22: сервер 1.0.21 не умеет сам читать номер выпуска из пакета и без этого поля откажет. Начиная с v22 номер определяется сам.
Номер выпуска для сборки — старший номер версии в Cargo.toml (22.0.0 → v22); при следующем выпуске его увеличивают на единицу. Обновление ставит root-помощник hope-mail-update.path (его устанавливает скрипт развёртывания): бэкап бинарника, установка, перезапуск, при неудаче — откат.
13. Диагностика
| Симптом | Что проверить |
|---|---|
| Внешние письма не уходят | коннектор для домена получателя; очередь; логи MAIL |
| Не приходит внешняя почта | порт 25 открыт; домен и ящик существуют; лог SMTP_IN |
| Клиент не подключается по IMAP/SMTP | порт/шифрование (STARTTLS), валидность сертификата, верный логин (полный email) |
| Не работает CalDAV на телефоне | DAV теперь HTTPS по умолчанию (HOPE_DAV_TLS), нужен валидный/принятый сертификат, адрес https://…:8090/ |
| Веб-клиент: «Ошибка соединения с сервером» | API теперь HTTPS (8443) — примите сертификат на https://<host>:8443/; за прокси задайте HOPE_API_TLS=0; проверьте, что VITE_API_URL начинается с https:// |
| Браузер блокирует запросы к API (CORS) | добавьте origin админки/почты в HOPE_CORS_ORIGINS (по умолчанию разрешён только localhost) |
| Не проходит вход после обновления | JWT-секрет сменился (старые токены недействительны) — войдите заново; в кластере задайте общий HOPE_JWT_SECRET на всех узлах |
| Синхронизация AD/LDAP падает на TLS | сертификат AD не проходит проверку — установите доверенный серт или (для теста) HOPE_LDAP_INSECURE_TLS=1 |
| HopeDC: «небезопасный адрес контроллера домена» | адрес удалённый по http:// — используйте https://, loopback, либо осознанно HOPE_DC_INSECURE_HTTP=1 |
| Не приходит почта от Hope MSG Gateway | задайте одинаковый HOPE_INTERNAL_TOKEN на HopeDB и в шлюзе (в логе — приём … отключён); шлюз шлёт заголовок X-Internal-Token |
| Вход не проходит | ящик активен; локальный пароль — bcrypt; для домена на HopeDC — «Переход» → «Проверить вход пользователя» |
| HopeDC: «сертификат сервера изменился» | HopeDC перевыпустил сертификат (v129 меняет LDAPS при перезапуске) — сверьте и закрепите отпечаток заново |
| HopeDC: «сертификат сервера не доверен» | самоподписанный сертификат HopeDC — «Получить и закрепить» в настройках каталога |
| Панель отвечает «Доступ запрещён для IP: …» | адреса нет во включённом белом списке — зайдите через SSH‑туннель на 127.0.0.1:8443 и добавьте адрес в «Сетевой доступ» (§ 8а) |
| Белый список включён, но панель открывается с любого адреса через nginx; «Ваш адрес: 127.0.0.1» | nginx не передаёт адрес клиента — добавьте proxy_set_header X-Real-IP $remote_addr; и X-Forwarded-For $remote_addr (DEPLOYMENT.md, п. 6.1); прокси на другой машине — в HOPE_MAIL_TRUSTED_PROXIES |
| «Изменение не применено: после него ваш адрес … потеряет доступ» | защита от самоблокировки — сначала добавьте свой адрес или подсеть в список, затем включайте ограничение |
| Вход «заблокирован на 15 минут» | 5 неверных паролей подряд; подождите 15 минут или перезапустите службу |