[C28-28] feat(email-relay): HTTP→SMTP релей для коопов с закрытым SMTP #115
Reference in New Issue
Block a user
Delete Branch "feature/C28-28-email-relay"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Зачем
Хостинги коопов режут исходящий SMTP → письма controller'а уходят в connection timeout (видно в журнале уведомлений). Раньше хабом отправки был Novu — после удаления коопы шлют SMTP напрямую и упираются в закрытые порты.
Решение
Минимальный HTTP→SMTP релей @coopenomics/email-relay. Коопы шлют письма ему по HTTPS (Bearer-токен), он стоит на сервере с открытыми портами (voskhod) и форвардит по SMTP.
Что в PR
Аутентификация
Статичный Bearer-токен поверх TLS (nginx + Let's Encrypt). Server-to-server, один секрет, ротация = смена env. mTLS отвергнут (раздача сертификатов по N коопам — боль за уже имеющимся TLS).
Тест
E2E локально (изолированно, рабочий стек не трогался): формат письма controller'а → релей → SMTP → mailpit. Тело с
и заголовки целы; 401 на отсутствие/неверный токен, 400 на пустое тело, /health 200.
Деплой (отдельно)
Плейбук playbooks/email-relay/setup.yaml (nginx TLS + docker compose pull/up образа dicoop/email-relay) — по образцу matrix-sender. Коопам в controller/.env: EMAIL_RELAY_URL + EMAIL_RELAY_TOKEN.
Generated with Claude Code