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
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)
- Git pull na sentinelu —
cd /root/projects/s60-mail && git pull - Ověřit secrets —
/root/secrets/mail/.env.hub— ⚠️ adresářmail, NEs60-mail(deploy.sh:515 přemapovává; dirs60-mailbyl mrtvý duplikát, smazán 2026-07-31) (required: DATABASE_URL, REDIS_HOST, REDIS_PASSWORD, RESEND_API_KEY) - Deploy —
./deploy/deploy.sh s60-mail hub - Health check — deploy.sh ověří automaticky, ale potvrdit:
ssh root@100.68.138.14 "curl -s http://127.0.0.1:3010/health" - Changelog — zapsat do changelog.md
- 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:
- Hub healthy —
ssh root@100.68.138.14 "curl -s http://127.0.0.1:3010/health"→ HTTP 200 - QA gate — QA agent ověří hub verzi (Relay API / task)
- Hub verze >= prod verze — na hub musí běžet stejná nebo novější verze než aktuální prod
- Commit ověřen —
cd /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
- Pre-checks splněny — všechny body z QA ověření výše ✅
- Ověřit secrets —
/root/secrets/mail/.env.prod— ⚠️ adresářmail, NEs60-mail(POZOR: musí být kompletní, ne placeholder!) - Deploy —
./deploy/deploy.sh s60-mail prod - Health check —
ssh root@100.78.87.88 "curl -s http://127.0.0.1:3010/health" - Changelog — zapsat do changelog.md
- 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-redisnas60-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é.