Diskussion mit Traefik 2.0

can you share screenshots?

Attached are two screenshots from the traefik dashboard. They show that discourse is showing up (twice) in the service, but nothing in the routers. I don’t necessarily know that means TBH but I noticed it.

Edit: I am a new discourse user so I am not trusted to put two images in one post, so I will reply with another.

Need to bring up my dockers tonight to compare, let you know than or maybe some others here can share their dashboard and compare

you don’t need that, better switch to the API and use traefik v2.1, so:
- "traefik.http.routers.traefik_dashboard-router.service=api@internal"
See Endless 502 / forwarding when calling dashboard via subdomain #6123 - #5 by ldez - Traefik v2 - Traefik Labs Community Forum

can you remove your comments

it make it easier to read for us.
No worries I was told the same once :).
I write my comments in extra line, so I can create a clean print easily using cat traefikV2.yaml | grep -v "#"

here is my dashboard

  1. Dashboard
  2. HTTP Routers
  3. HTTP Services
  4. HTTP Middlewares

Okay, es hat mich ein paar Tage gekostet, bis ich dazu kam. Ich habe meine Traefik-Konfiguration überarbeitet, um eine YAML-Datei zu verwenden, anstatt alles in docker-compose unterzubringen. Nachdem ich jedoch alles wieder verkabelt habe, scheint sich das gleiche oder ein ähnliche Verhalten einzustellen – ich erhalte einen 404-Fehler auf meiner Domain, und im Traefik-Dashboard sehe ich Einträge unter Services und Routers für Discourse, aber nichts unter Routers.

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.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
Traefik data/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"

Ich glaube, ich habe auch den Befehl docker network connect proxy ausgeführt, um dies mit dem Traefik-Netzwerk zu verbinden.

Ich schätze jede Hilfe, um zu sehen, was ich hier übersehe, und ich würde mich auch freuen zu hören, ob meine Sicherheitsvorkehrungen in Ordnung sind.

Ich weiß nicht, was dir fehlt. Hier ist, was ich in Ansible mache, um Sites mit Traefik hochzufahren:

        --docker-args "-l traefik.frontend.rule=Host:{{discourse_hostname}} \
        -l traefik.frontend.entryPoints=https \
        -l traefik.backend={{discourse_shortname}} \
        -l traefik.port=80"

Und dann:

       ./launcher start {{ discourse_yml }} {{ docker_args }}

Die Traefik-Regeln in docker_args statt in der yml-Datei anzugeben, hat den zusätzlichen Vorteil, dass Traefik den Container, der initialisiert wird, nicht überwacht.

Ich glaube, das ist Traefik v1, oder?

Oh, sorry. Ja, ich bin mir ziemlich sicher, dass es sich um Traefik 1 handelt, daher kann ich bei den Details nicht weiterhelfen.

Es sieht nicht so aus, als würdest du in app.yml Werte für diese Labels setzen? Ich denke, du musst eine Regel und vielleicht ein Middleware definieren.

Wenn du während des Bootstraps keine Ausfallzeit haben möchtest, solltest du sie mit ./launcher start setzen, wie in meinem Beispiel.

Vielleicht ist „Middleware

Sie werden gesetzt, aber du musst etwas nach rechts scrollen, um sie zu sehen. Das ist nur eine Formatierungsfrage.

Danke

LOL. Entschuldigung dafür.

Nun, ich habe keine Ahnung, wovon ich spreche, aber es ergibt für mich keinen Sinn, dass du dein discourse@docker als Load Balancer konfigurierst.

Hey, ich glaube, ich habe es hinbekommen.

Ich habe die Zeile entfernt:
# traefik.http.services.discourse_secure.loadbalancer.server.port: 80

aber diese hier belassen:

traefik.http.services.discourse.loadbalancer.server.port: 80

labels:
  app_name:                                                                     discourse

  #----Traefik labels------------------------
  traefik.enable:                                                               true
  traefik.docker.network:                                                       proxy
   #---HTTP ROUTER SECTION-------------------
  traefik.http.routers.discourse.rule:                                          Host(`forum.example.com`)
    #--HTTP SECTION--------------------------
  traefik.http.routers.discourse.entrypoints:                                   http
  traefik.http.routers.discourse.middlewares:                                   discourse_redirect2https
  traefik.http.services.discourse.loadbalancer.server.port:                     80

   #---HTTPS ROUTER SECTION
  traefik.http.routers.discourse_secure.rule:                                   Host(`forum.example.com`)
    #--HTTPS SECTION
  traefik.http.routers.discourse_secure.entrypoints:                            https

 # traefik.http.services.discourse_secure.loadbalancer.server.port:              80
    #--TLS SECTION
  traefik.http.routers.discourse_secure.tls.certresolver:                       tlsChallenge_letsencrypt

   #---MIDDLEWARE SECTION redirect http to https
  traefik.http.middlewares.discourse_redirect2https.redirectscheme.scheme:      https

Ich bin mir nicht sicher, wie ich darauf gekommen bin oder warum es so ist, aber es funktioniert. Also nutze ich die gesamte Konfiguration, die ich oben im Thread gepostet habe, mache aber diese eine Änderung – und bei mir funktioniert es jetzt.

Danke an alle!

