Olá,
Usei este post como guia para configurar o Discourse para funcionar com o Traefik. Já tenho o Traefik funcionando com outro aplicativo web.
Ao acessar forum.private.com, recebo um erro “404 página não encontrada”.
Parece que algo está funcionando, pois na aba Serviços do painel do Traefik, consigo ver discourse@docker e discourse_secure@docker.
No entanto, não há nada relacionado ao Discourse na aba Roteadores.
As alterações que fiz no app.yml estão abaixo, baseadas em grande parte no post linkado acima. Adicionei uma porta exposta nos argumentos do Docker no final, o que parece ter aberto os serviços mencionados acima. Agradeceria qualquer ajuda!
Traefik docker-compose
version: "3.3"
services:
################################################
#### Configuração do Proxy Traefik #####
###############################################
traefik:
image: traefik:v2.0
restart: always
container_name: traefik
ports:
- "80:80" # <== http
- "8080:8080" # <== :8080 é onde o painel roda
- "443:443" # <== https
command:
#### Estes são os comandos CLI que configurarão o Traefik e indicarão como ele deve funcionar! ####
- --api.insecure=true # <== Habilitando API insegura, NÃO RECOMENDADO PARA PRODUÇÃO
- --api.dashboard=true # <== Habilitando o painel para visualizar serviços, middlewares, roteadores, etc...
- --api.debug=true # <== Habilitando endpoints adicionais para depuração e perfilamento
## Configurações de Log (opções: ERROR, DEBUG, PANIC, FATAL, WARN, INFO) - https://docs.traefik.io/observability/logs/ ##
- --log.level=DEBUG # <== Definindo o nível dos logs do traefik
## Configurações do Provedor - https://docs.traefik.io/providers/docker/#provider-configuration ##
- --providers.docker=true # <== Habilitando Docker como provedor para o traefik
- --providers.docker.exposedbydefault=false # <== Não expor cada container ao traefik, expor apenas os habilitados
- --providers.file.filename=/dynamic.yaml # <== Referenciando um arquivo de configuração dinâmica
- --providers.docker.network=web # <== Operar na rede Docker chamada web
## Configurações dos Pontos de Entrada - https://docs.traefik.io/routing/entrypoints/#configuration ##
- --entrypoints.web.address=:80 # <== Definindo um ponto de entrada para a porta :80 chamado web
- --entrypoints.web-secured.address=:443 # <== Definindo um ponto de entrada para https na porta :443 chamado web-secured
## Configurações de Certificado (Let's Encrypt) - https://docs.traefik.io/https/acme/#configuration-examples ##
- --certificatesresolvers.mytlschallenge.acme.tlschallenge=true # <== Habilitar TLS-ALPN-01 para gerar e renovar certificados ACME
- --certificatesresolvers.mytlschallenge.acme.email=private@private.com # <== Definindo e-mail para certificados
- --certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json # <== Definindo arquivo acme para armazenar informações do certificado
volumes:
- ./letsencrypt:/letsencrypt # <== Volume para certificados (TLS)
- /var/run/docker.sock:/var/run/docker.sock # <== Volume para administração do Docker
- ./dynamic.yaml:/dynamic.yaml # <== Volume para arquivo de configuração dinâmica, **ref: linha 27
networks:
- web # <== Colocando o traefik na rede chamada web, para acessar containers nesta rede
labels:
#### Labels definem o comportamento e as regras do proxy traefik para este container ####
- "traefik.enable=true" # <== Habilitar traefik em si mesmo para visualizar o painel e atribuir subdomínio para acessá-lo
- "traefik.http.routers.api.rule=Host(`monitor.private.com`)" # <== Definindo o domínio para o painel
- "traefik.http.routers.api.service=api@internal" # <== Habilitando a API como um serviço para acesso
networks:
web:
external: true
backend:
external: false
volumes:
db_data: {}
wordpress:
external: true
db:
external: true
Discourse app.yml
## este é o template de container Docker all-in-one, standalone do Discourse
##
## Após fazer alterações neste arquivo, você DEVE reconstruir
## /var/discourse/launcher rebuild app
##
## TENHA *MUITO* CUIDADO AO EDITAR!
## ARQUIVOS YAML SÃO SUPER SUPER SENSÍVEIS A ERROS DE ESPAÇAMENTO OU ALINHAMENTO!
## visite http://www.yamllint.com/ para validar este arquivo conforme necessário
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## Descomente estas duas linhas se desejar adicionar Let's Encrypt (https)
#- "templates/web.ssl.template.yml"
# "templates/web.letsencrypt.ssl.template.yml"
## quais portas TCP/IP este container deve expor?
## Se você quiser que o Discourse compartilhe uma porta com outro servidor web como Apache ou nginx,
## consulte https://meta.discourse.org/t/17247 para detalhes
expose:
#- "80:80" # http
#- "443:443" # https
params:
db_default_text_search_config: "pg_catalog.english"
## Defina db_shared_buffers para no máximo 25% da memória total.
## será definido automaticamente pelo bootstrap com base na RAM detectada, ou você pode substituir
db_shared_buffers: "128MB"
## pode melhorar o desempenho de ordenação, mas aumenta o uso de memória por conexão
#db_work_mem: "40MB"
## Qual revisão do Git este container deve usar? (padrão: tests-passed)
#version: tests-passed
env:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## Quantas solicitações web simultâneas são suportadas? Depende da memória e dos núcleos da CPU.
## será definido automaticamente pelo bootstrap com base nas CPUs detectadas, ou você pode substituir
UNICORN_WORKERS: 2
## TODO: O nome de domínio ao qual esta instância do Discourse responderá
## Obrigatório. O Discourse não funcionará com um número IP puro.
DISCOURSE_HOSTNAME: forum.private.com
## Descomente se quiser que o container seja iniciado com o mesmo
## hostname (-h option) especificado acima (padrão "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: Lista de e-mails separados por vírgula que serão feitos administradores e desenvolvedores
## no cadastro inicial, exemplo 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'private@private.com'
## TODO: O servidor SMTP usado para validar novas contas e enviar notificações
## Endereço SMTP, nome de usuário e senha são obrigatórios
# AVISO: o caractere '#' na senha do SMTP pode causar problemas!
DISCOURSE_SMTP_ADDRESS: in-v3.mailjet.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: redacted
DISCOURSE_SMTP_PASSWORD: "redacted"
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (opcional, padrão true)
## Se você adicionou o template do Let's Encrypt, descomente abaixo para obter um certificado SSL gratuito
LETSENCRYPT_ACCOUNT_EMAIL: private@private.com
## O endereço http ou https do CDN para esta instância do Discourse (configurado para buscar)
## consulte https://meta.discourse.org/t/14857 para detalhes
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## O container Docker é sem estado; todos os dados são armazenados em /shared
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## Plugins vão aqui
## consulte https://meta.discourse.org/t/19157 para detalhes
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## Quaisquer comandos personalizados para executar após a construção
run:
- exec: echo "Início dos comandos personalizados"
## Se quiser definir o endereço de e-mail 'De' para seu primeiro registro, descomente e altere:
## Após receber o primeiro e-mail de cadastro, recomente a linha. Só precisa rodar uma vez.
#- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
- exec: echo "Fim dos comandos personalizados"
labels:
app_name: discourse
#----Labels do Traefik------------------------
traefik.enable: true
traefik.docker.network: web
#---SEÇÃO DE ROTEADOR HTTP-------------------
traefik.http.routers.discourse.rule: Host(`forum.private.com`)
#--SEÇÃO HTTP--------------------------
traefik.http.routers.discourse.entrypoints: web
traefik.http.routers.discourse.middlewares: discourse_redirect2https
traefik.http.services.discourse.loadbalancer.server.port: 80
#---SEÇÃO DE ROTEADOR HTTPS
traefik.http.routers.discourse_secure.rule: Host(`forum.private.com`)
#--SEÇÃO HTTPS
traefik.http.routers.discourse_secure.entrypoints: web-secured
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
docker_args:
- "--network=web"
- "--expose=80"
Obrigado