ACLClouds
ACLClouds

Comment exposer un webhook n8n en HTTPS ?

Configurer le DNS, le proxy inverse et WEBHOOK_URL, puis tester l’URL de production. Les intégrations externes exigent généralement HTTPS.

Les intégrations externes exigent généralement HTTPS. Le port 5678 doit rester en écoute locale derrière Caddy ou Nginx.

Procédure étape par étape

  1. Créer l’enregistrement DNS

    Ajoutez un enregistrement A pour n8n.example.com vers l’IPv4 du VPS.

  2. Configurer n8n

    Définissez N8N_HOST, N8N_PROTOCOL=https et WEBHOOK_URL dans Compose, puis recréez le conteneur.

  3. Installer Caddy

    Faites écouter Caddy sur les ports 80 et 443 et configurez-le comme proxy inverse vers 127.0.0.1:5678.

  4. Ouvrir les ports du pare-feu

    Autorisez HTTP et HTTPS. Gardez 5678 fermé au réseau public.

  5. Tester l’URL de production

    Activez un nœud Webhook, copiez l’URL de production puis appelez-la avec curl ou l’application source.

Caddyfile

n8n.example.com {
  reverse_proxy 127.0.0.1:5678
}

Test

curl -X POST https://n8n.example.com/webhook/YOUR_PATH \
  -H "Content-Type: application/json" \
  -d '{"source":"aclclouds"}'

Contrôler DNS, ports et Caddy

dig +short n8n.example.com
ss -lntp | grep -E ':(80|443) '
ufw allow 80/tcp
ufw allow 443/tcp
journalctl -u caddy -n 50 --no-pager

Avant de commencer

Let’s Encrypt ne délivre le certificat que si le domaine pointe déjà vers le VPS et si le port 80 est joignable depuis Internet. Créez l’enregistrement DNS en premier, attendez qu’il réponde, puis démarrez Caddy.

  • dig +short n8n.example.com renvoie l’IPv4 du VPS.
  • Aucun autre service, Nginx ou Apache par exemple, n’écoute déjà sur les ports 80 et 443.
  • Si vous avez activé le pare-feu du panel (« Outils supplémentaires » > « Pare-feu »), ajoutez une règle TCP pour 80 et une pour 443.
  • Si le domaine passe par Cloudflare, laissez-le en mode « DNS uniquement » (nuage gris) pendant la mise en place.

Comprendre les URL de webhook

Un nœud Webhook a deux adresses. L’URL de test, en /webhook-test/, ne répond que pendant que l’éditeur attend un appel, après un clic sur « Listen for test event ». L’URL de production, en /webhook/, ne répond que lorsque le workflow est publié.

n8n construit ces adresses à partir de WEBHOOK_URL. Si la variable manque, il affiche une adresse en localhost:5678 que l’application externe ne pourra jamais joindre.

Vérifier que tout fonctionne

curl -I https://n8n.example.com doit répondre sans erreur de certificat. Le test curl -X POST du guide renvoie {"message":"Workflow was started"} et une nouvelle ligne apparaît dans l’onglet « Executions » du workflow.

Questions fréquentes

Pourquoi l’appel renvoie 404 avec is not registered ?

n8n ne connaît aucun webhook actif pour ce chemin et cette méthode. Publiez le workflow pour l’URL /webhook/, ou cliquez sur « Listen for test event » avant d’appeler /webhook-test/. Vérifiez aussi que la méthode HTTP du nœud, POST ou GET, correspond à celle de l’appel.

Caddy n’obtient pas le certificat, que faire ?

Lisez journalctl -u caddy -n 50. NXDOMAIN signifie que le domaine ne résout pas encore ; Timeout during connect indique que le port 80 est bloqué. Corrigez la cause, puis systemctl restart caddy. Après plusieurs échecs, Let’s Encrypt refuse temporairement de nouvelles tentatives pour ce nom.

Pourquoi l’URL du nœud Webhook contient toujours localhost:5678 ?

WEBHOOK_URL est absente ou le conteneur n’a pas été recréé. Ajoutez WEBHOOK_URL=https://n8n.example.com/ dans compose.yaml puis lancez docker compose up -d. docker compose restart ne relit pas les variables modifiées.

Que signifie 502 Bad Gateway ?

Caddy fonctionne mais ne joint pas n8n. Vérifiez que le conteneur tourne avec docker compose ps et que curl -s http://127.0.0.1:5678/healthz répond. Le port du Caddyfile doit être celui publié par Compose.