--- title: "Traefik" date: 2025-04-09T12:02:34+02:00 tags: - 100DaysToOffload draft: false author: "Colmaris" description: "Jour 015/100 du défi 100DaysToOffLoad." toc: true --- Compilation d'infos utiles sur Traefik. ## Fichiers Les fichiers de confs se trouvent sur ma [forge]() git. ## Identifiant de connexion L’identifiant de connexion se présente sous la forme d’une ligne de texte à ajouter tel quel dans le fichier `traefik_auth_file`, contenant le nom d’utilisateur et le mot de passe qui sera chiffré avec openssl. Dans le répertoire `/traefik/secrets`. ```shell openssl passwd -apr1 mon_mot_de_passe $apr1$89eqM5Ro$CxaFELthUKV21DpI3UTQO. ``` Copier ensuite l'identifiant/mot de passe dans le fichier `/traefik/secrets` : ```shell user:$apr1$89eqM5Ro$CxaFELthUKV21DpI3UTQO. ``` ## Configuration TLS Dans le répertoire `/traefik/config` ajouter un fichier `tls.yml`. Il s’agit d’une configuration classique, j’utilise les ciphers autorisés dans la configuration par defaut, avec une version de TLS minimum en 1.2 et je force l’utilisation de TLSv1.3. ```yaml tls: options: default: minVersion: VersionTLS12 sniStrict: true cipherSuites: - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 # TLS 1.2 - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 # TLS 1.2 - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 # TLS 1.2 - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 # TLS 1.2 - TLS_AES_256_GCM_SHA384 # TLS 1.3 - TLS_CHACHA20_POLY1305_SHA256 # TLS 1.3 - TLS_FALLBACK_SCSV # TLS FALLBACK curvePreferences: - secp521r1 - secp384r1 - X25519 - CurveP521 - CurveP384 - CurveP256 modern: minVersion: VersionTLS13 ``` ## Les middlewares Par souci de compréhension j'utilise un fichier par middleware. Ils sont placés dans le dossier `/traefik/config/nom-middleware.yml`. ### Headers et HSTS Nom du fichier : config.yml ```yaml hsts-headers: headers: frameDeny: true browserXssFilter: true contentTypeNosniff: true stsIncludeSubdomains: true stsPreload: true stsSeconds: 31536000 forceStsHeader: true ``` ### Compression Compression en GZIP, nom du fichier: compression.yml. ```yaml http: middlewares: compression: compress: excludedContentTypes: - "text/event-stream" ``` ## Docker compose commenté ```yaml networks: traefik: external: true services: traefik: image: traefik:banon restart: unless-stopped container_name: traefik ports: - 80:80 - 443:443 labels: - traefik.enable=true # J'active traefik - traefik.docker.network=traefik # j'indique le réseau pour l'exposition du conteneur - traefik.http.middlewares.admin-auth.basicauth.usersfile=/secrets/traefik_auth_file # fichier contenant l'auhentification pour l'accès au dashboard - traefik.http.routers.traefik.rule=Host(`traffic.${DOMAIN}`) # url d'accès - traefik.http.routers.traefik.entrypoints=https # port d'écoute utilisé - traefik.http.routers.traefik.tls=true # chiffrage - traefik.http.routers.traefik.service=api@internal # service propre à traefik pour le dashboard - traefik.http.routers.traefik.tls.certresolver=le # Let's encrypt comme resolveur de certificat - traefik.http.routers.traefik.middlewares=admin-auth # activation de l'authentification via le fichier défini plus haut - traefik.http.services.traefik.loadbalancer.server.port=8080 # port d'écoute du dashbord non exposé volumes: - /var/run/docker.sock:/var/run/docker.sock:ro # écoute de l'api docker - /mnt/nas/voljin/volumes/traefik:/certificates # stockage des certificats - ./secrets:/secrets:ro # stockage des mots de passes - ./config:/config:ro # configuration dynamique - ./logs:/logs # enregistrement des logs. command: # ------------------------------------------- providers Docker - --providers.docker - --providers.docker.exposedbydefault=false # ------------------------------------------- Providers Fichier - --providers.file.directory=/config/ - --providers.file.watch=true # ------------------------------------------- Ports - --entrypoints.http.address=:80 - --entrypoints.https.address=:443 # ------------------------------------------- Redirection vers https - --entrypoints.http.http.redirections.entrypoint.to=https - --entrypoints.http.http.redirections.entrypoint.scheme=https # ------------------------------------------- Configuration SSL - --certificatesresolvers.le.acme.email=${TRAEFIKEMAIL} - --certificatesresolvers.le.acme.storage=/certificates/acme.json - --certificatesresolvers.le.acme.tlschallenge=true # ------------------------------------------- Configuration traefik - --global.sendanonymoususage=false - --accesslog=true - --log.level=INFO - --log.filePath=/logs/traefik.log - --api networks: - traefik ```