在家庭互联网环境下通过Cloudflare Tunnel安装Discourse

由于 Discourse 现在支持在树莓派上运行,在您的家庭实验室中运行小型实例将成为常见的用例。但是,许多住宅 ISP 会阻止 Discourse 所需的 80/443 端口的入站流量。

对于我们在 https://discourse-on-a-pi.falco.dev/ 上的演示站点,我们使用了 Cloudflare Tunnel 来解决这个问题,您也可以这样做!

设置您的隧道

首先,请遵循以下指南:

https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide

您唯一需要更改的是将 URL 从 url: http://localhost:8000 更改为 url: http://localhost:80。让隧道在后台运行。

禁用 Rocket Loader

您必须禁用 Cloudflare Rocket Loader 才能使 Discourse 正常工作。

https://community.cloudflare.com/t/how-can-i-remove-the-rocket-loader-script-from-the-header-tag-on-my-website/4229/2

安装 Discourse

遵循 如何在生产环境中安装 Discourse,但在创建 app.yml 文件后,在它给出 5 秒倒计时时按下 CTRL+C

现在编辑文件的前几行,使其看起来像这样:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/cloudflare.template.yml"
#  - "templates/web.ratelimited.template.yml"
## 如果您想添加 Let's Encrypt (https),请取消注释这两行
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"

并在 env: 部分下添加以下行:

DISCOURSE_FORCE_HTTPS: true

然后运行 ./launcher rebuild app

在等待时,安装一个页面规则以始终重定向到 HTTPS,如下所示:

几分钟后,您新的 Discourse 实例将在您在隧道/Discourse 配置中使用的域上可用 :tada:

38 个赞

我认为最好提及端口。如果用户决定使用 Argo Tunnel,那么他们需要将端口设置为与隧道设置相同。例如:

-80:80
#-443:443

然后他们需要让隧道监听
http://localhost:80

我使用的是 Unix 套接字来连接它们。

5 个赞

难道我在这里提到的不是吗:

7 个赞

您好 Rafael,

感谢您的教程。

我已按照您上面指南中的所有步骤操作,一切运行正常,但是;

点击电子邮件中的链接激活我的帐户时,我会返回到正确的网页,其中有一个激活按钮,但此按钮不起作用。我在论坛上查找了相关指南,看起来像是域名到 IP 的问题?

我已确认 config 中的 force_https 设置为 true。

有什么想法/您是否遇到过此问题(附有截图)——这个按钮不起作用?

3 个赞

我已经解决了这个问题。

请确保禁用 Rocket Loader :wink:

祝好!

6 个赞

最后,在树莓派上安装了 Discourse。但我遇到了 Cloudflare Tunnels 的问题。

我无法通过域名访问 Discourse 网站,是不是 config.yml 配置有问题?

url: http://localhost:80
tunnel: 371dd57c-************
credentials-file: /home/pi/.cloudflared/371dd57c-*********.json
3 个赞

隧道命令的输出是什么?它应该明确说明你在配置中犯下的任何错误。

3 个赞

cloudflared tunnel 信息 输出:

cloudflared tunnel info ******
2022-01-24T04:55:47Z INF 无法确定默认源证书路径。在 [~/.cloudflared ~/.cloudflare-warp ~/cloudflare-warp /etc/cloudflared /usr/local/etc/cloudflared] originCertPath= 中没有文件 cert.pem
2022-01-24T04:55:47Z ERR 您需要使用 --origincert 选项指定源证书路径,或设置 TUNNEL_ORIGIN_CERT 环境变量。有关更多信息,请参阅 https://developers.cloudflare.com/argo-tunnel/reference/arguments/。originCertPath=
解析 tunnel ID 时出错:定位源证书时出错:从终端运行时,客户端未指定 origincert 路径
2 个赞

看起来您放错了证书文件?如果您以 root 用户身份运行,该文件应位于
/root/.cloudflared/
而不是您放置它的位置

2 个赞

我已经有了 cert.pem 文件。

2 个赞

您是尝试以 pi 用户还是 root 用户身份启动隧道?

3 个赞

我正在以 pi 用户身份使用此命令

cloudflared tunnel run <UUID 或 NAME>

2 个赞

您好 @bekircem

看起来您的 Cloudflared 已成功连接到 Cloudflare 的边缘。

您是否已在 Cloudflare 上通过 CNAME 记录到您的 Argo Tunnel ID 启用了路由?

此致,

Alex。

3 个赞

