Sécurisez votre VPS pour héberger N8N avec Coolify
Intro (public visé : développeurs freelance / usage perso — niveau intermédiaire)
Tu veux héberger N8N sur un VPS sans exposer l’interface d’administration au public, tout en gardant uniquement les webhooks nécessaires accessibles ? Ce guide décrit une configuration pragmatique et reproductible : accès admin privé via Tailscale, proxy/SSL géré par Traefik avec challenge DNS (Cloudflare), et exposition sélective des webhooks via Cloudflare Tunnel.
Note importante : Ce guide partage une configuration pragmatique qui a fonctionné; considérez-le comme point de départ, pas comme un modèle de production.
TL;DR
- Accès admin : Tailscale (réseau privé) + Tailscale SSH (optionnel) pour SSH sans ouvrir le port 22.
- Réseau & firewall : Bloque les ports publiques au niveau du provider, et crée des règles UFW limitées pour le trafic interne entre containers/Tailscale.
- HTTPS : Traefik + ACME DNS-01 (Cloudflare) pour obtenir des certificats sans exposer les ports HTTP.
- Webhooks publics : Cloudflare Tunnel (cloudflared) pour exposer uniquement les routes HTTP des webhooks; ajoute tokens/IP whitelists/WAF pour durcir.
Objectif
Fournir une méthode simple pour :
- rendre l’interface N8N accessible uniquement depuis ton réseau privé Tailscale,
- exposer uniquement les endpoints webhooks nécessaires à l’extérieur via Cloudflare Tunnel,
- conserver des certificats TLS valides via Traefik + ACME DNS-01 (Cloudflare).
Prérequis
- VPS (Ubuntu 22.04+ recommandé) avec accès root
- Nom de domaine (Cloudflare recommandé pour DNS + API)
- Coolify installé (Traefik fourni par Coolify)
- Comptes : Tailscale, Cloudflare Zero Trust
Options d’hébergement:
- Hostinger : Vous pouvez utiliser mon code “pymecatech” pour avoir 20% de réduction
- DigitalOcean : Interface simple, documentation excellente
- Hetzner : Excellent rapport qualité-prix
- Linode (Akamai) : Performance stable, support technique réputé
- Vultr : Déploiement rapide, nombreuses localisations
- OVHcloud : Hébergeur français, conformité RGPD
Coolify
Coolify est une alternative open-source à Vercel/Netlify qui vous permet de déployer facilement vos applications sur votre propre infrastructure. C’est un outil de déploiement self-hosted qui simplifie la gestion de vos services avec une interface web intuitive.
Si vous n’avez pas encore préinstallé Coolify sur votre VPS, utilisez ceci :
Réf : https://coolify.io/docs/get-started/installation
1 – Installer et configurer Tailscale
Avant de bloquer tous les ports de votre VPS afin de le rendre sécuritaire, il faut installer Tailscale afin de pouvoir y accéder lorsque le firewall bloquera tous les ports en entrée.
Configuration du compte Tailscale
- Rendez-vous sur tailscale.com et créez un compte gratuit
- Connectez-vous avec votre compte Google, Microsoft ou GitHub
- Une fois connecté, vous aurez accès à votre tableau de bord Tailscale
Installation sur le VPS
Configuration de Tailscale
Authentifiez vous avec l’URL fournie dans le terminal.
Copier l’URL que vous avez dans votre terminal et collez-le dans un navigateur web. Ceci permettra d’authetifier votre VPS sur votre réseau Tailscale.
Optionnel : Améliorez la sécurité de votre SSH grâce à Tailscale SSH.
Cette fonctionnalité délègue l’authentification à votre fournisseur d’identité Tailscale existant (par ex. Google ou GitHub), ce qui élimine la nécessité de gérer séparément les utilisateurs Linux et les clés SSH.
Démarrez Tailscale avec l’option --ssh :
Recommendation(optionnel) : Renommez votre serveur dans Tailscale. De cette manière, vous n’aurez plus besoin de vous souvenir de son adresse IP Tailscale. Lorsque vous serez connecté à votre Tailscale, vous pourrez utiliser le nom que vous aurez définis.
Sur votre compte Tailscale allez dans la section “Machine” puis sélectionnez votre serveur –>”…”–>”Edit machine name”

