Puoi condividere degli screenshot?
Allegati ci sono due screenshot dalla dashboard di Traefik. Mostrano che Discourse appare (due volte) nei servizi, ma nulla nei router. Non so necessariamente cosa significhi, a dire il vero, ma l’ho notato.
Modifica: Sono un nuovo utente di Discourse, quindi non ho ancora l’affidabilità necessaria per inserire due immagini in un singolo post, quindi risponderò con un’altra.
Devo avviare i miei dockers stasera per confrontarli, farò sapere allora o magari qualcun altro qui può condividere la propria dashboard e confrontare
non ne hai bisogno, è meglio passare all’API e usare traefik v2.1, quindi:
- "traefik.http.routers.traefik_dashboard-router.service=api@internal"
Vedi Endless 502 / forwarding when calling dashboard via subdomain #6123 - #5 by ldez - Traefik v2 - Traefik Labs Community Forum
puoi rimuovere i tuoi commenti
questo rende più facile la lettura per noi.
Nessun problema, mi è stato detto lo stesso una volta :).
Scrivo i miei commenti su una riga separata, così posso creare facilmente una stampa pulita usando cat traefikV2.yaml | grep -v "#"
Ok, ci ho messo qualche giorno ad arrivare a questo. Ho rifatto la mia configurazione di Traefik per usare un file yaml invece di mettere tutto in docker-compose. Tuttavia, dopo aver riconnesso tutto, sembra che il comportamento sia lo stesso o simile: ricevo un 404 sul mio dominio e nella dashboard di Traefik vedo voci sotto Services e routers per discourse, ma nulla sotto 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"
Penso di aver eseguito anche il comando docker network connect proxy per collegarlo alla rete di Traefik.
Apprezzo qualsiasi aiuto per capire cosa mi sto perdendo e mi farebbe piacere sapere anche se ho messo in ordine le mie precauzioni di sicurezza.
Non so cosa ti stia mancando. Ecco cosa faccio in Ansible per configurare i siti con Traefik:
--docker-args "-l traefik.frontend.rule=Host:{{discourse_hostname}} \
-l traefik.frontend.entryPoints=https \
-l traefik.backend={{discourse_shortname}} \
-l traefik.port=80"
E poi esegui
./launcher start {{ discourse_yml }} {{ docker_args }}
Inserire le regole di Traefik in docker_args invece che nel file yml ha il vantaggio aggiuntivo di evitare che Traefik si occupi del container che viene avviato.
Penso che sia forse Traefik v1?
Oh, scusa. Sì, sono abbastanza sicuro che si tratti di Traefik 1, quindi non potrò darti indicazioni specifiche.
Non sembra che tu stia impostando alcun valore in quelle etichette in app.yml. Credo che tu debba impostare una regola e, forse, anche un middleware.
Se non vuoi tempi di inattività durante l’avvio iniziale, dovrai impostarli con ./launcher start, come nel mio esempio.
Forse “middleware” è ciò che prima era chiamato “backend”? Dovrai fare qualcosa per stabilire che il contenitore Discourse è il server che desideri e… qualcos’altro… per collegare un frontend/URL al backend/server appropriato.
Vengono impostati, ma devi scorrere un po’ verso destra per vederli. È solo una questione di formattazione.
Grazie
LOL. Scusa per questo.
Beh, non ho idea di cosa stia parlando, ma non ha senso per me che tu configuri il tuo discourse@docker come bilanciatore di carico.
Ehi, penso di averlo risolto.
Ho rimosso la riga:
# traefik.http.services.discourse_secure.loadbalancer.server.port: 80
ma ho lasciato questa:
traefik.http.services.discourse.loadbalancer.server.port: 80
labels:
app_name: discourse
#----Traefik lables------------------------
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
Non sono sicuro di come sia successo o del perché sia così, ma funziona. Quindi, utilizzando tutta la configurazione che ho pubblicato sopra nel thread, ma apportando questa singola modifica, ora funziona per me.
Grazie a tutti!
È corretto.
Ho inserito questo nella mia configurazione:
#—SEZIONE SERVICE: indica a Traefik dove inviare la richiesta
traefik.http.services.discourse.loadbalancer.server.port: 80
Ti suona familiare?
Quello che stai facendo è indicare a quale servizio (service) viene inviata la richiesta e a quale porta.
Potresti risolvere anche utilizzando expose, ma dal punto di vista della sicurezza è meglio esporre il meno possibile dei tuoi container. Inoltre, se esponi più porte, Traefik ne seleziona la prima; quindi, utilizzare loadbalancer è più pulito.
Traefik data/traefik.yml
Io non lo specifico perché questo è il percorso predefinito.
Qui non si usa il percorso completo, ma quello predefinito. A me non piace perché devi tenere a mente il percorso. Io uso storage: /etc/ssl/certs/letsencrypt/acme.json.
Definisco la rete; non mi piacciono le impostazioni predefinite.
providers: docker: exposedByDefault: false network: bridge_proxy_traefikv2
containers/app.yml
Non è necessario farlo, poiché è gestito da loadbalancer.
Traefik docker-compose
Potresti voler assegnare un nome a questa rete; nel mio caso:
networks: traefik: external: name: bridge_proxy_traefikv2
Ho lavorato sulle tue suggerimenti qui. Grazie per la tua risposta.
Voglio far notare che per l’endpoint dici di fidarti delle impostazioni predefinite, mentre per la posizione di archiviazione dici di non fidarti delle impostazioni predefinite. ![]()
Ho provato a apportare la modifica per acme.json che hai menzionato:
Tuttavia, il mio container Traefik non è riuscito a trovare il file. È apparso un errore nei log. Quindi per ora ho lasciato acme.json così com’è.
Volevo però chiederti riguardo a questo punto:
Non stai semplicemente rinominando la rete qui, o dandole un nome localizzato? Penso di averla chiamata semplicemente “proxy” nell’altra configurazione e qui localmente. Ha comunque un nome che ho definito; non sto semplicemente rinominandola. Almeno è così che l’ho capita.
Ho un’ultima preoccupazione significativa. Dopo il mio post “Successo!” sopra, ho notato che, sebbene HTTPS funzioni, ricevo un avviso di contenuto misto. Quindi non tutto viene criptato.
Ricevo l’errore di contenuto misto per la mia installazione di Discourse, ma non per l’installazione di WordPress sullo stesso server. Deve quindi essere qualcosa di specifico delle mie impostazioni di Discourse.
Guardando nella console per sviluppatori vedo:
Caricamento di contenuto di visualizzazione misto (non sicuro) “http://talk.redacted.com/uploads/default/optimized/1X/_129430568242d1b7f853bb13ebea28b3f6af4e7_2_180x180.png” su una pagina sicura FaviconLoader.jsm:174:19
Quindi forse in qualche modo il mio reindirizzamento non funziona correttamente?
Allego qui sotto i file pertinenti per la revisione.
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”
Quindi, hai qualche idea sul perché sto ricevendo l’errore di contenuto misto?
Beh, per un momento ho pensato che Discourse fosse diventato senziente perché ho ricevuto questa notifica nella mia vista amministratore:
Tuttavia, ho apportato questa modifica e ho ancora ricevuto l’errore di contenuto misto. Ho anche effettuato il logout, cancellato la cache e effettuato di nuovo l’accesso. Stessa cosa.
Sembra che le mie richieste di accesso siano ancora crittografate, il che è un bene, suppongo, ma devo liberarmi di questo errore di contenuto misto. La configurazione è riportata sopra nel post precedente.
Un altro aggiornamento: l’avviso sui contenuti misti è ora scomparso. Non sono sicuro del perché. Immagino sia correlato all’impostazione force_https, tuttavia non ho ottenuto un caricamento pulito della pagina per circa 30 minuti dopo aver modificato l’impostazione, nonostante avessi svuotato la cache e effettuato il logout e il login, come ho già notato sopra.
La buona notizia è che sembra di avere un’installazione di Discourse funzionante dietro un proxy inverso Traefic.
Si tratta delle immagini, che vengono caricate tramite connessioni HTTP. Ho avuto lo stesso problema, vedi:
- Cool features of Firefox Developer Tools - #16 by da4nic - Developer Tools - Mozilla Discourse
- "security" tab in developer tools - Developer Tools - Mozilla Discourse
E anche questo potrebbe essere d’aiuto: - Mixed content problem
- Got mix-content error and confused - #12 by mr8
- Mixed content due to hotlinked images - #13 by nbianca
Hai montato correttamente il volume? Traefik può essere piuttosto confuso quando si tratta dei percorsi.
Io, ad esempio, faccio così:
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
Non me lo ricordo, ma c’era un motivo per farlo, forse per vederla chiaramente nella CLI quando si elencano le reti.
No, non l’ho montato in questo modo. Ecco la mia sezione volumes dal docker-compose per 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
Noto che nel mio non viene nemmeno menzionato Let’s Encrypt, mentre nel tuo sì. Immagino tu abbia creato quella cartella annidata nel tuo directory docker-compose e ci abbia posto il tuo acme.json?
L’altra cosa che noto è che ho questo docker/sock e localtime. Non sono sicuro di cosa sia quello di localtime, e forse l’istruzione docker.sock è un problema di sicurezza. Devo informarmi a riguardo.
Ho notato che nel mio non viene nemmeno menzionato Let’s Encrypt, mentre nel tuo sì. Immagino tu abbia creato quella cartella profondamente annidata nella tua directory docker-compose e ci abbia posizionato il tuo acme.json?
La creazione del certificato Let’s Encrypt è gestita da Traefik. Montare un volume mi permette di salvarlo sull’host invece che dentro Docker.
Ricordo che configurare tutti i mount è stato un vero incubo; ho dovuto fare tutti i controlli eseguendo docker exec -it:
lsdirvi







