ça se fait de signaler un sujet parce qu'il est beaucoup trop stylé ? 🤣

Merci en tout cas ! J'ai trouvé dans les quelques lignes que j'ai lu la motivation nécessaire pour tenter un passage de mon "bon vieux" nginx vers cette v2 fort prometteuse.

Je teste ça au plus vite et je tenterais un petit retour bien propre ici pour y poser mon avis 😉

5 jours plus tard

Hello, avant tout super article ! Je rejoins totalement le fait que tout se ressemble concernant les explications de Traefik sauf cette page ! J'avais déjà appris "à la dure" ( voir très dure ... :p ) mais j'ai pu approfondir voir découvrir des nouvelles choses donc merci !
J'ai une grosse question concernant les redirections HTTPS ( scheme et redirect to websecure) : Actuellement, nous avons lancé une stack nextcloud sous docker avec la DB sur le host ( non docker donc). Il y a des "lenteurs" concernant les images qui sont balisée en http par ex. Soit c'est lent ou cela n'apparaît tout simplement pas.
Ces lenteurs n'étaient pas du tout présentes avant traefik ( ca réagissait à la secondes sans "lag"). Faut-il désactiver cette redirection ? Il y a des choses qui se font dans nextcloud vis à vis des proxys mais la c'est du docker .. je pense que cette règle ne s'applique pas. Avez-vous ressentit ce "soucis" ? Bonne soirée

    anoskar salut,

    Si tu ressens des lenteurs, c'est peux être que tu as plusieurs réseaux sous docker, j'ai eu le soucis et en spécifiant le réseaux à utiliser (--traefik.docker.network=traefik-net) ça a corrigé le bug.
    Je pense que dans le cas de plusieurs réseau, il doit tester les réseaux 1 à 1 dans un ordre inconnu.

    Ensuite effectivement tu peux supprimer la redirection, ou créer une règle global (dans les paramètres de lancement de traefik), je n'ai cependant jamais senti de ralentissement du a ceci.

    Autrement si tu étais sous nginx avant, il est possible que le cache soit mieux géré avec qu'avec traefik

    Bonsoir, merci pour cette réponse, je n'ai qu'un seul network de définit. Mais tôt ce matin le problème a été résolu par nos dev. En résumé, les url de certaines images étaient en HTTP et non en HTTPS. Tout est parfaitement réactif. Encore merci ! Bonne soirée

    Merci, un de mes projets était bloqué en traefik 1.7 car j'avais de la diffHHHH flemme pour lire les nouvelles docs, et une fois résumé comme ça, je vais pouvoir m'y remettre 🙂

    12 jours plus tard

    Bonjour,
    Tout d'abord merci pour ce super tuto qui m'a redonné envie de tester "Traefik" que j'avais abandonné !

    J'ai bien suivi à la lettre votre exemple et explications, et lorsque je lance le docker-compose tout se passe bien, les trois services docker sont actifs :

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                              NAMES
    7274811ae581        nextcloud:19        "/entrypoint.sh apac…"   45 minutes ago      Up 45 minutes       80/tcp                                                             nextcloud
    844bd0c0cd0a        postgres:12         "docker-entrypoint.s…"   45 minutes ago      Up 45 minutes       5432/tcp                                                           db_nextcloud
    da02512af7ce        traefik             "/entrypoint.sh --gl…"   45 minutes ago      Up 45 minutes       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8080->8080/tcp   traefik

    Toutefois, je rencontre un problème de non génération de certificat SSL, à cause de l'erreur suivante suivante (issue de la log de traefik) :

    time="2020-06-30T18:27:27Z" level=error msg="the router nextcloud-secure@file uses a non-existent resolver: letsencrypt-rsa2048"
    time="2020-06-30T18:27:27Z" level=error msg="the router traefik-secure@file uses a non-existent resolver: letsencrypt-ecdsa"

    Malgré des heures de recherches sur Internet, je n'ai pas résolu le problème.
    Est-ce que vous pourriez m'aider ?
    Par avance, merci.
    Ricardo

      rican Salut,

      Pourrais-tu fournir tes fichiers de configuration pour voir d'où viens le problème, ainsi que la log complète de traefik

      Bonjour,
      Par avance, merci pour votre aide.
      Voici les éléments demandés.

      docker logs traefik
      time="2020-07-02T10:06:19Z" level=info msg="Configuration loaded from flags."
      time="2020-07-02T10:06:19Z" level=info msg="Traefik version 2.2.1 built on 2020-04-29T18:02:09Z"
      time="2020-07-02T10:06:19Z" level=info msg="\nStats collection is disabled.\nHelp us improve Traefik by turning this feature on :)\nMore details on: https://docs.traefik.io/contributing/data-collection/\n"
      time="2020-07-02T10:06:19Z" level=info msg="Starting provider aggregator.ProviderAggregator {}"
      time="2020-07-02T10:06:19Z" level=info msg="Starting provider *file.Provider {\"directory\":\"/etc/traefik/conf.d/\",\"watch\":true}"
      time="2020-07-02T10:06:19Z" level=info msg="Starting provider *traefik.Provider {}"
      time="2020-07-02T10:06:19Z" level=error msg="the router nextcloud-secure@file uses a non-existent resolver: letsencrypt-rsa2048"
      time="2020-07-02T10:06:19Z" level=error msg="the router traefik-secure@file uses a non-existent resolver: letsencrypt-ecdsa"
      time="2020-07-02T10:06:20Z" level=error msg="the router traefik-secure@file uses a non-existent resolver: letsencrypt-ecdsa"
      time="2020-07-02T10:06:20Z" level=error msg="the router nextcloud-secure@file uses a non-existent resolver: letsencrypt-rsa2048"
      #/srv/docker/traefik/docker-compose.yml
      version: "3.8"
      networks:
        traefik:
      services:
        traefik:
          image: traefik:chevrotin
          container_name: traefik
          volumes:
            - /srv/docker/traefik/acme.json:/etc/traefik/acme.json
            - /srv/docker/traefik/certs:/etc/traefik/certs
            - /var/run/docker.sock:/var/run/docker.sock
            - /srv/docker/traefik/conf.d:/etc/traefik/conf.d
          ports:
            - 80:80
            - 443:443
            - 8080:8080 # le temps de tester
          networks:
            - traefik
          command:
            - "--global.sendanonymoususage=false" # désactivation de l'envoi de donnée
            - "--global.checknewversion=false" # puisque dockerisé, on désactive le check de mise à jour
            - "--accesslog=true" # Pour avoir les logs d'accès
            - "--api=true" # Pour activer l'api
            - "--api.insecure=true" # Activer pour exposer l'api sur 8080
            - "--api.dashboard=true" # Pour activer le dashboard
            - "--log.level=INFO"
            - "--providers.file.directory=/etc/traefik/conf.d/" # Permets de charger les configurations dans le répertoire (tout les yaml et toml)
            - "--providers.file.watch=true" # Permets de surveiller le répertoire précédent pour charger dynamiquement les configurations
            - "--entrypoints.web.address=:80" # Création de l'entrypoint nommé web sur le port 80
            - "--entrypoints.websecure.address=:443" # Création de l'entrypoint nommé websecure sur le port 443
            #- "--entrypoints.web.http.redirections.entrypoint.scheme=https" # Pour créer une redirection vers https
            #- "--entrypoints.web.http.redirections.entrypoint.to=websecure" # Pour rediriger vers l'entrypoint websecure (port 443)
        db_nextcloud:
          image: postgres:12
          container_name: db_nextcloud
          networks:
            - traefik
          volumes:
            - /srv/docker/db_nextcloud/:/var/lib/postgresql/
          environment:
            - POSTGRES_PASSWORD=nextcloud
            - POSTGRES_DB=nextcloud
            - POSTGRES_USER=nextcloud
        nextcloud:
          image: nextcloud:19
          container_name: nextcloud
          networks:
            - traefik
          environment:
            - POSTGRES_HOST=db_nextcloud
            - POSTGRES_DB=nextcloud
            - POSTGRES_USER=nextcloud
            - POSTGRES_PASSWORD=nextcloud
            - NEXTCLOUD_ADMIN_USER=admin
            - NEXTCLOUD_ADMIN_PASSWORD=admin
          volumes:
            - /srv/docker/nextcloud:/var/www/html
      #/serv/docker/traefik/conf.d/auth.yml
      http:
        middlewares:
          admin-users:
            basicAuth:
              users:
                - "ricardo:xxxxx" # mot de passe masqué
          dev-users:
            basicAuth:
              users:
                - "tata:$apr1$inMBbv02$C/oh3LLEfmmOyloAtqW/V/"
      #/srv/docker/traefik/conf.d/compression.yml
      http:
        middlewares:
          compression:
            compress:
              excludedContentTypes:
                - "text/event-stream"
      #/srv/docker/traefik/conf.d/hsts.yml
      http:
        middlewares:
          hsts:
            headers:
              forceSTSHeader: true
              stsSeconds: 315360000
              stsIncludeSubdomains: true
              stsPreload: true
      #/srv/docker/traefik/conf.d/nextcloud.yml
      http:
        services:
          nextcloud:
            loadBalancer:
              servers:
                - url: "http://192.168.1.104:80/cloud"
        routers:
          nextcloud:
            rule: "Host(`xxxxx.ovh`) && PathPrefix(`/cloud`)" # domaine masqué
            entryPoints:
              - "web"
            middlewares:
              - "redirect-to-https@file"
            service: "noop@internal"
          nextcloud-secure:
            rule: "Host(`xxxxx.ovh`) && PathPrefix(`/cloud`)" # domaine masqué
            entryPoints:
              - "websecure"
            middlewares:
              - "hsts@file"
              - "security@file"
              - "compression@file"
              - "strip-cloud@file"
            service: "nextcloud@file"
            tls:
              certResolver: letsencrypt-rsa2048
        middlewares:
          strip-cloud:
            stripPrefix:
              prefixes:
                - "/cloud"
      #/srv/docker/traefik/conf.d/redirect-to-https.yml
      http:
        middlewares:
          redirect-to-https:
            redirectScheme:
              scheme: https
              permanent: true
      #/srv/docker/traefik/conf.d/security.yml
      http:
        middlewares:
          security:
            headers:
              accessControlMaxAge: 100
              addVaryHeader: true
              browserXssFilter: true
              contentTypeNosniff: true
              frameDeny: true
              sslRedirect: true
              customFrameOptionsValue: "SAMEORIGIN"
              referrerPolicy: "same-origin"
              featurePolicy: "vibrate 'self'"
      #/srv/docker/traefik/conf.d/tls.yml
      certificatesResolvers: 
        letsencrypt-ecdsa: # Nom arbitraire, je pourrais mettre toto, ça fonctionne correctement
          acme:
            email: "xxx@xxxxx" # email masqué
            caserver: "https://acme-v02.api.letsencrypt.org/directory"
            storage: "/etc/traefik/acme.json"
            keytype: "EC384"
            httpChallenge:
              entryPoint: "web"
        letsencrypt-rsa2048: # Nom arbitraire, je pourrais mettre toto, ça fonctionne correctement
          acme:
            email: "xxx@xxxxx" # email masqué
            caserver: "https://acme-v02.api.letsencrypt.org/directory"
            storage: "/etc/traefik/acme.json"
            keytype: "RSA2048"
            httpChallenge:
              entryPoint: "web"
      tls:
        options:
          default:
            minVersion: "VersionTLS12"
            sniStrict: true
            cipherSuites:
              - "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"
              - "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"
              - "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305"
              - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"
              - "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
              - "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305"
              - "TLS_AES_128_GCM_SHA256"
              - "TLS_AES_256_GCM_SHA384"
              - "TLS_CHACHA20_POLY1305_SHA256"
            curvePreferences:
              - X25519
              - CurveP521
              - CurveP384
              - CurveP256
          mintls13: # Arbitraire également, toto fonctionne aussi
            minVersion: "VersionTLS13"
      #/serv/docker/traefik/conf.d/traefik.yml
      http:
        services:
          traefik:
            loadBalancer:
              servers:
                - url: "http://192.168.1.104:8080"
        routers:
          traefik:
            rule: "Host(`xxxxx.ovh`)" # domaine masqué
            entryPoints:
              - "web"
            middlewares:
              - "redirect-to-https@file"
            service: "noop@internal"
          traefik-secure:
            rule: "Host(`xxxxx.ovh`)" # domaine masqué
            entryPoints:
              - "websecure"
            middlewares:
              - "hsts@file"
              - "security@file"
              - "compression@file"
              - "admin-users@file"
            service: "traefik@file"
            tls:
              certResolver: letsencrypt-ecdsa
              options: mintls13

      Enfin, je précise que la procédure a généré deux dossiers vides

      /serv/docker/traefik/acme.json
      /serv/docker/traefik/certs

        rican Ah le problème viens peux être du acme.json, c'est normalement un fichier, et bizarrement traefik est incapable de le créer.

        Essaie en supprimant le dossier acme.json et en créant un fichier vide (touch acme.json)

        Dans un test précédent, à partir d'un autre tuto, j'avais déjà rencontré le problème du "acme.json" et je l'avais résolu avec les commandes suivantes (trouvées sur Internet)

        sudo touch /srv/docker/traefik/acme.json
        sudo chmod 600 /srv/docker/traefik/acme.json

        Désolé, mais avec ton tuto ça ne fonctionne pas, j'obtiens la même anomalie 😃 !

        Ah merde, je viens de trouver le problème, c'est effectivement un soucis avec mon tuto.

        J'avais la configuration des certResolvers en double, dans le cli, et dans le tls.yml. Mais les certResolver ne fonctionne que dans la configuration static (yml, toml ou cli), et pas dans le providers file.

        Puisque je l'avais en double, forcément dans la rédaction du tuto, ça marchait. Je corrige ça dès que possible

          xataz J'ai vu à l'initialisation de traefik qu'il cherchait un traefik.toml ou yml dans /etc/traefik/, j'ai donc essayé de passer uniquement la config des certResolver dedans mais avoir un fichier lu au démarrage supplante les option passées en CLI donc impossible de faire cohabiter les deux.

          J'ai donc décidé de passer la conf présente dans le docker-compose vers le fichier yml dans /etc/traefik/traefik.yml (penser à ajouter /opt/docker/traefikV2/traefik.yml:/etc/traefik/traefik.yml pour monter le fichier) :

          ## Fichier traefik.yml lu au démarrage
          global:
            checkNewVersion: false
            sendAnonymousUsage: false
          
          providers:
            file:
              directory: /etc/traefik/conf/
              watch: true
          
          api:
            insecure: false
            dashboard: true
          
          log:
            level: INFO
            filePath: /etc/traefik/traefik.log
          
          accessLog: true
          
          entryPoints:
            web:
              address: ":80"
            websecure:
              address: ":443"
          
          certificatesResolvers:
            letsencrypt-ecdsa:
              acme:
                email: test@domain.tld
                caserver: https://acme-v02.api.letsencrypt.org/directory
                storage: /etc/traefik/acme.json
                keytype: EC384
                httpChallenge:
                  entryPoint: web
            letsencrypt-rsa2048:
              acme:
                email: test@domain.tld
                caserver: https://acme-v02.api.letsencrypt.org/directory
                storage: /etc/traefik/acme.json
                keytype: RSA2048
                httpChallenge:
                  entryPoint: web

          Tout fonctionne, même si j'aurai préféré que traefik puisse gérer les certificatesresolver dynamiquement.

          un mois plus tard

          J'ai modifier le tuto sur la partie Resolver, effectivement impossible de les modifier dynamiquement, dommage

          5 mois plus tard

          Bonjour,

          Pourrais tu revoir le tutorial car il est mal fait en termes d'ordre car je but sur pas mal de chose

          8 jours plus tard

          Bonjour,
          Merci pour le tuto.
          J'ai juste deux petites erreurs que je n'arrive pas à résoudre.

          level=error msg="servers transport not found default@internal" entryPointName=websecure routerName=traefik-secure@file
          
          level=error msg="Unable to obtain ACME certificate for domains \"traefik..xx.xx\": unable to generate a certificate for the domains [traefik.xx.xx]: error: one or more domains had a problem:\n[traefik.xx.xx] [traefik.xx.xx] acme: error presenting token: timeout 2021-01-24 15:41:36.984015158 +0000 UTC m=+54.997971025\n" rule="Host(`traefik.xx.xx`)" routerName=traefik-secure@file providerName=letsencrypt-ecdsa.acme
          

          Merci d'avance

          Salut et bienvenu sur le forum !

          Ton log te dit qu'il ne trouve pas default@internal et si on se réfère à la doc, il n’existe pas de defaut@internal, tu veux surement utiliser le api@internal (doc pour traefik 2.4).

          L'autre erreur découle de la première puisque ton domain ne répond pas letsencrypt ne peut pas générer un certificat.

          Bon courage.

          11 jours plus tard

          Hello, merci pour ton partage.

          Petite coquille;

          time="2021-02-05T20:55:13Z" level=error msg="middleware \"admins-users@file\" does not exist" routerName=traefik-secure@file entryPointName=websecure
          time="2021-02-05T20:55:13Z" level=error msg="middleware \"admins-users@file\" does not exist" entryPointName=websecure routerName=traefik-secure@file

          il faut corriger le nom du middleware dans "../traefik/conf.d/auth.yml" ou dans le fichier du service "../traefik/conf.d/traefik.yml" car dans l'un c'est "admin-users" et dans l'autre c'est "admins-users@file".

          Peut-être juste rajouter, toujours dans le middleware auth.yml, une étape pour générer un mdp ?

          docker run --rm -ti xmartlabs/htpasswd mon_USER mon_MDP > htpasswd
          cat htpasswd

          Sinon pour Nextcloud, je sais que tu as pris un exemple comme ça pour faire comprendre, mais au cas où, il faut autoriser le dns que tu as personnalisé sinon nextcloud refuse de démarer à partir d'un domaine non approuvé

          docker exec --user www-data ID_CONTENEUR php occ config:system:set trusted_domains 2 --value=mon.domaine.com

          en tout cas le tuto est super clair, on voit bien que tu n'en es pas à ton 1er 😉

          2 mois plus tard

          Bonjour, merci pour le tuto que j'ai découvert grâce à @Wonderfall (j'étais passé complètement à côté).
          Juste une question, est-ce qu'il y a une différence entre utiliser "command: " + tous les paramètres ou un fichier traefik.yml ?
          Et @Banip comment tu vois par exemple qu'un fichier traefik.yml est cherché à l'initialisation ? Dans la doc de l'image traefik ? En analysant un fichier ? J'aimerais utiliser cette méthode si jamais pour les autres images qui pourraient avoir besoin de command:
          Merci !

          Juste une question, est-ce qu'il y a une différence entre utiliser "command: " + tous les paramètres ou un fichier traefik.yml ?

          Tu peux utiliser l'une ou l'autre configuration. xataz préfère fournir en commandes, moi je préfère fournir un yaml pour ça. Mais vraiment peu importante, c'est suivant l'organisation que tu préfères.

          Dans traefik.yml tu fournis ça comme provider :

          providers:
            file:
              directory: /etc/traefik/conf.d
              watch: true

          Et pour chaque conteneur à reverse tu mets un .yml dans ce dossier (monté évidemment). Comme l'exemple qu'il donne avec Nextcloud en fait.

          Après si tu veux tu peux utiliser le socket Docker en provider, mais comme dit, c'est une surface d'attaque supplémentaire et c'est pas forcément plus pratique SAUF si tu changes de conteneurs tous les jours.

          Merci, je commence par la version simple moins secure pour déjà comprendre la base et après je rajouterai les couches sécu 😉
          Donc je suis parti sur le fichier traefik.yml fourni par Banip quelques posts au dessus.
          J'ai quelques questions comme toujours :

          log:
          level: INFO
          filePath: /etc/traefik/traefik.log

          • Il ne faudrait pas ajouter un bind mount pour le répertoire ci-dessus dans le docker-compose (/etc/traefik/traefik.log) ?

          • Quelle est la différence entre web et http dans les entrypoints ?

          • Quelqu'un utilise un nom de domaine OVH ? J'ai bien suivi les procédures, apparemment c'est un DNS challenge qui est utilisé. J'ai bien configuré mon API OVH mais concernant les variables à passer, est-ce qu'il faut le faire par un fichier ? Si oui sous quelle forme ? Ou directement en variables d'environnement ? Directement dans mon fichier docker-compose ou dans le traefik.yml ?

          Merci !

          Edit : A moins que je puisse utiliser le challenge HTTP avec OVH, je viens de lire que le DNS challenge n'est pas trop sécurisé car il faut donner des droits particuliers...