Fase 04 — Operação
HITL #11 Aprovado Operations

Fase 04 — Operação

CI/CD, GMUD, SLOs, DORA metrics, infraestrutura e A/B testing.

CI/CD Pipeline

Estratégia de Deploy
Single VPS + PM2 + Nginx + Let’s Encrypt SSL

Domínio: food.ecportilho.com

Process Manager: PM2 (zero-downtime reload)

Reverse Proxy: Nginx

SSL: Let’s Encrypt via Certbot

Build Pipeline — 7 Steps

StepComandoDescrição
1. pull_latestgit pull origin mainAtualizar código-fonte
2. install_dependenciesnpm ci --production=falseInstalar dependências (incluindo devDeps para build)
3. build_frontendnpm run buildBuild do React SPA via Vite → client/dist/
4. run_seednpm run seedPopular SQLite com dados iniciais (idempotente)
5. register_webhooknpm run register-webhookRegistrar webhook no ecp-digital-bank (idempotente)
6. restartpm2 reload ecosystem.config.cjsReload graceful (zero-downtime)
7. verify_healthcurl -sf http://127.0.0.1:3000/api/categoriesHealth 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

GMUD-FOODFLOW-001
Deploy Inicial — FoodFlow Marketplace MVP em Produção

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érioValidação
Aplicação respondendo com SSLcurl -sf https://food.ecportilho.com/ retorna HTML
API funcionalGET /api/categories retorna 200
Autenticação funcionalPOST /api/auth/login retorna JWT válido
Integração banco acessívelPOST /api/payments/bank-auth retorna token
Webhook registradoecp-digital-bank confirma registro
PM2 estável 30 minpm2 status mostra 0 restarts

Service Level Objectives (SLOs)

Janela de medição: Rolling 30 dias.

SLO-1: Disponibilidade da API
99.5%
Requisições HTTP 2xx/4xx (excluindo 5xx). Error budget: 3.6h downtime/mês. Alerta: < 99.0%
SLO-2: Latência P95 — Catálogo
200ms
95% das requisições GET em /api/restaurants e /api/categories completam em < 200ms. Alerta: > 350ms
SLO-3: Latência P95 — Pagamento
2000ms
95% das requisições em /api/payments/* completam em < 2s (inclui chamada ao banco). Alerta: > 3000ms
SLO-4: Error Rate
< 0.5%
Taxa de erros 5xx no total de requisições por janela de 1 hora. Alerta: > 1.0%
SLO-5: Tempo de Entrega SSE (PIX)
2000ms
Evento SSE payment_update entregue ao frontend em < 2s após webhook recebido. Alerta: > 5000ms

DORA Metrics

MétricaTargetBand AlvoComo 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

PM2 — Process Manager
  • 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
Nginx — Reverse Proxy
  • 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.

A/B Testing (Futuros)

Experimento 1
Hero Banner: Promo do Dia vs Personalizado
KR1 (Conversão)
Testar se hero banner com recomendação personalizada converte melhor que promoção genérica do dia.
Experimento 2
Checkout: 2 Passos vs 3 Passos
KR1 (Conversão)
Testar se consolidar endereço+cupom em um passo reduz abandono de carrinho.
Experimento 3
Cupom de Retorno: R$ 5 vs Frete Grátis
KR2 (Recompra)
Testar qual incentivo gera melhor taxa de recompra em 7 dias entre usuários do segundo pedido.

Artefatos Gerados

04-product-operation/ops-output.json docs/gmud/GMUD-001.md docs/install/install-ecp-digital-food-win.md