Discours avec Traefik 2.0

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 "#"

voici mon tableau de bord

  1. Tableau de bord
  2. Routeurs HTTP
  3. Services HTTP
  4. Middlewares HTTP

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. :slight_smile:

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 :


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.

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 :

  • ls
  • dir
  • vi