Files
b2bcall/docs/OPERATIONS.md
B2BCall Bootstrap 80e72881b2 feat: Fase 9/10 — métricas, scripts operacionais, callback/wrap-up e aceite final
Fase 9 (segurança e produção):
- GET /api/metrics: endpoint Prometheus com métricas reais (chamadas,
  agentes, filas, CPS por campanha), protegido por permissão
- scripts/backup.sh, restore.sh, healthcheck.sh, install.sh, update.sh —
  testados contra o ambiente real (backup.sh e healthcheck.sh rodados de
  verdade; install.sh/update.sh validados por inspeção, ambiente atual já
  provisionado)
- POST /api/agent-console/dispose: aplica disposição de chamada de verdade
  (lacuna deixada aberta desde a Fase 6), com ações CALLBACK (agenda
  retorno) e DO_NOT_CALL (suprime automaticamente)
- apps/dialer-worker/src/callback-sweep.ts: reativa leads com callback
  vencido; GET /api/callbacks para consulta
- apps/dialer-worker/src/wrap-up-sweep.ts: transição automática
  WRAP_UP -> AVAILABLE + despausa real na fila do Asterisk. Exigiu corrigir
  main.ts para conectar ao AMI mesmo em DIALER_SIMULATION=true
  (DIALER_SIMULATION deve impedir só originação de chamada, não ações
  administrativas de fila)
- nftables revisado (sem alterações necessárias)
- Documentação completa: INSTALL, OPERATIONS, BACKUP_RESTORE, SECURITY,
  DATABASE, API, ASTERISK, OPENSIPS (não implementado, motivo
  documentado), TROUBLESHOOTING
- README.md e CHANGELOG.md reescritos

Fase 10 (testes e aceite):
- Quality gate completo executado: build/typecheck (7 workspaces), lint,
  46 testes unitários, docker compose config/ps, healthcheck — tudo verde
- Aceite de segurança (seção 92): 13 itens verificados ao vivo contra o
  sistema real, não só por inspeção de código
- Aceite Asterisk (seção 93): os 5 comandos executados e documentados,
  comunicação API->AMI->Asterisk validada
- docs/RELATORIO_FINAL.md: relatório final no formato da seção 96

Todos os fixtures de teste desta fase foram removidos/desativados ao
final. Credenciais de acesso entregues separadamente em CREDENCIAIS.txt
(fora do git, nunca versionado).
2026-08-27 19:16:14 -03:00

3.7 KiB

B2BCall — Operação

Comandos do dia a dia

Tarefa Comando
Ver status de tudo bash scripts/healthcheck.sh
Ver logs de um serviço docker compose logs -f api (troque api pelo serviço)
Reiniciar um serviço docker compose restart api
Aplicar atualização de código sudo ./scripts/update.sh
Backup manual sudo ./scripts/backup.sh
Restaurar backup sudo ./scripts/restore.sh backups/postgres-<ts>.dump
Console do Asterisk docker exec -it b2bcall-asterisk asterisk -rvvv
Ver regras de firewall ativas nft list table inet b2bcall_fw

Atualização (scripts/update.sh)

  1. git pull --ff-only (se for um clone git).
  2. pnpm install --frozen-lockfile.
  3. prisma migrate deploy contra o Postgres (via 127.0.0.1:5432, fora dos containers).
  4. docker compose build — rebuilda só as imagens cujo contexto mudou (cache do Docker layer a layer).
  5. docker compose up -d — recria containers com imagem nova.
  6. scripts/healthcheck.sh.

Não há downtime zero: durante o rebuild/restart de api/frontend/nginx há uma janela curta de indisponibilidade (segundos). O Asterisk e as chamadas em andamento não são afetados a menos que a migration exija mudança incompatível em tabelas usadas pelo Realtime (raro — revisar a migration antes de rodar em produção com campanhas ativas).

Rotina recomendada de produção

  • Backup diário via cron (docs/BACKUP_RESTORE.md).
  • Monitoramento: apontar Prometheus para http://api:3000/api/metrics de dentro da rede Docker (b2bcall-net) — o endpoint exige uma sessão autenticada (permissão monitoring.view) e não é exposto via Nginx, então um scraper externo precisaria de uma integração dedicada (fora do escopo atual; hoje o uso pretendido é observabilidade interna/manual).
  • Alertas mínimos recomendados: b2bcall_calls_abandoned_total / b2bcall_calls_total acima do limiar de compliance (ver GET /api/compliance/indicators, que já calcula isso), containers não saudáveis (docker compose ps), espaço em disco (dumps + logs do Asterisk).
  • Rotação de logs do Asterisk: /var/log/asterisk dentro do volume asterisk-log cresce indefinidamente sem logrotate configurado — não incluído nesta fase (ver TODO.md, limitação conhecida).

Escalando além do laboratório atual

O ambiente original (1.9 GiB RAM / 2 vCPU) é suficiente para desenvolvimento e para o modo DIALER_SIMULATION=true, não para volume real de discagem (docs/ARCHITECTURE.md §1). Para produção real:

  1. Aumentar para pelo menos 4 vCPU / 8 GiB RAM.
  2. Revisar mem_limit de cada serviço em docker-compose.yml (hoje conservador para caber em 1.9 GiB).
  3. Considerar mover Postgres/Redis para fora do mesmo host do Asterisk se o volume de CDR/CEL crescer muito (arquitetura já separa os dois logicamente — schema asterisk dedicado — o que facilita migrar depois).
  4. Colocar OpenSIPS na frente do Asterisk para múltiplos troncos/roteamento avançado (não implementado nesta fase — ver docs/OPENSIPS.md).

HTTPS

Não configurado nesta fase (a rede é privada, sem IP público — seção 5). Para expor com TLS:

  1. Obter certificado (Let's Encrypt via DNS challenge, já que não há IP público para HTTP-01, ou certificado interno/self-signed para uso só na LAN).
  2. Editar infrastructure/nginx/nginx.conf: adicionar bloco listen 443 ssl; com ssl_certificate/ssl_certificate_key, e um bloco listen 80 que só redireciona para 443.
  3. Publicar a porta 443 em docker-compose.yml (serviço nginx).
  4. Atualizar infrastructure/nftables/ se necessário (443 já não é bloqueado por padrão, só os serviços administrativos do Asterisk são).