J'aime bien l'idée du namespace, malheureusement je ne sais pas si c'est adaptable à tous les cas. Jamais essayé pour cette raison, je préfère vérifier conteneur/conteneur ce qu'il s'y passe. Mais c'est une solution aussi !
Traefik v2, un vrai reverse proxy
- Modifié
Merci pour ces explications c'est vraiment très clair !
J'ai deux petites remarques :
Dans le docker-compose tu map /etc/traefik/conf.d
mais dans le provider file tu as mis /etc/traefik/conf/
Dans les exemples de middlewares basicAuth il faut bien mettre le A en majuscule sinon le middleware est invalide
Je rencontre un problème mais je fouille encore, traefik me dit que mes routeurs utilises un resolver qui n'existe pas... mais une fois réglé tout sera bon !
ç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
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
- Modifié
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
- Modifié
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
- Modifié
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
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
- Modifié
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
- Modifié
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.
J'ai modifier le tuto sur la partie Resolver, effectivement impossible de les modifier dynamiquement, dommage
Bonjour,
Pourrais tu revoir le tutorial car il est mal fait en termes d'ordre car je but sur pas mal de chose
- Modifié
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.
- Modifié
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