Files
mono/components/email-relay/.env.example
T
coopops 7e2b26a02e
Typecheck / desktop (pull_request) Has been cancelled
Typecheck / controller (pull_request) Has been cancelled
[C28-28][@ant] feat(email-relay): HTTP→SMTP релей для коопов с закрытым SMTP
Хостинги коопов режут исходящий SMTP → письма controller'а уходят в timeout
(раньше хабом был Novu, его убрали). Новый компонент @coopenomics/email-relay
принимает письма по HTTPS с Bearer-токеном и форвардит по SMTP. Ставится на
сервер с открытыми портами (плейбук в playbooks/email-relay).

- components/email-relay: express + nodemailer, POST /send + GET /health,
  Bearer-токен (constant-time), опц. IP-allowlist, конфиг из ENV
- controller: email-channel.adapter получил relay-режим — если задан
  EMAIL_RELAY_URL, письмо уходит POST'ом на релей; иначе прямой SMTP как
  раньше (opt-in, без регрессии)
- docker-compose: дев-сервисы email-relay + mailpit (SMTP-перехватчик для E2E)
- release.yaml: сборка образа dicoop/email-relay

E2E проверен локально: controller-формат письма → релей → SMTP → mailpit,
тело с <br> и заголовки целы; 401 на отсутствие/неверный токен, 400 на пустое тело.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 07:42:15 +00:00

24 lines
845 B
Bash

# Порт HTTP-сервера релея (за ним nginx+TLS)
PORT=3025
# Общий секрет. Коопы шлют Authorization: Bearer <RELAY_TOKEN>.
# Сгенерировать: openssl rand -hex 32
RELAY_TOKEN=
# SMTP реального почтового сервера (порты должны быть открыты на этом хосте)
SMTP_HOST=
SMTP_PORT=587
# secure: пусто = авто (true для 465, иначе STARTTLS). Можно явно true/false.
SMTP_SECURE=
SMTP_USERNAME=
SMTP_PASSWORD=
# from по умолчанию, если запрос его не прислал
EMAIL_FROM_DEFAULT=
# Опционально: allowlist IP коопов через запятую (defense-in-depth за TLS)
RELAY_IP_ALLOWLIST=
# Опционально: лимит тела запроса
RELAY_BODY_LIMIT=1mb