Chatbot customizado n8n funciona em alguns dispositivos mas não em outros (problema de fetch/webhook?)

Oi a todos,
Estou executando uma instância n8n auto-hospedada em uma VPS da Hostinger atrás do Traefik.
Construí meu próprio chatbot JavaScript customizado que envia requisições diretamente para um webhook n8n usando fetch().
O problema estranho é que o chatbot funciona perfeitamente em alguns dispositivos, mas falha completamente em outros.
Por exemplo:
:white_check_mark: Funciona no meu celular.
:white_check_mark: Funciona no meu computador.
:cross_mark: Não funciona no computador da minha mãe.
:cross_mark: Alguns outros usuários também relatam o mesmo problema.
O importante é que o problema é específico do dispositivo, não do usuário.
Há alguns meses atrás mudei meu domínio do webhook porque achei que o software antivírus estava bloqueando.
Originalmente eu usava outro domínio, mas mudei tudo para:

usando Traefik com HTTPS.
Infelizmente, nada mudou. O chatbot ainda funciona em alguns dispositivos, mas não em outros.
Hoje também consertei outro problema onde o Traefik havia parado porque o Nginx estava ocupando a porta 80. O Traefik agora está funcionando corretamente, o HTTPS funciona e o webhook está acessível.
A parte confusa é:
Em dispositivos onde funciona, tudo é perfeito.
Em dispositivos onde não funciona, a requisição nunca parece chegar corretamente ao chatbot.
Meu frontend exibe „Erro desconhecido", mas essa mensagem é minha própria mensagem de fallback, não um erro do n8n. É mostrada sempre que o fetch() do JavaScript falha ou a requisição não pode ser concluída.
O fluxo de trabalho em si funciona corretamente quando a requisição chega ao n8n.
Estou anexando capturas de tela de:
Minha configuração.
Executações de fluxo de trabalho bem-sucedidas.
O comportamento do frontend.
Alguém já vivenciou uma situação onde um webhook funciona em alguns dispositivos, mas não em outros?
Poderia estar relacionado a:
CORS?
Segurança do navegador?
Software antivírus?
DNS ou SSL?
Proxy reverso (Traefik)?
Algo mais que estou deixando passar?
Ademais, qual seria a melhor forma de debugar por que fetch() funciona em alguns dispositivos mas falha em outros?
Qualquer sugestão seria muito apreciada.

Descreva o problema/erro/pergunta

Qual é a mensagem de erro (se houver)?

Por favor, compartilhe seu fluxo de trabalho

(Select the nodes on your canvas and use the keyboard shortcuts CMD+C/CTRL+C and CMD+V/CTRL+V to copy and paste the workflow.)

Compartilhe a saída retornada pelo último nó

Informações sobre sua configuração n8n

@Rafael_Van_Meerbeek falhas específicas do dispositivo + seu próprio fallback disparando significa que o fetch está morrendo no nível de rede antes mesmo de chegar ao n8n, então não é seu workflow, é DNS/TLS/antivírus nesses dispositivos específicos. a forma mais rápida de separar: em um dispositivo onde falha, abra a URL do webhook diretamente no navegador e verifique o console. um aviso de certificado/segurança aponta para confiança TLS (dispositivos mais antigos não confiando na cadeia), e cant-resolve ou connection-refused aponta para DNS ou antivírus bloqueando o domínio. qual aparece?

Testei exatamente o que você sugeriu.

Em um dispositivo onde o chatbot falha, abrir o domínio do webhook diretamente no navegador resulta em:

ERR_CONNECTION_TIMED_OUT

Não há aviso de TLS ou aviso de certificado. O navegador simplesmente não consegue estabelecer uma conexão.

O que é estranho é que:

  • a mesma URL funciona perfeitamente do meu próprio PC,

  • funciona do meu telefone,

  • mas expira em outro PC.

Então parece que a solicitação nunca chega a Traefik/n8n.

Você tem alguma ideia do que poderia fazer o mesmo endpoint HTTPS público estar acessível em alguns dispositivos, mas expirar completamente em outros?

Isso ainda pode estar relacionado a antivírus/firewall, ou devo investigar algo como IPv6, resolução de DNS ou minha configuração de VPS/rede?

@Rafael_Van_Meerbeek connection-timed-out (não name-not-resolved, sem aviso de certificado) significa que o DNS se resolve bem mas a conexão TCP com o IP nunca se completa, e isso variar por dispositivo é geralmente IPv6. verifique se seu domínio tem um registro AAAA, se tem mas o VPS/Traefik não está realmente servindo v6 (ou está mal configurado), os dispositivos que tentam o endereço v6 travam enquanto os v4 se conectam sem problema. a correção mais rápida, remova o registro AAAA para que todos usem IPv4, ou corrija IPv6 no servidor. confirme com curl -6 vs curl -4 para o domínio de uma rede com falha.

Obrigado, verifiquei.

O subdomínio API só tem um registro A:

api.novaintellectagents.com -> 31.97.199.227

e nenhum registro AAAA.

Confirmei com:

dig api.novaintellectagents.com A
dig api.novaintellectagents.com AAAA

A consulta AAAA não retorna resposta, então a API é apenas IPv4.

Isso descarta a teoria de IPv6?

O estranho é que os dispositivos afetados ainda recebem ERR_CONNECTION_TIMED_OUT, enquanto outros dispositivos em redes diferentes conseguem acessar exatamente o mesmo endpoint sem problemas.

@Rafael_Van_Meerbeek sim isso descarta IPv6, boa verificação. então DNS resolve mas o mesmo IP sofre timeout em algumas redes, e um timeout (não connection-refused) significa que os pacotes estão sendo silenciosamente descartados, o que é quase sempre um firewall. o principal suspeito é server-side: fail2ban, ufw, ou o próprio firewall da Hostinger banindo esses IPs de origem. verifique fail2ban-client status, ufw status, e o painel de firewall da Hostinger para bans. depois execute tracert para 31.97.199.227 de uma rede com falha, se chegar na Hostinger e parar lá é o firewall do servidor, se morrer antes é ISP/roteamento nessa rede.

Verifiquei o lado do servidor.

Resultados:

dig api.novaintellectagents.com A
→ 31.97.199.227

dig api.novaintellectagents.com AAAA
→ no AAAA record

Então IPv6 parece descartado.

No VPS:

sudo ufw status verbose
→ inactive

sudo fail2ban-client status
→ command not found

Então fail2ban não está instalado.

O firewall do Hostinger também parece desabilitado no painel.

iptables -L -n não mostra nenhuma regra de bloqueio customizada para tráfego de entrada.

Além disso, do próprio VPS:

curl -I https://api.novaintellectagents.com
→ HTTP/2 200

e o TLS verifica corretamente com Let’s Encrypt.

Então o endpoint funciona bem em algumas redes/dispositivos, mas os dispositivos afetados ainda recebem:

ERR_CONNECTION_TIMED_OUT

Isso aponta mais para ISP/roteamento ou algum filtro upstream do Hostinger em vez do próprio n8n/Traefik?

A seguir vou tentar tracert 31.97.199.227 de um dispositivo/rede afetado.

@Rafael_Van_Meerbeek legal, isso descarta totalmente seu lado, servidor e firewall estão limpos. então é upstream, ou a rota para 31.97.199.227 está quebrada nessas redes (seu tracert vai mostrar onde morre), ou mais provavelmente o IP está em uma blocklist de reputação que essas redes/ISPs/antivírus honram e silenciosamente descartam, IPs reciclados de VPS Hostinger frequentemente carregam uma má reputação de um inquilino anterior. verifique no abuseipdb ou spamhaus. a solução mais limpa de qualquer forma: coloque o domínio atrás do Cloudflare (grátis), você recebe um IP bem reputado que toda rede consegue alcançar e esconde sua origem, o que contorna os problemas de roteamento e reputação simultaneamente.

Opa @Rafael_Van_Meerbeek, a sugestão do Cloudflare é o caminho certo aqui. passos para fazer isso:

Verifique a reputação do IP primeiro, cole 31.97.199.227 em abuseipdb.com e spamhaus.org. Se mostrar um histórico ruim, isso confirma a causa raiz.

Adicione seu domínio ao Cloudflare (grátis), crie uma conta, adicione novaintellectagents.com e aponte seus nameservers para o Cloudflare. Seu registro A permanece o mesmo, mas o tráfego agora flui através dos IPs limpos do Cloudflare, que toda rede confia.

Certifique-se de que a nuvem laranja está ON para api.novaintellectagents.com no DNS do Cloudflare, é isso que faz proxy do tráfego e esconde seu IP de origem.

No Traefik, restrinja conexões de entrada apenas aos intervalos de IP do Cloudflare (eles publicam a lista em IP Ranges | Cloudflare) isso protege sua origem e impede que alguém contorne o Cloudflare direto para seu IP de VPS.

Isso deve corrigir as falhas específicas do dispositivo completamente, já que ninguém estará atingindo seu IP do Hostinger direto mais.

Isso não parece mais ser um bug do workflow n8n.

ERR_CONNECTION_TIMED_OUT significa que a requisição falha antes mesmo de n8n poder estar errado. A primeira divisão que faria seria:

zero request nos logs do Traefik/Hostinger = roteamento, firewall, ISP ou edge do servidor;
requisição aparece mas sem execução do workflow = problema no caminho n8n/webhook;
execução aparece e falha = problema na lógica do workflow.

Então eu pararia de debugar CORS até você provar se o dispositivo que falha alcança o Traefik.

De uma rede que falha, você consegue ver alguma linha de access-log para essa requisição no lado do servidor?

A divisão de Tony (logs do Traefik primeiro) é a abordagem certa - não persiga CORS até confirmar que a requisição está chegando ao seu servidor.

Se você vir a requisição chegando ao Traefik mas falhando lá, verifique a cadeia de certificados SSL. Certificados intermediários ausentes causam quedas específicas do dispositivo que parecem idênticas a timeouts - dispositivos com stores de raiz mais rigorosos (Windows antigos, algumas versões do Android) descartarão silenciosamente a conexão. Teste a cadeia em SSL Server Test (Powered by Qualys SSL Labs) ou execute curl -v --max-time 5 https://api.novaintellectagents.com da máquina que está falhando. Se você vir SSL certificate verify failed ou a cadeia está incompleta, esse é o seu culpado - o Traefik precisa do pacote de certificado completo incluindo intermediários.

Concordo com o uso do Cloudflare para aplicações assim!

@Rafael_Van_Meerbeek pergunta óbvia, mas você já descartou a possibilidade do navegador estar bloqueando a requisição? Você testou, digamos, Safari vs Chrome vs Firefox? para ver se você está recebendo o mesmo comportamento nos 3?