Pular para o conteúdo principal

Deploy

Como a API sobe em cada ambiente, o que o CI faz, e como reverter.

Artefactos

ArtefactoFunção
DockerfileMulti-stage: npm ci + nest build → imagem Alpine com user nestjs, CMD node dist/main.js
compose.yamlServiço backend, env_file: .ENV, healthcheck /api/health
.github/workflows/ci.ymlTestes, 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

AmbienteComo sobeNotas
Local (Node)npm run start:dev.env / .ENV
Local (Compose)docker compose --env-file .ENV up -d --buildVolume ./.ENV:/app/.ENV:ro
Staging / produção (pull da imagem)Painel Swarm/K8s injeta as mesmas chaves do .envSem 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:

  1. Unit Tests (ubuntu-latest, Node 20, npm ci, npm run test:cov) — artefact coverage/
  2. Mutation Testingnpm run test:mutation, continue-on-error: true
  3. SonarQube — em PR ou push a main; tokens SONAR_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

  1. GET /api/health → 200 { "status": "ok", ... }
  2. GET /api"name": "CentralCRM API"
  3. POST /api/v1/auth/login com um utilizador de staging → 200 + accessToken
  4. Confirmar que o container não aponta Postgres para 127.0.0.1 se a BD for remota
  5. Confirmar JWT_SECRET igual ao do default-crm (presença) neste ambiente
  6. 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).

  1. Imagem: republicar a tag anterior no serviço (Swarm update --image, K8s rollout undo, Compose image: + up -d).
  2. 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.
  3. JWT_SECRET: se rodou o segredo, todos os tokens ficam inválidos; avise o front e o default-crm.
  4. Presença: qualquer restart zera sessões WebSocket; os clientes devem reconectar.

Estratégia de release

  • Integração em Develop; main para o que vai a produção (alinhar com o fluxo da equipa).
  • Versionar com tags vMAJOR.MINOR.PATCH e 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=1 só para diagnóstico de BD (não deixar ligado em produção sem necessidade)
  • Healthcheck Compose / orquestrador em /api/health

Quando algo falha: runbooks.