SvenC56
(Sven)
1
大家好,
我正在迁移到新服务器,并希望使用 Traefik 2.0 作为反向代理。目前我在新的配置上遇到了困难。我在 app.yml 文件底部添加了一个部分。(来源:https://meta.discourse.org/t/discourse-behind-traefik/84874)
...
expose:
- "8060:80" # http
- "8070:443" # https
...
docker_args:
- "--network=web"
- "--expose=8060"
- "-l traefik.enable=true"
- "-l traefik.http.routers.forum.rule=Host(`forum.example.com`)"
- "-l traefik.http.routers.forum.entrypoints=websecure"
- "-l traefik.http.routers.forum.tls=true"
- "-l traefik.http.routers.forum.tls.certresolver=mytlschallenge"
- "-l traefik.http.services.forum.loadbalancer.server.port=8060"
- "-l traefik.docker.network=web"
这似乎不起作用。当我访问该路由时,会收到 Bad Gateway 错误。但如果直接访问 ip_adress:8060,Discourse 可以正常打开。
有人有使用 Traefik 2.0 的经验吗?
谢谢!
SvenC56
(Sven)
2
经过一番尝试,我已经自行解决了问题。
供后续参考,附上我的 app.yml:
...
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## 如果希望添加 Let's Encrypt (https),请取消以下两行的注释
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
#- "templates/web.socketed.template.yml"
## 此容器应暴露哪些 TCP/IP 端口?
## 如果您希望 Discourse 与 Apache 或 nginx 等其他 Web 服务器共享端口,
## 请参阅 https://meta.discourse.org/t/17247 了解详情
#expose:
# - "8060:80" # http
# - "8070:443" # https
...
docker_args:
- "--network=web"
#- "--expose=8060"
- "-l traefik.enable=true"
- "-l traefik.http.routers.forum.rule=Host(`forum.example.com`)"
- "-l traefik.http.routers.forum.entrypoints=websecure"
- "-l traefik.http.routers.forum.tls=true"
- "-l traefik.http.routers.forum.tls.certresolver=mytlschallenge"
- "-l traefik.http.services.forum.loadbalancer.server.port=80"
- "-l traefik.docker.network=web"
PackElend
(Pack Elend)
3
为什么有必要使用 docker_args?根据 GitHub - discourse/discourse_docker: A Docker image for Discourse · GitHub 的说明,应该这样写:
labels:
monitor: 'true'
app_name: {{config}}_discourse
为当前容器添加标签。上述配置将在运行容器时向选项添加 --l monitor=true -l app_name=dev_discourse。
此外,docker_args 在哪里有说明?
PackElend
(Pack Elend)
4
@Cameron_D
你是怎么发现应该使用 docker_args 的?
我无法让标签部分按预期工作。我不确定具体是为什么它不再起作用,也不确定之后是否已修复,因为我的配置保持不变,目前它能正常工作。
你好,
你能分享一下你的 Traefik 配置吗?
我遇到了 302 重定向,它会自动跳转到 https,然后就没有下文了……
Traefik 仪表板显示一切正常。
我的 docker-compose.yml 在这里
version: "3.7"
services:
traefik-reverse-proxy:
# 官方 v2.0 Traefik Docker 镜像
image: traefik:latest #traefik:v2.0
container_name: "traefik"
command:
# 告诉 Traefik 监听 Docker
- --providers.docker # (默认: true)
# 启用 API/仪表板 / (设置 Docker 端点以与 Docker API 通信)
- --api=true # (默认: false)
# 激活仪表板。
- --api.dashboard # (默认: true)
# 启用 Web UI / Traefik 默认在端口 8080 监听 API 请求。/ 直接在名为 traefik 的入口点激活 API。(默认: false) --> 端口 '8080'v= 入口点 'traefik',覆盖 --api
- --api.insecure=true # (默认: false)
# 启用用于调试和分析的附加端点。
- --api.debug=true # (默认: false)
# 设置日志的调试级别
- --log.level=DEBUG
# 写入访问日志
- --accesslog=true
# 定义容器内的存储位置,日志文件写入容器内部。为了在主机上可用,已挂载,请参见 volumes 部分
- --log.filePath=/var/traefik-container/logs/traefik-log.log
- --accesslog.filepath=/var/traefik-container/logs/traefik-access.log
# 覆盖默认端口 80 的入口点名称为 "web"
- --entrypoints.web.address=:80
# 声明端口 443 的入口点名称
- --entrypoints.websecure.address=:443
#--providers.docker.endpoint=unix:///var/run/docker.sock
# Let's Encrypt
- --certificatesresolvers.mytlschallenge.acme.tlschallenge=true
- --certificatesresolvers.mytlschallenge.acme.email=my@email.com
- --certificatesresolvers.mytlschallenge.acme.storage=/var/traefik-container/letsencrypt/acme.json
ports:
# HTTP 端口
- "80:80"
# HTTPS 端口
- "443:443"
# Web UI (通过 --api.insecure=true 启用)
- "8080:8080"
volumes: # 语法 --> 主机位置:容器内路径
# 以便 Traefik 可以监听 Docker 事件
- /var/run/docker.sock:/var/run/docker.sock
- /var/traefik/log:/var/traefik-container/logs
- /var/traefik/letsencrypt:/var/traefik-container/letsencrypt
labels:
- "traefik.enable=true"
- "traefik.docker.network=bridge_proxy_traefikv2"
- "traefik.http.routers.traefikv2.rule=Host(`traefik.mydomain.community`)"
- "traefik.http.routers.traefikv2.entrypoints=web"
- "traefik.http.services.traefikv2.loadBalancer.server.port=80"
networks:
- traefik
#- default
# 一个小型 Go Web 服务器,将操作系统信息和 HTTP 请求打印到输出
# whoami:
# image: "containous/whoami"
# container_name: "whoami"
# labels:
# - "traefik.enable=true"
# - "traefik.docker.network=bridge_proxy_traefikv2"
# - "traefik.http.routers.whoami.rule=Host(`mydomain.community`)"
# - "traefik.http.routers.whoami.entrypoints=web"
# - "traefik.http.services.whoami.loadBalancer.server.port=80"
# networks:
# - traefik
# #- default
whoami_sub:
image: "containous/whoami"
container_name: "whoami_sub"
labels:
- "traefik.enable=true"
- "traefik.name=whoami_sub"
- "traefik.docker.network=bridge_proxy_traefikv2"
- "traefik.http.routers.whoami_sub.rule=Host(`whoami.mydomain.community`)"
- "traefik.http.routers.whoami_sub.entrypoints=web"
#- "traefik.http.services.whoami_sub.loadBalancer.server.port=80"
networks:
- traefik
- default
networks:
traefik:
external:
name: bridge_proxy_traefikv2
我的 Discourse app.yml 在这里
## 这是 Discourse 的一体化独立 Docker 容器模板
##
## 修改此文件后,您必须重新构建
## /var/discourse/launcher rebuild app
##
## 编辑时请 *非常* 小心!
## YAML 文件对空白或对齐错误超级敏感!
## 如有需要,请访问 http://www.yamllint.com/ 验证此文件
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## 如果您想添加 Let's Encrypt (https),请取消注释这两行
- "templates/web.ssl.template.yml"
- "templates/web.letsencrypt.ssl.template.yml"
## 此容器应暴露哪些 TCP/IP 端口?
## 如果您希望 Discourse 与另一个 Web 服务器(如 Apache 或 nginx)共享端口,
## 请参阅 https://meta.discourse.org/t/17247 了解详情
expose:
# - "80:80" # http
# - "443:443" # https
params:
db_default_text_search_config: "pg_catalog.english"
## 将 db_shared_buffers 设置为总内存的最大 25%。
## 将根据检测到的 RAM 自动设置,或者您可以覆盖
db_shared_buffers: "128MB"
## 可以提高排序性能,但会增加每个连接的内存使用量
#db_work_mem: "40MB"
## 此容器应使用哪个 Git 修订版本?(默认: tests-passed)
#version: tests-passed
labels:
app_name: discourse
traefik.enable: true
traefik.docker.network: bridge_proxy_traefikv2
traefik.http.services.forum.loadbalancer.server.port: 80
traefik.http.routers.forum.rule: Host(`forum.mydomain.community`)
traefik.http.routers.forum.entrypoints: websecure
traefik.http.routers.forum.tls: true
traefik.http.routers.forum.tls.certresolver: mytlschallenge
docker_args:
- "--network=bridge_proxy_traefikv2"
# - "-l traefik.enable=true"
# - "-l traefik.http.routers.forum.rule=Host(`fairbnb.community`)"
# - "-l traefik.http.routers.forum.entrypoints=websecure"
# - "-l traefik.http.routers.forum.tls=true"
# - "-l traefik.http.routers.forum.tls.certresolver=mytlschallenge"
# - "-l traefik.http.services.forum.loadbalancer.server.port=80"
# - "-l traefik.docker.network=web"
env:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## 支持多少个并发 Web 请求?取决于内存和 CPU 核心数。
## 将根据检测到的 CPU 自动设置,或者您可以覆盖
UNICORN_WORKERS: 2
## TODO: 此 Discourse 实例将响应的域名
## 必需。Discourse 无法在纯 IP 地址上运行。
DISCOURSE_HOSTNAME: forum.fairbnb.community
## 如果您希望容器使用与上面指定的相同的主机名 (-h 选项) 启动,请取消注释
## (默认 "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: 初始注册时将被设为管理员和开发者的逗号分隔电子邮件列表
## 示例 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'discourse@myemail.com'
## TODO: 用于验证新账户和发送通知的 SMTP 邮件服务器
# SMTP 地址、用户名和密码是必需的
# 警告:SMTP 密码中的字符 '#' 可能会导致问题!
DISCOURSE_SMTP_ADDRESS: smtp.zoho.eu
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: discourse@myemail.com
DISCOURSE_SMTP_PASSWORD: "tempPassword"
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (可选,默认 true)
## 如果您添加了 Let's Encrypt 模板,请取消注释以下行以获取免费 SSL 证书
LETSENCRYPT_ACCOUNT_EMAIL: me@example.com
## 此 Discourse 实例的 http 或 https CDN 地址(配置为拉取)
## 请参阅 https://meta.discourse.org/t/14857 了解详情
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## Docker 容器是无状态的;所有数据都存储在 /shared 中
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## 插件放在这里
## 请参阅 https://meta.discourse.org/t/19157 了解详情
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## 构建后运行的任何自定义命令
run:
- exec: echo "开始自定义命令"
## 如果您想设置首次注册的 'From' 电子邮件地址,请取消注释并更改:
## 收到首次注册邮件后,请重新注释该行。它只需运行一次。
- exec: rails r "SiteSetting.notification_email='discourse@zoho.fairbnb.community'"
- exec: echo "结束自定义命令"
在通过子域名使 Traefik 仪表板可用方面存在问题,但 Discourse 仍然无法访问,详见 Discourse with Traefik 2.0 - Traefik v2 - Traefik Labs Community Forum
以下是我的可用配置。
-
带我的注释
docker-compose: traefikV2_docker-compose.yaml
# https://stackoverflow.com/questions/49718431/docker-compose-yml-file-naming-convention
version: "3.7"
services:
traefik-reverse-proxy:
# Traefik 官方 v2.0 Docker 镜像
#image: traefik:latest
#image: traefik:v2.0
image: traefik:v2.1.1
container_name: traefik
#command:
## 若要使用自定义的 Traefik 配置文件,必须声明本地路径并将该位置挂载到主机,请参阅 volumes 部分
#- --configFile=/etc/traefik/traefik-config.yaml
ports:
# HTTP 端口
- 80:80
# HTTPS 端口
- 443:443
# Web UI(通过 --api.insecure=true 启用)
#- "8080:8080"
volumes:
# 语法 --> 主机位置:容器内路径,参见 https://docs.docker.com/compose/compose-file/#volumes
# 以便 Traefik 可以监听 Docker 事件
- /var/run/docker.sock:/var/run/docker.sock
# 将日志文件位置挂载到主机,以便我可以在主机上读取它们
# 基于 https://unix.stackexchange.com/questions/104936/where-are-all-the-posibilities-of-storing-a-log-file
- /var/log/traefik:/var/log
# 将证书位置挂载到主机,以便我可以在主机上读取它们
# 基于 https://www.getpagespeed.com/server-setup/ssl-directory 和 https://serverfault.com/questions/62496/ssl-certificate-location-on-unix-linux
- /etc/ssl/certs/traefik/letsencrypt:/etc/ssl/certs/letsencrypt
# 我使用自定义的 "traefik.toml",因此必须将其挂载到 Traefik 容器中(或存储在那里),结合
# https://stackoverflow.com/questions/47382756/why-is-my-traefik-toml-file-not-be-read-by-docker-compose-configuration
# https://stackoverflow.com/questions/57200728/can-the-default-location-of-the-traefik-configuration-file-be-changed-in-the-off
# https://stackoverflow.com/questions/45902133/how-to-use-custom-traefik-toml-file
# https://docs.traefik.io/getting-started/configuration-overview/
- /opt/traefik/traefik-config.yaml:/etc/traefik/traefik.yaml
labels:
- traefik.enable=true
#- "traefik.docker.network=bridge_proxy_traefikv2"
- traefik.http.routers.traefik_dashboard-router.rule=Host(`traefik.fairbnb.community`)
- traefik.http.routers.traefik_dashboard-router.entrypoints=web
#- "traefik.http.services.traefik_dashboard-service.loadBalancer.server.port=8080"
- traefik.http.routers.traefik_dashboard-router.service=api@internal
networks:
- traefik
#- default
# 一个打印操作系统信息和 HTTP 请求到输出的微型 Go Web 服务器
# whoami:
# image: "containous/whoami"
# container_name: "whoami"
# labels:
# - "traefik.enable=true"
# - "traefik.docker.network=bridge_proxy_traefikv2"
# - "traefik.http.routers.whoami-router.rule=Host(`fairbnb.community`)"
# - "traefik.http.routers.whoami-router.entrypoints=web"
# - "traefik.http.services.whoami-service.loadBalancer.server.port=80"
# networks:
# - traefik
# #- default
whoami_viaSubdomain:
image: "containous/whoami"
container_name: "whoami_viaSubdomain"
labels:
- traefik.enable=true
- traefik.docker.network=bridge_proxy_traefikv2
- traefik.http.routers.whoami_viaSubdomain-router.rule=Host(`whoami.fairbnb.community`)
- traefik.http.routers.whoami_viaSubdomain-router.entrypoints=web
#- "traefik.http.services.whoami_viaSubdomain-service.loadBalancer.server.port=80"
networks:
- traefik
#- default
networks:
traefik:
external:
name: bridge_proxy_traefikv2
Traefik 配置:traefik-config.yaml
global:
checkNewVersion: true
# sendAnonymousUsage: true
#serversTransport:
# insecureSkipVerify: true
# rootCAs:
# - foobar
# maxIdleConnsPerHost: 42
# forwardingTimeouts:
# dialTimeout: 42
# responseHeaderTimeout: 42
# idleConnTimeout: 42
entryPoints:
web:
address: :80
#transport:
# lifeCycle:
# requestAcceptGraceTimeout: 42
# graceTimeOut: 42
# respondingTimeouts:
# readTimeout: 42
# writeTimeout: 42
# idleTimeout: 42
#proxyProtocol:
# insecure: true
# trustedIPs:
# - foobar
# - foobar
#forwardedHeaders:
# insecure: true
# trustedIPs:
# - foobar
# - foobar
websecure:
address: :443
#traefik_dashboard:
#address: ":8080"
api:
#api: {}
# 激活仪表板。
## 启用 Web UI @ 端口 8080 / Traefik 默认将在端口 8080 上监听 API 请求。/ 直接在名为 traefik 的 entryPoint 上激活 API。(默认:false)--> 端口 '8080'v= entryPoint 'traefik',覆盖 --api
#insecure: true
## 激活仪表板。(默认:true)
# dashboard: true
# 启用用于调试和分析的附加端点。
debug: true
providers:
# providersThrottleDuration: 42
docker:
#constraints: foobar
## 监视提供者。(默认:true)
#watch: true
## Docker 服务器端点。可以是 TCP 或 Unix socket 端点。(默认:unix:///var/run/docker.sock)
#endpoint: unix:///var/run/docker.sock
#defaultRule: foobar
#tls:
#ca: foobar
#caOptional: true
#cert: foobar
#key: foobar
#insecureSkipVerify: true
# 默认暴露容器。(默认:true)/ 默认情况下,会为所有检测到的容器创建路由。若要限制 Traefik 服务发现的范围,即禁止为某些容器创建路由,可以通过两种方式实现:通用的 exposedByDefault(被 traefik.enable 覆盖),或基于约束的更细粒度机制。
exposedByDefault: false
#useBindPortIP: true
#swarmMode: true
# 默认 Docker 网络。
network: bridge_proxy_traefikv2
# swarmModeRefreshSeconds: 42
not used currently-metrics: # 这仅用于在 Notepad++ 中折叠/展开注释区域
#metrics:
# prometheus:
# buckets:
# - 42
# - 42
# addEntryPointsLabels: true
# addServicesLabels: true
# entryPoint: foobar
# manualRouting: true
# datadog:
# address: foobar
# pushInterval: 42
# addEntryPointsLabels: true
# addServicesLabels: true
# statsD:
# address: foobar
# pushInterval: 42
# addEntryPointsLabels: true
# addServicesLabels: true
# prefix: traefik
# influxDB:
# address: foobar
# protocol: foobar
# pushInterval: 42
# database: foobar
# retentionPolicy: foobar
# username: foobar
# password: foobar
# addEntryPointsLabels: true
# addServicesLabels: true
#ping:
# entryPoint: foobar
# manualRouting: true
#
log:
#Traefik 的日志文件
# 设置日志的调试级别
level: DEBUG
# 定义容器内的存储位置,日志文件在容器内写入。若要使其在主机上可用,需进行挂载,请参阅 docker-compose 文件中的 volumes 部分
# 基于 https://unix.stackexchange.com/questions/104936/where-are-all-the-posibilities-of-storing-a-log-file
filePath: /var/log/traefik-log.log
# Traefik 日志格式:json | common(默认:common)
#format: common
accessLog:
# 记录访问尝试
# 定义容器内的存储位置,日志文件在容器内写入。若要使其在主机上可用,需进行挂载,请参阅 docker-compose 文件中的 volumes 部分
# 基于 https://unix.stackexchange.com/questions/104936/where-are-all-the-posibilities-of-storing-a-log-file
filePath: /var/log/traefik-access.log
# 访问日志格式:json | common(默认:common)
#format: common
# filters:
# statusCodes:
# - foobar
# - foobar
# retryAttempts: true
# minDuration: 42
# fields:
# defaultMode: foobar
# names:
# name0: foobar
# name1: foobar
# headers:
# defaultMode: foobar
# names:
# name0: foobar
# name1: foobar
# bufferingSize: 42
#
not used currently-tracing: # 这仅用于在 Notepad++ 中折叠/展开注释区域
#tracing:
# serviceName: foobar
# spanNameLimit: 42
# jaeger:
# samplingServerURL: foobar
# samplingType: foobar
# samplingParam: 42
# localAgentHostPort: foobar
# gen128Bit: true
# propagation: foobar
# traceContextHeaderName: foobar
# collector:
# endpoint: foobar
# user: foobar
# password: foobar
# zipkin:
# httpEndpoint: foobar
# sameSpan: true
# id128Bit: true
# sampleRate: 42
# datadog:
# localAgentHostPort: foobar
# globalTag: foobar
# debug: true
# prioritySampling: true
# traceIDHeaderName: foobar
# parentIDHeaderName: foobar
# samplingPriorityHeaderName: foobar
# bagagePrefixHeaderName: foobar
# instana:
# localAgentHost: foobar
# localAgentPort: 42
# logLevel: foobar
# haystack:
# localAgentHost: foobar
# localAgentPort: 42
# globalTag: foobar
# traceIDHeaderName: foobar
# parentIDHeaderName: foobar
# spanIDHeaderName: foobar
# baggagePrefixHeaderName: foobar
#
not used currently-hostResolver: # 这仅用于在 Notepad++ 中折叠/展开注释区域
#hostResolver:
# cnameFlattening: true
# resolvConfig: foobar
# resolvDepth: 42
#
certificatesResolvers:
tlsChallenge_letsencrypt:
acme:
email: my.secret@gmail.com
# 要使用的 CA 服务器。(默认:https://acme-v02.api.letsencrypt.org/directory)
#caServer:
# 位置基于 https://www.getpagespeed.com/server-setup/ssl-directory 和 https://serverfault.com/questions/62496/ssl-certificate-location-on-unix-linux
storage: /etc/ssl/certs/letsencrypt/acme.json
# 用于生成证书私钥的 KeyType。允许的值 'EC256', 'EC384', 'RSA2048', 'RSA4096', 'RSA8192'。(默认:RSA4096)
#keyType: {}
#dnsChallenge:
# provider: foobar
# delayBeforeCheck: 42
# resolvers:
# - foobar
# - foobar
# disablePropagationCheck: true
#httpChallenge:
# entryPoint: foobar
tlsChallenge: {}
#CertificateResolver1:
# acme:
# email: my.secret@gmail.com
# caServer: foobar
# storage: foobar
# keyType: foobar
# dnsChallenge:
# provider: foobar
# delayBeforeCheck: 42
# resolvers:
# - foobar
# - foobar
# disablePropagationCheck: true
# httpChallenge:
# entryPoint: foobar
# tlsChallenge: {}
-
不带我的注释
docker-compose: traefikV2_docker-compose.yaml
root@Ubuntu18:/opt/10_docker-compose.yml-files# cat traefikV2_docker-compose.yaml | grep -v "#"
version: "3.7"
services:
traefik-reverse-proxy:
image: traefik:v2.1.1
container_name: traefik
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/log/traefik:/var/log
- /etc/ssl/certs/traefik/letsencrypt:/etc/ssl/certs/letsencrypt
- /opt/traefik/traefik-config.yaml:/etc/traefik/traefik.yaml
labels:
- traefik.enable=true
- traefik.http.routers.traefik_dashboard-router.rule=Host(`traefik.fairbnb.community`)
- traefik.http.routers.traefik_dashboard-router.entrypoints=web
- traefik.http.routers.traefik_dashboard-router.service=api@internal
networks:
- traefik
whoami_viaSubdomain:
image: "containous/whoami"
container_name: "whoami_viaSubdomain"
labels:
- traefik.enable=true
- traefik.docker.network=bridge_proxy_traefikv2
- traefik.http.routers.whoami_viaSubdomain-router.rule=Host(`whoami.fairbnb.community`)
- traefik.http.routers.whoami_viaSubdomain-router.entrypoints=web
networks:
- traefik
networks:
traefik:
external:
name: bridge_proxy_traefikv2
Traefik 配置:traefik-config.yaml
root@Ubuntu18:/opt/traefik# cat traefik-config.yaml | grep -v "#"
global:
checkNewVersion: true
entryPoints:
web:
address: :80
websecure:
address: :443
api:
debug: true
providers:
docker:
exposedByDefault: false
network: bridge_proxy_traefikv2
log:
level: DEBUG
filePath: /var/log/traefik-log.log
accessLog:
filePath: /var/log/traefik-access.log
certificatesResolvers:
tlsChallenge_letsencrypt:
acme:
email: my.secret@gmail.com
storage: /etc/ssl/certs/letsencrypt/acme.json
tlsChallenge: {}
@Cameron_D
@SvenC56
@Cerix
@huberfe
抱歉直接@了各位,但看起来你们是仅有的公开记录中在 Traefik 后端运行 Discourse 的用户。
尽管 Traefik 承诺能处理所有相关配置,但实际设置似乎并不简单。
到目前为止,我尚未成功:
正常工作的 URL:
无法访问的 URL:
如果您能分享 Discourse 和 Traefik 的完整配置,将不胜感激,这将有助于我更好地排查问题。
我在本文末尾发布的 Traefik 配置:Endless 502 / forwarding when calling dashboard via subdomain #6123 - #9 by PackElend - Traefik v2 - Traefik Labs Community Forum
由于我目前仅使用手机,请在此查看我的配置:traefik - SeAT Discourse Documentation
请注意:我的配置仅在 Traefik v1.6 和 v1.7 版本下运行过,不确定是否适用于 v2 版本。
在此配置下,多名用户能够使用我的插件、Discourse 以及 Traefik。
备注:我尚未阅读本线程中的任何帖子,只是针对提醒进行回复。
PackElend
(Pack Elend)
10
非常感谢

我会尝试将其从 v1 迁移到 v2。
我已经有一些思路了,还需要几个小时来仔细推敲。
我猜 SSL 和 Let’s Encrypt 的模板是被注释掉的,所以模板部分看起来应该是这样的:
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## 如果你希望添加 Let's Encrypt (https),请取消注释以下两行
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
是的,既然你打算在前面启用代理,为什么还要让 Discourse 容器来管理你的 SSL 证书呢?
完成后请发布你的解决方案。
PackElend
(Pack Elend)
12
在 Run other websites on the same machine as Discourse - #301 中可以看到:
我建议也在文档中添加模板部分。我注意到在我的安装中它没有被注释掉,因为我是先进行独立安装以获取 app.yml。在最开始的时候,我忘了注释它们。这样可以避免其他人遇到同样的问题。
没问题
PackElend
(Pack Elend)
14
好消息,各位! http://forum.fairbnb.community/ 已可访问。
这是在 app.yml 中改动最小的配置,可通过 http 提供服务。我将在周末深入研究 https。
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## 如果希望添加 Lets Encrypt (https),请取消注释以下两行
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
expose:
#- "80:80" # http
#- "443:443" # https
labels:
traefik.enable: true
traefik.http.services.discourse.loadbalancer.server.port: 80
traefik.http.routers.discourse.rule: Host(`forum.fairbnb.community`)
traefik.http.routers.discourse.entrypoints: web
Cerix
(Cerix)
15
对于 SSL,只需配置 Traefik + Let’s Encrypt,无需使用 Discourse SSL。
Traefik 将管理您所有容器的加密。
目前我正在使用 Traefik 1.6,因此尚未了解如何在 Traefik v2 上启用它。
PackElend
(Pack Elend)
16
是的,参见 https://meta.discourse.org/t/running-other-websites-on-the-same-machine-as-discourse/17247,但看起来当客户端通过 https 与代理通信时,discourse 期望某些标头信息。
我简要阅读了相关内容。我会尝试将其翻译成普通上班族也能理解的文字。
是的,另见 https://docs.traefik.io/https/overview。起初我直接启用了 https,证书创建也成功了,但仅此而已。现在我需要将其与我此后获得的知识进行对齐。
所以你是通过 https 访问你的论坛,对吧?
你能分享一下 Traefik 和 Discourse 的配置吗?分享得越多,我周末处理起来就越容易。
v1 到 v2 的迁移指南见 https://docs.traefik.io/migration/v1-to-v2/,但我会在本周末尝试在这里进行解释。
Cerix
(Cerix)
17
好的,这是您的 traefik.toml 文件,但不适用于新版本 v2
defaultEntryPoints = ["http", "https"]
[web]
address = ":8080"
[web.auth.basic]
users = ["yourusername:yourpassword"]
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[acme]
email = "XXXXXXXX"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
onDemand = false
[acme.httpChallenge]
entryPoint = "http"
minVersion = "VersionTLS12"
Discourse 配置的一部分
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
expose:
- "80" # http ------ 仅暴露容器端口
- "443" # https ------ 无需暴露外部主机端口
labels:
traefik.port: '80'
traefik.backend: 'mycontainername'
traefik.frontend.rule: 'Host:www.myhost.com'
traefik.docker.network: 'mynetworkname'
docker_args:
- "--network=mynetworkname"
使用此配置,Traefik 会将所有来自端口 80(HTTP)的请求重定向到端口 443(HTTPS),
并在 Discourse 管理面板中启用强制 HTTPS 以避免错误。
PackElend
(Pack Elend)
18
PackElend
(Pack Elend)
19
你好,
我参考这篇帖子设置了 Discourse 与 Traefik 的集成。目前 Traefik 已经与另一个 Web 应用正常工作。
当我访问 forum.private.com 时,会收到“404 页面未找到”的错误。
看起来某些部分正在运行,因为在 Traefik 仪表板的“服务”选项卡中,我看到了 discourse@docker 和 discourse_secure@docker。
然而,在“路由器”选项卡中并没有关于 Discourse 的任何条目。
我对 app.yml 所做的修改如下,主要基于上述链接的帖子。我在底部的 Docker 参数中添加了一个暴露端口,这似乎使上述服务得以开启。非常感谢您的帮助!
Traefik docker-compose
version: "3.3"
services:
################################################
#### Traefik Proxy Setup #####
###############################################
traefik:
image: traefik:v2.0
restart: always
container_name: traefik
ports:
- "80:80" # <== http
- "8080:8080" # <== :8080 是仪表板运行的端口
- "443:443" # <== https
command:
#### 这些是配置 Traefik 并告知其如何工作的 CLI 命令 ####
- --api.insecure=true # <== 启用不安全的 API,不建议在生产环境中使用
- --api.dashboard=true # <== 启用仪表板以查看服务、中间件、路由器等...
- --api.debug=true # <== 启用额外的端点用于调试和性能分析
## 日志设置(选项:ERROR, DEBUG, PANIC, FATAL, WARN, INFO)- https://docs.traefik.io/observability/logs/ ##
- --log.level=DEBUG # <== 设置 Traefik 的日志级别
## 提供者设置 - https://docs.traefik.io/providers/docker/#provider-configuration ##
- --providers.docker=true # <== 启用 Docker 作为 Traefik 的提供者
- --providers.docker.exposedbydefault=false # <== 不要将所有容器暴露给 Traefik,仅暴露已启用的容器
- --providers.file.filename=/dynamic.yaml # <== 引用动态配置文件
- --providers.docker.network=web # <== 在名为 web 的 Docker 网络上操作
## 入口点设置 - https://docs.traefik.io/routing/entrypoints/#configuration ##
- --entrypoints.web.address=:80 # <== 定义名为 web 的端口 :80 的入口点
- --entrypoints.web-secured.address=:443 # <== 定义名为 web-secured 的端口 :443 的 HTTPS 入口点
## 证书设置 (Let's Encrypt) - https://docs.traefik.io/https/acme/#configuration-examples ##
- --certificatesresolvers.mytlschallenge.acme.tlschallenge=true # <== 启用 TLS-ALPN-01 以生成和续订 ACME 证书
- --certificatesresolvers.mytlschallenge.acme.email=private@private.com # <== 设置证书邮箱
- --certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json # <== 定义用于存储证书信息的 ACME 文件
volumes:
- ./letsencrypt:/letsencrypt # <== 证书(TLS)卷
- /var/run/docker.sock:/var/run/docker.sock # <== Docker 管理卷
- ./dynamic.yaml:/dynamic.yaml # <== 动态配置文件卷,**参考:第 27 行
networks:
- web # <== 将 Traefik 放置在名为 web 的网络上,以访问该网络上的容器
labels:
#### 标签定义此容器的 Traefik 代理的行为和规则 ####
- "traefik.enable=true" # <== 在自身上启用 Traefik 以查看仪表板并分配子域名进行访问
- "traefik.http.routers.api.rule=Host(`monitor.private.com`)" # <== 设置仪表板的域名
- "traefik.http.routers.api.service=api@internal" # <== 启用 API 作为可访问的服务
networks:
web:
external: true
backend:
external: false
volumes:
db_data: {}
wordpress:
external: true
db:
external: true
Discourse app.yml
## 这是 Discourse 的一体化独立 Docker 容器模板
##
## 修改此文件后,您必须重新构建
## /var/discourse/launcher rebuild app
##
## 编辑时请*非常*小心!
## YAML 文件对空白或缩进错误极其敏感!
## 如需验证此文件,请访问 http://www.yamllint.com/
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## 如果您想添加 Let's Encrypt (https),请取消注释这两行
#- "templates/web.ssl.template.yml"
# "templates/web.letsencrypt.ssl.template.yml"
## 此容器应暴露哪些 TCP/IP 端口?
## 如果您希望 Discourse 与另一个 Web 服务器(如 Apache 或 nginx)共享端口,
## 请参阅 https://meta.discourse.org/t/17247 获取详细信息
expose:
#- "80:80" # http
#- "443:443" # https
params:
db_default_text_search_config: "pg_catalog.english"
## 将 db_shared_buffers 设置为总内存的最大 25%。
## 将根据检测到的 RAM 自动由引导程序设置,您也可以覆盖
db_shared_buffers: "128MB"
## 可以提高排序性能,但会增加每个连接的内存使用量
#db_work_mem: "40MB"
## 此容器应使用哪个 Git 修订版本?(默认:tests-passed)
#version: tests-passed
env:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## 支持多少并发 Web 请求?取决于内存和 CPU 核心数。
## 将根据检测到的 CPU 自动由引导程序设置,您也可以覆盖
UNICORN_WORKERS: 2
## TODO: 此 Discourse 实例将响应的域名
## 必需。Discourse 无法仅使用 IP 地址运行。
DISCOURSE_HOSTNAME: forum.private.com
## 如果您希望容器使用与上述相同的
## 主机名(-h 选项)启动,请取消注释(默认值为 "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: 初始注册时将设为管理员和开发人员的逗号分隔邮箱列表
## 示例 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'private@private.com'
## TODO: 用于验证新账户和发送通知的 SMTP 邮件服务器
# SMTP 地址、用户名和密码为必填项
# 警告:SMTP 密码中的字符 '#' 可能导致问题!
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 # (可选,默认为 true)
## 如果您添加了 Let's Encrypt 模板,请取消注释以下行以获取免费 SSL 证书
LETSENCRYPT_ACCOUNT_EMAIL: private@private.com
## 此 Discourse 实例的 http 或 https CDN 地址(配置为拉取)
## 详见 https://meta.discourse.org/t/14857
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## Docker 容器是无状态的;所有数据都存储在 /shared 中
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## 插件放在这里
## 详见 https://meta.discourse.org/t/19157
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## 构建后运行的任何自定义命令
run:
- exec: echo "开始自定义命令"
## 如果您想设置首次注册的“发件人”邮箱地址,请取消注释并修改:
## 收到首次注册邮件后,请重新注释该行。它只需运行一次。
#- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
- exec: echo "结束自定义命令"
labels:
app_name: discourse
#----Traefik 标签------------------------
traefik.enable: true
traefik.docker.network: web
#---HTTP 路由器部分-------------------
traefik.http.routers.discourse.rule: Host(`forum.private.com`)
#--HTTP 部分--------------------------
traefik.http.routers.discourse.entrypoints: web
traefik.http.routers.discourse.middlewares: discourse_redirect2https
traefik.http.services.discourse.loadbalancer.server.port: 80
#---HTTPS 路由器部分
traefik.http.routers.discourse_secure.rule: Host(`forum.private.com`)
#--HTTPS 部分
traefik.http.routers.discourse_secure.entrypoints: web-secured
traefik.http.services.discourse_secure.loadbalancer.server.port: 80
#--TLS 部分
traefik.http.routers.discourse_secure.tls.certresolver: tlsChallenge_letsencrypt
#---中间件部分:将 HTTP 重定向到 HTTPS
traefik.http.middlewares.discourse_redirect2https.redirectscheme.scheme: https
docker_args:
- "--network=web"
- "--expose=80"
谢谢