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
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"}}]
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"):
src/agent/agent.tsagora extrai apenas as partes de texto docontentviaextractTextFromContent— partesfunctionCall,function_call,functionResponse,tool_usesao deliberadamente descartadas.extractFinalAgentTextpercorre 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).- Todos os call-sites de
sendWhatsAppMessageSplitque recebem resposta do agente fazem early-return + warn quando a resposta esta vazia. sendWhatsAppMessage/sendWhatsAppMessageSplitemsrc/infra/gowa.tstem detectorlooksLikeRawToolCallJsoncomo ultima linha de defesa que recusa enviar conteudo suspeito.- Evento
agent.empty_responsee emitido eminternal_eventsquando 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