Recommendation(optionnel) : “Disable key expiry”
À la fin de ce tutoriel, vous pourrez vous connecter à votre VPS seulement depuis un ordinateur connecté à Tailscale. Si la clef de votre serveur expire, il ne sera plus connecté à votre réseau Tailscale et vous ne pourrez plus vous connecter.
Si vous désirez quand même que la clef expire automatiquement pour des raisons de sécurité, assurez-vous que votre fournisseur VPS vous offre un moyen de se connecter via un “Web Terminal”.
Sur votre compte Tailscale allez dans la section “Machine” puis sélectionnez votre serveur –>”…”–>”Disable key expiry”

Obtenir votre adresse IP Tailscale
Maintenant, vous pouvez vous connecter sécuritairement à votre VPS depuis n’importe quel appareil connecté à votre réseau Tailscale.
Étape 2 : Sécurisation de votre VPS avec le firewall local UFW
Vous pouvez vous référer à cette article : https://tailscale.com/kb/1077/secure-server-ubuntu
Configuration
Inspectez les règles en place :
Vous devriez avoir ceci :

Effacez toutes les règles d’UFW :
Si vous avez d’autres règles, vous pouvez utiliser la commande
sudo ufw delete <numéro de la règle à supprimer>
Étape 3 : Configuration Docker et réseaux
Identification du Docker host IP
Prenez en note l’adresse qui est retournée par cette commande
Identification des réseaux Docker de Coolify

Recherchez les réseaux avec les noms bridge et coolify
Utiliser docker inspect pour trouver les adresses
Dans la sortie, localisez le champ IPAM → Config → Subnet

Ajout des règles UFW pour la communication entre conteneurs
Exemple :
Redémarrez UFW :
Vérification
Vous devriez avoir quelque chose comme ça :
textTo Action From
-- ------ ----
Anywhere on tailscale0 ALLOW IN Anywhere
10.0.0.1 ALLOW IN 10.0.0.0/24
10.0.0.1 ALLOW IN 10.0.1.0/24
Anywhere (v6) on tailscale0 ALLOW IN Anywhere (v6)
Accès à votre VPS
Connectez-vous à Coolify via Tailscale :
http://<votre IP Tailscale>:8000/
**Firewall du VPS**
Coolify fonctionne sur Docker, qui utilise des règles iptables basées sur le NAT pouvant contourner les pare-feu Linux traditionnels comme UFW.
https://coolify.io/docs/knowledge-base/server/firewall#closing-ports-using-a-firewall
En conséquence, le blocage de ports uniquement via UFW n’est pas efficace.
Il faut donc fermer les ports au niveau de votre VPS.

Félicitation vous avez un VPS qui est accessible seulement depuis Tailscale.
Maintenant, si vous installez N8N, il y a de fortes chances que vous aurez besoin d’avoir des URL webhook acessibles depuis l’internet afin que vos workflow fonctionnent correctement.
Étape 4 :Utilisation de votre nom de domaine
Vous pouvez utiliser de vrais noms de domaine au lieu d’adresses IP/Nom Tailscale. Cependant, le MagicDNS de Tailscale ne permet pas d’ajouter des enregistrements DNS personnalisés, leur documentation recommande d’ajouter l’adresse IP Tailscale du serveur dans les enregistrements de votre fournisseur DNS. De cette façon, coolify.mydomaine.com pointe directement vers l’adresse IP Tailscale de votre VPS. Bien sûr, on pourrait aussi configurer un serveur DNS personnalisé dans le réseau local, mais pour l’instant c’est hors de la portée de ce tutoriel.
L’image ci-dessous montre la configuration avec le DNS CloudFlare. La procédure devrait être très similaire si vous utilisez un autre fournisseur DNS.

Utilisation de HTTPS
À ce stade, http://coolify.<mydomaine>.com devrait fonctionner, mais pas HTTPS. Cela peut être acceptable dans un réseau local, mais ce n’est pas recommandé.
Par défaut, la configuration Traefik de Coolify utilise Let’s Encrypt avec des HTTP challenges, qui nécessitent un accès public. Le HTTP challenges ne pourra pas fonctionner puisque le Firewall du VPS bloque tous les ports en entrée.
À la place, j’ai configuré l’utilisation de DNS challenges avec Cloudflare (source).
Générer un jeton d’API Cloudflare
Créez un API Token dans Cloudflare avec les permissions suivantes :
- Zone / DNS / Edit : permet à Traefik d’ajouter des enregistrements DNS TXT pour le challenge DNS-01.
- Zone / Zone / Read : permet à Traefik de lire les zones DNS.
Étapes :
- Accédez à votre tableau de bord Cloudflare.
- Naviguez vers : Mon profil > API Tokens > Create Custom Token
- Configurez les permissions comme suit :
- Zone / DNS / Edit
- Zone / Zone / Read
- Restreignez le jeton à votre domaine (<mydomain>.com) pour plus de sécurité 🔒
Dans la configuration du proxy de Collify (Traefik), ajoutez la ligne suivante :

