Você pode compartilhar capturas de tela?
Em anexo, há duas capturas de tela do painel do Traefik. Elas mostram que o Discourse está aparecendo (duas vezes) nos serviços, mas nada nos roteadores. Não tenho certeza do que isso significa, na verdade, mas notei.
Edição: Sou um usuário novo do Discourse, então não tenho permissão para incluir duas imagens em uma única postagem, então vou responder com outra.
Preciso subir meus dockers hoje à noite para comparar. Te aviso depois ou talvez alguns outros aqui possam compartilhar seus dashboards e comparar.
você não precisa disso, é melhor alternar para a API e usar o traefik v2.1, então:
- "traefik.http.routers.traefik_dashboard-router.service=api@internal"
Veja Endless 502 / forwarding when calling dashboard via subdomain #6123 - #5 by ldez - Traefik v2 - Traefik Labs Community Forum
pode remover seus comentários?
Isso facilita a leitura para nós.
Sem problemas, me disseram o mesmo uma vez :).
Eu escrevo meus comentários em uma linha extra, para que eu possa criar facilmente uma impressão limpa usando cat traefikV2.yaml | grep -v "#"
Ok, levei alguns dias para chegar aqui. Refiz minha configuração do Traefik para usar um arquivo YAML em vez de colocar tudo no docker-compose. No entanto, depois de reconectar tudo, parece que estou tendo o mesmo ou comportamento semelhante: estou recebendo um erro 404 no meu domínio e, no painel do Traefik, vejo entradas em Services e routers para o Discourse, mas nada em 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"
Acho que executei o comando docker network connect proxy também para conectar isso à rede do Traefik.
Agradeço qualquer ajuda para ver o que estou perdendo aqui e também adoraria saber se minha configuração de segurança está correta.
Não sei o que você está perdendo. Aqui está o que faço no Ansible para subir sites com o 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 então execute:
./launcher start {{ discourse_yml }} {{ docker_args }}
Adicionar as regras do traefik em docker_args, em vez de no yml, tem o benefício adicional de evitar que o traefik fique atento ao container que está sendo inicializado.
Acho que é o Traefik v1, talvez?
Ah. Desculpe. Sim, tenho quase certeza de que se trata do Traefik 1, então não poderei ajudar com detalhes específicos.
Parece que você não está definindo nenhum valor nessas labels no app.yml? Acredito que seja necessário definir uma regra e, talvez, um middleware?
Se você não quiser tempo de inatividade durante a inicialização, deverá defini-los com ./launcher start, como no meu exemplo.
Talvez “middleware” seja o que antes era chamado de “backend”? Você precisará fazer algo para estabelecer que o contêiner do Discourse é o servidor desejado e . . . algo mais . . . para conectar algum front-end/URL ao backend/servidor apropriado.
Eles estão sendo definidos, mas você precisa rolar um pouco para a direita para vê-los. É apenas uma questão de formatação.
Obrigado
LOL. Desculpe por isso.
Bem, não faço ideia do que estou falando, mas não faz sentido para mim que você configure seu discourse@docker como um balanceador de carga.
Ei, acho que consegui.
Removi a linha:
# traefik.http.services.discourse_secure.loadbalancer.server.port: 80
mas mantive esta:
traefik.http.services.discourse.loadbalancer.server.port: 80
labels:
app_name: discourse
#----Etiquetas do Traefik------------------------
traefik.enable: true
traefik.docker.network: proxy
#---SEÇÃO DO ROTEADOR HTTP-------------------
traefik.http.routers.discourse.rule: Host(`forum.example.com`)
#--SEÇÃO HTTP--------------------------
traefik.http.routers.discourse.entrypoints: http
traefik.http.routers.discourse.middlewares: discourse_redirect2https
traefik.http.services.discourse.loadbalancer.server.port: 80
#---SEÇÃO DO ROTEADOR HTTPS
traefik.http.routers.discourse_secure.rule: Host(`forum.example.com`)
#--SEÇÃO HTTPS
traefik.http.routers.discourse_secure.entrypoints: https
# traefik.http.services.discourse_secure.loadbalancer.server.port: 80
#--SEÇÃO TLS
traefik.http.routers.discourse_secure.tls.certresolver: tlsChallenge_letsencrypt
#---SEÇÃO DE MIDDLEWARE redirecionar HTTP para HTTPS
traefik.http.middlewares.discourse_redirect2https.redirectscheme.scheme: https
Não tenho certeza de como isso aconteceu ou por que está assim, mas funciona. Então, usando toda a configuração que postei acima no tópico, mas fazendo essa única alteração, está funcionando para mim agora.
Obrigado a todos!
Isso está correto.
Eu coloquei isso na minha configuração:
#—SEÇÃO DE SERVIÇO diz ao Traefik para onde enviar a solicitação
traefik.http.services.discourse.loadbalancer.server.port: 80
Isso soa familiar?
O que você está fazendo aqui é dizer a quem (serviço) a solicitação é enviada e em qual porta.
Você também poderia resolver isso usando expose, mas, do ponto de vista da segurança, você deseja expor o mínimo possível dos seus contêineres. Além disso, o Traefik seleciona a primeira porta se você expor várias portas, então usar loadbalancer é mais limpo.
Traefik data/traefik.yml
Eu não faço isso, pois esse caminho é o padrão.
Você não usa o caminho completo aqui, usando um caminho padrão. Eu não gosto disso porque você precisa se lembrar do caminho. Eu faço storage: /etc/ssl/certs/letsencrypt/acme.json.
Eu defino a rede; eu não gosto de configurações padrão.
providers: docker: exposedByDefault: false network: bridge_proxy_traefikv2
containers/app.yml
Você não precisa fazer isso; isso é feito pelo loadbalancer.
Traefik docker-compose
Você pode querer dar um nome a essa rede; no meu caso:
networks: traefik: external: name: bridge_proxy_traefikv2
Tenho trabalhado com suas sugestões aqui. Obrigado pela sua resposta.
Devo apontar que, para o endpoint, você diz para confiar no padrão, mas para o local de armazenamento, diz que não gosta de confiar em padrões. ![]()
Tentei fazer a alteração para o arquivo acme.json que você mencionou:
No entanto, meu contêiner Traefik não encontrou o arquivo depois disso. Um erro apareceu no log. Então, por enquanto, deixei como acme.json.
Gostaria de perguntar sobre este ponto aqui:
Você não está apenas renomeando a rede aqui ou dando um nome localizado? Acredito que eu apenas me referi a ela como proxy na outra configuração e aqui localmente. Ela ainda tem um nome que eu defini; apenas não estou renomeando. Pelo menos, essa é a minha compreensão.
Tenho uma última preocupação relevante. Notei após minha postagem “Sucesso!” acima que, embora o HTTPS esteja funcionando, estou recebendo um aviso de conteúdo misto. Ou seja, nem tudo está sendo criptografado.
Estou recebendo o erro de conteúdo misto para minha instalação do Discourse, mas não para a instalação do WordPress que tenho no mesmo servidor. Então, deve ser algo específico nas configurações do meu Discourse.
Olhando no console de desenvolvedor, vejo:
Carregando conteúdo de exibição misto (inseguro) “http://talk.redacted.com/uploads/default/optimized/1X/_129430568242d1b7f853bb13ebea28b3f6af4e7_2_180x180.png” em uma página segura FaviconLoader.jsm:174:19
Então, talvez de alguma forma meu redirecionamento não esteja funcionando corretamente?
Estou anexando os arquivos relevantes abaixo para revisão.
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”
Então, alguma ideia sobre por que estou recebendo o erro de conteúdo misto?
Bem, por um momento achei que o Discourse tivesse se tornado senciente, porque recebi esta notificação na minha visão de administrador:
No entanto, fiz essa alteração e ainda recebi o erro de conteúdo misto. Também fiz logout, limpei o cache e fiz login novamente. A mesma coisa.
Parece que minhas solicitações de login ainda estão criptografadas, o que é bom, suponho, mas preciso me livrar desse erro de conteúdo misto. A configuração está acima, no post anterior.
Outra atualização: o aviso de conteúdo misto agora desapareceu. Não tenho certeza do motivo. Acho que está relacionado à configuração force_https, no entanto, não obtive um carregamento limpo da página por talvez 30 minutos após alterar a configuração, apesar de ter limpado meu cache e feito logout e login novamente, como mencionei acima.
A boa notícia é que parece ter uma instalação do Discourse funcionando atrás de um proxy reverso Traefic.
São as imagens, que são carregadas via conexões HTTP. Tive o mesmo problema, veja:
- Cool features of Firefox Developer Tools - #16 by da4nic - Developer Tools - Mozilla Discourse
- "security" tab in developer tools - Developer Tools - Mozilla Discourse
e isso também deve ajudar: - Mixed content problem
- Got mix-content error and confused - #12 by mr8
- Mixed content due to hotlinked images - #13 by nbianca
você montou o volume corretamente? O Traefik pode ser bastante confuso quando se trata de caminhos.
Por exemplo, eu faço:
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
Não me lembro, mas havia um motivo para isso, talvez para vê-la claramente na CLI ao listar as redes.
Não, eu não montei assim. Aqui está minha seção de volumes do docker-compose para o 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
Notei que o meu nem menciona o Let’s Encrypt, enquanto o seu menciona. Imagino que você tenha criado aquela pasta profundamente aninhada no seu diretório do docker-compose e colocado seu acme.json lá.
Outra coisa que notei é que tenho o docker.sock e o localtime. Não tenho certeza do que é o de localtime, e talvez a declaração do docker.sock seja um problema de segurança. Preciso pesquisar sobre isso.
Notei que o meu nem menciona o Let’s Encrypt, enquanto o seu menciona. Imagino que você tenha criado aquela pasta profundamente aninhada no seu diretório docker-compose e colocado seu acme.json lá?
A criação do certificado Let’s Encrypt é feita pelo Traefik. Montar um volume me permite armazená-lo no host em vez de no Docker.
Lembro que fazer todas as montagens foi um verdadeiro trabalho duro, com muitas verificações usando docker exec -it:
lsdirvi