您好 @Stigin,感谢您的回复。

是的,我已启用从命令行进行路由。

2 个赞

@bekircem,这个很有意思——嗯!!

您在浏览您的网站地址时遇到的当前错误是什么?只是一个通用的 Cloudflare Argo Tunnel 错误页面吗?

请运行命令 docker ps 向我们展示您正在运行的容器,并运行 cloudflared tunnel list 向我们展示您当前正在运行的隧道 || 确保您模糊化您的 argo 路由/任何不相关的容器! :wink:

Alex。

3 个赞

浏览到您的网站地址时,您目前收到什么错误?是通用的 Cloudflare Argo Tunnel 错误页面吗?

没有 Cloudflare Argo Tunnel 错误页面。

ERR_NAME_NOT_RESOLVED

docker ps

CONTAINER ID   IMAGE                 COMMAND        CREATED        STATUS        PORTS                                                                      NAMES
f1bde9b70f55   local_discourse/app   “/sbin/boot”   11 hours ago   Up 11 hours   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app

当以 root 用户身份使用此命令 cloudflared tunnel list

2022-01-24T15:55:03Z INF 无法确定默认源证书路径。在 [~/.cloudflared ~/.cloudflare-warp ~/cloudflare-warp /etc/cloudflared /usr/local/etc/cloudflared] originCertPath= 中没有文件 cert.pem
2022-01-24T15:55:03Z ERR 您需要使用 --origincert 选项指定源证书路径,或设置 TUNNEL_ORIGIN_CERT 环境变量。有关更多信息,请参阅 https://developers.cloudflare.com/argo-tunnel/reference/arguments/。originCertPath=
找不到源证书:客户端在从终端运行时未指定 origincert 路径

当以 pi 用户身份使用此命令 cloudflared tunnel list

您可以使用 `cloudflared tunnel info <name/uuid>` 获取每个 tunnel 的更详细信息
ID                                   NAME      CREATED              CONNECTIONS
371dd57c-**************** ze****2022-01-24T03:35:19Z

这正常吗?

我们需要为 config.yml 文件中的 DISCOURSE_HOSTNAME 使用子域,对吗?

更新:我已卸载 Cloudflared 并以 root 用户重新安装,现在可以正常工作了。我仍然不明白我之前尝试中到底哪里出错了。

2 个赞

不知怎么的,我终于在 Raspberry 上运行了网站,并且它已上线。

我不太明白怎么做到的。我删除了 Cloudflared 并以 root 用户重新安装它。然后它就工作了……

我有两个问题:

1- 似乎我的 SSL 证书无法正常工作,因此我无法登录 Discourse 上的管理员帐户。(它似乎在隐身标签中运行。也许是关于缓存的问题。)您使用的是 full 还是 full(strict)?

2- 我对将 cloudflared 作为服务运行有疑问。https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/run-tunnel/run-as-service

我使用 cloudflared tunnel run <UUID or NAME> 命令运行了隧道。但是当我关闭 iterm 窗口时,它会停止工作吗?

如果您已经登录并且在 ~/.cloudflared/ 中有一个配置文件,这些文件将被复制到 /etc/cloudflared/

如果您没有配置文件,则需要创建一个 config.yml 文件,其中包含上述字段。您可以通过运行 cloudflared --config CONFIG-FILE service install 来传递自定义文件。

我检查了,我在 /etc/cloudflared/ 中没有配置文件。在这种情况下,我应该怎么做才能自动运行此服务?

谢谢。

2 个赞

关于 Cloudflare Tunnel 服务的更具体的问题,可以在 https://community.cloudflare.com/tag/cloudflaretunnel 获得更好的解答。

3 个赞

@bekircem

我认为重新安装它应该可以解决 cloudflared 找不到证书的问题……

关于将 Cloudflare 作为服务运行——您在手动运行服务时创建的配置文件需要移动到 /etc/cloudflared。

我不确定是否应该在此处链接个人网站,所以如果我需要删除它,请告诉我,但我已经在我的一个博客中涵盖了这一点,在名为:“将 Cloudflared 设置为服务并运行”的部分中。

让我们知道您的进展!

Alex。

4 个赞

感谢您的回复。

很棒的博文,谢谢分享。

将 Cloudflared 作为服务运行

sudo cloudflared service install

config.yml 文件已自动复制到 /etc/cloudflared/。

sudo systemctl start cloudflared

sudo systemctl enable cloudflared

运行得很棒。我还没试过重启,但希望它能正常工作。

4 个赞