• Docker
  • Traefik 1.7 Certificats SSL par default.

Hello,

Il y a quelques jours j'ai découvert Traefik un peut par hasard.
Après avoir regaré un conférence, je me suis mis en tête de remplacer mon nginx histoire de tester.

Le tout tourne sur du docker.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
725a568d7892 traefik "/traefik --api --do…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8080->8080/tcp proxy
9666bde7ffea ghost:1.25 "docker-entrypoint.s…" About an hour ago Up About an hour 2368-2369/tcp ghost

Après avoir un peut compris comment ça fonctionnais j'ai voulus forcer la connexion en https.
Mon soucis c'est que Treafik fournis mon certificat par défaut (donc non valide).

Mon fichier acme.json reste vide.

root@m~~~~~e:~/docker/root/proxy# tree
.
├── acme.json
└── traefik.toml

0 directories, 2 files
root@m~~~~~~e:~/docker/root/proxy# cat acme.json 
root@m~~~~~~e:~/docker/root/proxy# 

Voici la partie concernant traefik.toml :

[acme]
email = "semlin@DomainName.xy"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
onDemand = false
[acme.httpChallenge]
entryPoint = "http"

Les volumes du docker compose :

                volumes:
                        - "/root/docker/root/proxy/traefik.toml:/etc/traefik.toml"
                        - "/var/run/docker.sock:/var/run/docker.sock"
                        - "/root/docker/root/proxy/acme.json:/acme.json"

Au début j'ai pensé a un soucis de droit, vu que mon acme.json restais vierge, je l'ai donc chmod 777 afin d'etre certain d'éliminer cette piste.

J'ai peut être mal compris le fonctionnement de traefik (je t'atone pas mal par moment) ou simplement loupé une instruction de la doc (fort possible aussi).
Dans tout les cas je vous remercie pour votre lecture.

Salut, tu devrais faire attention a la balise code, c'est plus jolie 😉
Pour ma part voici ma config peut-être que tu verras ou ça manque 😛

  • Mon traefik.toml
    defaultEntryPoints = ["https","http"]
    
    checkNewVersion = true
    logLevel = "INFO"
    sendAnonymousUsage = true
    MaxIdleConnsPerHost = 500
    
    
    [entryPoints]
      [entryPoints.http]
      address = ":80"
        [entryPoints.http.redirect]
        entryPoint = "https"
      [entryPoints.https]
      address = ":443"
      [entryPoints.https.tls]
    
    [retry]
    
    [docker]
    endpoint = "unix:///var/run/docker.sock"
    domain = "TONDOMAIN.COM"
    watch = true
    exposedByDefault = false
    
    [acme]
    email = "admin@TONDOMAIN.COM"
    storage = "acme.json"
    entryPoint = "https"
    onHostRule = true
    [[acme.domains]]
       main = "TONDOMAIN.COM"
       sans = ["down.TONDOMAIN.COM","git.TONDOMAIN.COM"]
    [acme.httpChallenge]
    entryPoint = "http"
    
    • Mon docker-compose
    version: '3.7'
    
    services:
      traefik:
        image: traefik:latest
        restart: always
        ports:
          - 80:80
          - 443:443
        networks:
          - proxyweb
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /home/docker/traefik/traefik.toml:/traefik.toml
          - /home/docker/traefik/acme.json:/acme.json
        container_name: traefik
    
      ghost:
        image: ghost
        restart: always
        networks:
          - proxyweb
        volumes:
          - /home/docker/ghost:/var/lib/ghost/content
        environment:
          - PUID=1001
          - PGID=1001
        labels:
          - "traefik.enable=true"
          - "traefik.backend=ghost"
          - "traefik.frontend.rule=Host:TONDOMAIN.COM;PathPrefixStrip:/ "
          - "traefik.port=2368"
          - "traefik.docker.network=proxyweb"
    
      watchtower:
        image: v2tec/watchtower
        networks:
          - proxyweb
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        labels:
          - "traefik.enable=false"
          - "traefik.backend=watchtower"
        command: --interval 30
    
    networks:
      proxyweb:
        external: true
    
    Tu crées un fichier acme.json puis un
    chmod 600 acme.json 
    regarde les logs
    docker-compose logs -f 
9 jours plus tard

Hello tanguy,

Merci pour ton retour et l'aide apporté.
J'ai pu corriger pas mal d'erreur notamment le point de montage de mon fichier toml qui n'étais pas correct.

Bien vu pour les log docker 😉 ca m'a aussi permis de corriger quelques erreur dans mon fichier de configuration.

Mon fichier toml est maintenant bien pris en compte pas mon container mais le problème inital persiste !

Effectivement quand je :
docker-compose kill && docker-compose up -d && docker-compose logs -f

Je vois que let's encrypt essaye de générer un certificat pour le domaine \docker.proxy\
J'ai pourtant bien définis la partie :
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "mondomaine.ici"

Je me demande si ça ne viens pas de mon container name, a voir, je vais encore faire quelque tests mais si quelqu'un a une idée, n'hésitais pas.

Merci !

salut @semlin

Alors la je comprend pas, parce que chez moi tout fonctionne avec le ssl ... C'est bien ghost que tu veux faire tournée en docker ? si c'est le cas un simple copie coller du hauts suffit ...
Que dise tes logs ?

Nb: je viens de refaire une install en copie/collant le hauts et tout roule ...

~/traefik$ ls -la
drwxr-xr-x 2 docker docker  4096 Apr 17 23:58 .
drwxr-xr-x 8 docker docker  4096 Apr 17 23:59 ..
-rw------- 1 docker docker 13199 Apr 17 20:25 acme.json
-rw-r--r-- 1 docker docker  2590 Apr 17 20:52 docker-compose.yml
-rw-r--r-- 1 docker docker   626 Apr 17 20:22 traefik.toml

    Bon, ce matin j'avais un peut de temps libre pour m'y remettre.
    J'ai rien fais, et les certs fonctionnais.

    Du coup au top, ça a peut être pris un certain temps d'activation.
    Bon j'ai toujours la ligne dans les log mais ça fonctionne correctement.
    SI je trouve d'ou ça viens, je reviendrais ici l'indiquer pour les curieux.
    proxy | time="2019-04-16T18:38:32Z" level=error msg="Unable to obtain ACME certificate for domains \"proxy.root\" detected thanks to rule \"Host:proxy.root\" : unable to generate a certificate for the domains [proxy.root]: acme: error: 400 :: POST :: https://acme-v02.api.letsencrypt.org/acme/new-order :: urn:ietf:params:acme:error:malformed :: Error creating new order :: Name does not end in a public suffix, url: "

    Pour répondre a ta question tanguy, pour le moment j'ai simplement un ghost et un container de test.
    Mais si je remonte tout comme quand j'avais mon Nginx en SSL proxy, je vais avoir une 10ène de sub domain.

    laster13 Oui bien vu j'avais lus ça sur une doc, mais pour le coup. Avant que Tanguys me file son coup de pouce, mon container n'avais pas connaissance du fichier toml donc je pense qu'il n'essayais même pas de request let's E.
    Puis du coup maintenant le cert est stocké dans la acme, du coup ça devrais être ok 🙂

    Merci a vous deux, problem solved 😃

    Répondre…