我可能需要将此分成三个独立的帖子,但它们是相关的,所以我将从一个开始。
几天前,我几乎逐字地使用了这个教程 (How to Scale a Discourse Deployment with a Load Balancer and Managed Database Cluster | DigitalOcean),并将我独立的 Discourse Droplet 从 Digital Ocean 迁移到了负载均衡器内的两个 Droplet 中,到目前为止一切顺利。
然后我浏览了这个教程 (Configure an S3 compatible object storage provider for uploads),但在从命令行重建 discourse 后,我的 Discourse 网站只显示一个空白屏幕。我在浏览器中查看 Inspector,发现浏览器阻止了我所有的内容,因为它正在通过 HTTP 而不是 HTTPS 提供服务。这可能是因为负载均衡器是 SSL 终止的,所以所有外部都是 HTTPS,但服务器本身运行在 HTTP 上。
这时,我再次完全搞砸了我的服务器,试图让它们在负载均衡器内使用 HTTPS,但这根本不可能。我无法让 Digital Ocean Space/CDN 按照这个教程 (Configure an S3 compatible object storage provider for uploads) 与 S3/CDN 一起工作。我仔细检查了每一个方面很多次,但它就是不起作用。我能让 Discourse 重建的唯一方法是从 app.yml 中删除 DISCOURSE_S3_ENDPOINT: https://sfo3.digitaloceanspaces.com 参数,但即使它已经构建完成,我也无法让服务器响应。我得到了 503 服务器未响应错误,或者普通的浏览器服务器未响应或服务器断开连接错误。这取决于我尝试的负载均衡器和 DO Space/CDN 设置。我尝试了所有可能的设置组合,但没有任何一种能让我提供页面。
当我在 app.yml 中保留 DISCOURSE_S3_ENDPOINT 参数时,我在 Discourse 重建过程中收到以下错误,但当我注释掉 S3_ENDPOINT 参数时,该错误消失了。
Aws::S3::Errors::InvalidAccessKeyId: Aws::S3::Errors::InvalidAccessKeyId
我所有的文件都已同步到 S3,所以我认为可以安全地假设 Access Key 是没问题的,问题是由 S3_ENDPOINT 参数引起的。
今天,我放弃了尝试让之前的尝试奏效,并恢复了我只有 HTTP 负载均衡的 Droplet 的备份,最终通过这个教程 (Set up file and image uploads to S3) 再次成功了,但这次我通过 Discourse 管理面板编辑了 S3 设置,而不是像推荐教程中那样编辑 app.yml 中的设置。它终于奏效了,但重要的区别是,我故意省略了 S3 CDN 设置。我已经确认上传到帖子的图片正在存储在 S3 中,并且我可以直接将 Discourse 备份到 S3,这确实是我想要的全部,但我现在有三个困扰我的问题,一个关键,两个可以忽略,尽管我希望在这里确认一下。
所以,关键问题是用户无法再通过 Discourse 登录页面上的 Patreon 登录按钮登录。显示的消息是:
抱歉,授权您的帐户时出错。请重试。
URL 是这个:
https://mbp.community/auth/failure?message=invalid_credentials&origin=https%3A%2F%2Fmbp.community%2Flogin&strategy=patreon
我非常希望得到一些关于我可能尝试什么来解决这个问题的建议,但同样,我想知道这是否是因为服务器内部没有运行 HTTPS。正如你从 URL 中看到的,外部是 HTTPS,所以很难确定。我想我希望这里有人有使用 Discourse 的 Digital Ocean 负载均衡等方面的经验。
另外两个问题现在在管理控制台中被标记出来,如下所示:
根据您当前的网站设置提供的一些建议
- 您的网站正在使用 SSL。但
[force_https](https://mbp.community/admin/site_settings/category/all_results?filter=force_https) 尚未在您的网站设置中启用。
- 服务器配置为将文件上传到 S3,但没有配置 S3 CDN。这可能导致昂贵的 S3 成本和较慢的网站性能。了解更多请参阅“使用对象存储进行上传”。
所以,我不介意尝试启用 force_https,但我担心它会把我锁在服务器之外,因为内部负载均衡的服务器没有运行 HTTPS,而且由于我昨天遇到的问题,我不愿再花十二个小时对着墙头痛,看着无数次 15 分钟的 Discourse 重建却一无所获。同样,如果有人知道在我的配置下启用 force_https 是安全的,请告诉我。
第二个问题,同样,通过添加到 app.yml 文件的参数并没有很好地解决,所以我也不愿再次尝试。你能确认这基本上和添加到 app.yml 文件的参数一样吗?如果是这样,我将忽略第二条消息。反之,如果出于某种原因可以安全尝试,请告诉我,我会做一个备份然后试试。
抱歉发了这么长的帖子。希望你能弄清楚我想寻求什么建议。
1 个赞
pfaffman
(Jay Pfaffman)
2
那么你确实需要在那方面寻求帮助,因为这里真正支持的只是标准安装。
你期望的日页面浏览量超过 20 万吗?如果没有,一个带有 CDN 的 8GB 单个 Droplet 会更容易管理,而且可能更便宜。据我所知,有至少几种方法,这些说明很可能对任何人都不起作用。
首先,你是否按照第 5 步的描述设置了外部 Redis?如果没有,我预计事情至少会有点损坏。他们暗示使用粘性会“修复”它,但实际上并不会。所以你可能会遇到难以诊断的虚假错误。而且他们没有指定一种方法来确保你的所有实例都运行完全相同版本的 Discourse,这也很可能导致问题。
你真的应该先做那件事,否则,实际上,那种设置是无法工作的,因为有些上传会在一个服务器上,有些会在另一个服务器上,而那些说明中没有提到“上传”这个词,所以我预计如果你使用它的时间超过了测试,你可能会遇到一些麻烦,并且需要同步你多个 Droplet 之间的上传。
它明确指出 Digital Ocean CDN 与 Discourse 不兼容。
你是否使用了不同的 CDN,正如它推荐的那样?Bunny.net 设置起来相当容易和简单。
2 个赞
Falco
(Falco)
3
我的天,我不知道是谁写的这个指南,但肯定不是一个非常熟悉大规模 Discourse 部署的人。
最后一步告诉你,可以通过使用 Droplet 快照功能向负载均衡器添加更多后端,但由于该指南没有提到使用对象存储进行上传,这样做将完全破坏用户上传功能。另外,如果你遵循该指南,更新将变得不那么简单。
我给 @Martin_Bailey 的建议是,你不应该遵循其中的任何内容。这只会导致安装失败,正如你所发现的。
如果你想快速、合理地安装 Discourse,请遵循我们的官方安装指南。偏离该路径很快就会变成一项全职工作。
3 个赞
pfaffman
(Jay Pfaffman)
4
有趣。我曾在那儿留下评论,概述了一些问题并链接到 Rafael 的帖子,但它被删除了。
3 个赞
哇!好的,虽然我注意到了一些不正确的地方,但我认为它进行得很顺利,现在我有一个负载均衡的安装。当然,我发现的第一个问题是图片上传坏了,这就是我使用 S3 来存储图片的原因。
目前,要回到单服务器状态需要大量的工作,所以关于 Patreon 登录问题,有什么我可以做的吗?其他两个问题我将忽略。
无论如何,感谢您的帮助。你们在这里做得太好了。
嗨 Jay,谢谢你的帮助。回复你的问题……
我并不期望有很多用户,因为这是一个封闭的 Patreon 社区。我的主要目标是能够在不使网站宕机的情况下更新一个服务器。事实上,我已经确认这是可能的,所以我对这个设置很满意。是的,我确实完成了第五步,所以状态被存储在外部的 Redis droplet 上。
我不得不弄清楚的另一件事,这让我停滞了一段时间,就是我还必须在 app.yml 中添加下面的参数,否则,由于它试图连接到默认端口的 Postgres,尽管 DISCOURSE_DB 参数中有实际的端口,重建仍然会失败。
DISCOURSE_DB_BACKUP_PORT: 25060
直到我根据第一个教程把所有东西都弄好之后,我才考虑到上传,一开始当我尝试设置 S3 时,它确实搞砸了一切,但那是因为你们这里提供的 DO Space CDN 设置不起作用。
它明确指出 Digital Ocean CDN 不能与 Discourse 一起使用。
我知道,但然后教程让我们添加这个:
DISCOURSE_S3_ENDPOINT: https://sfo3.digitaloceanspaces.com
这来自 DO Space,对吧?根据我阅读的这些教程,我不知道如何使用不同的 CDN,但目前我并不担心,因为我稍后会讲到。
不,我没有使用不同的 CDN。我实际上不介意不使用 CDN。我会让 CDN 设置为空。作为进一步的更新,根据你们迄今为止提供的建议,我只是想恢复上周的备份,但我认为我会先尝试启用 force_https 选项,启用它解决了 Patreon 登录问题,正如我所想的那样。服务器上没有任何改变,所以 Patreon 登录问题可能是由某些内部 Discourse 逻辑引起的,尽管我再次意识到(现在)我正在做一些你们不推荐或不支持的事情。
所以,在这一点上,我的设置几乎和第一个教程推荐的一样,但是图片和备份都发送到 S3,没有 CDN。它运行得非常好。我很感激你们建议我只使用独立安装,但每次更新都要让网站宕机 15 分钟真的太痛苦了。就在昨天,我找到了你们关于 data.yml 和 web_only.yml 的参考资料,用于多服务器设置,但我不知道该怎么做,所以我放弃了。
我现在将继续使用我现有的设置。感谢你们的帮助,以及你们所做的一切。
好的,各位,你们赢了。 
我开始看到更多图片无法加载的问题,因为它们有时是通过 http 而不是 https 共享的。你们是对的,这太糟糕了。
我现在已经大部分回退了,保留了 Postgres 数据库,但只使用一个服务器 droplet,没有负载均衡器,图片/Redis 存储在本地。不过,我仍然保留了 S3 用于网站备份。我喜欢它的运行如此顺畅。
我猜我每次升级都会有 15 分钟的宕机时间,但我到目前为止总共花了大约五整天的时间,我不能再花时间在这上面了,所以我很高兴你们能纠正我当初遵循的教程。这几乎就像他们只是想让人们支付更多的 Droplets。
再次感谢你们的帮助。
实际上,如果我能问一下,是否有教程可以帮助我们设置 Discourse,使其在每次更新时都能避免那 15 分钟的停机时间。我看到了关于 data.yml 和 web_only.yml 的说明,但我不知道该怎么做才能实现这一点。
拥有独立的 data 和 web_only yml 文件来自双容器设置:
1 个赞
michaeld
(Michael - Communiteq)
10
这将奏效并解决一些问题。如果你因为(其他)原因被锁在外面,你总是可以通过 launcher enter app 重新进入,并从 Rails 控制台切换回站点设置。
正如其他人已经说过的,最好遵循另一个指南。
1 个赞
Francis
(Francis)
11
大家好,
我写了那篇 DigitalOcean 的文章,看起来我犯了几个错误,我的错!
我想更新这篇文章来纠正这些问题。
所以我想问几个问题,以确保我用修正后的版本把事情弄对。
在文章中,我说你可以选择使用托管 Redis 实例,我当时的想法是使用粘性会话(sticky sessions)可以让你使用 Discourse 镜像内置的 Redis。这是正确的吗?也许这还不够,外部 Redis 实例应该是强制要求。
我同意 @Falco 关于对象存储(Object Storage)的评论,这是我的疏忽。我可以更新文章,加入关于使用 DigitalOcean Spaces 来处理图片上传的说明。
我怀疑移除 Droplets 中的所有状态是解决安装问题的答案,我曾希望使用外部 Redis 是可选的,因为有粘性会话,但我可能是错的。
我也同意这使得你的 Discourse 安装升级更复杂,但我认为,如果你移除了 Droplets 中的所有状态,你应该能够只升级一个 Droplet,然后对其进行快照,并用新创建的快照替换其他 Droplets(有点像 Kubernetes Deployments,只是你手动重新部署)。
我也同意可能还有更好的方法来扩展 Discourse,但我仍然想修正这篇文章,以便人们可以按照它来操作,如果他们愿意的话。
谢谢,
Francis
pfaffman
(Jay Pfaffman)
12
我是一名快乐的 Digital Ocean 客户,我有一个仪表板,我的客户可以在其中输入 API 密钥和主机名,然后它会自动创建 droplet、配置 mailgun、等待 DNS 记录设置完成,然后安装 Discourse。
它根本不像你建议的那样工作。我(找不到其他方式)在你们的论坛上联系了 Digital Ocean,告知你们,我的消息被删除了。然后,9 个月后你们在这里回复。
正确地做这件事是一项相当复杂的壮举,而且它会有用的情况相当牵强。我有一个网站,每天有 10 万次页面浏览量,运行在一个 8GB 的 droplet 上。你认为这个指南的目标受众是谁?
是的,你需要外部 redis、postgres 和带有 CDN 的 S3 存储桶,而 Digital Ocean 的 CDN 不起作用,所以你的指南需要引导他们设置其他公司的 CDN。我认为你不想这样做。这仅仅是设置完成。如果他们之后想进行升级,那将是另一套程序,地球上没有人会知道如何提供帮助。
你能做的最好的事情就是完全删除那篇指南。如果你想成为一个真正的英雄,你可以修复“一键安装”,使其不使用你们自己的专有脚本来设置电子邮件等,这样它实际上就是一个标准的安装。不得不按 Ctrl+C 才能进入 Discourse 的位置,这相当令人困惑,而且由于使用“一键安装”的人没有使用标准的 Discourse 工具,所以在命令行升级时他们不知道如何使用它们。如果你能做到这一点,那将是非常非常棒的。
在这里你可以看到那些使用过它并且遇到麻烦的人:Search results for 'digital ocean one-click' - Discourse Meta
1 个赞
Falco
(Falco)
13
不,因为 Redis 不仅仅是一个简单的缓存,它还处理大量的计数、速率限制、后台作业、发布/订阅。拥有多个 Redis 会导致计数损坏和行为中断。
这可以解决问题,但添加托管的 Redis、托管的 PostgreSQL、托管的负载均衡器、对象存储、容器注册表将比仅支付我们的标准托管费用更昂贵,并且维护起来也复杂得多。
届时,那些每月愿意支付数百美元并且不介意服务因单点故障而中断的人群之间的交集相当小,这与其说是我们推荐给论坛管理员的设置,不如说更像是一个业余爱好者的设置。
1 个赞