Dans la même écran, remplacez les lignes:
- '--certificatesresolvers.letsencrypt.acme.httpchallenge=true'
- '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=http'
par
- '--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=cloudflare'
- '--certificatesresolvers.letsencrypt.acme.dnschallenge.delaybeforecheck=0'

**Redémarrez le proxy**
Étape 5 : CloudFlare Tunnel pour exposer seulement vos Webhook N8N
Maintenant, vous pouvez accéder à tous vos ressource avec HTTPS depuis le réseau Tailscale. Cependant, vos webhook N8N ne sont pas accessibles depuis l’internet. Il faut donc les exposer sécuritairement avec un CloudFlare Tunnel.
Séparer et protéger les webhooks N8N de l’interface de connexion (Login UI)
Créer un CloudFlare Tunnel:
- Allez sur Cloudflare Zero Trust dashboard
- Allez à Zero Trust → Networks → Tunnels
- Cliquez “Create a Tunnel”
- Sélectionnez “Cloudflared”, et donnez un nom (j’ai nommé le mien “webhook”).

Choisissez votre environnement. La plus part des VPS utilisent Unbuntu, il faut donc choisir l’environnement “Debian”. Puis in faut exécuter la commande d’installation dans le terminale de votre VPS

Configurez votre Tunnel pour exposer vos Webhook seulment

Activez le SSL sur votre CloudFlare – mode : Full (Strict)


Configurer le container N8N
Ajouter les “labels” suivants :
labels: - traefik.enable=true # Webhooks - traefik.http.routers.n8n-webhook-http.entrypoints=http - traefik.http.routers.n8n-webhook-http.rule=Host(`webhook.yourdomain.com`) && (PathPrefix(`/webhook/`) || PathPrefix(`/webhook-test/`)) - traefik.http.routers.n8n-webhook-http.service=n8n-webhook-service - traefik.http.routers.n8n-webhook-https.entrypoints=https - traefik.http.routers.n8n-webhook-https.rule=Host(`webhook.yourdomain.com`) && (PathPrefix(`/webhook/`) || PathPrefix(`/webhook-test/`)) - traefik.http.routers.n8n-webhook-https.service=n8n-webhook-service - traefik.http.routers.n8n-webhook-https.tls=true - traefik.http.routers.n8n-webhook-https.tls.certresolver=letsencrypt - traefik.http.services.n8n-webhook-service.loadbalancer.server.port=5678

Maintenant il faut configurer N8N afin qu’il génère le bon URL pour les Webhook.
Pour ce faire il faut ajouter la variable d’environnement WEBHOOK_URL avec la valeur que vous avez configuré dans CloudFlare.

**Redémarrez votre service N8N**
Maintenant N8N génère le bon URL pour les Webhook.

N’oubliez pas, les Webhook sont maintenant accessible depuis l’internet, appliquez des mesures de contrôles:
- Bearer Token: Exigez un jeton secret dans l’en-tête Authorization.
- IP Whitelisting: Limitez les adresses IP sources autorisées dans les règles de pare-feu de Cloudflare.
- Cloudflare WAF: Mettez en place des règles personnalisées pour bloquer le trafic suspect ou abusif.
D’autre méthodes permettent de sécuriser :
https://github.com/coollabsio/coolify/discussions/4031#discussioncomment-11102806
https://community.n8n.io/t/how-i-secured-my-n8n-instance-with-cloudflare-zero-trust-no-open-ports-no-public-ip-further-edits-to-come/119834
https://dev.to/dalenguyen/free-self-host-ai-agent-workflows-with-n8n-and-cloudflare-tunnel-2bff
https://kjetilfuras.com/self-host-n8n-with-cloudflare-zero-trust/


Leave a Reply