Das ist korrekt.
Ich habe das in meiner Konfiguration so stehen:

#—SERVICE SECTION sagt Traefik, wohin die Anfrage gesendet werden soll
traefik.http.services.discourse.loadbalancer.server.port: 80

kommt dir das bekannt vor?
Was du hier machst, ist anzugeben, an wen (welchen Service) die Anfrage gesendet wird und an welchem Port.
Du könntest das Problem auch lösen, indem du expose verwendest, aber aus Sicherheitsgründen möchtest du so wenig wie möglich von deinen Containern exponieren. Außerdem wählt Traefik den ersten Port aus, wenn du mehrere Ports exponierst, daher ist die Verwendung von loadbalancer sauberer.


Traefik data/traefik.yml

Ich mache das nicht, da dieser Pfad der Standardpfad ist.

Hier arbeitest du nicht mit dem vollständigen Pfad, sondern verwendest einen Standardpfad. Das mag ich nicht, weil du den Pfad im Kopf behalten musst. Ich verwende storage: /etc/ssl/certs/letsencrypt/acme.json.

Ich definiere das Netzwerk; ich mag keine Standardeinstellungen.

providers:
  docker:
    exposedByDefault: false
    network: bridge_proxy_traefikv2

containers/app.yml

Das musst du nicht tun, das wird durch loadbalancer erledigt.

Traefik docker-compose

Du solltest diesem Netzwerk möglicherweise einen Namen geben, in meinem Fall:

networks:
  traefik:
    external:
      name: bridge_proxy_traefikv2

Ich habe mich hier durch Ihre Vorschläge gearbeitet. Vielen Dank für Ihre Antwort.

Ich möchte darauf hinweisen, dass Sie beim Endpunkt empfehlen, dem Standard zu vertrauen, während Sie beim Speicherort angeben, dass Sie dem Standard nicht gerne vertrauen. :slight_smile:

Ich habe versucht, die von Ihnen erwähnte Änderung für acme.json vorzunehmen:

Allerdings hat mein Traefik-Container die Datei danach nicht gefunden. Im Log wurde dies als Fehler angezeigt. Daher habe ich es vorerst bei acme.json belassen.

Ich wollte jedoch noch etwas anderes fragen:

Benennen Sie das Netzwerk hier nicht einfach um oder geben ihm einen lokalisierten Namen? Ich habe es in der anderen Konfiguration und hier lokal einfach als „proxy

Nun, für einen Moment dachte ich, Discourse sei sentient geworden, weil ich diese Benachrichtigung in meiner Admin-Ansicht erhalten habe:

Ich habe diese Änderung jedoch vorgenommen und habe trotzdem den Mixed-Content-Fehler erhalten. Ich habe mich auch ausgeloggt, den Cache gelöscht und mich erneut angemeldet. Das gleiche Ergebnis.

Es sieht so aus, als wären meine Anmeldeanfragen immer noch verschlüsselt, was gut ist, denke ich, aber ich muss diesen Mixed-Content-Fehler loswerden. Die Konfiguration steht oben im vorherigen Beitrag.

Ein weiteres Update: Die Warnung vor gemischten Inhalten ist jetzt verschwunden. Mir ist nicht ganz klar, warum. Ich vermute, dass dies mit der Einstellung force_https zusammenhängt, aber ich habe trotz des Löschen meines Caches und eines Ab- und Wiederanmelde-Vorgangs, wie oben erwähnt, für vielleicht 30 Minuten nach der Änderung der Einstellung keine saubere Seitenladung erhalten.

Die gute Nachricht ist, dass ich anscheinend eine funktionierende Discourse-Installation hinter einem Traefic-Reverse-Proxy habe.


Es sind die Bilder, die über HTTP-Verbindungen geladen werden. Ich hatte das gleiche Problem, siehe:


Hast du das Volume korrekt eingebunden? Bei den Pfaden kann Traefik ziemlich verwirrend sein.
Ich mache zum Beispiel:

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

[quote=“pc1oad1etter, Beitrag: 35, Thema: 130357”]
Änderst du hier nicht nur den Netzwerknamen oder gibst ihm einen lokalisierten Namen? Ich habe es in der anderen Konfiguration und hier lokal einfach als „proxy

Nein, ich habe es nicht so eingebunden. Hier ist mein volumes-Abschnitt aus der Docker Compose-Datei für 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

Mir fällt auf, dass bei mir Let’s Encrypt gar nicht erwähnt wird, während bei dir schon. Ich vermute, du hast diesen tief verschachtelten Ordner in deinem Docker Compose-Verzeichnis erstellt und dort deine acme.json abgelegt?

Das andere, was mir auffällt, ist, dass ich docker.sock und localtime habe. Ich bin mir nicht sicher, wofür das localtime-Element ist, und vielleicht stellt die docker.sock-Angabe ein Sicherheitsproblem dar. Das muss ich mir noch genauer ansehen.

Die Erstellung von Let’s Encrypt-Zertifikaten übernimmt Traefik. Durch das Mounten eines Volumes kann ich die Daten auf dem Host speichern, anstatt im Docker-Container.
Ich erinnere mich, dass das Einrichten aller Mounts eine echte Herausforderung war. Ich habe dabei ständige Checks mit docker exec -it durchgeführt:

  • ls
  • dir
  • vi