n8n · webhooks públicos
Cómo exponer los webhooks de n8n con HTTPS, autenticación y protección contra spam usando Caddy o Traefik como reverse proxy en producción.
Toda automatización en n8n que recibe datos externos necesita un webhook público con HTTPS, ya sea para EvolutionAPI, el formulario del sitio o un servicio de terceros.
Configuración obligatoria
En el docker-compose.yml, define siempre:
environment:
N8N_HOST: n8n.exemplo.com
N8N_PROTOCOL: https
WEBHOOK_URL: https://n8n.exemplo.com/
La WEBHOOK_URL es lo que n8n usa para generar la URL pública del webhook en los workflows. Sin ella, muestra la IP local y los webhooks no funcionan.
Reverse proxy con Caddy
Caddy ya se encarga del certificado Let’s Encrypt automáticamente:
n8n.exemplo.com {
reverse_proxy n8n-main:5678
# Bloquea el editor en la red pública (opcional)
@editor path / /workflow* /credentials* /executions*
basicauth @editor {
admin $2a$14$...hash_bcrypt
}
}
Autenticación en el webhook
En n8n, cada webhook node permite elegir:
- None (público): úsalo solo si la URL es lo bastante secreta
- Basic Auth (usuario + contraseña)
- Header Auth (validar
X-API-Key, por ejemplo) - JWT (validar bearer token)
Para EvolutionAPI, lo habitual es None con URL secreta (/webhook/abc-123-supersecreto).
Protección contra spam
Si el webhook queda público (formulario, callback de OAuth):
- Rate limiting en Caddy:
@webhook path /webhook/* rate_limit @webhook 30r/m - Cloudflare al frente: el plan gratuito ya bloquea bots conocidos
- IF node validando el User-Agent o el origen antes de procesar
Headers útiles
n8n expone en el webhook node:
$json.headers: todos los headers de la solicitud$json.query: query string parseada$json.body: cuerpo (JSON o form-data)
Para leer la IP real (detrás de Caddy/Cloudflare), toma $json.headers['x-forwarded-for'] en lugar de x-real-ip.
Próximos pasos
Última actualización: