n8n · webhooks públicos
Como expor webhooks do n8n com HTTPS, autenticação e proteção contra spam usando Caddy ou Traefik.
Toda automação no n8n que recebe dado externo precisa de um webhook público com HTTPS — seja para EvolutionAPI, formulário do site, ou um serviço terceiro.
Configuração obrigatória
No docker-compose.yml, defina sempre:
environment:
N8N_HOST: n8n.exemplo.com
N8N_PROTOCOL: https
WEBHOOK_URL: https://n8n.exemplo.com/
A WEBHOOK_URL é o que o n8n usa para gerar a URL pública do webhook nos workflows. Sem ela, ele exibe o IP local e os webhooks não funcionam.
Reverse proxy com Caddy
O Caddy já cuida do certificado Let’s Encrypt automaticamente:
n8n.exemplo.com {
reverse_proxy n8n-main:5678
# Bloqueia o editor em rede pública (opcional)
@editor path / /workflow* /credentials* /executions*
basicauth @editor {
admin $2a$14$...hash_bcrypt
}
}
Autenticação no webhook
No n8n, cada webhook node permite escolher:
- None (público) — só use se a URL é secreta o suficiente
- Basic Auth (usuário + senha)
- Header Auth (validar
X-API-Key, por exemplo) - JWT (validar bearer token)
Para EvolutionAPI, o padrão é None com URL secreta (/webhook/abc-123-supersecreto).
Proteção contra spam
Se o webhook fica público (formulário, callback de OAuth):
- Rate limiting no Caddy:
@webhook path /webhook/* rate_limit @webhook 30r/m - Cloudflare na frente — o plano gratuito já bloqueia bots conhecidos
- IF node validando User-Agent ou origem antes de processar
Headers úteis
O n8n expõe no webhook node:
$json.headers— todos os headers da requisição$json.query— query string parseada$json.body— corpo (JSON ou form-data)
Para ler o IP real (atrás de Caddy/Cloudflare), pegue $json.headers['x-forwarded-for'] em vez de x-real-ip.
Próximos passos
Última atualização: