Déployer cloudflared dans Docker Swarm

cloudflared est le daemon client de Cloudflare Tunnel. Il crée une connexion sortante persistante vers les datacenters Cloudflare, ce qui permet d’exposer des services internes sur internet sans ouvrir de ports entrants sur les serveurs.

Voilà donc comment l’intégrer. proprement dans une stack Docker Swarm.

Table des matières

  1. Concepts clés
  2. Intégration dans la stack Swarm
  3. Configuration des routes
  4. Monitoring des connecteurs
  5. Comportement en cas de panne

1. Concepts clés

Tunnel et token

Un tunnel Cloudflare génère un token unique. Ce token peut ainsi être utilisé sur plusieurs instances cloudflared simultanément. Chaque instance qui démarre avec ce token s’enregistre automatiquement comme un connecteur distinct dans l’interface Zero Trust.

Published Application Routes

Les routes définissent quel domaine est redirigé vers quel service interne. Par conséquent, une route est partagée par tous les connecteurs.


2. Intégration dans la stack Swarm

Ajouter cloudflared comme service dans le docker-compose.yml de la stack :

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    command: tunnel --no-autoupdate run
    environment:
      - TUNNEL_TOKEN=<TOKEN_DU_TUNNEL>
    networks:
      - traefik-public
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure

networks:
  traefik-public:
    external: true

En effet, deux points sont importants :

  • Le réseau : cloudflared doit être sur le même réseau Docker que Traefik pour que la résolution DNS interne (http://traefik:80) fonctionne. Sans ça, le tunnel ne peut pas joindre Traefik.
  • De plus, un seul token suffit pour tous les réplicas. Cloudflare distingue les connecteurs automatiquement.

Pour récupérer le token :

Dans l’interface Cloudflare Zero Trust :

Networks → Tunnels → [Votre tunnel] → Add a connector → Docker

Ainsi, le token est affiché


3. Configuration des routes

Les routes se configurent dans :

Networks → Tunnels → [Votre tunnel] → Published application routes

Ensuite, pour ajouter un domaine :

  1. Cliquer sur + Add a published application route
  2. Renseigner le domaine ou sous-domaine
  3. Service : http://traefik:80 (nom du service Docker sur le réseau partagé)
  4. Sauvegarder

Exemple :

DomainePathService
monsite.com*http://traefik:80
app.monsite.com*http://traefik:80

Autrement dit, les domaines doivent être gérés par Cloudflare. (nameservers actifs).


4. Monitoring des connecteurs

Connecteurs actifs

Networks → Tunnels → [Votre tunnel] → Connectors

Ainsi, chaque réplica apparaît comme un connecteur distinct avec son statut, son uptime et la version de cloudflared.

Logs en temps réel

Networks → Tunnels → [Votre tunnel] → Live logs

Il permet donc de suivre les requêtes HTTP et les événements de connexion par connecteur, utile pour déboguer un problème de routing ou vérifier qu’une route est bien atteinte.


5. Comportement en cas de panne

Avec 3 réplicas Swarm, si un conteneur cloudflared tombe :

  • Swarm le redémarre automatiquement (restart_policy: on-failure)
  • Cloudflare bascule les requêtes vers les connecteurs restants pendant le redémarrage
  • Le service reste accessible sans interruption