name: hm-deploy description: Validação de deploy por distribution model. Use antes de subir pra produção pela primeira vez, quando o ambiente local parou de funcionar, quando mudou infra, ou para validar que qualquer pessoa consegue subir o projeto do zero. Cobre 6 modelos distintos com checks próprios — Container/Docker, Serverless/Edge (Vercel/CF), Desktop (Electron), Mobile (Expo/RN), Library/SDK (npm/PyPI), CLI tool. Security Gate primeiro: se falha, não continua.
/hm-deploy — Validação de Deploy (v3)
Você está agora em modo deploy. Seu trabalho e garantir que o projeto está pronto pra sair do local e ir pro mundo. Ou que o ambiente local esta saudavel e reprodutivel.
Princípio central
Deploy não é o último passo. E uma camada de engenharia. Se o deploy e frágil, o produto e frágil. Se levantar o ambiente depende de conhecimento tribal, o projeto não está pronto. Segurança de deploy não é checklist final — e pré-requisito.
Quando usar
- Antes de subir pra produção pela primeira vez
- Quando o ambiente local parou de funcionar
- Quando mudou infra (novo servico, nova porta, nova variavel)
- Pra validar que qualquer pessoa consegue subir o projeto do zero
- Depois de uma refatoracao significativa
O que você valida
0. Distribution Model (PRIMEIRO — define os checks aplicaveis)
Identifique o modelo de distribuicao antes de qualquer auditoria. Cada modelo tem checks próprios — pular o que não se aplica e parte do trabalho.
| Modelo | Exemplos | Checks aplicaveis |
|---|---|---|
| Container/Docker | API com Postgres+Redis, monolitos | DOMÍNIO 1 inteiro, secrets em compose, multi-stage |
| Serverless/Edge | Vercel, Netlify, CF Workers | Cold start, env vars no dashboard, edge runtime, build output |
| Desktop (Electron) | macOS .app, Windows .exe | electron-builder config, contextIsolation, nodeIntegration false, code signing, secrets embedded warning, auto-update |
| Mobile (Expo/RN) | Apps na App Store / Play | EAS build, certs, App Transport Security, OTA updates, native modules ABI |
| Library/SDK | npm package, PyPI | semver, exports, types, lock file, supply chain, provenance, sem ANY no surface |
| CLI tool | Binario standalone | Cross-platform builds, signing, install path, autoupdate via release |
Pula seções que não se aplicam. Ex: app Electron NÃO tem .dockerignore — pule DOMÍNIO 1.1. Library NPM NÃO tem migrations — pule DOMÍNIO 3.
Checks por modelo (além do Security Gate)
Container/Docker (cobre DOMÍNIO 1 inteiro abaixo)
Serverless/Edge:
- Build output dentro do limite (Vercel: 50MB unzipped por function)?
- Cold start <1s pra rotas criticas? Se não, considerar warming ou edge runtime.
- Env vars sensíveis no dashboard, NUNCA em
next.config.js? - Edge runtime constraints respeitadas (sem
node:modules, sem fs, sem better-sqlite3)? - ISR/cache headers configurados?
- Domain + SSL configurados pré-deploy?
Desktop (Electron):
contextIsolation: true+nodeIntegration: false+sandbox: true(default em Electron 28+)?- Sem preload script expondo APIs perigosas? Se tem preload, exporta apenas APIs minimas via
contextBridge? webSecurity: true(NUNCAfalse)?- Code signing configurado (mesmo que sem identity em dev — documentar warning)?
- Auto-update via electron-updater? Ou ship manual?
- Secrets bundled na .app:
.env.localou similar copiado pro Resources/ — distribuir publicamente vaza secrets. Documentar. - Native modules (better-sqlite3, sharp) com ABI Electron rebuild correto?
app.disableHardwareAcceleration()se necessario?setAppUserModelId(Windows) e bundle id (macOS) corretos?- Versão Electron com zero CVEs HIGH?
bun audit/npm auditlimpo?
Mobile (Expo/RN):
- EAS build profile (development, preview, production) configurado?
- Certificados/provisioning iOS via EAS?
- Android keystore versionado em local seguro (NÃO no repo)?
app.jsoncom bundle ID, version, build number corretos?- Permissions declaradas (camera, location, etc) com justificativa?
- App Transport Security: zero
NSAllowsArbitraryLoads = trueem prod? - OTA updates configuradas (
expo-updates) ou versão nativa pinada? - Native modules com versões compatíveis com SDK Expo?
- Firebase/analytics SDKs com config files certos por env?
Library/SDK:
- Lock file commitado (package-lock.json, poetry.lock)?
package.jsoncomexportsmap definido (ESM + CJS quando aplicavel)?- Types em
.d.tsoutypesfield correto? filesfield limita o que vai pro registry (semnode_modules, sem.env, sem testes)?- Zero
anyno surface público? - Semver respeitado: breaking change = major bump?
- README com installation + quick start + API reference?
- Provenance (npm provenance ou cosign) configurado pra supply chain?
- CI pública via OIDC (sem NPM_TOKEN secreto)?
- Tag git assinada pra cada release?
CLI tool:
- Cross-platform builds (Linux x64/arm64, macOS x64/arm64, Windows x64)?
- Signed binaries (Apple Developer ID, Authenticode)?
- Install path padroniza (Homebrew fórmula, Scoop manifest, .deb, AUR)?
- Help text (
--help,-h) cobre todos os comandos? - Versão reportada via
--version? - Update check opt-in (sem auto-update silencioso)?
- Logs vao pra path padrão do OS (XDG_STATE_HOME, ~/Library/Logs, %APPDATA%)?
1. Security Gate (Container — pular se modelo != Docker)
Esta seção é bloqueante. Se qualquer item CRÍTICO falhar, o deploy NÃO está pronto. Não importa se tudo mais funciona.
| Check | Criterio | Severidade |
|---|---|---|
.dockerignore |
Existe em CADA servico com Dockerfile. Exclui: .env, .env.*, .git, node_modules, __pycache__, .venv, .next |
CRÍTICO — sem isso, secrets vazam nas layers da imagem Docker. Qualquer pessoa com acesso a imagem extrai .env |
| Dockerfile prod-ready | Multi-stage build. Sem gcc/dev-headers na imagem final. Sem npm run dev. Sem --reload. Sem --debug. |
CRÍTICO — dev server em produção = hot reload instável + source maps expostos + info leak |
| Non-root user | Container roda como user não-root (USER appuser) |
ALTO — se o container for comprometido, atacante tem root |
| Build secrets | Nenhum secret em Dockerfile (COPY, ARG, ENV com valores reais) | CRÍTICO — visível em docker history, irrecuperavel |
| Secrets em compose | docker-compose.yml usa ${VAR} ou env_file, nunca valores literais de secrets |
CRÍTICO — compose commitado no git = secrets públicos |
| Entrypoint separado | dev (com --reload) e prod (sem --reload) sao entrypoints diferentes | ALTO — um único entrypoint tenta servir dois propositos e falha em ambos |
| Dependency audit | Zero CVEs HIGH/CRITICAL em dependências (npm audit, pip audit) |
ALTO — vulnerabilidade conhecida e porta aberta |
| CORS | Configurável via env var. Nunca * em produção. Nunca hardcoded localhost. |
ALTO — CORS * permite qualquer origem fazer requests autenticados |
| Swagger/Debug | /docs, /redoc, debug mode desabilitados quando APP_ENV != development |
ALTO — endpoints de documentação expoe toda a API surface |
Se .dockerignore não existe: PARA TUDO. Cria antes de continuar a validação.
1. Docker & Containers
Subida:
docker compose upsobe todos os servicos sem erro?- Todos os containers ficam healthy? (não só running — healthy)
- A ordem de dependência esta correta? (banco antes da API, etc)
- Logs dos containers mostram startup limpo?
Rebuild:
- Mudancas de código sao refletidas apos
docker compose build <service> && docker compose up -d <service>? - O Dockerfile usa multi-stage build?
- Cache de layers esta otimizado? (deps antes de code copy)
- Imagem final não tem ferramentas de dev desnecessarias?
- Tamanho da imagem final e razoável? (Python slim < 200MB, Node alpine < 150MB)
Dados sagrados:
- Volumes sao nomeados (nunca anonymous)?
docker compose down(sem -v) preserva todos os dados?- Dados do banco sobrevivem a rebuild de container?
- Se tem dados de produção local, estao protegidos contra
down -v?
2. Environment & Configuração
.env.exampleexiste e tem TODAS as variaveis necessarias?- Nenhum secret esta hardcoded no código ou no docker-compose.yml?
- Variaveis sensíveis estao marcadas como tal no .env.example? (com
change-meouyour-key-here) - Valores padrão fazem sentido pra dev local?
- Ports estao documentados e não colidem com outros projetos?
Checklist de ports:
Manter um registro vivo dos ports usados por todos os projetos do mesmo ecossistema que rodam em paralelo na máquina do dev. Cada projeto novo deve consultar e reservar ports que não colidem.
Estrutura típica de port allocation:
| Projeto | API/Backend | Web/Frontend | Postgres | Redis | Outros (MinIO/S3, etc) |
|---|---|---|---|---|---|
| 8000 | 3000 | 5432 | 6379 | — | |
| 8001 | 3001 | 5433 | 6380 | — | |
| 8002 | 3002 | 5434 | 6381 | MinIO 9000-9001 |
Faixa sugerida pra novo projeto: API 8000+N, Web 3000+N, Postgres 5432+N, Redis 6379+N — onde N e o próximo livre.
Anti-patterns:
- Dois projetos disputando porta 5432 ou 3000.
- Ports hardcoded em código (deve ser env var).
- Ports diferentes em
.env.examplevsdocker-compose.yml.
3. Database & Migrations
- Migrations rodam automaticamente no boot do container?
- Migrations estao em ordem e não tem gaps?
- Nenhuma migration e destrutiva sem ser reversível?
- Schema atual reflete todas as migrations aplicadas?
- Conexão do app com o banco funciona logo apos subir?
4. Health & Monitoramento
- Endpoint de health check existe? (
/healthou/api/health) - Health check retorna status dos servicos dependentes (banco, cache, etc)?
- Health check NÃO retorna só
{"status": "ok"}— verifica conexão real com DB e Redis - Logs sao estruturados e úteis (não verbose demais)?
- Erros sao logados com contexto suficiente pra debuggar?
5. Reprodutibilidade
O teste definitivo: clone limpo.
- Clone o repo
- Copie
.env.examplepra.env - Rode
docker compose up - O projeto funciona?
Se qualquer passo extra é necessário, esta faltando documentação ou automação.
6. Segurança de deploy (checklist complementar)
Além do Security Gate (seção 0), verificar:
- Nenhum port desnecessario exposto
- HTTPS configurado (se produção/homologacao)
- Secrets não estao nos logs de build
.envesta no.gitignore- Rate limiting em endpoints públicos
- Security headers configurados (X-Content-Type-Options, X-Frame-Options, etc.)
- Logs não contem secrets, tokens, ou senhas
7. Scripts & DX
- Existe um README ou ARCHITECTURE.md com instrucoes de setup?
- O setup é um comando (ou no máximo dois)?
- Scripts de desenvolvimento estao documentados? (como rodar testes, como rebuildar, etc)
- Makefile ou scripts de conveniencia existem se necessario?
Formato do output
SECURITY GATE
[Check]: PASSED/FAILED (detalhes)
Gate: PASSED / BLOCKED (N criticos, M altos)
CONTAINERS
[Servico]: healthy/unhealthy (detalhes)
Build: OK/FALHOU (detalhes)
Dados: protegidos/em risco (detalhes)
ENVIRONMENT
.env.example: completo/incompleto (variaveis faltando)
Secrets: seguros/expostos (detalhes)
Ports: OK/conflito (detalhes)
DATABASE
Migrations: OK/falhou (detalhes)
Conexão: OK/falhou
Dados persistentes: sim/não
HEALTH
Endpoint: existe/não existe
Servicos: todos healthy/X unhealthy
REPRODUTIBILIDADE
Clone limpo: funciona/falha no passo X
SEGURANÇA COMPLEMENTAR
[Check]: OK/issue (detalhes)
VEREDICTO
Pronto pra deploy / BLOQUEADO — X criticos, Y altos pra resolver primeiro
Para auditoria de segurança completa (OWASP ASVS, LLM, multi-tenant, business logic), usar
/hm-securityapos o deploy estar funcional.
Regras
- Security Gate é a PRIMEIRA coisa que roda. Se falha, não continua.
- Nunca assuma que "funciona na minha máquina" e suficiente
- Dados sao sagrados. Se a validação mostra risco de perda de dados, é CRÍTICO.
- Todo finding tem fix especifico. Não só "configure melhor."
- Se o projeto não sobe do zero com um comando, é finding.
- Se um secret está exposto, é CRÍTICO. Sem exceção.
- Se
.dockerignorenão existe, é CRÍTICO. Ponto. - Se Dockerfile roda dev server ou --reload, é CRÍTICO. Ponto.
- Se container roda como root, é ALTO. Ponto.
- Teste o clone limpo mentalmente (ou de fato). Cada passo manual e divida técnica.
- O padrão: um engenheiro novo entra no time na segunda-feira e tem o projeto rodando antes do almoco.