Deploy
Como a API sobe em cada ambiente, o que o CI faz, e como reverter.
Artefactos
| Artefacto | Função |
|---|---|
Dockerfile | Multi-stage: npm ci + nest build → imagem Alpine com user nestjs, CMD node dist/main.js |
compose.yaml | Serviço backend, env_file: .ENV, healthcheck /api/health |
.github/workflows/ci.yml | Testes, cobertura, Stryker (não bloqueante), Sonar em PR/main |
A imagem não inclui .env. Segredos entram por env_file, variáveis do orquestrador ou JWT_SECRET_FILE.
Ambientes
| Ambiente | Como sobe | Notas |
|---|---|---|
| Local (Node) | npm run start:dev | .env / .ENV |
| Local (Compose) | docker compose --env-file .ENV up -d --build | Volume ./.ENV:/app/.ENV:ro |
| Staging / produção (pull da imagem) | Painel Swarm/K8s injeta as mesmas chaves do .env | Sem ficheiro no servidor; ver env-container |
NODE_ENV=production no Compose. CORS_ORIGIN obrigatório em produção (lista de origens do front). SSL das BDs: DATABASE_SSL / AUTH_DATABASE_SSL.
Pipeline CI
Workflow .github/workflows/ci.yml:
- Unit Tests (
ubuntu-latest, Node 20,npm ci,npm run test:cov) — artefactcoverage/ - Mutation Testing —
npm run test:mutation,continue-on-error: true - SonarQube — em PR ou push a
main; tokensSONAR_TOKEN,SONAR_HOST_URL
Não há job de deploy automático neste repositório: o release é construir a imagem e o orquestrador fazer pull. Publicação da documentação MkDocs: ver DOCS_SITE.md.
Checklist pós-deploy
GET /api/health→ 200{ "status": "ok", ... }GET /api→"name": "CentralCRM API"POST /api/v1/auth/logincom um utilizador de staging → 200 +accessToken- Confirmar que o container não aponta Postgres para
127.0.0.1se a BD for remota - Confirmar
JWT_SECRETigual ao dodefault-crm(presença) neste ambiente - Swagger só se a política de rede o permitir (não é superfície de negócio)
Rollback
A API é stateless excepto o mapa de presença em memória (ADR 0003).
- Imagem: republicar a tag anterior no serviço (Swarm
update --image, K8srollout undo, Composeimage:+up -d). - Schema: o TypeORM não reverte SQL. Se o release aplicou migration em
docs/sql/migrations/, execute o down manual antes ou em conjunto com o rollback da imagem — não há down automático. - JWT_SECRET: se rodou o segredo, todos os tokens ficam inválidos; avise o front e o default-crm.
- Presença: qualquer restart zera sessões WebSocket; os clientes devem reconectar.
Estratégia de release
- Integração em
Develop;mainpara o que vai a produção (alinhar com o fluxo da equipa). - Versionar com tags
vMAJOR.MINOR.PATCHe entrada no CHANGELOG.md. - Features que alteram contrato HTTP: documentar no catálogo no mesmo PR.
Observabilidade mínima
Não há APM obrigatório no código. Operação:
- Logs Nest (stdout do container)
VERBOSE_BOOT=1só para diagnóstico de BD (não deixar ligado em produção sem necessidade)- Healthcheck Compose / orquestrador em
/api/health
Quando algo falha: runbooks.