SuperdindaDocs

WAHA fora do ar

O provedor das sessões (WAHA), o gateway ou o Redis caíram — o que para, o que se recupera sozinho e o que conferir na volta.

Sintomas

Quem caiuSinais
WAHAhealthcheck unhealthy no compose; workers logando challenge refresh failed e reconnect restart failed; iniciar pareamento falha com waha POST /api/sessions -> …; nenhum session.status chegando
waha-dbo WAHA não sobe (depende dele service_healthy)
gatewayWAHA não consegue entregar webhooks; GET /health do gateway sem resposta
RedisGET /health da api e do gateway em 503 (degraded); workers logando provider stream read failed e, num reinício, abortando com redis unreachable, aborting boot

Confirmar

No servidor, na pasta do compose
docker compose ps waha waha-db gateway workers redis
docker compose logs --tail 200 waha
docker compose exec waha curl -fsS -H "X-Api-Key: <WAHA_API_KEY>" http://localhost:3000/health
curl -s https://api.superdinda.com/health

O que se recupera sozinho

  • Sessões: ficam no waha-db. Com WHATSAPP_RESTART_ALL_SESSIONS: "true" o WAHA reabre todas ao subir, sem novo vínculo.
  • Webhooks: cada sessão foi criada com retry exponencial (2 s, 10 tentativas). Gateway fora por pouco tempo não perde eventos.
  • Fila: o gateway grava em provider:waha (Redis com --appendonly yes, até ~50 000 entradas) e os workers leem pelo consumer group. Eventos que chegaram antes de os workers voltarem são lidos na volta.
  • Estado: ao voltar, o WAHA manda session.status; WORKING num pareamento degraded o leva de volta a paired, sem notificar de novo.

O que não se recupera sozinho

Em aberto

Durante a queda do WAHA, o tick de reconexão incrementa a tentativa e zera next_retry_at antes de chamar o restart. Se o restart falha (WAHA fora), nada agenda outro: o pareamento fica degraded parado até um session.status novo chegar.

Em aberto

Webhooks que esgotarem as 10 tentativas se perdem, e não há reconciliação com o estado do WAHA (state() não é chamado por ninguém). Entradas cujo handler falhou ficam pendentes no Redis e não são relidas sozinhas.

Passos

  1. Suba o que caiu, na ordem das dependências: redis e waha-db, depois waha, depois gateway e workers. Em produção, pelo Dokploy (compose do backend).
  2. Se o WAHA não sobe, veja os logs. Em produção, WAHA_IMAGE_TAG, WAHA_API_KEY, WAHA_POSTGRES_PASSWORD e WAHA_DASHBOARD_* são obrigatórios (${VAR:?}): faltando um, o deploy falha nomeando a variável.
  3. Se a queda veio de uma troca de imagem, volte a tag anterior (Atualizar o WAHA).
  4. Na volta, abra Clientes → Conexões filtrando degraded. Para cada um parado (sem next_retry_at e sem evento novo na linha do tempo), confira a sessão no WAHA (GET /api/sessions/sd-<pairingUid>): se está WORKING e o pareamento não voltou, ou se não existe mais, use o reset da vaga e peça novo pareamento (Sessão caiu).
  5. Olhe as entradas pendentes: redis-cli XPENDING provider:waha workers.

Outros provedores

  • IPRoyal (API): só as telas de Compras/Orçamento param (catálogo, cotação, saldo). A alocação lê o pool do nosso banco e continua funcionando; os endereços em si não dependem da API.
  • Meta (WhatsApp Business): afeta o envio do link de consentimento, não as sessões. bun run wa:doctor diagnostica número, templates e assinatura do webhook.

Quando escalar

  • WAHA fora com famílias pareadas: acompanhe Conexões até todos os degraded voltarem a paired ou serem tratados.
  • Falha que se repete após subir de novo → abra um problema no vault com logs.

Fontes

  • backend/docker-compose.prod.yml, backend/docker-compose.yml
  • backend/apps/gateway/main.ts, backend/apps/workers/{main,consume-provider-events,reconnect-ticker,challenge-refresher}.ts
  • backend/src/domains/channels/use-cases/{apply-provider-state,start-pairing}.ts, adapters/waha-adapter.ts
  • backend/src/infra/{streams,provider-stream}.ts, backend/src/http/routes/system/health.route.ts
  • backend/src/domains/proxies/use-cases/{allocate,supply}.ts, backend/scripts/wa-doctor.ts
  • Vault: AD-002, AD-010, AD-012, problems/2026-09-11-waha-dashboard-loop-basic-auth

On this page