S60Mail
Email edge service — Resend API, BullMQ fronty pro transakční emaily, Bull Board monitoring UI.
| Owner | mail (agent) |
| Status | running (ověřeno 2026-07-30: kontejner s60-mail na hub i prod running/healthy) |
| Repo | studio60-cz/s60-mail |
| Stack | NestJS + BullMQ + Redis |
| Catalog | catalog/services/s60mail.yaml |
Aktuální stav
✅ Service běží. Kontejner s60-mail je na hub i prod running/healthy, fronta email-outbound odbavuje.
⚠️ Oprava 2026-08-01: tvrzení „nasazený commit 36a41f6, ověřeno 2026-07-30" bylo nepravdivé — vzniklo ze
changelogu, ne z měření. Na hubu do 1. 8. běžel starší kód (/health vracel prázdné details). Hub byl
36a41f6 reálně nasazen až 1. 8. 2026 05:59 UTC (commit VERIFIED, source hash local=remote, QA 3/3 pass),
což potvrzuje /health → database: up, redis: up. Prod nasazen 1. 8. 08:11 UTC (build hash identický
s hubem 5d9ed069…, commit VERIFIED); /health tam nově vrací database: up, redis: up a /api/providers
bez tokenu 401 místo dřívějších 200. Detail v
deploy/changelog.md u záznamu z 1. 8. Sekce o čekání na Resend domain verification byla stale od ~07/2026 — verifikace dávno proběhla, dokument se jen nedostal k opravě.
⚠️ Secrets: adresář se jmenuje mail, NE s60-mail
deploy.sh má na to natvrdo zadrátované přemapování (řádek ~515):
- živé:
/root/secrets/mail/.env.{hub,prod}← odtud deploy.sh sype/opt/s60-mail/.env - ~~mrtvý duplikát
/root/secrets/s60-mail/~~ — SMAZÁN 2026-07-31 (archiv/root/backups/secrets-s60-mail-duplikat-20260731.tar.gz); nikdo ho nečetl, ale sváděl k editaci podle jména služby
Sentinel na to 2026-07-30 šlápl: zápis SENTRY_DSN do duplikátu → deploy proběhl čistě, ale hodnota se nikam nepropsala. Ověřuj md5 nasazeného /opt/<svc>/.env proti secrets, ne jen to, že deploy skončil zeleně. Duplikát byl 2026-07-31 na Liborův pokyn archivován a smazán, takže tahle past už nehrozí — ale to přemapování v deploy.sh zůstává, takže secrets pro s60-mail hledej vždy v mail/.
Error tracking (GlitchTip)
SENTRY_DSNdoplněn 2026-07-30 do/root/secrets/mail/.env.{hub,prod}, projekt 6 (s60-mail)- klíč MUSÍ být bez pomlček (hex32) — SDK parsuje public key jako
[A-Za-z0-9_]+a UUID tvar odmítne, vizglitchtip/INDEX.md https://7e308f4baf8742bf9e589244d28935c7@errors.studio60.cz/6- instrumentace v repu je (
Sentry.init()+captureException/captureMessagev 5 souborech) → po propsání DSN reálně reportuje, na rozdíl od badwolfa
Cílové URLs
S60Mail nemá veřejnou doménu — je to interní API volané ostatními službami.
| Prostředí | Health | Status |
|---|---|---|
| Hub | http://100.102.29.119:3010/health | dle Resend domain |
| Prod | http://100.78.87.88:3010/health | dle Resend domain |
Architektura
| Container | Port | Role |
|---|---|---|
s60-mail |
3010 | NestJS API + BullMQ worker |
Endpointy
POST /api/send— odeslání emailuGET /api/templates— správa šablonGET /health— health checkGET /queues— Bull Board dashboardGET /editor— template editor
Známé problémy
⚠️ sslmode v DATABASE_URL: ?sslmode=require způsobuje SSL error s novějším pg driverem. Řešení: odstranit z URL — TypeORM ssl config v production módu nastaví rejectUnauthorized: false automaticky.
⚠️ Migrace chybí v repo: tabulka email_templates byla vytvořena ručně. Mail agent notifikován — měl by přidat migrace do repo.
DB
| Env | DB | User | Server | Port |
|---|---|---|---|---|
| Hub | s60_mail_hub |
s60_mail_hub_user |
hub-alfa (pg-alfa) | 6432 |
| Prod | s60_mail_prod |
s60_mail_prod_user |
prod-alfa (pg-alfa) | 6432 |
Závislosti
- redis (BullMQ fronty)
Features
- Resend API integrace
- BullMQ email fronty
- Bull Board monitoring UI
- Health endpoint
- Transakční emaily (faktury, notifikace, přihlášení, bankovní avíza)
Domains pro Resend
studio60.cz— mainbillit.cz— fakturační emaily*.in.billit.cz— inbound (parsování bankovních avíz)
Resend credentials
- Plan: Pro ($20/měs)
- API key:
/root/secrets/mail/.env.prod(RESEND_API_KEY)
Klíčová pravidla
- BillIt fakturační emaily MUSÍ jít přes s60-mail (ne přímý Resend volání z Billit) — drží retry logic, error tracking, Bull Board observability
- Inbound (bank avíza) → BillIt order matching pipeline
Související
runbooks/resend-domain-verify.md(pokud existuje)billit/INDEX.md— primárny consumer fakturačních emailů