Saludos,
Utilicé esta publicación como guía para configurar Discourse para que funcione con Traefik. Ya tengo Traefik funcionando con otra aplicación web.
Cuando visito forum.private.com, obtengo un error de “404 página no encontrada”.
Parece que algo está funcionando, porque en la pestaña de servicios del panel de control de Traefik, puedo ver discourse@docker y discourse_secure@docker.
Sin embargo, no hay nada relacionado con Discourse en la pestaña de routers.
Los cambios que he realizado en app.yml se encuentran a continuación, basados en gran medida en la publicación enlazada anteriormente. Agregué un puerto expuesto en los argumentos de Docker al final, lo cual pareció habilitar los servicios mencionados anteriormente. ¡Agradecería cualquier ayuda!
Traefik docker-compose
version: "3.3"
services:
################################################
#### Configuración del Proxy Traefik #####
###############################################
traefik:
image: traefik:v2.0
restart: always
container_name: traefik
ports:
- "80:80" # <== http
- "8080:8080" # <== :8080 es donde se ejecuta el panel de control
- "443:443" # <== https
command:
#### Estos son los comandos CLI que configurarán Traefik y le indicarán cómo funcionar! ####
- --api.insecure=true # <== Habilitar API insegura, NO RECOMENDADO PARA PRODUCCIÓN
- --api.dashboard=true # <== Habilitar el panel de control para ver servicios, middlewares, routers, etc...
- --api.debug=true # <== Habilitar endpoints adicionales para depuración y perfiles
## Configuración de registros (opciones: ERROR, DEBUG, PANIC, FATAL, WARN, INFO) - https://docs.traefik.io/observability/logs/ ##
- --log.level=DEBUG # <== Establecer el nivel de los registros de Traefik
## Configuración de proveedores - https://docs.traefik.io/providers/docker/#provider-configuration ##
- --providers.docker=true # <== Habilitar Docker como proveedor para Traefik
- --providers.docker.exposedbydefault=false # <== No exponer cada contenedor a Traefik, solo exponer los habilitados
- --providers.file.filename=/dynamic.yaml # <== Referenciar un archivo de configuración dinámica
- --providers.docker.network=web # <== Operar en la red Docker llamada web
## Configuración de puntos de entrada - https://docs.traefik.io/routing/entrypoints/#configuration ##
- --entrypoints.web.address=:80 # <== Definir un punto de entrada para el puerto :80 llamado web
- --entrypoints.web-secured.address=:443 # <== Definir un punto de entrada para HTTPS en el puerto :443 llamado web-secured
## Configuración de certificados (Let's Encrypt) - https://docs.traefik.io/https/acme/#configuration-examples ##
- --certificatesresolvers.mytlschallenge.acme.tlschallenge=true # <== Habilitar TLS-ALPN-01 para generar y renovar certificados ACME
- --certificatesresolvers.mytlschallenge.acme.email=private@private.com # <== Establecer el correo electrónico para los certificados
- --certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json # <== Definir el archivo ACME para almacenar información del certificado
volumes:
- ./letsencrypt:/letsencrypt # <== Volumen para certificados (TLS)
- /var/run/docker.sock:/var/run/docker.sock # <== Volumen para administración de Docker
- ./dynamic.yaml:/dynamic.yaml # <== Volumen para archivo de configuración dinámica, **ref: línea 27
networks:
- web # <== Colocar Traefik en la red llamada web, para acceder a contenedores en esta red
labels:
#### Las etiquetas definen el comportamiento y las reglas del proxy Traefik para este contenedor ####
- "traefik.enable=true" # <== Habilitar Traefik en sí mismo para ver el panel de control y asignar un subdominio para verlo
- "traefik.http.routers.api.rule=Host(`monitor.private.com`)" # <== Establecer el dominio para el panel de control
- "traefik.http.routers.api.service=api@internal" # <== Habilitar la API como un servicio para acceder
networks:
web:
external: true
backend:
external: false
volumes:
db_data: {}
wordpress:
external: true
db:
external: true
Discourse app.yml
## Esta es la plantilla de contenedor Docker todo en uno y autónomo de Discourse
##
## Después de realizar cambios en este archivo, DEBES reconstruir
## /var/discourse/launcher rebuild app
##
## TEN *MUCHO* CUIDADO AL EDITAR!
## LOS ARCHIVOS YAML SON SUPER SENSIBLES A ERRORES EN ESPACIOS EN BLANCO O ALINEACIÓN!
## visita http://www.yamllint.com/ para validar este archivo según sea necesario
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## Descomenta estas dos líneas si deseas agregar Let's Encrypt (https)
#- "templates/web.ssl.template.yml"
# "templates/web.letsencrypt.ssl.template.yml"
## ¿Qué puertos TCP/IP debe exponer este contenedor?
## Si deseas que Discourse comparta un puerto con otro servidor web como Apache o nginx,
## consulta https://meta.discourse.org/t/17247 para obtener detalles
expose:
#- "80:80" # http
#- "443:443" # https
params:
db_default_text_search_config: "pg_catalog.english"
## Establece db_shared_buffers a un máximo del 25% de la memoria total.
## se establecerá automáticamente durante el arranque según la RAM detectada, o puedes sobrescribirlo
db_shared_buffers: "128MB"
## puede mejorar el rendimiento de ordenación, pero aumenta el uso de memoria por conexión
#db_work_mem: "40MB"
## ¿Qué revisión de Git debe usar este contenedor? (predeterminado: tests-passed)
#version: tests-passed
env:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## ¿Cuántas solicitudes web simultáneas son compatibles? Depende de la memoria y los núcleos de CPU.
## se establecerá automáticamente durante el arranque según los CPUs detectados, o puedes sobrescribirlo
UNICORN_WORKERS: 2
## TODO: El nombre de dominio al que responderá esta instancia de Discourse
## Requerido. Discourse no funcionará con una dirección IP desnuda.
DISCOURSE_HOSTNAME: forum.private.com
## Descomenta si deseas que el contenedor se inicie con el mismo
## nombre de host (opción -h) que se especificó anteriormente (predeterminado "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: Lista de correos electrónicos separados por comas que serán administradores y desarrolladores
## en el registro inicial, ejemplo 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'private@private.com'
## TODO: El servidor de correo SMTP utilizado para validar nuevas cuentas y enviar notificaciones
## SE REQUIEREN DIRECCIÓN, nombre de usuario y contraseña de SMTP
# ADVERTENCIA: el carácter '#' en la contraseña de SMTP puede 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, predeterminado true)
## Si agregaste la plantilla de Let's Encrypt, descomenta a continuación para obtener un certificado SSL gratuito
LETSENCRYPT_ACCOUNT_EMAIL: private@private.com
## La dirección CDN http o https para esta instancia de Discourse (configurada para extraer)
## consulta https://meta.discourse.org/t/14857 para obtener detalles
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## El contenedor Docker es sin estado; todos los datos se almacenan en /shared
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## Los plugins van aquí
## consulta https://meta.discourse.org/t/19157 para obtener detalles
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## Cualquier comando personalizado para ejecutar después de la construcción
run:
- exec: echo "Comienzo de comandos personalizados"
## Si deseas establecer la dirección de correo electrónico 'De' para tu primer registro, descomenta y cambia:
## Después de obtener el primer correo electrónico de registro, vuelve a comentar la línea. Solo necesita ejecutarse una vez.
#- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
- exec: echo "Fin de comandos personalizados"
labels:
app_name: discourse
#----Etiquetas de Traefik------------------------
traefik.enable: true
traefik.docker.network: web
#---SECCIÓN DE ROUTER HTTP-------------------
traefik.http.routers.discourse.rule: Host(`forum.private.com`)
#--SECCIÓN HTTP--------------------------
traefik.http.routers.discourse.entrypoints: web
traefik.http.routers.discourse.middlewares: discourse_redirect2https
traefik.http.services.discourse.loadbalancer.server.port: 80
#---SECCIÓN DE ROUTER HTTPS
traefik.http.routers.discourse_secure.rule: Host(`forum.private.com`)
#--SECCIÓN HTTPS
traefik.http.routers.discourse_secure.entrypoints: web-secured
traefik.http.services.discourse_secure.loadbalancer.server.port: 80
#--SECCIÓN TLS
traefik.http.routers.discourse_secure.tls.certresolver: tlsChallenge_letsencrypt
#---SECCIÓN DE MIDDLEWARE redirigir http a https
traefik.http.middlewares.discourse_redirect2https.redirectscheme.scheme: https
docker_args:
- "--network=web"
- "--expose=80"
Gracias