Переменные окружения
Актуально для: SimpleTwo 0.9.x · Проверено: 26.09.2026
Имена и значения по умолчанию берутся из тех же файлов, что читают сами службы
(site/docs-gen/env-variables.py). Поэтому список полон по построению: переменная, которой
здесь нет, не читается ни одной службой.
Обычно эти значения задаёт координатор, когда ставит роль: он же пишет файл службы и подставляет туда параметры. Справочник нужен в двух случаях — когда разбираетесь, почему служба ведёт себя не так, и когда ставите её руками.
1. Координатор
Координатор ведёт реестр своих переменных, и у каждой записано, что стоит её изменение:
| Класс | Что значит |
|---|---|
restart | значение читается один раз при старте; правка в окружении работающего процесса не делает ничего |
hot | перечитывается на ходу |
Имя не из реестра координатор не считает ошибкой: он пишет предупреждение и продолжает работать. Это решение, купленное простоем: первая версия реестра отказывалась стартовать при незнакомой переменной, и установка встала из-за переменной, которую сама же и поставляла в образе. То, что выполняется раньше службы, не должно уметь её останавливать.
| Переменная | Тип | Применение | Что делает |
|---|---|---|---|
ST_ADDR | string | restart | адрес и порт HTTP-слушателя: проверка владения именем (ACME HTTP-01) и перенаправление на HTTPS |
ST_HTTPS_ADDR | string | restart | адрес и порт HTTPS-слушателя; пусто — HTTPS выключен |
ST_TOKEN_TTL | duration | restart | срок жизни сессионного токена. Держится коротким: отзыв здесь — это истечение |
ST_REFRESH_TTL | duration | restart | срок жизни токена обновления; длинный, но отзывается на сервере |
ST_GATEWAY_TTL | duration | restart | сколько может не приходить пульс от VPN-узла, прежде чем он считается устаревшим |
ST_TRUSTED_PROXIES | csv | restart | сети, чьему заголовку X-Forwarded-For можно верить; пусто — заголовок игнорируется |
ST_ACME_STAGING | bool | restart | выпускать сертификаты в тестовом контуре Let's Encrypt вместо боевого |
ST_TLS_DOMAIN | string | restart | имя, на которое координатор заказывает сертификат Let's Encrypt; пусто — самоподписанный |
ST_TLS_EMAIL | string | restart | почта для уведомлений удостоверяющего центра; необязательна |
ST_AGENT_BIN_DIR | path | restart | каталог со сборками агента под разные платформы: их координатор раздаёт узлам при установке ролей |
ST_DEPLOY_DRYRUN | bool | restart | печатать команды установки вместо их выполнения. Значение разбирается строго: False и Off — это ложь, а не мусор, но опечатка отвергается с ошибкой, а не превращается в «включено» |
ST_DB_PATH | path | restart | путь к базе координатора (SQLite); пусто — временное хранилище в памяти, то есть стенд |
ST_KEYSTORE_PATH | path | restart | файл с мастер-ключом шифрования. Именно путь, и никогда сам ключ: ключ в переменной окружения — это ключ в журнале. Файл должен лежать вне каталога данных, иначе резервная копия данных увезёт с собой и ключ от них |
ST_VERSION | string | restart | версия сборки; подставляется образом, руками не задаётся |
ST_TOKEN_SECRET 🔒 | string | restart | секрет подписи токенов; общий для координатора и продуктовых служб |
2. Служба переписки
| Переменная | По умолчанию | Что делает |
|---|---|---|
MSG_ACME_CACHE | /var/lib/simpletwo/msg-acme | каталог, где хранится выписанный сертификат |
MSG_ACME_EMAIL | — | почта для уведомлений удостоверяющего центра; необязательна |
MSG_ACME_STAGING | 0 | тестовый контур Let's Encrypt вместо боевого |
MSG_ADDR | :9090 | адрес и порт, на котором служба принимает клиентов |
MSG_AI_PROVIDER_KEY_FILE | — | путь к файлу с ключом провайдера модели. Только файл: значение в окружении попадает в журналы |
MSG_AI_PROVIDER_KIND | anthropic | диалект провайдера модели: anthropic или openai-совместимый |
MSG_AI_PROVIDER_URL | — | адрес провайдера модели; по умолчанию зависит от диалекта |
MSG_CONTROL_ADDR | 127.0.0.1:9091 | адрес управляющего интерфейса. По умолчанию только петля: наружу он не смотрит |
MSG_CONTROL_TOKEN 🔒 | — | токен управляющего интерфейса; подставляет координатор |
MSG_CONVLOG_KEEP | 10000 | сколько ревизий журнала беседы хранить |
MSG_COORDINATOR_CERT_SHA256 | — | отпечаток сертификата координатора (пин); защищает от подмены |
MSG_COORDINATOR_INSECURE | false | не проверять сертификат координатора. Только для стенда |
MSG_COORDINATOR_URL | — | адрес координатора |
MSG_DB_DSN | — | строка подключения к Postgres. Пусто — хранилище в памяти, то есть стенд |
MSG_DEPROVISION_RETENTION_DAYS | 30 | сколько дней хранятся данные человека, у которого в identity с няли чат и звонки: он сразу отключён (вход закрыт, соединения и пуши остановлены), данные затем удаляются. 0 — удалить при следующем проходе; отсчёт идёт, только пока в identity включено назначение доступа |
MSG_DIRECTORY_SOURCE | — | не читается с messaging 0.199.0: люди и группы — всегда из ленты каталога, когда задан MSG_IDENTITY_URL, права людей — из живой проекции RBAC. Агент координатора 0.x ещё ставит переменную по переключателю консоли |
MSG_DOMAIN | — | собственный домен установки для федерации; пусто — федерация выключена |
MSG_FEDERATION_ALLOW | — | домены установок, с которыми разрешён обмен, через запятую |
MSG_IDENTITY_URL | — | приватный адрес identity: служба читает ленту назначений функции «чат и звонки» и сообщает, что создала или удалила. Пусто — назначения не читаются: пускают всех, никого не отключают |
MSG_LIVEKIT_KEY | — | ключ медиасервера — им подписываются пропуска в комнату |
MSG_LIVEKIT_SECRET 🔒 | — | секрет медиасервера |
MSG_MAX_MEMBERS | 10000 | предел числа участников одной беседы |
MSG_MAX_UPLOAD_MB | 50 | предел размера одного вложения, мегабайты |
MSG_MEDIA_DIR | /var/lib/simpletwo/media | каталог вложений, когда они лежат на диске, а не в объектном хранилище |
MSG_PRESENCE_GRACE_SEC | 45 | сколько секунд человек считается в сети после обрыва последнего соединения |
MSG_PSTN_CDR_RETENTION_DAYS | 0 | сколько дней хранить записи о телефонных звонках (CDR) после их окончания; 0 — по умолчанию, 395 дней |
MSG_REDIS_ADDR | — | адрес шины; нужен для пула SFU, телефонии и нескольких реплик |
MSG_REDIS_DB | 0 | номер базы Redis |
MSG_REDIS_PASSWORD 🔒 | — | пароль шины |
MSG_RETENTION_DAYS | 0 | срок хранения сообщений в днях; 0 — не удалять |
MSG_S3_ACCESS_KEY 🔒 | — | ключ доступа к объектному хранилищу |
MSG_S3_BUCKET | — | бакет для вложений |
MSG_S3_ENDPOINT | — | адрес объектного хранилища |
MSG_S3_PREFIX | — | префикс ключей внутри бакета |
MSG_S3_REGION | — | регион объектного хранилища |
MSG_S3_SECRET 🔒 | — | секрет доступа к объектному хранилищу |
MSG_SFU_POOL_PATH | /var/lib/simpletwo-messaging/sfu-pool.json | файл со снимком пула SFU |
MSG_TLS_ADDR | :443 | адрес HTTPS-слушателя, когда служба сама терминирует TLS |
MSG_TLS_HOST | — | публичное имя службы; оно же имя в сертификате |
MSG_TURN_HOST | — | имя сервера TURN, выдаваемое клиентам |
MSG_TURN_SECRET 🔒 | — | общий секрет TURN, из которого считаются временные учётные данные |
3. Служба directory — каталог и вход
| Переменная | По умолчанию | Что делает |
|---|---|---|
DIR_ACME_CACHE | /var/lib/simpletwo/identity-acme | каталог кеша сертификатов: без него сертификат перевыпускается на каждом старте и упирается в лимит удостоверяющего центра |
DIR_ACME_EMAIL | — | почта для уведомлений удостоверяющего центра; необязательна |
DIR_ACME_STAGING | 0 | тестовый контур Let's Encrypt вместо боевого |
DIR_ADDR | :8086 | адрес и порт приватного HTTP — через него координатор пишет в identity |
DIR_ALLOWED_ORIGINS | — | источники браузера, кроме адреса координатора, которым разрешено читать адресную книгу каталога (/v1/directory/*): через запятую, точно scheme://host[:port]. Нужно, если веб-клиент встроен в страницу другого сайта. Пусто — только адрес координатора |
DIR_APNS_KEY_ID | — | идентификатор ключа APNs |
DIR_APNS_KEY_P8_FILE | — | путь к файлу ключа APNs (.p8) подсистемы notify — пуши iPhone и Mac; агент пишет файл из настроек координатора |
DIR_APNS_SANDBOX | 0 | отправлять пуши в песочницу Apple вместо боевого контура (сборки из Xcode) |
DIR_APNS_TEAM_ID | — | идентификатор команды Apple Developer |
DIR_APNS_TOPIC | — | VoIP-topic приложения iPhone (bundle id + «.voip»); topic уведомлений — тот же id без суффикса |
DIR_APNS_TOPIC_MACOS | — | bundle id приложения macOS — отдельный topic; пусто — на Mac пуши не уходят |
DIR_AUDIT_ALARM_BYTES | 1073741824 | размер журнала событий безопасност и, при котором /healthz поднимает тревогу о месте; по умолчанию 1 ГиБ |
DIR_BREACH_LIST | — | файл SHA-1 утёкших паролей (выгрузка Pwned Passwords): ищется на диске, в память не грузится. Пусто — только встроенный список частых паролей; сторонние сервисы не вызываются |
DIR_COORDINATOR_CERT_SHA256 | — | отпечаток SHA-256 самоподписанного сертификата координатора |
DIR_COORDINATOR_INSECURE | 0 | доверять самоподписанному сертификату координатора; только вместе с DIR_COORDINATOR_CERT_SHA256 |
DIR_COORDINATOR_URL | — | адрес координатора, у которого служба берёт ключ для секретов интеграций. Пусто — ключа нет: секреты остаются как есть, а /healthz показывает "secrets_sealed": false |
DIR_DATA_DIR | /var/lib/simpletwo/directory | каталог файлов хранилища на хосте роли: directory.db, notify.db, calendar.db (встроенный SQLite). Пусто — служба не стартует: каталогу без хранилища некуда положить группу |
DIR_EXPECTED_SHA256 | — | хеш бинаря, который выдал координатор и проверил агент. Задан — служба на старте хеширует себя и не запускается при несовпадении; пусто — только показывает хеш в /healthz |
DIR_FCM_SA_JSON_FILE | — | путь к файлу сервисной учётной записи Firebase подсистемы notify (пуши Android) |
DIR_MAIL_URL | — | приватный адрес узла почты: через его служебную дверь уходят коды для входа на подтверждённый внешний адрес человека. Координатор пишет его, когда в установке есть почтовый узел; пусто — кодов по почте нет, и переключатель политики их не включает |
DIR_PLATFORM | — | платформа этого каталога (simpletwo, simplezero, simplethree): префикс его расширения схемы — x-<платформа>-… в LDAP и urn:ietf:params:scim:schemas:extension:<платформа>:2.0:User в SCIM, под которым сеется его каталог и куда попадает новый атрибут. Пусто — simpletwo |
DIR_PLATFORM_ISSUER | — | имя эмитента токенов платформы в этой установке — публичный адрес первичного каталога, тот же, что координатор выдаёт проверяющим службам; реплика подписывает токены своими ключами под этим именем, а каждый экземпляр публикует в /oauth/jwks ключи всех экземпляров. Задаёт координатор; пусто — собственный адрес экземпляра |
DIR_PROFILES | — | слои роли на этом хосте, через запятую: base (хранилище линейки: учётки, группы, объекты установки, схема, минимальный вход, SCIM), simpletwo (расширение SimpleTwo: адресные книги и GAL, алиасы, руки переговорных, гости, боты, переезд, доступ к продуктам), calendar. Пусто — все три; base включён всегда; незнакомое имя — отказ при старте |
DIR_PUBLIC_URL | — | адрес службы, как его видят клиенты; координатор публикует его как identity_url |
DIR_REPLICATION_PEERS | — | другие экземпляры каталога этой установки — их SCIM-базы (https://<имя>/scim/v2) через запятую; каталог читает ленту каждого раз в минуту и применяет записи по правилу версий (мульти-мастер). Список задаёт координатор; пусто — партнёров нет |
DIR_REPLICATION_ROLE | — | положение этого экземпляра среди партнёров: executor — исполняет исходящие задания (SCIM-цели, SIEM, HRMS, вышестоящий LDAP, метаданные SAML), replica — не исполняет; серверные двери (LDAP, OIDC/SAML, SCIM, вход) у каждого экземпляра. Пусто — координатор репликацией не управляет, настройки берутся из базы |
DIR_SCHEMA_MASTER | — | origin экземпляра, у которого меняется схема (https://<имя>): здесь двери схемы отвечают 307 на него. Пусто — схема меняется у этого экземпляра |
DIR_TLS_ADDR | :443 | адрес HTTPS-слушателя |
DIR_TLS_HOST | — | публичное имя службы. Задано — HTTPS с собственным сертификатом для входа, портала и консоли; пусто — только приватный HTTP |
DIR_TOKEN_TTL | 12h | срок жизни сессии, которую служба продлевает сама; держится равным сроку координатора |
4. Служба directory — календарная половина
| Переменная | По умолчанию | Что делает |
|---|---|---|
DIR_CAL_ADDR | :8085 | адрес и порт службы календарей |
DIR_CAL_CALDAV_ENABLED | 0 | разрешить полный доступ по CalDAV; по умолчанию выключено |
DIR_CAL_COORDINATOR_CERT_SHA256 | — | отпечаток SHA-256 самоподписанного сертифика та координатора |
DIR_CAL_COORDINATOR_INSECURE | 0 | доверять самоподписанному сертификату координатора; только вместе с DIR_CAL_COORDINATOR_CERT_SHA256 |
DIR_CAL_COORDINATOR_URL | — | адрес координатора, у которого служба берёт ключ для адресных книг. Пусто — ключа нет: контакты хранятся открыто, а /healthz показывает "books_sealed": false |
DIR_CAL_DAV_AUTH | — | чем человек входит в CalDAV и CardDAV: calendar (по умолчанию) — паролем устройства календаря или паролем приложения identity с областью caldav/carddav; identity — только паролем приложения identity, пароли устройств получают отказ и больше не выдаются. Пишет агент из переключателя dav_auth координатора; identity без DIR_CAL_DIRECTORY_URL и любое другое значение — служба не стартует |
DIR_CAL_DB_PATH | — | файл календаря; по умолчанию calendar.db в каталоге DIR_DATA_DIR |
DIR_CAL_DEFAULT_TZ | UTC | часовой пояс по умолчанию |
DIR_CAL_DEPROVISION_RETENTION_DAYS | — | сколько дней хранятся календари и книги человека, которого удалили или у которого отозвали календарь (шаги задач координатора): доступ закрыт сразу, данные затем удаляются. 0 — удалить при следующем проходе |
DIR_CAL_DIRECTORY_URL | — | приватный адрес identity: служба проверяет там пароли приложений (CalDAV/CardDAV). По умолчанию — свой же приватный адрес directory. Ленту назначений с directory 0.58.0 не читает |
DIR_CAL_MEET_URL | — | адрес, от которого строится гостевая ссылка на встречу (хост координатора). Пусто — ссылка не выдаётся вовсе |
DIR_CAL_PUBLIC_URL | — | адрес, от которого строятся ссылки подписки; по умолчанию https://<DIR_TLS_HOST>/cal — календарь отвечает под /cal на имени directory. За прокси задаётся обязательно, иначе подписка не обновляется |
DIR_CAL_S3_ACCESS_KEY | — | ключ доступа к объектному хранилищу вложений |
DIR_CAL_S3_BUCKET | simpletwo-calendar | бакет вложений календаря; по умолчанию simpletwo-calendar |
DIR_CAL_S3_ENDPOINT | — | адрес объектного хранилища для вложений календаря; пусто — вложения выключены, служба говорит об этом в /healthz |
DIR_CAL_S3_REGION | — | регион объектного хранилища вложений |
DIR_CAL_S3_SECRET | — | секрет доступа к объектному хранилищу вложений |
DIR_CAL_SERIES_CAP_YEARS | — | на сколько лет вперёд разворачивается повторяющаяся серия |
DIR_CAL_SERVICE_KEY_DIR | — | каталог собственного ключа календарной половины для служебных токенов в режиме keys (подписывает как svc:calendar); пусто — общий ST_SERVICE_KEY_DIR. Пишет агент |
DIR_CAL_TOKEN_TTL | — | срок жизни токена службы |
DIR_CAL_WORK_DAYS | 1,2,3,4,5 | рабочие дни организации (1 — понедельник), через запятую |
DIR_CAL_WORK_END | 18:00 | конец рабочего дня |
DIR_CAL_WORK_START | 09:00 | начало рабочего дня |
ST_SERVICE_KEY_DIR | — | каталог ключа этого хоста (current.json, next.json, previous.json) и закреплённой копии реестра ключей всех служб (registry.json). Ключ создаёт и ротирует агент на самом хосте и регистрирует у координатора; с хоста ключ не уходит. В режиме keys без ключа служба не стартует |
5. Почта — роли mail и mx
| Переменная | По умолчанию | Что делает |
|---|---|---|
MAIL_ACME_CACHE | /var/lib/simpletwo/mail-acme | каталог кеша сертификатов: без него сертификат перевыпускается на каждом старте |
MAIL_ACME_EMAIL | — | почта для уведомлений удостоверяющего центра; необязательна |
MAIL_ACME_STAGING | 0 | тестовый контур Let's Encrypt вместо боевого |
MAIL_ADDR | :8087 | адрес и порт HTTP: JMAP, push, /healthz, внутренний API |
MAIL_AUDIT | shared | журнал доступа к ящикам: off, shared (общие ящики — по умолчанию) или all |
MAIL_CALENDAR_URL | — | адрес ленты приглашений календаря: каждое приглашение человеку с ящиком здесь приходит письмом |
MAIL_COORDINATOR_CERT_SHA256 | — | отпечаток SHA-256 самоподписанного сертификата координатора |
MAIL_COORDINATOR_INSECURE | false | доверять самоподписанному сертификату координатора; только вместе с MAIL_COORDINATOR_CERT_SHA256 |
MAIL_COORDINATOR_URL | — | адрес координ атора, у которого служба берёт ключи шифрования. Пусто — ключ не получить: допустимо, только пока шифрование выключено |
MAIL_DB_DSN | — | строка подключения к Postgres — оба хоста пары с target_session_attrs=read-write. Пусто — хранилище в памяти, то есть стенд |
MAIL_DIRECTORY_SOURCE | — | не читается с mail 0.92.0: люди и группы — только из каталога (MAIL_IDENTITY_URL). Агент координатора 0.x ещё ставит переменную |
MAIL_DMARC_ORG | — | имя организации в отчётах DMARC (по умолчанию — первый почтовый домен) |
MAIL_DMARC_REPORTS | true | отправлять ли сводные отчёты DMARC доменам, которые их запрашивают (rua): раз в сутки, по одному на домен (включено; off — не отправлять) |
MAIL_DOMAINS | — | почтовые домены через запятую для первого старта: из них один раз заполняется список принимаемых доменов (первый — основной); дальше список ведётся в консоли, в карточке «Домены», а переменная не читается |
MAIL_IDENTITY_CERT_SHA256 | — | отпечаток SHA-256 самоподписанного сертификата identity |
MAIL_IDENTITY_INSECURE | false | доверять самоподписанно му сертификату identity; только вместе с MAIL_IDENTITY_CERT_SHA256 |
MAIL_IDENTITY_URL | — | адрес identity: люди с адресами, группы с адресом, отправителями и участниками |
MAIL_INTERNAL_TOKEN 🔒 | — | токен, которым mx входит во внутренний API |
MAIL_LMTP_ADDR | :24 | где mx сдаёт почту по LMTP; отвечает только узлам mx и своему хосту. off — выключено |
MAIL_MDN | off | уведомления о прочтении: off, internal (только внутри организации) или all |
MAIL_MX_NODES | — | узлы mx, через которые уходит исходящая почта: host:port через запятую, по кругу |
MAIL_QUARANTINE_DAYS | 30 | сколько дней хранится задержанное письмо (карантин фильтров и антивируса), потом удаляется без уведомления (30; 0 — хранить, пока администратор не решит) |
MAIL_RECALL_ALLOW_READ | false | разрешать отзыв письма, которое уже прочитали |
MAIL_RECALL_MAX_AGE | 0 | насколько старое письмо можно отозвать; 0 — без ограничения |
MAIL_S3_ACCESS_KEY 🔒 | — | ключ доступа к объектному хранилищу |
MAIL_S3_BUCKET | simpletwo-mail | бакет для почты |
MAIL_S3_ENDPOINTS | — | объектное хранилище: primary=https://…;secondary=https://…, в этой версии используется первое. Пусто — хранилище в памяти, только для разработки |
MAIL_S3_PREFIX | — | префикс ключей внутри бакета |
MAIL_S3_REGION | — | регион объектного хранилища |
MAIL_S3_SECRET 🔒 | — | секрет доступа к объектному хранилищу |
MAIL_TLSRPT_ORG | — | имя организации в отчётах TLS-RPT (по умолчанию — MAIL_DMARC_ORG, а без него первый почтовый домен) |
MAIL_TLSRPT_REPORTS | true | отправлять ли отчёты TLS-RPT (RFC 8460) доменам, которые их запрашивают записью _smtp._tls: раз в сутки, по одному на домен, на адреса mailto: (включено; off — не отправлять) |
MAIL_TLS_ADDR | :443 | адрес HTTPS-слушателя |
MAIL_TLS_HOST | — | публичное имя, на котором служба отвечает по JMAP. Задано — HTTPS с собственным сертификатом, а координатор публикует mail_url, когда имя ответит |
MAIL_TOKEN_TTL | 12h | срок жизни сессии, которую служба продлевает сама |
MX_ADDR | 127.0.0.1:8088 | адрес служебного слушателя mx (здоровье); никогда не публичный |
MX_ARC_TRUSTED | — | запечатыватели ARC (RFC 8617), которым доверяет локальная политика, — домены через запятую, каждый вместе с поддоменами (lists.example,google.com); пусто (по умолчанию) — никому. Письмо, не прошедшее DMARC при p=reject или p=quarantine, доставляется как обычное, только если цепочка ARC проходит проверку, все её запечатыватели от последнего до поручившегося — из списка и поручившийся у себя увидел DMARC пройденным для этого From:; в Authentication-Results — dmarc=fail с причиной, в агрегатном отчёте — local_policy. Цепочка проверяется и записывается (arc=) всегда, копии групп внешним участникам запечатываются всегда — от этой переменной не зависит |
MX_DEVICES | — | коннекторы для машин без AUTH (МФУ, ERP, мониторинг), JSON-список: name, networks (CIDR или адреса), senders (адреса или @домен из локальных), relay (local/any), rate (писем в минуту с адреса, 60), max_size, tls (optional/require); узнаются на двери :25 по сети источника; ошибка в списке останавливает службу |
MX_DKIM_DIR | /etc/simpletwo/mx-dkim | каталог ключей DKIM: <домен>/<селектор>.pem, PKCS#8 или PKCS#1, только владельцу; подписывает каждый ключ домена From: (или его родителя); пусто — письма уходят без подписи, и /healthz это показывает |
MX_DNSBL_ZONES | zen.spamhaus.org | DNS-списки блокировки (RFC 5782), по которым проверяется каждый клиент двери :25, через запятую (`zone=127.0.0.2 |
MX_DNSWL_ZONES | — | DNS-списки разрешения: адрес из них не проверяется по спискам блокировки (пусто — нет) |
MX_FILTERS | — | фильтры содержимого почты из интернета — JSON-список [{"name":"rspamd","transport":"milter","address":"inet:127.0.0.1:11332","on_error":"open"}, {"name":"av","transport":"icap","address":"icap://av:1344/respmod","on_error":"closed"}] (пусто — без фильтров); транспорт — milter или icap; on_error — open (без фильтра дальше) или closed (отправителю 451), timeout 30s, eom_timeout 300s; spam_signal у milter — заголовки, по которым письмо уходит в «Спам»; verdict у ICAP — чем антивирус сообщает о находке (headers, header_patterns, on_modified_body, status_codes); on_virus — quarantine (у ICAP по умолчанию: письмо задерживается, отправителю 250) или reject (отправителю 550); milter считается антивирусом, только если on_virus задан; неверный список останавливает службу |
MX_FILTERS_FILE | — | файл с тем же JSON-списком, что MX_FILTERS; если задан, MX_FILTERS не читается, а файл, который не читается, останавливает службу. Так список передаёт агент: регулярные выражения с \ переменная окружения systemd не переносит |
MX_FILTER_QUARANTINE | held | что делает карантин фильтра: held (по умолчанию) — письмо задерживается на кластере mail до решения администратора (консоль, «Почта → Карантин»), получатели получают уведомление; junk — письмо в «Спам». Находка антивируса задерживается всегда |
MX_HOSTNAME | — | имя края в EHLO и Received; по умолчанию — имя хоста |
MX_INBOUND_AUTH | on | проверка SPF, DKIM и DMARC почты из интернета (on по умолчанию; off — без проверок): итог — в Authentication-Results, при p=reject — отказ на DATA, при p=quarantine — в «Спам» |
MX_INTERNAL_TOKEN 🔒 | — | токен, который почтовый кластер выдал этому краю |
MX_MAIL_API | — | базовые адреса внутреннего API узлов почты через запятую; пусто — узлы из MX_MAIL_NODES на порту MX_MAIL_API_PORT |
MX_MAIL_API_PORT | 8087 | порт HTTP почтовой роли для внутреннего API, когда MX_MAIL_API не задан (8087) |
MX_MAIL_NODES | — | узлы почтового кластера для LMTP и внутреннего API: host:port через запятую |
MX_MAX_CONNECTIONS | 500 | сколько соединений на :25 узел держит одновременно; следующему — 421 (0 — без предела) |
MX_MAX_CONNECTIONS_PER_IP | 20 | сколько соединений на :25 одновременно с одного адреса; следующему — 421 (0 — без предела); сети коннекторов устройств не считаются |
MX_MAX_MESSAGE_BYTES | 52428800 | самое большое письмо, которое берёт дверь MX, в байтах (50 МиБ) |
MX_RELAY_ADDR | :2525 | дверь для исходящей почты кластера mail (:2525; off — нет): отвечает только адресам из MX_MAIL_NODES, с сертификатом требует STARTTLS |
MX_SMARTHOST | — | куда отдавать всю исходящую почту вместо MX получателей (host:port через запятую); пусто — доставка по MX |
MX_SMTP_ADDR | :25 | публичная дверь MX (:25); off — не слушать |
MX_SPOOL_DIR | /var/lib/simpletwo/mx/spool | каталог очереди на диске; доступен только владельцу — это почта в пути, в открытом виде |
MX_SUBMISSION_MAX_CONNECTIONS | 0 | сколько соединений на порты отправки 587 и 465 вместе узел держит одновременно, отдельно от :25; следующему на 587 — 421, на 465 соединение закрывается, и отказ попадает в журнал отказов отправки (0, по умолчанию, — без предела); сети коннекторов устройств не считаются |
MX_SUBMISSION_MAX_CONNECTIONS_PER_IP | 0 | сколько соединений на 587 и 465 вместе одновременно с одного адреса (IPv6 — с одной сети /64); следующему — как у MX_SUBMISSION_MAX_CONNECTIONS (0, по умолчанию, — без предела). Все, кто за одним NAT, — один адрес: офис, отправляющий через один публичный адрес, делит этот предел |
MX_SUBMIT_ADDR | :587 | подача SMTP со STARTTLS и паролем приложения (:587; off — нет); без MX_TLS_CERT не открывается: AUTH открытым текстом не предлагается |
MX_SUBMIT_TLS_ADDR | :465 | подача SMTP с TLS с первого байта (:465; off — нет); без MX_TLS_CERT не открывается |
MX_TLS_CERT | — | сертификат для STARTTLS на :25; вместе с MX_TLS_KEY |
MX_TLS_KEY | — | ключ к MX_TLS_CERT |
6. Диск — роль drive
| Переменная | По умолчанию | Что делает |
|---|---|---|
DRIVE_ACME_CACHE | /var/lib/simpletwo/drive-acme | каталог, где хранится полученный сертификат |
DRIVE_ACME_EMAIL | — | контакт для Let's Encrypt |
DRIVE_ACME_STAGING | 0 | 1 — тестовый каталог Let's Encrypt |
DRIVE_ADDR | :8088 | адрес и порт, на котором служба принимает клиентов |
DRIVE_BIN_DAYS | 30 | сколько дней удалённый файл ждёт в корзине, прежде чем сборщик сотрёт его байты. То же число, что у почты. 0 — корзины фактически нет: ближайший проход сборщика забирает всё |
DRIVE_COORDINATOR_CERT_SHA256 | — | отпечаток SHA-256 самоподписанного сертификата координатора |
DRIVE_COORDINATOR_INSECURE | — | доверять самоподписанному сертификату координатора, у которого диск в режиме identity спрашивает права; только вместе с DRIVE_COORDINATOR_CERT_SHA256 |
DRIVE_DB_DSN | — | строка подключения к Postgres. Обязательна: режима «в памяти» у диска нет — диск, теряющий дерево при перезапуске, это не ослабленный режим |
DRIVE_DEFAULT_QUOTA_GB | 0 | квота пространства по умолчанию, в гигабайтах; 0 — без предела. Своя квота пространства задаётся в консоли и перекрывает это значение |
DRIVE_IDENTITY_URL | — | частный адрес identity: лента назначений, по которой у каждого, кому выдан диск, заводится личный каталог home. Пусто — никому ничего не заводится, и /healthz об этом говорит |
DRIVE_MAIL_URL | — | частный адрес почтового узла: политика хранения ушедших, ответственный за ящик ушедшего и письмо-предупреждение — те же, что для его ящика. Пусто — личный каталог ушедшего хранится бессрочно, только для чтения |
DRIVE_MAX_UPLOAD_MB | 2048 | предел на один файл, в мегабайтах. Проверяется при открытии загрузки, а не после того, как байты пересекли сеть |
DRIVE_PUBLIC_URL | — | публичный адрес диска — имя, по которому его видят клиенты |
DRIVE_S3_ACCESS_KEY | — | ключ доступа к объектному хранилищу |
DRIVE_S3_BUCKET | simpletwo-drive | бакет диска; по умолчанию simpletwo-drive |
DRIVE_S3_ENDPOINT | — | адрес объектного хранилища. Пусто — служба работает, но хранит только файлы, помещающиеся в строку каталога, и говорит об этом в /healthz |
DRIVE_S3_REGION | us-east-1 | регион объектного хранилища |
DRIVE_S3_SECRET | — | секрет доступа к объектному хранилищу |
DRIVE_TLS_ADDR | :443 | адрес HTTPS-листенера (по умолчанию :443) |
DRIVE_TLS_HOST | — | публичное имя диска; оно же имя в сертификате, который служба получает сама |
🔒 — значение секретное: не печатайте его в журналы и не передавайте в переписке. Секреты, которые можно задать файлом, задавайте файлом: значение в окружении видно всем, кто может прочитать состояние процесса.
6. Общие для развёртывания
ST_TOKEN_SECRET и ST_MESSAGING_URL читают несколько служб: первый — потому что токены
подписывает координатор, а проверяют остальные; второй — потому что календарь сообщает службе
переписки об изменениях. Значения у них одни и те же во всём контуре, иначе службы просто не
поверят друг другу.
Переменные токена платформы одни и те же во всех службах с дверью для людей —
переписка, календари, почта, identity; их читает общая библиотека shared/auth, а значения агент
берёт из желаемого состояния. Координатор их не читает: переключатель — его собственная настройка.
Так же устроены переменные служебного токена ST_SERVICE_*: их читает
shared/svcauth. ST_MOVE_STOPGAP_UNTIL получают только identity и календарь —
службы, в двери которых ходит утилита миграции.
| Переменная | Что делает |
|---|---|
ST_PLATFORM_TOKEN | какой токен принимают двери для людей: hmac (по умолчанию) — сессионный токен координатора, как раньше; identity — только токен платформы, выпущенный identity, а HMAC-сессия человека отклоняется. Другое значение — служба не стартует. Переключатель один на всю установку, его ставит координатор (PUT /admin/api/settings/platform-token) |
ST_PLATFORM_ISSUER | издатель токена платформы — публичный адрес identity, ровно как он пишет iss |
ST_PLATFORM_JWKS_URL | ключи identity (JWKS) на его частном адресе; неизвестный kid перечитывает их не чаще раза в 30 секунд |
ST_PLATFORM_JWKS | закреплённая копия JWKS (base64url): ею проверяется токен, когда identity недоступен, в том числе после перезапуска. Координатор забирает её у identity и обновляет при ротации ключей |
ST_PLATFORM_REVOCATIONS_URL | лента отзывов identity (/v1/revocations/feed): закрытые сессии и отключённые учётные записи, опрос каждые 30 секунд служебным токеном |
ST_PLATFORM_RBAC_URL | корень SCIM каталога (<directory>/scim/v2): роли и назначения (/Authz?since=) и учётки (/Users?since=) чита ются отсюда от курсора, а не из токена; опрос каждые 15 секунд, при сбое отвечает последняя полученная копия |
ST_PLATFORM_REVOCATIONS_STALE | предел устаревания ленты отзыва в режиме identity: если ленту не читали дольше него, токены, выписанные раньше этого предела, отклоняются, а в /healthz — revocations.stale: true; длительность от 1m до 24h, off или пусто — 10 минут. Задаётся в консоли координатора («Настройки → Каталог», карточка «Перевод служб на каталог») |
ST_SERVICE_TOKEN | каким токеном службы ходят друг к другу: hmac (по умолчанию) — токен под общим ST_TOKEN_SECRET, как раньше; keys — только токен, подписанный собственным ключом хоста вызывающей службы, а служебный токен под общим секретом отклоняется. Другое значение — служба не стартует. Переключатель один на всю установку, его ставит координатор (PUT /admin/api/settings/service-token) |
ST_SERVICE_KEY_DIR | каталог ключа этого хоста (current.json, next.json, previous.json) и закреплённой копии реестра ключей всех служб (registry.json). Ключ создаёт и ротирует агент на самом хосте и регистрирует у коорд инатора; с хоста ключ не уходит. В режиме keys без ключа служба не стартует |
ST_SERVICE_KEYS_URL | реестр ключей служб у координатора (/v1/service/keys/jwks): неизвестный kid перечитывает его не чаще раза в 30 секунд; когда координатор недоступен, проверяет закреплённая копия |
ST_MOVE_STOPGAP_UNTIL | момент (RFC 3339), до которого identity и календарь принимают служебный токен svc:move без волны — временный доступ утилиты миграции. Пусто или нет переменной — доступ закрыт (по умолчанию); момент прошёл по часам самой службы — закрыт; дальше 72 часов вперёд или нечитаемое значение — закрыт; в режиме служебного токена keys — закрыт всегда. Каждое использование пишется в журнал службы с причиной stopgap и считается в /healthz (move.stopgap). Задаёт владелец в консоли координатора (Settings → «Утилита миграции: временный доступ svc:move», PUT /admin/api/settings/move-stopgap) с обязательной причиной |