Oui c'est un risque pour des vieux clients, mais après on n'est plus en 2015 (et encore en 2016 en utilisant "précocement" les certificats EC384 j'ai eu peu de soucis), aujourd'hui le support des certificats ECC et plus précisément EC384 est vraiment "mainstream", ça ne devrait pas poser de soucis. Donc franchement t'es bon avec juste ça.

Du coup il faut que je modifie la configuration des routers aussi ? Plus besoin d'avoir un router traefik, je garde uniquement le traefik-secure ? Et j'adapte le nom de l'entrypoints en fonction de ce que j'ai renseigné dans mon traefik.yml ?

Oui c'est ça, tu vires les routeurs qui sont pas "secure", ça ne sert plus à rien vu que la redirection sera globale sur l'entrypoint "non-secure". J'ai testé les redirections, ça marche parfaitement et c'est une solution propre (maintenant suggérée dans leur doc).

Merci @Wonderfall
Je vais tester de rester uniquement en EC384, si je vois que certains clients ne peuvent pas se connecter je regarderai pour remettre d'autres certificatesresolvers 😉
Pour la redirection effectivement je viens de regarder la doc et j'ai vu ce dont tu parles, je suis parti comme dans leur exemple du coup :

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
          permanent: true
  websecure:
    address: ":443"

La seule différence avec ton exemple c'est le to: qui pointe vers websecure au lieu de :443 mais ça doit revenir au même vu que websecure pointe vers :443 (et donc si jamais on venait à modifier, pour x raison, le 443 en 4443 on aurait juste à faire une modif sur websecure au lieu de 2 ?)

Je pense que traefik est OK après ces modifs, me reste à essayer d'intégrer une app comme nextcloud ou autre, et une fois que tout sera fonctionnel je passe à la sécurisation 🙂

    Et donc si j'ai bien compris, si par exemple mon app traefik est dans /home/user/docker/traefik et que je veux créer une autre app dans /home/user/docker/app, je n'aurais plus à déclarer de labels concernant traefik dans le docker-compose.yml de la nouvelle app ?
    J'aurais juste à créer un app.yml dans le dossier conf.d de traefik avec les infos concernant ma nouvelle app et c'est tout ? Pas besoin de bind mount le dossier conf.d dans le docker-compose.yml de ma nouvelle app ?
    Si je prends par exemple portainer (je n'ai pas encore organisé mes stacks donc disons qu'elle sera à part et on ferme les yeux sur le docker.sock pour le moment 😃), j'aurais juste ce fichier docker-compose.yml dans le répertoire que je veux ?

    version: "2.4"
    
    networks:
      frontend:
        external: true
    
    services:
      portainer:
        container_name: portainer
        image: portainer/portainer-ce
        volumes:
          - ./data/:/data/
          - /var/run/docker.sock:/var/run/docker.sock
        networks:
          - frontend
        restart: unless-stopped

    NicCo La seule différence avec ton exemple c'est le to: qui pointe vers websecure au lieu de :443 mais ça doit revenir au même vu que websecure pointe vers :443 (et donc si jamais on venait à modifier, pour x raison, le 443 en 4443 on aurait juste à faire une modif sur websecure au lieu de 2 ?)

    Oui c'est la même chose, moi j'ai précisé :443 car mon conteneur Traefik est rootless et écoute sur le port 4430 (et avec la magie de Docker et du NAT ça devient le port 443 exposé sur mon IP publique). Mais longue histoire

    J'aurais juste à créer un app.yml dans le dossier conf.d de traefik avec les infos concernant ma nouvelle app et c'est tout ? Pas besoin de bind mount le dossier conf.d dans le docker-compose.yml de ma nouvelle app ?

    Pas besoin non, l'app n'y ferait rien. Traefik communiquera avec ton app via le réseau docker, frontend dans ton cas. Après moi j'utilise encore la configuration dynamique, il faudra voir les exemples de xataz pour la configuration statique, mais c'est l'idée

    Merci @Wonderfall
    Petit à petit ça avance, c'est cool 🙂
    Encore une question : si par exemple je souhaite monter un serveur de medias type Emby ou Jellyfin auquel je veux accéder soit directement en local, soit derrière Traefik, il suffit juste de rajouter les ports dans le docker-compose du serveur de medias ? En l'occure :

    ports :
      - 8096:8096
      - 7359:7359/udp
      - 1900:1900/udp

    Merci !

    Edit: Je viens de tomber sur macvlan, c'est la solution qu'il faudrait que j'utilise ?

      NicCo Ne fais pas ça, tu risques d'exposer publiquement Jellyfin en HTTP, c'est pas ce que tu veux. Ce qu'il faut faire, c'est lier les 2 conteneurs (Jellyfin et Traefik) avec un réseau, et créer un service qui écoute sur jellyfin:8096.

      Si ton serveur est local, tu peux par contre modifier et préciser par sécurité 127.0.0.1:8096:8096 pour qu'en gros le port ne soit exposé que localement si tu veux y accéder sans Traefik. Pareil pour les autres, si c'est une utilisation spécifique (je doute que tu aies besoin les exposer sur Internet !).

      Moi je ferais juste tout simplement passer par Traefik, et dans ce cas tu n'as pas besoin de publier les ports de Jellyfin.

        Wonderfall Merci, donc je crée un réseau différent de frontend, je l'ajoute sur Jellyfin et Traefik et je crée un autre service différent de celui-ci ?

        http:
          services:
            jellyfin:
              loadBalancer:
                servers:
                  - url: "http://jellyfin:8096"

        Pour le serveur oui il est en local, si je précise 127.0.0.1:8096:8096, tous les équipements de mon réseau local pourront y accéder ? Par contre Jellyfin utilise 2 autres ports UDP pour le discovery et le DLNA. J'avais tenté d'exposer les 3 ports pour tester dans mon docker-compose mais par exemple le DLNA n'était pas détecté sur mon réseau local, alors qu'avec macvlan oui.

        Et tout passer par Traefik, je vais être dépendant de ma connexion Internet non ? Si je passe comme ça, je perds également le discovery et le DLNA, pratique pour la famille. Si j'utilise macvlan, l'accès ne sera pas limité uniquement qu'aux IP du subnet défini dans le réseau macvlan ?

          NicCo J'avoue que ça dépasse un peu mon utilisation donc je ne peux pas trop t'aider sur ce terrain. 🙁

          Mais macvlan me semble être utilisé pour des besoins bien précis, ce réseau associe une adresse MAC à ton conteneur, j'ai du mal à voir pourquoi faire ça.

          Sinon au pire tu publies le port 8096 et le reste normalement, mais tu filtres l'accès par iptables comme ça :
          -A FILTERS -p tcp --dport PORT -s LOCAL_SUBNET -j ACCEPT
          Avec la chaîne FILTERS à ajouter dans INPUT et DOCKER-USER. C'est une solution aussi je pense

          @Wonderfall De ce que j'ai compris macvlan te permet d'attaquer directement le réseau en bypassant un peu l'hôte en gros. Par contre il n'y a aucune communication entre l'hôte Docker et les containers d'après ce que j'ai lu.
          La surface d'attaque est donc limitée je pense. J'ai trouvé un cas d'utilisation pour Jellyfin / Emby et un AdGuard apparemment.
          Je vais refaire quelques tests hors Traefik pour voir déjà ce que ça donne, sinon je testerai ta méthode aussi 😉 merci

          @Wonderfall Je viens de relire la doc de Jellyfin et eux indiquent d'utiliser le host mode à la base. Sauf qu'à priori le host mode n'est pas compatible avec l'utilisation de networks donc pas possible d'utiliser le container en local (avec le DLNA qui fonctionne) et en distant derrière Traefik.
          Donc en gros :

          • soit je passe tout derrière Traefik (mais est-ce que le fonctionnement est le même qu'à l'extérieur, à savoir que le débit max sera celui de l'upload de ma connexion donc 40Mbps ? Malgré que soit pour une utilisation LAN le flux va sortir et rentrer par ma connexion Internet ?)
          • soit j'utilise macvlan pour avoir un Jellyfin complètement opérationnel, avec les éventuels risques de sécurité que ça peut comporter
          • soit je me passe du DLNA et du discover (je vais re réfléchir à mon utilisation) et à ce moment-là je peux exposer sur mon réseau local, en activant en plus la règle iptables que tu m'as indiqué

            NicCo Moi je pense toujours que tu peux utiliser bridge même pour les ports en local.
            Précise l'IP du subnet local comme j'ai montré avant pour voir si ça marche. Et si ça marche pas, tu le fais écouter sur localhost et puis t'utilises nginx pour reverse proxy ça.

            Dans tous les cas, je vois difficilement l'intérêt du mode network host, tu peux juste publier les ports de la bonne façon. Et en dernier recours faire des règles iptables manuelles.

            Merci je vais tester ça 😉

            @Wonderfall (ou quelqu'un d'autre 🙂 ) j'ai encore une question sur Traefik. Je vais partir sur la solution "faire des réseaux uniques pour chaque lien Traefik <-> conteneur.", autant partir sur une bonne base de sécurité.
            Donc pour les réseaux type DB ou Redis, on est OK qu'un réseau internal suffit vu qu'il n'y a pas besoin d'accéder à l'extérieur.
            Par contre pour tous les réseaux des apps auxquelles je vais accéder derrière traefik, je peux les créer en internal (vu que c'est traefik qui est en frontal) ou il faut quand même les créer en external ? Et il faut aussi prévoir un réseau dédié à traefik vers l'extérieur ou pas la peine ? Si oui, comment déclarer que traefik va utiliser ce réseau pour les communications depuis et vers l'extérieur ?
            Merci !

            Donc pour les réseaux type DB ou Redis, on est OK qu'un réseau internal suffit vu qu'il n'y a pas besoin d'accéder à l'extérieur.

            Oui, c'est préférable.

            Par contre pour tous les réseaux des apps auxquelles je vais accéder derrière traefik, je peux les créer en internal (vu que c'est traefik qui est en frontal) ou il faut quand même les créer en external ?

            Le truc c'est que ton conteneur va quand même avoir besoin d'un réseau non-internal, sinon par exemple dans ton cas avec Jellyfin, il pourra pas récupérer des métadonnées pour tes bibliothèques. Ces réseaux-là je les laisserais comme ça.

            Du coup pareil pour Traefik, il lui faut au moins un réseau connecté au monde extérieur. Pour ces réseaux-là ne t'embête donc pas à faire des réseaux internal.

            4 jours plus tard

            @Wonderfall J'hésite sur la compréhension d'un point pour les réseaux sur Traefik. Imaginons que j'ai 3 applis à faire passer par Traefik. Il faut donc que je crée seulement 3 réseaux différents (tous external, un par app) ou 4 réseaux (tous external, un par app + un pour Traefik) ? Je pense que le réseau 4 est inutile si j'ai bien compris.
            En résumé :

            • Réseau1 (external) : Traefik + App1
            • Réseau2 (external) : Traefik + App2
            • Réseau3 (external) : Traefik + App3
            • Réseau4 (external) : Traefik -> ?

            Et s'il faut le réseau 4 comment Traefik sait qu'il doit être connecté à l'extérieur par celui-là ? C'est à déclarer dans traefik.yml en providers: docker: network: ? Merci !

            Edit : Et d'ailleurs dans chaque docker-compose qui a plusieurs réseaux déclarés il faut lui préciser lequel est à utiliser pour Traefik ?

              NicCo Oui j'ai pas très bien compris, mais le 4ème réseau sera inutile du coup.
              Traefik utilise ce label par app que tu veux exposer : traefik.docker.network=mon_reseau

              @Wonderfall Oui difficile à expliquer mais en gros il ne faut pas que je crée un réseau où il y aura juste traefik tout seul dedans. Donc dans le cas où j'ai 3 apps avec chacun leur réseau dédié, je déclare ces 3 réseaux dans le docker-compose de traefik. Mais comment savoir lequel des 3 doit être utilisé par traefik pour sortir ? J'en prends un au hasard vu qu'ils sont tous external ?
              Et on est obligé de passer par les labels ? On ne peut pas déclarer soit dans le fichier yaml de config statique de traefik, soit dans le fichier yaml de config des services/routers de chaque app ?
              Merci.

                NicCo Un réseau external te donne la connectivité, mais à partir de là tu map Traefik aux ports de l’hôte directement. Le label que j’ai donné est à préciser pour chaque conteneur pour que Traefik sache sur quel réseau il doit trouver ce conteneur. Comme dit, moi j’ai juste pour le moment un gros réseau frontend.

                Chez Traefik tu as différents backends (Docker, file, etc.) et types de configuration (dynamique/statique, labels/toml/yaml). Donc tout ce que tu peux faire en label tu peux le faire en statique yaml et vice versa. La documentation couvre vraiment beaucoup, n’hésite pas à la consulter !

                @Wonderfall Merci, j'ai regardé la doc de traefik et j'ai fouillé un peu sur Google mais difficile de trouver quelqu'un qui a mis en place un réseau par app.
                Du coup je ne sais pas trop quoi comme réseau pour traefik quand il y a plusieurs apps avec un réseau chacun.

                App1 :

                version: "2.4"
                
                networks:
                  network1:
                    external: true
                
                services:
                  app1:
                    container_name: app1
                    image: app/app1
                    labels:
                      - traefik.docker.network=network1
                    networks:
                      - network1
                    restart: unless-stopped

                App2 :

                version: "2.4"
                
                networks:
                  network2:
                    external: true
                
                services:
                  app2:
                    container_name: app2
                    image: app/app2
                    labels:
                      - traefik.docker.network=network2
                    networks:
                      - network2
                    restart: unless-stopped

                App3 :

                version: "2.4"
                
                networks:
                  network3:
                    external: true
                
                services:
                  app3:
                    container_name: app3
                    image: app/app3
                    labels:
                      - traefik.docker.network=network3
                    networks:
                      - network3
                    restart: unless-stopped

                Traefik :

                version: "2.4"
                
                networks:
                  network1:
                    external: true
                  network2:
                    external: true
                  network3:
                    external: true
                
                services:
                  traefik:
                    container_name: traefik
                    image: traefik
                    volumes:
                      - ./traefik.yml:/etc/traefik/traefik.yml
                      - ./acme/acme.json:/etc/traefik/acme.json
                      - ./certs:/etc/traefik/certs
                      - ./conf.d:/etc/traefik/conf.d
                      - /var/run/docker.sock:/var/run/docker.sock
                    ports:
                      - 80:80
                      - 443:443
                    networks:
                      - network1
                      - network2
                      - network3
                    restart: unless-stopped

                Avec ce genre d'environnement, normalement je dois rajouter dans le fichier de configuration traefik.yml quel réseau doit être utilisé par traefik non ? Sur les autres exemples que je trouve un peu partout c'est toujours "web" ou "frontend" donc un seul réseau pour tous, mais dans le cas de plusieurs networks je ne vois pas lequel indiquer dans la conf de traefik :

                providers:
                  docker:
                    network: network1 # ou network2 ou network3

                La doc de traefik indique bien

                Defines a default docker network to use for connections to all containers.

                Mais tu as essayé comme ça ? Tu ne devrais pourtant pas avoir à préciser de réseau pour le provider Docker. Pour moi ça devrait fonctionner si tu précises par app le label Traefik du réseau à utiliser.

                Sinon c'est effectivement un cas très rare, d'habitude on fait un gros réseau frontend avec le provider Docker, rapide et simple mais isole moins les apps entre elles (ça pose problème si tu dépends par exemple d'une basicauth donc via le proxy pour sécuriser l'accès à une application).

                Cependant sache qu'il n'y a aucun problème si utilises des configurations statiques, même sans forcément les IP statiques (c'est juste pour gVisor ça, t'embête pas comme moi) ; donc au pire des cas, fais de la configuration statique directement avec l'exemple que je t'avais fourni par mail (ou celui de xataz). Mais je suis persuadé qu'avec juste les labels de réseau ça devrait marcher, ça me semblait logique (mais si ce n'est pas le cas excuse-moi).