Installez le Reverse Proxy Traefik :Partie 2

Installez le Reverse Proxy Traefik :Partie 2

De retour pour la suite. Un petit rappel en dessous de la partie 1 :

Installez le Reverse Proxy Traefik : Partie 1
Traefik est une application open source de routage permettant de faire du reverse proxy a la manière de “Nginx reverse proxy” et bien plus encore

Bon, à ce stade, avant de lancer le conteneur Traefik, il faut s'assurer de plusieurs étapes :

  1. Créer une règle de NAT pour Traefik sur son routeur pare-feu, ici en l'occurrence, il s'agit ici de Pfsense. Le principe suit la même logique sur d'autres instances.
  2. Avoir un nom de domaine public.
  3. Soit posséder une IP fixe ou si L'IP est dynamique, il faudra utiliser un prestataire de DNS dynamique.

Traefik va utiliser le port 443 (https) et uniquement le port 443, puisque la demande de certificats "Let's Encrypt" est réalisé avec le protocole TLS. (Voir le fichier "compose.yml")
Dans mon exemple ci-dessous, j’effectue la démonstration sur les deux ports http et https :

Création d’une règle de NAT pour le reverse proxy
Traeffik sera exposé sur le port 443 au domaine public Il s’occupe aussi entièrement les demandes et renouvellement des certificats « Letsencrypt

Pour le domaine, j'ai acheté celui-ci chez Ovh car il coûte moins de 3 euros l'année. Je gère le DNS de ce domaine chez "Cloudflare". Mon opérateur est Free, j'ai une IP fixe en "Fullstack"

Avant de continuer, je vous invite à consulter les trois notes suivantes :

Achetez un nom de domaine
Quand on veut faire de l’auto Hébergement, on n’a pas le choix, il faut un nom de domaine afin de pouvoir accéder à ses applications web.
Domaine et IP dynamique
La plupart d’entre vous se voit attribuer une IP dynamique par les opérateurs. Celle-ci est changeante et si vous hébergez un site internet
Transfert des DNS de votre domaine chez Cloudflare
Cloudflare dont l’IP 1.1.1.1 est connu comme le camembert est un prestataire américain (indépendant🙏), le plus rapide serveur DNS au monde

Si toutes les étapes citées 1,2 et 3 sont ok, on peut continuer !

On va faire juste un aparté sur la façon dont les certificats « Let's Encrypt » peuvent être importés par Traefik.
J’ai indiqué que j'utilisais le protocole Acmé "ChallengeTLS" mais ils existent d'autre façon d'obtenir ces certificats.

  1. La validation DNS: "DNS-01 challenge" correspond à : <acme-challenge.mondomaine.com>, Vous devez prouver que vous êtes le propriétaire du nom de domaine en enregistrant un fichier TXT spécifique sur la zone DNS de votre Registrar...un peu long à mettre en place.

  2. La validation Http: "HTTP-01 challenge" correspond à :<acme-challenge "http">, ce mode utilise le port 80 http pour ennoyer un jeton au client "acme « sur votre serveur web à l’adresse http://<YOUR_DOMAIN>/.well-known/acme-challenge/...(Je vous met le lien en dessous c'est très bien expliqué)

  3. La validation Https: "TLS-ALPN-01" correspond à: <acme.tlsChallenge>
    C'est identique au "HTTP-01 challenge" sauf le port utilisé est le port Secure 443. C'est celui que j'utilise. (Attention, certains serveurs ne sont pas compatibles) de mon côté je n'ai aucun problème !

Types de Challenges
Lorsque vous obtenez un certificat de Let&rsquo;s Encrypt, nos serveurs valident que vous contrôlez les noms de domaine dans ce certificat en utilisant des &ldquo;challenges&rdquo;, comme défini par la norme ACME. La plupart du temps, cette validation est traitée automatiquement par votre client ACME, mais si vous devez prendre des décisions de configuration plus complexes, il est utile d&rsquo;en savoir plus à leur sujet. Si vous n&rsquo;êtes pas sûr, utilisez les paramètres par défaut de votre client ou le protocole HTTP-01.

Nous voici donc avec notre fichier "compose.yml" prêt !

  version: '3'
  services:
    traefik:
      image: traefik:v2.4.8
      container_name: traefik
      restart: unless-stopped
      command:
        - "--providers.docker=true"
        - "--providers.docker.exposedbydefault=false"
        - "--providers.file.directory=/etc/traefik/dynamic-conf"
        - "--providers.file.watch=true"
        - "--api.dashboard=true"
        - "--entrypoints.web.address=:80"
        - "--entrypoints.websecure.address=:443"
        - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
        - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
        - "--certificatesResolvers.letsencrypt.acme.email=email@exemple.tld"
        - "--certificatesResolvers.letsencrypt.acme.storage=acme.json"
        - "--certificatesResolvers.letsencrypt.acme.tlsChallenge=true"
     labels:
        - "traefik.enable=true"
        - "traefik.http.routers.dashboard.rule=Host(`traefik.exemple.tld`)"
        - "traefik.http.routers.dashboard.service=api@internal"
        - "traefik.http.routers.dashboard.entrypoints=websecure"
        - "traefik.http.routers.dashboard.middlewares=auth-dashboard"
        - "traefik.http.middlewares.auth-dashboard.basicauth.users=admin:
            $$xxxxxxxxx$$xxjjgfy"  
        - "traefik.http.routers.dashboard.tls=true"
        - "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
      networks:
        - traefik_net
      ports:
        - 80:80
        - 443:443
      volumes:
        - /var/run/docker.sock:/var/run/docker.sock:ro
        - $PWD/acme.json:/acme.json
        - $PWD:/etc/traefik:ro
  networks:
    traefik_net:
      external: true

