Skip to content

Deploy — S60Mail

Specifika nasazení S60Mail. Obecný postup viz Standardní deploy proces.

Kontejnery

Kontejner Port Popis
s60-mail 3010 NestJS mailový backend (Resend)

Deploy příkaz

# Staging (hub)
./deploy/deploy.sh s60-mail hub

# Produkce
./deploy/deploy.sh s60-mail prod

Deploy.sh provede automaticky: git pull → readiness check → npm audit → rsync → scp secrets → docker compose up --build → health check → QA gate.

NIKDY ruční rsync/scp/docker compose

Vždy použít deploy.sh. Viz deploy guard hook.

Postup: S60Mail Staging (hub)

  1. Git pull na sentinelu — cd /root/projects/s60-mail && git pull
  2. Ověřit secrets/root/secrets/mail/.env.hub — ⚠️ adresář mail, NE s60-mail (deploy.sh:515 přemapovává; dir s60-mail byl mrtvý duplikát, smazán 2026-07-31) (required: DATABASE_URL, REDIS_HOST, REDIS_PASSWORD, RESEND_API_KEY)
  3. Deploy./deploy/deploy.sh s60-mail hub
  4. Health check — deploy.sh ověří automaticky, ale potvrdit: ssh root@100.68.138.14 "curl -s http://127.0.0.1:3010/health"
  5. Changelog — zapsat do changelog.md
  6. Memory — zapsat do Redis memory:inbox

QA ověření na hub (před prod deployem)

Po úspěšném hub deployi musí proběhnout QA kontrola:

  1. Hub healthyssh root@100.68.138.14 "curl -s http://127.0.0.1:3010/health" → HTTP 200
  2. QA gate — QA agent ověří hub verzi (Relay API / task)
  3. Hub verze >= prod verze — na hub musí běžet stejná nebo novější verze než aktuální prod
  4. Commit ověřencd /root/projects/s60-mail && git log -1 (musí být ten co prošel QA na hub)

Blokery

  • Hub NENÍ healthy → STOP
  • QA neprošlo na hub → předat WFH (čeká na manuální zásah Libora)
  • Na hub běží starší verze než co chceš dát na prod → STOP, nejdřív deploy hub
  • NIKDY nespouštět deploy na prod bez splnění VŠECH podmínek

Postup: S60Mail Produkce

  1. Pre-checks splněny — všechny body z QA ověření výše ✅
  2. Ověřit secrets/root/secrets/mail/.env.prod — ⚠️ adresář mail, NE s60-mail (POZOR: musí být kompletní, ne placeholder!)
  3. Deploy./deploy/deploy.sh s60-mail prod
  4. Health checkssh root@100.78.87.88 "curl -s http://127.0.0.1:3010/health"
  5. Changelog — zapsat do changelog.md
  6. Memory — zapsat do Redis memory:inbox

Env proměnné

Secrets v /root/secrets/mail/ (ne s60-mail — viz services/mail/INDEX.md):

Proměnná Popis
DATABASE_URL PostgreSQL connection string (BEZ sslmode=require!)
REDIS_HOST Redis hostname (s60-redis)
REDIS_PORT Redis port (6379)
REDIS_PASSWORD Redis heslo
RESEND_API_KEY Resend API klíč pro odesílání mailů
PORT Port aplikace (3010)
NODE_ENV production
TEST_MAIL_ENABLED true na hub — přesměrování testovacích mailů
TEST_MAIL_REDIRECT Cílová adresa pro testovací maily (hub: test@studio60.cz)

DATABASE_URL bez sslmode=require

S60Mail nefunguje se sslmode=require v DATABASE_URL. Používat bez něj.

Databáze

Prostředí DB User
Hub (staging) s60_mail_hub s60_mail_hub_user
Prod s60_mail_prod s60_mail_prod_user

Závislosti

Před deploy na cílovém serveru musí existovat:

  • [x] Docker network s60-network
  • [x] Redis kontejner s60-redis na s60-network
  • [x] PostgreSQL databáze + user na DO managed PG

Specifika pro S60Mail

  • Interní API — žádná veřejná doména, žádný nginx virtualhost. Ostatní služby přistupují přes Docker network (s60-mail:3010).
  • Dockerfile nemá HEALTHCHECK — healthcheck je definován v docker-compose.yml (wget http://localhost:3010/health).
  • TypeORM migrace — spouští se automaticky při startu aplikace, není třeba manuálně.
  • Resend API — jediný externí provider, klíč v .env.

Známé problémy

  • Dockerfile healthcheck chybí — HEALTHCHECK je v docker-compose.yml, ne v Dockerfile. Pokud se použije jiný orchestrátor, je třeba přidat.
  • .env.prod neúplný — k datu 2026-03-20 obsahuje pouze placeholder, před prod deployem nutné doplnit všechny proměnné.