Peux-tu partager des captures d’écran ?
Ci-joint deux captures d’écran du tableau de bord Traefik. Elles montrent que Discourse apparaît (deux fois) dans les services, mais rien dans les routeurs. Je ne sais pas forcément ce que cela signifie, à vrai dire, mais je l’ai remarqué.
Édition : Je suis un nouvel utilisateur de Discourse, je ne suis donc pas autorisé à publier deux images dans un seul message. Je répondrai donc avec une autre capture.
Je dois lancer mes dockers ce soir pour comparer, je vous tiens au courant alors, ou peut-être que d’autres ici pourront partager leur tableau de bord et comparer.
Ce n’est pas nécessaire. Il vaut mieux passer à l’API et utiliser Traefik v2.1, donc :
- "traefik.http.routers.traefik_dashboard-router.service=api@internal"
Voir Endless 502 / forwarding when calling dashboard via subdomain #6123 - #5 by ldez - Traefik v2 - Traefik Labs Community Forum
Pourriez-vous supprimer vos commentaires ?
Cela nous rend la lecture plus facile.
Pas de souci, on m’a dit la même chose une fois :).
J’écris mes commentaires sur une ligne séparée, afin de pouvoir générer facilement une version propre en utilisant cat traefikV2.yaml | grep -v "#"
Bon, il m’a fallu quelques jours pour m’y mettre. J’ai refait ma configuration Traefik pour utiliser un fichier YAML au lieu de tout mettre dans docker-compose. Cependant, après avoir tout reconnecté, je semble rencontrer le même comportement ou un comportement similaire : j’obtiens une erreur 404 sur mon domaine, et dans le tableau de bord de Traefik, je vois des entrées sous Services et Routers pour Discourse, mais rien sous Routers.
docker-compose de Traefik
version: '3'
services:
traefik:
image: traefik:v2.0
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks:
- proxy
ports:
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/acme.json:/acme.json
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=http"
- "traefik.http.routers.traefik.rule=Host(`monitor.example.com`)"
- "traefik.http.middlewares.traefik-auth.basicauth.users=user:redacted"
- "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
- "traefik.http.routers.traefik-secure.entrypoints=https"
- "traefik.http.routers.traefik-secure.rule=Host(`monitor.example.com`)"
- "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
- "traefik.http.routers.traefik-secure.tls=true"
- "traefik.http.routers.traefik-secure.tls.certresolver=http"
- "traefik.http.routers.traefik-secure.service=api@internal"
networks:
proxy:
external: true
données Traefik/traefik.yml
api:
dashboard: true
entryPoints:
http:
address: ":80"
https:
address: ":443"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
certificatesResolvers:
http:
acme:
email: nick@innomadic.com
storage: acme.json
httpChallenge:
entryPoint: http
containers/app.yml
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
expose:
params:
db_default_text_search_config: "pg_catalog.english"
db_shared_buffers: "128MB"
env:
LANG: en_US.UTF-8
UNICORN_WORKERS: 2
DISCOURSE_HOSTNAME: forum.example.com
DISCOURSE_DEVELOPER_EMAILS: 'info@example.com'
DISCOURSE_SMTP_ADDRESS: redacted.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: redacted
DISCOURSE_SMTP_PASSWORD: "redacted"
LETSENCRYPT_ACCOUNT_EMAIL: info@example.com
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
run:
- exec: echo "Beginning of custom commands"
- exec: echo "End of custom commands"
labels:
app_name: discourse
traefik.enable: true
traefik.docker.network: proxy
traefik.http.routers.discourse.rule: Host(`forum.example.com`)
traefik.http.routers.discourse.entrypoints: http
traefik.http.routers.discourse.middlewares: discourse_redirect2https
traefik.http.services.discourse.loadbalancer.server.port: 80
traefik.http.routers.discourse_secure.rule: Host(`forum.example.com`)
traefik.http.routers.discourse_secure.entrypoints: https
traefik.http.services.discourse_secure.loadbalancer.server.port: 80
traefik.http.routers.discourse_secure.tls.certresolver: tlsChallenge_letsencrypt
traefik.http.middlewares.discourse_redirect2https.redirectscheme.scheme: https
docker_args:
- "--network=proxy"
- "--expose=80"
Je pense avoir également exécuté la commande docker network connect proxy pour attacher ce conteneur au réseau Traefik.
Je vous remercie pour toute aide afin de voir ce qui me manque ici, et j’aimerais aussi savoir si j’ai mis mes mesures de sécurité en ordre.
Je ne sais pas ce qui vous manque. Voici ce que je fais dans Ansible pour lancer des sites avec Traefik :
--docker-args "-l traefik.frontend.rule=Host:{{discourse_hostname}} \
-l traefik.frontend.entryPoints=https \
-l traefik.backend={{discourse_shortname}} \
-l traefik.port=80"
Ensuite, exécutez :
./launcher start {{ discourse_yml }} {{ docker_args }}
Ajouter les règles Traefik dans docker_args plutôt que dans le fichier YAML présente l’avantage supplémentaire d’éviter que Traefik ne prenne en compte le conteneur en cours de bootstrap.
Je pense que c’est Traefik v1, peut-être ?
Oh. Désolé. Oui, je suis presque certain qu’il s’agit de Traefik 1, donc je ne pourrai pas vous aider avec des détails précis.
Il ne semble pas que vous définissiez de valeurs dans ces labels dans app.yml ? Je pense que vous devez définir une règle et, peut-être, un middleware ?
Si vous ne voulez pas d’interruption de service pendant le démarrage initial, vous devrez les configurer avec ./launcher start, comme dans mon exemple.
Peut-être que « middleware » est ce qui était autrefois appelé « backend » ? Vous devrez faire quelque chose pour indiquer que le conteneur Discourse est le serveur que vous souhaitez et… quelque chose d’autre… pour connecter un front-end/URL au backend/serveur approprié.
Ils sont bien définis, mais vous devez un peu défiler vers la droite pour les voir. C’est juste un problème de mise en forme.
Merci
LOL. Désolé pour ça.
Bon, je n’ai aucune idée de ce dont je parle, mais il n’a pas de sens pour moi que vous configuriez votre discourse@docker comme un équilibreur de charge.
Salut, je pense que j’ai trouvé.
J’ai supprimé la ligne :
# traefik.http.services.discourse_secure.loadbalancer.server.port: 80
mais j’ai laissé celle-ci :
traefik.http.services.discourse.loadbalancer.server.port: 80
labels:
app_name: discourse
#----Traefik labels------------------------
traefik.enable: true
traefik.docker.network: proxy
#---SECTION ROUTEUR HTTP-------------------
traefik.http.routers.discourse.rule: Host(`forum.example.com`)
#--SECTION HTTP--------------------------
traefik.http.routers.discourse.entrypoints: http
traefik.http.routers.discourse.middlewares: discourse_redirect2https
traefik.http.services.discourse.loadbalancer.server.port: 80
#---SECTION ROUTEUR HTTPS
traefik.http.routers.discourse_secure.rule: Host(`forum.example.com`)
#--SECTION HTTPS
traefik.http.routers.discourse_secure.entrypoints: https
# traefik.http.services.discourse_secure.loadbalancer.server.port: 80
#--SECTION TLS
traefik.http.routers.discourse_secure.tls.certresolver: tlsChallenge_letsencrypt
#---SECTION MIDDLEWARE redirection HTTP vers HTTPS
traefik.http.middlewares.discourse_redirect2https.redirectscheme.scheme: https
Je ne sais pas comment cela s’est produit ni pourquoi c’est ainsi, mais cela fonctionne. Donc, en utilisant toute la configuration que j’ai publiée ci-dessus dans le fil de discussion, mais en apportant ce seul changement, cela fonctionne pour moi maintenant.
Merci à tous !
c’est correct.
J’ai ajouté ceci dans ma configuration :
#—SECTION SERVICE indique à Traefik où envoyer la requête
traefik.http.services.discourse.loadbalancer.server.port: 80
est-ce que cela vous dit quelque chose ?
Ce que vous faites ici, c’est indiquer à quel service la requête est envoyée et sur quel port.
Vous pourriez aussi résoudre le problème en utilisant expose, mais d’un point de vue sécurité, vous souhaitez exposer le moins possible de vos conteneurs. De plus, Traefik sélectionne le premier port si vous exposez plusieurs ports, donc l’utilisation de loadbalancer est plus propre.
Traefik data/traefik.yml
Je ne fais pas cela car ce chemin est le chemin par défaut.
Vous n’utilisez pas le chemin complet ici, mais un chemin par défaut. Je n’aime pas cela car vous devez garder en tête le chemin. Moi, j’utilise : storage: /etc/ssl/certs/letsencrypt/acme.json.
Je définis le réseau, je n’aime pas les paramètres par défaut.
providers: docker: exposedByDefault: false network: bridge_proxy_traefikv2
containers/app.yml
Vous n’avez pas besoin de faire cela, c’est pris en charge par loadbalancer.
Traefik docker-compose
Vous voudrez peut-être donner un nom à ce réseau, dans mon cas :
networks: traefik: external: name: bridge_proxy_traefikv2
J’ai travaillé sur vos suggestions ici. Merci pour votre réponse.
Je tiens à souligner que pour le point de terminaison, vous dites de faire confiance aux paramètres par défaut, tandis que pour l’emplacement de stockage, vous indiquez ne pas aimer faire confiance aux paramètres par défaut. ![]()
J’ai essayé d’appliquer la modification pour acme.json que vous avez mentionnée :
Cependant, mon conteneur Traefik n’a pas trouvé le fichier par la suite. Une erreur est apparue dans le journal. Je l’ai donc laissé tel quel, sous la forme acme.json pour l’instant.
Je voulais vous poser une question à ce sujet :
Ne faites-vous pas simplement renommer le réseau ici, ou lui donner un nom localisé ? Je pense que je l’ai simplement appelé « proxy » dans l’autre configuration et ici localement. Il conserve toujours un nom que j’ai défini, je ne le renomme pas. Du moins, c’est ainsi que je le comprends.
J’ai une dernière préoccupation notable. J’ai remarqué après mon message « Succès ! » ci-dessus que, bien que HTTPS fonctionne, j’obtiens un avertissement de contenu mixte. Donc, tout n’est pas chiffré.
J’obtiens l’erreur de contenu mixte pour mon installation Discourse, mais pas pour l’installation WordPress que j’ai sur le même serveur. Cela doit donc être spécifique à mes paramètres Discourse.
En regardant dans la console de développement, je vois :
Chargement de contenu d’affichage mixte (non sécurisé) « http://talk.redacted.com/uploads/default/optimized/1X/_129430568242d1b7f853bb13ebea28b3f6af4e7_2_180x180.png » sur une page sécurisée FaviconLoader.jsm:174:19
Donc, peut-être que ma redirection ne fonctionne pas correctement d’une manière ou d’une autre ?
Je joins ci-dessous les fichiers pertinents pour examen.
Traefik.yml
api:
dashboard: true
entryPoints:
http:
address: “:80”
https:
address: “:443”
providers:
docker:
exposedByDefault: false
network: proxy
certificatesResolvers:
http:
acme:
email: info@private.com
storage: acme.json
httpChallenge:
entryPoint: http
Traefik docker-compose
version: ‘3’
services:
traefik:
image: traefik:v2.0
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks:
- proxy
ports:
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/acme.json:/acme.json
labels:
- “traefik.enable=true”
- “traefik.http.routers.traefik.entrypoints=http”
- “traefik.http.routers.traefik.rule=Host(monitor.private.com)”
- “traefik.http.middlewares.traefik-auth.basicauth.users=private:private”
- “traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https”
- “traefik.http.routers.traefik.middlewares=traefik-https-redirect”
- “traefik.http.routers.traefik-secure.entrypoints=https”
- “traefik.http.routers.traefik-secure.rule=Host(monitor.private.com)”
- “traefik.http.routers.traefik-secure.middlewares=traefik-auth”
- “traefik.http.routers.traefik-secure.tls=true”
- “traefik.http.routers.traefik-secure.tls.certresolver=http”
- “traefik.http.routers.traefik-secure.service=api@internal”
networks:
proxy:
external: true
app.yml
templates:
- “templates/postgres.template.yml”
- “templates/redis.template.yml”
- “templates/web.template.yml”
- “templates/web.ratelimited.template.yml”
expose:
params:
db_default_text_search_config: “pg_catalog.english”
db_shared_buffers: “128MB”
env:
LANG: en_US.UTF-8
UNICORN_WORKERS: 2
DISCOURSE_HOSTNAME: talk.private.com
DISCOURSE_DEVELOPER_EMAILS: ‘info@private.com’
LETSENCRYPT_ACCOUNT_EMAIL: info@private.com
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared - volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone GitHub - discourse/docker_manager: Plugin for use with discourse docker image · GitHub
run:
- exec: echo “Beginning of custom commands”
- exec: echo “End of custom commands”
labels:
app_name: discourse
traefik.enable: true
traefik.docker.network: proxy
traefik.http.routers.discourse.rule: Host(talk.private.com)
traefik.http.routers.discourse.entrypoints: http
traefik.http.routers.discourse.middlewares: discourse_redirect2https
traefik.http.services.discourse.loadbalancer.server.port: 80
traefik.http.routers.discourse_secure.rule: Host(talk.private.com)
traefik.http.routers.discourse_secure.entrypoints: https
traefik.http.routers.discourse_secure.tls: true
traefik.http.routers.discourse_secure.service: discourse
traefik.http.routers.discourse_secure.tls.certresolver: http
traefik.http.middlewares.discourse_redirect2https.redirectscheme.scheme: https
docker_args:
- “–network=proxy”
Donc, avez-vous des idées sur la raison pour laquelle j’obtiens l’erreur de contenu mixte ?
Eh bien, pendant un instant, j’ai cru que Discourse était devenu conscient car j’ai reçu cette notification dans ma vue d’administrateur :
Cependant, j’ai apporté cette modification et j’ai toujours reçu l’erreur de contenu mixte. J’ai également déconnecté, vidé le cache et reconnecté. Même résultat.
Il semble que mes requêtes de connexion soient toujours chiffrées, ce qui est bien, je suppose, mais je dois me débarrasser de cette erreur de contenu mixte. La configuration se trouve ci-dessus dans le message précédent.
Autre mise à jour : l’avertissement de contenu mixte a maintenant disparu. Je ne suis pas certain de la raison. Je suppose que cela est lié au paramètre force_https, mais je n’ai pas obtenu de chargement de page propre pendant environ 30 minutes après avoir modifié ce paramètre, même si j’ai vidé mon cache et me suis déconnecté puis reconnecté, comme je l’ai mentionné plus haut.
La bonne nouvelle est que j’ai l’air d’avoir une installation Discourse fonctionnelle derrière un proxy inverse Traefic.
Ce sont les images, qui sont chargées via des connexions HTTP, qui posent le même problème. Voir :
- Cool features of Firefox Developer Tools - #16 by da4nic - Developer Tools - Mozilla Discourse
- "security" tab in developer tools - Developer Tools - Mozilla Discourse
Cela devrait également aider : - Mixed content problem
- Got mix-content error and confused - #12 by mr8
- Mixed content due to hotlinked images - #13 by nbianca
Avez-vous correctement monté le volume ? Traefik peut être assez déroutant en ce qui concerne les chemins.
Par exemple, je fais :
volumes: - /etc/ssl/certs/traefik/letsencrypt:/etc/ssl/certs/letsencrypt - /opt/traefik/traefik-config.yaml:/etc/traefik/traefik.yaml - /etc/passwd.traefik.dashboard:/etc/passwd.BasicAuth.dashboard - /etc/passwd.traefik.whoami:/etc/passwd.BasicAuth.whoami
Je ne m’en souviens plus, mais il y avait une raison pour cela, peut-être pour bien le voir dans l’interface en ligne de commande lors de la liste des réseaux.
Non, je n’ai pas monté comme ça. Voici ma section volumes de docker-compose pour Traefik :
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/acme.json:/acme.json
Je remarque que le mien ne mentionne même pas Let’s Encrypt, alors que le vôtre le fait. J’imagine que vous avez créé ce dossier profondément imbriqué dans votre répertoire docker-compose et y avez placé votre fichier acme.json ?
L’autre chose que je remarque, c’est que j’ai ce docker.sock et localtime. Je ne sais pas à quoi sert celui de localtime, et peut-être que l’instruction docker.sock pose un problème de sécurité. Je dois me renseigner là-dessus.
Je remarque que le mien ne mentionne même pas Let’s Encrypt, alors que le vôtre le fait. Je suppose que vous avez créé ce dossier profondément imbriqué dans votre répertoire docker-compose et que vous y avez placé votre acme.json ?
La création du certificat Let’s Encrypt est gérée par Traefik. Le montage d’un volume me permet de le stocker sur l’hôte plutôt que dans Docker.
Je me souviens que la configuration de tous les montages a été un vrai casse-tête ; j’ai dû effectuer toutes sortes de vérifications en utilisant docker exec -it :
lsdirvi







