Skip to content

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 /healthdatabase: 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):

SECRET_PROJECT="$PROJECT"
[[ "$PROJECT" == "s60-mail" ]] && SECRET_PROJECT="mail"
  • ž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_DSN doplně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, viz glitchtip/INDEX.md
  • https://7e308f4baf8742bf9e589244d28935c7@errors.studio60.cz/6
  • instrumentace v repu je (Sentry.init() + captureException/captureMessage v 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í emailu
  • GET /api/templates — správa šablon
  • GET /health — health check
  • GET /queues — Bull Board dashboard
  • GET /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 — main
  • billit.cz — fakturační emaily
  • *.in.billit.czinbound (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í