Cloudflare 使用子文件夹设置

我只是想分享一下我设置子文件夹和 Cloudflare 的步骤,特别是当主网站已经上线,并且根域名无法(即使是临时)指向论坛服务器时。

关键点

  • 现有的 mywebsite.com 当前指向 1.1.1.1 并且已上线
  • 我们应该将 mywebsite.com/forum(及其子目录)路由到 2.2.2.2
  • 由于在 Discourse 安装过程中我们无法通过 letsencrypt 验证(该验证会检查域名是否解析到当前服务器),因此我们应该使用 DNS 验证

app.yml 中的更改

Letsencrypt 更新

创建一个新的 letsencrypt 模板,并根据此主题将其设置在 app.yml 中:LetsEncrypt DNS Validation Template Using Cloudflare

但是,请确保仅复制该帖子中的 issue_cert 方法,其余内容从原始 web.letsencrypt.ssl.template.yml 中获取(因为该主题发布后内容已更改)。

LETSENCRYPT_CF_TOKEN: ""
LETSENCRYPT_CF_ACCOUNT_ID: ""
LETSENCRYPT_CF_ZONE_ID: ""
LETSENCRYPT_DNS_PROVIDER: "dns_cf"
  • 您可以从 CF 我的个人资料 → “API Tokens”页面创建 Cloudflare 令牌。
  • 账户 ID 和区域 ID 显示在域的“概览”页面上。
  • 保持 DNS 提供商的值如上

子文件夹更新

根据此主题 https://meta.discourse.org/t/serve-discourse-from-a-subfolder-path-prefix-instead-of-a-subdomain/30507,在 env: 下设置 DISCOURSE_RELATIVE_URL_ROOT: /forum 并更新 run: 部分。
请注意此帖关于用户 IP 的信息:Serve Discourse from a subfolder (path prefix) instead of a subdomain - #111 by varun21

重建

在更改 app.yml 以运行重建命令后,我们需要跳过 Discourse 对域名解析到当前服务器 IP 的检查(因为我们的 mywebsite.com 已指向 1.1.1.1,而 Discourse 会检查根域名),为此请运行:

./launcher rebuild app --skip-connection-test

Cloudflare 设置

我知道有些人建议使用 Workers 来将 /forum 路由到 2.2.2.2,但我发现使用负载均衡更容易。无论如何,使用 Workers 我都无法解决 CSS/JS 相关的问题,即使禁用了 rocket loader 和其他类似设置。所以,

  • 激活负载均衡(在“流量”下)
  • 选择“管理池” → “创建”
  • 创建 2 个池(一个用于主网站,一个用于论坛),每个池应只有一个端点

  • 创建负载均衡器,主机名应为 mywebsite.com
  • 在端点部分,选择两个池
  • 跳过监视器(因为我们不需要监视服务器的健康状况,主网站应始终指向 1.1.1.1,论坛指向 2.2.2.2),跳过流量转向(默认关闭)
  • 在自定义规则下,创建一个具有路径条件 /forum 的规则,并指向论坛端点

  • 保存/部署

注意事项

  • 出于某种原因,复制示例 app.yml 然后重建对我不起作用(可能是我做错了什么)。因此,作为解决方案,我第一次使用其他域名运行了 discourse-setup,然后,除了上面 app.yml 的其他更改之外,更改了主机名并进行了最终重建。
  • Discourse 从 letsencrypt 生成 2 个证书,RSA certECDSA cert,letsencrypt 对每个精确域名每周的证书数量限制为 5 个,如果您连续 2 次出错,第 3 次尝试将只颁发一个证书,论坛将无法工作(您可以使用此脚本 GitHub - sahsanu/lectl: Script to check issued certificates by Let's Encrypt on CTL (Certificate Transparency Log) using https://crt.sh 检查当前限制)。
  • CF 负载均衡器不是免费的,但考虑到(截至目前)每 500k DNS 请求 5 美元的价格,我认为它比处理 nginx 等更值得,考虑到麻烦程度。