Pular para conteúdo

Troubleshooting

Diagnostico Geral

# Ver todos os servicos e status
docker service ls

# Ver logs de um servico
docker service logs <service_name> --tail 50 -f

# Ver tasks (incluindo falhas)
docker service ps <service_name> --no-trunc

# Ver detalhes do servico
docker service inspect <service_name> --pretty

Backend nao conecta no MongoDB

Sintoma: SSL routines: tlsv1 alert internal error

Causa: Imagem Docker Alpine tem OpenSSL incompativel com MongoDB Atlas.

Solucao: Usar node:20-slim (Debian) no Dockerfile em vez de node:20-alpine.


Backend nao conecta no MongoDB (timeout)

Sintoma: Timeout ao conectar, sem erro SSL.

Causa: IP do servidor nao esta na whitelist do MongoDB Atlas.

Solucao:

# Descobrir IP publico do servidor
curl -s ifconfig.me
Adicionar em: Atlas > Security > Network Access > Add IP Address


Frontend mostra localhost:3000 nas requisicoes

Sintoma: Requisicoes da API vao para localhost:3000 em vez da URL correta.

Causa: NEXT_PUBLIC_API_URL e injetada em build time. Se o secret nao estava configurado no momento do build, cai no fallback.

Solucao: 1. Verificar que NEXT_PUBLIC_API_URL esta nos secrets do GitHub 2. Forcar novo build:

git commit --allow-empty -m "ci: rebuild com NEXT_PUBLIC_API_URL" && git push origin main


Container reinicia em loop (CrashLoopBackOff)

Sintoma: docker service ps mostra multiplas tasks falhando.

Diagnostico:

docker service logs <service_name> --tail 50

Causas comuns: - .env nao existe no path configurado - Variavel de ambiente obrigatoria faltando - Porta ja em uso por outro servico - Erro de conexao com dependencia (RabbitMQ, MongoDB)


Frontend container crasha com ENOTFOUND

Sintoma: Error: getaddrinfo ENOTFOUND <container_hash>

Causa: Next.js standalone tenta fazer bind no hostname do container.

Solucao: Adicionar no Dockerfile:

ENV HOSTNAME=0.0.0.0
ENV PORT=3000


GHCR retorna 403 Forbidden no pull

Sintoma: docker pull da 403 no servidor, mas login funcionou.

Causas: - Package esta como Private (precisa ser Internal) - Token nao tem permissao read:packages

Solucao: 1. GHCR > Package settings > Visibility > Internal 2. Verificar que o workflow usa GITHUB_TOKEN com packages: write


Servico nao consegue se comunicar com outro

Sintoma: ECONNREFUSED ou ENOTFOUND ao acessar outro servico.

Diagnostico:

# Verificar se ambos estao na mesma network
docker service inspect <service_name> --format '{{.Spec.TaskTemplate.Networks}}'

# Verificar se o servico destino esta rodando
docker service ls | grep <service_name>

Solucao:

# Adicionar network ao servico
docker service update --network-add network_swarm_01 <service_name>


RabbitMQ fila nao existe

Sintoma: Erro ao publicar na fila events.

Causa: A fila quorum e criada pelo consumer (backend) na inicializacao.

Solucao: Garantir que o backend esta rodando. A fila sera criada automaticamente.


WhatsApp desconectou

Sintoma: Mensagens nao sao recebidas/enviadas.

Diagnostico:

docker service logs whatsapp_whatsapp --tail 20

Solucao: Acessar a API do Go-Whatsmeow e re-escanear o QR code.


GCS/Calendar: Invalid JWT Signature ou DECODER routines unsupported

Sintoma: invalid_grant: Invalid JWT Signature ou error:1E08010C:DECODER routines::unsupported

Causa: A private key da service account esta corrompida no .env. O docker service --env-file nao remove aspas e pode corromper \n.

Solucao: Usar GCS_CREDENTIALS_FILE com o JSON original da service account:

# Copiar o JSON para o servidor
scp service-account.json contato@servidor:/opt/marie_ai_backend/gcs-credentials.json

# Montar no container e definir a env var
docker service update \
  --mount-add type=bind,source=/opt/marie_ai_backend/gcs-credentials.json,target=/opt/marie_ai_backend/gcs-credentials.json,readonly \
  --env-add GCS_CREDENTIALS_FILE=/opt/marie_ai_backend/gcs-credentials.json \
  --force marie_ai_backend

WhatsApp: no LID found

Sintoma: no LID found for 55XXXXXXXXXXX@s.whatsapp.net from server

Causa: Alguns numeros brasileiros estao registrados no WhatsApp com 8 digitos (sem o 9° digito).

Solucao: O sistema faz retry automatico removendo o 9° digito. Se o problema persistir, verifique se o numero realmente tem WhatsApp.


Agent envia JSON cru de tool call ao lead

Sintoma: O lead recebe uma mensagem como:

[{"type":"functionCall","functionCall":{"name":"schedule_meeting","args":{...},"id":"uE214n7t"}}]
ao inves de uma resposta em linguagem natural. Extremamente raro (visto 1x em milhares).

Causa: O modelo Gemini (via @langchain/google-genai) ocasionalmente retorna AIMessages cujo content e um array estruturado no formato nativo do Google GenAI ([{type: "functionCall", functionCall: {...}}]). Se o loop do ReAct termina nessa mensagem (recursion limit atingido, tool nao executada, modelo emite o function call como turno final), um fallback JSON.stringify(content) despeja o JSON inteiro como texto enviado ao usuario.

Mitigacao aplicada (commit "fix: prevent raw function-call JSON leaking to WhatsApp"):

  1. src/agent/agent.ts agora extrai apenas as partes de texto do content via extractTextFromContent — partes functionCall, function_call, functionResponse, tool_use sao deliberadamente descartadas.
  2. extractFinalAgentText percorre as mensagens de tras para frente em busca da ultima AIMessage com texto real. Se nada e encontrado, retorna string vazia (nao ha fallback para JSON.stringify).
  3. Todos os call-sites de sendWhatsAppMessageSplit que recebem resposta do agente fazem early-return + warn quando a resposta esta vazia.
  4. sendWhatsAppMessage / sendWhatsAppMessageSplit em src/infra/gowa.ts tem detector looksLikeRawToolCallJson como ultima linha de defesa que recusa enviar conteudo suspeito.
  5. Evento agent.empty_response e emitido em internal_events quando a resposta sai vazia — pode ser monitorado.

Como diagnosticar caso ocorra novamente:

# Procurar no MongoDB pelos eventos
db.internal_events.find({ type: "agent.empty_response" }).sort({timestamp: -1}).limit(10)

# Procurar nos logs do backend pelo warn/error
docker service logs marie_ai_backend --tail 200 | grep -E "empty response|raw tool-call JSON|Agent produced no user-facing text"

Sinais relacionados: - last_message_has_tool_calls=true no log: o agente parou no meio de uma tool call. - Acontece mais quando o recursionLimit do createReactAgent (default 25) e atingido. Considere subir o limit se virar recorrente. - O agent.empty_response consecutivo no mesmo chat_id indica problema sistemico — verifique system_prompt e ferramentas configuradas.


GitHub Actions falha no SSH

Sintoma: error: missing server host ou timeout no SSH.

Causas: - Secret de host/user/key nao configurado no environment correto - Firewall bloqueando porta 22 - Chave SSH invalida

Verificar: 1. Confirmar que os secrets existem no environment marie_ai_swarm_manager_01 2. Testar SSH manualmente: ssh -i key user@host