Fase 04 — Operação
CI/CD, GMUD, SLOs, DORA metrics, infraestrutura e A/B testing.
CI/CD Pipeline
Domínio: food.ecportilho.com
Process Manager: PM2 (zero-downtime reload)
Reverse Proxy: Nginx
SSL: Let’s Encrypt via Certbot
Build Pipeline — 7 Steps
| Step | Comando | Descrição |
|---|---|---|
| 1. pull_latest | git pull origin main | Atualizar código-fonte |
| 2. install_dependencies | npm ci --production=false | Instalar dependências (incluindo devDeps para build) |
| 3. build_frontend | npm run build | Build do React SPA via Vite → client/dist/ |
| 4. run_seed | npm run seed | Popular SQLite com dados iniciais (idempotente) |
| 5. register_webhook | npm run register-webhook | Registrar webhook no ecp-digital-bank (idempotente) |
| 6. restart | pm2 reload ecosystem.config.cjs | Reload graceful (zero-downtime) |
| 7. verify_health | curl -sf http://127.0.0.1:3000/api/categories | Health check da aplicação |
Rollback
Trigger: Health check falha após deploy OU erro crítico em pagamentos nas primeiras 2 horas.
Comando: git checkout HEAD~1 && npm ci && npm run build && pm2 reload ecosystem.config.cjs
Tempo estimado: 5 minutos
GMUD
Tipo: Normal | Prioridade: Alta | Risco: Baixo-Médio (10/30)
Escopo: Provisionamento de VPS, instalação de Node.js 20 LTS + PM2 + Nginx + Certbot, deploy da aplicação, seed data (6 restaurantes, 24 itens, 3 usuários), configuração de SSL, registro de webhook no ecp-digital-bank, DNS food.ecportilho.com.
Janela: Sábado 10:00-12:00 BRT | Duração estimada: 45 minutos | Monitoramento: 2h após deploy
Critérios de Sucesso
| Critério | Validação |
|---|---|
| Aplicação respondendo com SSL | curl -sf https://food.ecportilho.com/ retorna HTML |
| API funcional | GET /api/categories retorna 200 |
| Autenticação funcional | POST /api/auth/login retorna JWT válido |
| Integração banco acessível | POST /api/payments/bank-auth retorna token |
| Webhook registrado | ecp-digital-bank confirma registro |
| PM2 estável 30 min | pm2 status mostra 0 restarts |
Service Level Objectives (SLOs)
Janela de medição: Rolling 30 dias.
DORA Metrics
| Métrica | Target | Band Alvo | Como Medir |
|---|---|---|---|
| Deployment Frequency | 1-2x por semana | Medium | Contagem de pm2 reload em produção por semana |
| Lead Time for Changes | < 1 dia | High | Timestamp do merge no main vs timestamp do deploy |
| Change Failure Rate | < 15% | Medium | Deploys com rollback / total de deploys no período |
| Mean Time to Recovery | < 30 minutos | High | Tempo entre detecção do incidente e restauração confirmada |
Targets calibrados para MVP com equipe enxuta e VPS único. Futuro: CI/CD automatizado via GitHub Actions.
Infraestrutura
- Métricas: CPU, memória, restarts, uptime
- Log rotation: max 50MB, retenção 10 arquivos, compress
- Logs stdout: ~/.pm2/logs/foodflow-out.log
- Logs stderr: ~/.pm2/logs/foodflow-error.log
- Access log: /var/log/nginx/foodflow-access.log
- Error log: /var/log/nginx/foodflow-error.log
- SSL: Let’s Encrypt (Certbot auto-renew)
- Health check: GET /api/categories a cada 60s, timeout 5s
Variáveis de Ambiente (15)
NODE_ENV, PORT, HOST, JWT_SECRET, JWT_REFRESH_SECRET, DB_PATH, CORS_ORIGIN, ECP_BANK_API_URL, ECP_BANK_PLATFORM_EMAIL, ECP_BANK_PLATFORM_PASSWORD, ECP_BANK_PLATFORM_PIX_KEY, ECP_BANK_PLATFORM_PIX_KEY_TYPE, ECP_BANK_PIX_EXPIRATION_MINUTES, ECP_BANK_WEBHOOK_SECRET, FOODFLOW_PUBLIC_URL
Arquivo .env na raiz do projeto no VPS. NUNCA commitar no repositório.