[{"data":1,"prerenderedAt":162},["ShallowReactive",2],{"seo-verification":3,"blog-cloudflare-tunnel-exposer-application-vps-fr":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"id":7,"slug":8,"title":9,"excerpt":10,"readTime":11,"views":12,"isPinned":13,"publishedAt":14,"category":15,"categories":20,"featuredImage":22,"bgImage":23,"posterImage":24,"relatedSolution":22,"intro":25,"sections":26,"ctaTitle":118,"ctaBody":119,"ctaButton":120,"ctaUrl":121,"relatedPosts":122},248,"cloudflare-tunnel-exposer-application-vps","Cloudflare Tunnel : exposer une app VPS sans ouvrir de port","Exposez une application sur votre VPS via un Cloudflare Tunnel sans ouvrir aucun port entrant. Guide complet avec cloudflared, Docker Compose et service systemd.",10,0,false,"2026-08-12T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":18},3,"Déploiement","deploiement","bg-success\u002F10 text-success",[21],{"id":16,"name":17,"slug":18,"color":19,"icon":18},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fcloudflare-tunnel-exposer-application-vps-poster.svg","Vous venez de déployer une application sur votre VPS et vous vous retrouvez bloqué : IP dynamique, pare-feu d'entreprise qui filtre le port 443 entrant, ou refus d'exposer directement votre serveur à Internet. Un Cloudflare Tunnel résout ce problème en renversant la connexion : c'est `cloudflared` qui appelle Cloudflare, pas l'inverse. Résultat : votre application est accessible en HTTPS sur votre domaine, sans ouvrir le moindre port entrant et sans toucher à votre configuration DNS.",[27,31,42,45,70,73,77,80,112,115],{"type":28,"title":29,"body":30},"h2","Pourquoi un Cloudflare Tunnel plutôt qu'ouvrir un port","La configuration classique — ouvrir les ports 80 et 443 sur le pare-feu, pointer un enregistrement DNS vers l'IP du serveur, installer un reverse proxy — fonctionne bien quand vous contrôlez le réseau. Mais trois situations la mettent en échec : un FAI ou un réseau d'entreprise qui bloque les connexions entrantes sur 443, une IP dynamique qui invalide vos enregistrements DNS toutes les 24 heures, ou un VPS placé derrière un NAT strict qui ne permet aucun port forwarding.\n\nCloudflare Tunnel contourne ces trois cas d'un même mécanisme : le démon `cloudflared` établit une connexion sortante persistante vers les points de présence Cloudflare. Votre serveur n'accepte rien, Cloudflare reçoit les requêtes HTTPS et les transmet via ce tunnel chiffré. Le trafic entrant ne touche jamais votre serveur directement.",{"type":32,"title":33,"items":34},"ul","Ce que Cloudflare Tunnel apporte concrètement",[35,36,37,38,39,40,41],"**Zéro port ouvert** — le pare-feu du VPS peut bloquer tout le trafic entrant (80, 443 compris) sans impacter l'accessibilité de l'application.","**HTTPS automatique** — Cloudflare gère le certificat TLS côté client : pas de Let's Encrypt à configurer, pas de renouvellement à surveiller.","**NAT et IP dynamique transparents** — la connexion sortante de `cloudflared` traverse n'importe quel NAT ; l'IP du serveur peut changer sans reconfigurer le DNS.","**Réseau d'entreprise ou FAI restrictif** — si le port 443 entrant est bloqué chez vous, le tunnel reste fonctionnel car il repose sur des connexions sortantes HTTP\u002F2 ou QUIC.","**Intégration Zero Trust optionnelle** — les tunnels s'associent à Cloudflare Access pour restreindre l'accès à des utilisateurs authentifiés, sans VPN.","**Protection Cloudflare incluse** — le trafic passe par le réseau Cloudflare : DDoS mitigation, WAF et rate limiting s'appliquent sans configuration supplémentaire.","**Plan gratuit disponible** — un tunnel simple, sans load-balancing, est utilisable sans abonnement payant Cloudflare.",{"type":28,"title":43,"body":44},"Prérequis","Pour suivre ce guide, il vous faut :\n\n**VPS avec accès root.** L'installation de `cloudflared` comme service systemd — la seule façon de garantir le redémarrage automatique — nécessite les droits root. Un hébergement mutualisé ou une instance sans accès root ne permet pas cette configuration.\n\n**Ressources minimales.** `cloudflared` consomme moins de 50 Mo de RAM et négligeable en CPU. Comptez 1 vCPU et 512 Mo de RAM comme strict minimum pour le démon seul ; la contrainte réelle vient de l'application que vous exposez.\n\n**Un domaine géré par Cloudflare.** Le domaine doit être enregistré ou transféré vers Cloudflare (ou délégation NS vers Cloudflare). Sans zone Cloudflare active, un tunnel named ne peut pas créer d'enregistrement DNS automatique.\n\n**Docker Engine** (si vous utilisez la variante Docker Compose de ce guide). Disponible sur Ubuntu 22.04\u002F24.04, Debian 12 et les distributions RHEL-compatibles.\n\n**Un compte Cloudflare gratuit.** Aucun abonnement payant n'est requis pour un tunnel unique sans load-balancing.",{"type":46,"title":47,"steps":48},"steps","Installer et configurer cloudflared sur le VPS",[49,52,55,58,61,64,67],{"title":50,"body":51},"Installer cloudflared via le dépôt Cloudflare","Cloudflare publie `cloudflared` sous forme de paquet `.deb` \u002F `.rpm` et de binaire statique. Pour une installation via APT sur Debian\u002FUbuntu :\n\n```bash\ncurl -fsSL https:\u002F\u002Fpkg.cloudflare.com\u002Fcloudflare-main.gpg | sudo tee \u002Fusr\u002Fshare\u002Fkeyrings\u002Fcloudflare-main.gpg > \u002Fdev\u002Fnull\necho \"deb [signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fcloudflare-main.gpg] https:\u002F\u002Fpkg.cloudflare.com\u002Fcloudflared $(lsb_release -cs) main\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fcloudflared.list\nsudo apt update && sudo apt install cloudflared\n```\n\nVérifiez que l'installation s'est déroulée correctement :\n\n```bash\ncloudflared --version\n```\n\nLa commande doit retourner une ligne du type `cloudflared version 2025.x.x (built ...)`. La version exacte dépend du moment de l'installation ; référez-vous au \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcloudflare\u002Fcloudflared\u002Freleases\">dépôt officiel cloudflare\u002Fcloudflared\u003C\u002Fa> pour le numéro courant.",{"title":53,"body":54},"Authentifier cloudflared auprès de Cloudflare","Sur le VPS (ou localement si vous avez un accès graphique), lancez :\n\n```bash\ncloudflared tunnel login\n```\n\nUn lien s'affiche dans le terminal. Ouvrez-le dans un navigateur, sélectionnez la zone Cloudflare à autoriser, puis validez. Un certificat `~\u002F.cloudflared\u002Fcert.pem` est créé sur la machine.",{"title":56,"body":57},"Créer un tunnel nommé","Créez un tunnel avec un nom descriptif :\n\n```bash\ncloudflared tunnel create mon-tunnel\n```\n\nCloudflare génère un identifiant UUID et un fichier de credentials `~\u002F.cloudflared\u002F\u003CUUID>.json`. Notez l'UUID ; vous en aurez besoin dans les étapes suivantes.",{"title":59,"body":60},"Écrire le fichier de configuration config.yml","Créez `\u002Fetc\u002Fcloudflared\u002Fconfig.yml` :\n\n```bash\nsudo mkdir -p \u002Fetc\u002Fcloudflared\n```\n\nContenu du fichier (adaptez `\u003CUUID>`, `votre-domaine.com` et le port de votre application) :\n\n```yaml\ntunnel: \u003CUUID>\ncredentials-file: \u002Fhome\u002F\u003Cuser>\u002F.cloudflared\u002F\u003CUUID>.json\n\ningress:\n  - hostname: app.votre-domaine.com\n    service: http:\u002F\u002Flocalhost:3000\n  - service: http_status:404\n```\n\nLa dernière règle — `service: http_status:404` sans `hostname` — est **obligatoire** : elle sert de règle catch-all. Sans elle, `cloudflared` refuse de démarrer et retourne l'erreur `\"You must specify an ingress rule that matches all incoming requests\"`. Si votre application tourne sur un autre port ou protocole, remplacez `http:\u002F\u002Flocalhost:3000` en conséquence (par exemple `http:\u002F\u002Flocalhost:8080` ou `tcp:\u002F\u002Flocalhost:22` pour SSH).",{"title":62,"body":63},"Créer l'enregistrement DNS et lancer le tunnel","Enregistrez automatiquement le sous-domaine dans votre zone Cloudflare :\n\n```bash\ncloudflared tunnel route dns mon-tunnel app.votre-domaine.com\n```\n\nPuis testez le tunnel en mode foreground pour valider la configuration :\n\n```bash\ncloudflared tunnel run mon-tunnel\n```\n\nOuvrez `https:\u002F\u002Fapp.votre-domaine.com` dans un navigateur. Si l'application répond, arrêtez le process (`Ctrl+C`) et passez à l'étape suivante.",{"title":65,"body":66},"Installer cloudflared comme service systemd","Pour que le tunnel redémarre automatiquement au reboot, installez-le comme démon système :\n\n```bash\nsudo cloudflared service install\nsudo systemctl enable cloudflared\nsudo systemctl start cloudflared\nsudo systemctl status cloudflared\n```\n\nLe fichier unit systemd créé par Cloudflare se trouve dans `\u002Fetc\u002Fsystemd\u002Fsystem\u002Fcloudflared.service`. Son contenu ressemble à :\n\n```ini\n[Unit]\nDescription=cloudflared\nAfter=network.target\n\n[Service]\nTimeoutStartSec=0\nType=notify\nExecStart=\u002Fusr\u002Fbin\u002Fcloudflared --no-autoupdate tunnel run\nRestart=on-failure\nRestartSec=5s\n\n[Install]\nWantedBy=multi-user.target\n```\n\nAvec ce service actif, le tunnel est opérationnel dès le démarrage du VPS, sans intervention manuelle.",{"title":68,"body":69},"Intégrer cloudflared dans un Docker Compose existant","Si votre application tourne déjà dans une stack Docker Compose, ajoutez un service `cloudflared` dans le même fichier. L'approche par token (sans fichier de credentials) est la plus simple pour un conteneur :\n\n```yaml\nservices:\n  app:\n    image: mon-image\n    networks:\n      - internal\n\n  cloudflared:\n    image: cloudflare\u002Fcloudflared:latest\n    command: tunnel --no-autoupdate run\n    environment:\n      - TUNNEL_TOKEN=${TUNNEL_TOKEN}\n    networks:\n      - internal\n    restart: unless-stopped\n\nnetworks:\n  internal:\n```\n\nDéfinissez `TUNNEL_TOKEN` dans un fichier `.env` au même niveau. Le token se récupère depuis le tableau de bord Cloudflare → Zero Trust → Networks → Tunnels → votre tunnel → Configure → Connecteurs Docker. Le service `cloudflared` et votre application partagent le réseau `internal` ; dans `config.yml` ou via le token, pointez l'application par son nom de service Docker (`http:\u002F\u002Fapp:3000` au lieu de `http:\u002F\u002Flocalhost:3000`).",{"type":28,"title":71,"body":72},"Configuration post-installation","Une fois le tunnel opérationnel, quelques réglages complémentaires améliorent la robustesse de la configuration.\n\n**Récupérer l'IP réelle du client.** Par défaut, votre application reçoit les requêtes depuis `127.0.0.1` ou depuis l'IP interne du tunnel. Pour obtenir l'IP réelle du visiteur, lisez l'en-tête `CF-Connecting-IP` que Cloudflare injecte automatiquement. Configurez votre application ou votre reverse proxy local pour faire confiance à cet en-tête.\n\n**Chiffrement de bout en bout.** Le tunnel chiffre la connexion entre `cloudflared` et Cloudflare. La connexion entre `cloudflared` et votre application locale est en HTTP par défaut (loopback ou réseau Docker interne). Si votre application expose du HTTPS en local, ajoutez `originServerName: app.votre-domaine.com` dans la règle d'ingress correspondante pour que `cloudflared` valide le certificat.\n\n**Plusieurs services, un seul tunnel.** Un tunnel peut exposer plusieurs services sur des sous-domaines distincts : ajoutez simplement des entrées supplémentaires dans le bloc `ingress` de `config.yml`, avant la règle catch-all.",{"type":74,"title":75,"body":76},"tip","Durcissement : fermez le port 80 et 443 entrant","Le principal avantage de cette architecture est de pouvoir fermer tous les ports entrants sur le VPS. Une fois le tunnel validé, appliquez ces règles UFW :\n\n```bash\nsudo ufw default deny incoming\nsudo ufw default allow outgoing\nsudo ufw allow ssh\nsudo ufw enable\n```\n\nVotre application reste accessible via le tunnel Cloudflare (qui repose sur des connexions sortantes), et le port SSH reste ouvert pour l'administration. Aucune connexion directe sur 80 ou 443 n'atteint plus le serveur. Consultez le guide \u003Ca href=\"\u002Fblog\u002Fpare-feu-ufw-vps\">Configurer UFW sur un VPS\u003C\u002Fa> pour la configuration complète.",{"type":28,"title":78,"body":79},"Cloudflare Tunnel versus Nginx \u002F Traefik : des approches complémentaires","Une objection fréquente : « J'ai déjà Nginx et Traefik qui font ce travail, pourquoi ajouter une couche Cloudflare ? » La réponse est que les deux approches ne résolvent pas le même problème.\n\nUn reverse proxy local (Nginx, Traefik, Caddy) gère le routage entre services sur le même réseau et le renouvellement SSL — mais il suppose que le trafic entrant atteigne le serveur. Si le port 443 est bloqué par le réseau en amont, le reverse proxy ne sert à rien.\n\nCloudflare Tunnel résout précisément ce que le reverse proxy local ne peut pas : le trafic arrive à Cloudflare quelle que soit la connectivité réseau du serveur. Les deux sont complémentaires : vous pouvez très bien placer Traefik derrière le tunnel pour gérer le routage interne, et laisser Cloudflare gérer le TLS public.",{"type":81,"title":82,"headers":83,"rows":87},"comparison","Cloudflare Tunnel vs reverse proxy local",[84,85,86],"Critère","Cloudflare Tunnel","Reverse proxy local (Nginx\u002FTraefik)",[88,92,96,100,104,108],[89,90,91],"Port entrant requis","Non — connexion sortante uniquement","Oui — 80\u002F443 doivent être accessibles",[93,94,95],"TLS public","Géré par Cloudflare, automatique","Let's Encrypt via ACME (certbot, Traefik…)",[97,98,99],"IP dynamique \u002F NAT strict","Transparent — pas de DNS à mettre à jour","Problématique — nécessite un DynDNS ou une IP fixe",[101,102,103],"Load balancing","Plan payant (Cloudflare Load Balancing)","Disponible nativement (Traefik, Nginx upstream)",[105,106,107],"Latence","Légèrement supérieure (routage via POP Cloudflare)","Minimale — trafic direct vers le serveur",[109,110,111],"Dépendance externe","Oui — Cloudflare doit être joignable","Non — fonctionne sans tiers",{"type":28,"title":113,"body":114},"Dépannage : messages d'erreur courants","**`You must specify an ingress rule that matches all incoming requests`**\nLa règle catch-all est absente ou mal placée dans `config.yml`. Elle doit être la dernière entrée du bloc `ingress`, sans `hostname`, avec `service: http_status:404`.\n\n**`Unable to locate config file in default locations`**\n`cloudflared` cherche sa configuration dans `~\u002F.cloudflared\u002Fconfig.yml` ou `\u002Fetc\u002Fcloudflared\u002Fconfig.yml`. Précisez le chemin explicitement avec `cloudflared tunnel --config \u002Fetc\u002Fcloudflared\u002Fconfig.yml run mon-tunnel`.\n\n**`ERR connection to origin timed out` dans les logs**\nL'application cible n'est pas joignable depuis `cloudflared`. Vérifiez que le service local tourne (`curl http:\u002F\u002Flocalhost:3000`) et que le port dans `config.yml` correspond. Dans un contexte Docker Compose, utilisez le nom du service (`http:\u002F\u002Fapp:3000`) plutôt que `localhost`.\n\n**Token expiré : `tunnel credentials file not found` ou `token is expired`**\nLes tokens générés via l'interface Cloudflare ont une durée de vie limitée si le connecteur n'a jamais été enregistré. Régénérez le token depuis Zero Trust → Networks → Tunnels → Configure → Connecteurs, puis mettez à jour la variable `TUNNEL_TOKEN` dans votre `.env`.\n\n**Limitation Plan Free : load-balancing et SSH par tunnel**\nLe plan gratuit ne prend pas en charge le load-balancing entre plusieurs origines. L'accès SSH via tunnel (`cloudflared access ssh`) sur le plan gratuit nécessite une configuration spécifique de Cloudflare Access et n'est pas activé par défaut. Le nombre de connecteurs par tunnel est limité à quelques instances sur le plan gratuit.",{"type":28,"title":116,"body":117},"Cloudflare Tunnel comme architecture de référence sur VPS","Cloudflare Tunnel illustre bien ce que l'accès root sur un VPS rend possible : installer `cloudflared` comme démon système, modifier les règles du pare-feu, piloter des services systemd. Sur un hébergement mutualisé sans accès root, aucune de ces étapes n'est réalisable — le démon ne peut pas s'installer, le pare-feu n'est pas sous votre contrôle, et le service ne peut pas être configuré pour démarrer au boot.\n\nCette architecture convient particulièrement aux situations où la connectivité réseau est contrainte ou incertaine : labs de développement, bureaux avec pare-feu d'entreprise strict, serveurs edge, ou simplement refus d'exposer une IP publique. Elle s'associe naturellement aux reverse proxies locaux comme Traefik ou Nginx Proxy Manager pour le routage interne, et au durcissement système pour fermer les surfaces d'attaque directes.","Un VPS avec accès root pour installer cloudflared","Le démon `cloudflared` et son service systemd nécessitent l'accès root — ce qu'un hébergement mutualisé ne permet pas. Un VPS ServOrbit vous donne le contrôle total : choix d'OS, accès root, IPv4 dédiée, et les templates du Marketplace pour démarrer rapidement.","Voir les VPS Cloud","\u002Fsolutions\u002Fdeveloppeurs",[123,134,149],{"id":124,"slug":125,"title":126,"excerpt":127,"readTime":11,"views":128,"isPinned":13,"publishedAt":129,"category":130,"categories":131,"featuredImage":22,"bgImage":23,"posterImage":133,"relatedSolution":22},37,"deployer-avec-nginx-proxy-manager","Déployer vos applications avec Nginx Proxy Manager sur un VPS","Gérez domaines, SSL et reverse proxy de plusieurs services sur un VPS avec Nginx Proxy Manager : installation, réseaux Docker, dépannage 502 et configuration avancée.",369,"2026-05-14T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":18},[132],{"id":16,"name":17,"slug":18,"color":19,"icon":18},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-nginx-proxy-manager-poster.svg",{"id":135,"slug":136,"title":137,"excerpt":138,"readTime":11,"views":12,"isPinned":13,"publishedAt":139,"category":140,"categories":146,"featuredImage":22,"bgImage":23,"posterImage":148,"relatedSolution":22},228,"durcissement-serveur-linux-initial","Durcissement initial d'un serveur Linux","Créez un utilisateur sudo, configurez SSH avec clés, activez UFW et fail2ban sur Ubuntu 22.04 ou Debian 12 en moins d'une heure.","2026-08-06T00:00:00+00:00",{"id":141,"name":142,"slug":143,"color":144,"icon":145},8,"Sécurité & Monitoring","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[147],{"id":141,"name":142,"slug":143,"color":144,"icon":145},"\u002Fblog\u002Fcovers\u002Fdurcissement-serveur-linux-initial-poster.svg",{"id":150,"slug":151,"title":152,"excerpt":153,"readTime":11,"views":154,"isPinned":13,"publishedAt":155,"category":156,"categories":157,"featuredImage":22,"bgImage":23,"posterImage":159,"relatedSolution":160},41,"deployer-avec-coolify","Déployer vos applications avec Coolify sur un VPS","Déployer Coolify sur un VPS : installation, configuration HTTPS, connexion Git, première application, bases de données, sauvegardes et dépannage.",1640,"2026-05-10T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":18},[158],{"id":16,"name":17,"slug":18,"color":19,"icon":18},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-coolify-poster.svg",{"categorySlug":18,"appSlug":161},"coolify",1786536086643]