Je vous le met ici en pdf:

On y va, on lance la commande de déploiement du conteneur de n'importe où :

# docker compose -f /opt/traefik/compose.yml up -d

Si tout s'est bien passé, vous devriez pouvoir vous connecter au tableau de bord via le nom de domaine avec son certificat "Let’s Encrypt"

https://traefik.mondomaine.com

Vous allez avoir une fenêtre pop ‘up qui s'ouvre pour renseigner l'identifiant et mot de passe (celui que vous avez choisi au début)

Enfin, le tableau de bord de Traefik s’ouvre :

traefikacces.png

Si vous avez un échec :

  • Vérifier dans votre fichier "compose.yml"

  • Les chemins des répertoires et surtout le fichier acme.json
    Vous pouvez aller visualiser le fichier, s'il est vide, il y a un problème !

  • L'adresse du sous domaine attribué à Traefik.

  • La règle de nat dans votre routeur.

  • L’IP de Traefik correspond bien à cette règle?

Pour l'instant de votre côté, vous devez avoir que les "routeurs" et services de Traefik:

  • 2 "routeurs" pour Traefik
  • 3 "services" pour Traefik
  • 1 "service" Pour Docker

C’est ici que le fichier « config.yaml » va rentrer en action !
On va éditer ce fichier :

# nano /opt/traefik/traefik-dynamic/config.yaml

# As YAML Configuration File
http:

  routers:

    router-vaultwarden:
      service: service-vaultwarden
      middlewares:
         - middleware-authelia-auth
      rule: "Host(`rzopass.rzo.ovh`)"
      tls:
        certResolver: "letsencrypt"
        domains:
          - main: "rzopass.rzo.ovh"

    
    router-seafile:
      service: service-seafile
      rule: "Host(`fichiers.rzo.ovh`)"
      tls:
        certResolver: "letsencrypt"
        domains:
          - main: "fichiers.rzo.ovh"

    

  middlewares:

    middleware-authelia-auth:
      forwardAuth:
        address: "http://10.0.0.102:9091/api/verify?rd=https://authelia.rzo.ovh"
        trustForwardHeader: true
        
        
  services:

    service-vaultwarden:
      loadBalancer:
        servers:
          - url: "http://10.0.0.135:8000"

    service-seafile:
      loadBalancer:
        servers:
          - url: "http://10.0.0.27:8084"

    

On va faire abstraction du Middleware "Authelia", je ferais une note dessus prochainement. Sachez que c'est un portail d'authentification et d’identification sophistiqué.

Vous avez donc dans ce fichier, deux exemples d'applications qu'on souhaite connecter à internet :

  • Vaultwarden qui est un gestionnaire de mot de passe.
  • Seafile : Un serveur qui synchronise vos fichiers en ligne.

Vous devez déclarer le routeur correspondant.

Exemple pour Seafile:

  • La section "routers"
    On indique de quel routeur il s’agit :
    Le routeur seafile
    -router-seafile
    Qui correspond au service :
    -service-seafile
    On lui indique le sous domaine utilisé :
    -"fichiers.rzo.ovh"
    On lui indique qu’un certificat "Let's Encrypt" doit être généré
    -certResolver: "letsencrypt" (letsencrypt est le nom du résolveur)
    *Enfin, on lui indique qu'il doit l'appliquer sur le sous-domaine correspondant :
    -domains: main : "fichiers.rzo.ovh"

  • La section "services"
    On a indiqué dans la partie routeur le service correspondant à Seafile
    -Le service est en fait le nom du conteneur Docker de l'application
    -Son emplacement : son IP locale et le port qu'il utilise dans Dokcer
    -Le load balencer indique le fait que Traefik doit répartir la charge entre chaque application.

L'inscription de toutes vos applications se fera de façon identique comme les exemples de ce fichier. Je rappelle que Traefik écoute sur le « sock » (le port) de Docker. Il détectera à chaud les informations que vous lui indiquez ici, car il se situe dans le répertoire dynamique declaré dans le docker-compose.

Attention, ce fichier est extrêmement sensible à l'indentation(rappel)
Positionnez correctement vos éléments comme l'exemple ci-dessus.

Pour voir le résultat, il suffit de vous connecter à votre application, Si cela ne marche pas, vérifiez l'état sur le tableau de bord de Traefik.

👍
Pour conclure, Traefik est un super outil, une fois bien paramétré, c'est du bonheur ! Nous avons configuré ici une partie infime que ce qu'il peut réalisé ...