Runbooks
Última atualização: 16/09/2026.
Procedimentos curtos para quando produção (ou HML) quebra. Sempre sanitize logs antes de colar em chat. Canal de segurança: SECURITY.md.
0. Primeiros 5 minutos (qualquer alerta)
GET /backend/api/health.php— se 503, é env/banco; se 200, o PHP sobe.docker compose logs --tail=200 app(ou log do painel).- Tabela / arquivo
backend/logs/<modulo>/do horário do incidente. - Confirme se o incidente é só um WL ou global (isso muda rollback).
Não reinicie o container em loop: sessões e uploads estão em volume, mas restart no meio de migration deixa schema pela metade.
Login recusado para todo mundo
Sintomas: 401 genérico, overlay infinito, rate limit.
| Hipótese | Checagem | Ação |
|---|---|---|
| Banco fora | health db: false | subir MySQL, conferir max_connections |
DB_* errado no painel | warning no entrypoint | corrigir env e recriar container |
Cookie secure em HTTP | SESSION_SECURE=1 sem TLS | alinhar proxy/TRUST_PROXY |
| Fingerprint UA (app móvel / PWA) | logs session | não desligar fingerprint; ajustar proxy UA |
| Rate limit saturado | backend_rate_limits | limpar linhas da ação login daquele IP depois de confirmar que não é brute force |
Usuário único inativo: status em users.status. Senha: fluxo forgot.
Health 503 / “limite de conexões”
Mensagem amigável mapeada em backend_map_exception_for_client.
SHOW STATUS LIKE 'Threads_connected';- Matar sleep queries longas de polling de credenciamento se estiverem empilhadas.
- Não aumentar
max_user_connectionsno susto — o PHP abre conexão por request e os*_ensure_schema()pesam.
Dashboard / transações vazios
- Token Movingpay:
MOVINGPAY_TOKEN_USAGE_TRANSACOESHML vs PROD. customer_idbate com o ambiente?- Permissão
transacoes.visualizar/dashboard.ver_todose recorte de WL. - Polling do browser:
backend/api/transacoes/polling.phpeassets/js/polling-transacoes.js. - Relógio do servidor vs filtro de período.
Credenciamento / terminal preso em pendente
- Logs
backend/logsdo módulo estabelecimentos / movingpay. - Daemon CLI de polling (
polling_background_service.php) — só corre em CLI. Se ninguém disparou o processo, o HTTP de polling precisa ser chamado. - Estabelecimento local vs remoto (
listar-remotos). - Após rename Entrepay → Adquirente: código velho falando nome antigo de tabela indica imagem desatualizada.
Upload / Google Drive
GET /backend/api/storage/drive-health.php(sessão admin).- No container: JSON em
backend/secrets/ou envGOOGLE_DRIVE_SERVICE_ACCOUNT_JSON. - Bind mount do compose exige arquivo no host antes do up.
- Pasta
GOOGLE_DRIVE_USER_MEDIA_FOLDER_IDcompartilhada com a service account (Shared Drive). - nginx
client_max_body_size 200m— uploads maiores falham no proxy, não no PHP.
Arquivo local: uploads/ no volume. Sem volume, recriar container “apaga”
binários que não foram para o Drive.
Autentique: documento não muda de status
- Webhook chegou? Tabela
assinatura_webhook_eventos(event_hash). - Header
X-Autentique-SignaturevsAUTENTIQUE_SIGNATURE_SECRET. - URL pública do webhook acessível sem sessão (
assinaturas/webhook.php). - Token GraphQL (
AUTENTIQUE_TOKEN) não expirou.
Tarefas / Comercial sumiram do menu
tenant_modulesparatasks/ módulo comercial daquelewhite_label_id.- Flags
tarefas.*/leads.*no usuário e no escopo do WL. - Fail-safe: exceção na consulta de módulo esconde o grupo inteiro — veja log PHP.
Comissões divergentes
- Confirme modelo de taxa (MDR vs custo efetivo) do WL.
- Período e estabelecimento filtro.
- API externa
financeiro/external/comissoes.phpusa token, não cookie. Token vazado: revogue emfinanceiro_api_tokense emita outro. - Não recarregue apuração em cima de export já enviado ao parceiro sem registrar o recálculo.
CPU / disco
- Logs JSON sem rotação: truncar
backend/logscom mais de N dias (manter 14 dias em prod, 3 em HML) depois de backup. - Polling agressivo no browser: várias abas do dashboard.
ensure_schemaem todo request de módulo novo — sintoma de schema ainda não aplicado; rode a migration e o custo cai.
Incidente de segurança (vazamento / auth bypass)
- Não discuta PoC em issue pública.
- Rotacione todos os segredos que possam ter saído (DB, Movingpay, Autentique, Drive, SMTP, OpenAI, tokens financeiros).
- Invalide sessões (apague o volume
sessionsou os arquivos embackend/storage/sessions). - Siga SECURITY.md e registre
request_iddos logs.
Contatos
- Código / deploy: time dono do repo (CODEOWNERS).
- Banco: DBA / painel do MySQL do ambiente.
- Gateway: suporte Movingpay / Autentique / PayUp com o
customer_idde HML/prod correto (nunca misturar).