AWS 部署的 Discourse 从数据库 URL 获取资源

大家好,

我正在 AWS ECS 上运行 Discourse。当我尝试运行应用程序时,浏览器中的控制台标签页因以下 URL 而失败。我是否遗漏了任何配置更改?

混合内容:页面“https://discuss-stage.tllms.com/finish-installation/register”通过 HTTPS 加载,但请求了一个不安全的网站图标“http://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/uploads/default/optimized/1X/_129430568242d1b7f853bb13ebea28b3f6af4e7_2_32x32.png”。该请求已被阻止;内容必须通过 HTTPS 提供。

在上述 URL 中,这是我的数据库端点 discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com

我已在 database.yml 文件中提供了上述端点。

我使用 Docker 在 ECS 上部署了 Discourse。当我尝试访问应用程序时,浏览器网络请求从以下 URL 获取资源,而不是从 https://discuss-stage.tllms.com/ 获取。

这是我们用于 database.yml 文件的 RDS 端点 discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com

混合内容:页面“https://discuss-stage.tllms.com/”通过 HTTPS 加载,但请求了一个不安全的网站图标“http://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/uploads/default/optimized/1X/_129430568242d1b7f853bb13ebea28b3f6af4e7_2_32x32.png”。该请求已被阻止;内容必须通过 HTTPS 提供。

拒绝加载脚本“https://discuss-stage.tllms.com/assets/browser-detect.js”,因为它违反了以下内容安全策略(CSP)指令:“script-src https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/logs/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/sidekiq/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/mini-profiler-resources/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/assets/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/brotli_asset/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/extra-locales/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/highlight-js/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/javascripts/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/plugins/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/theme-javascripts/ https://discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com/svg-sprite/”。注意,未显式设置“script-src-elem”,因此使用“script-src”作为回退。

看起来您的 S3 存储桶配置有误。

您是如何安装 Discourse 的?您使用的是 Discourse 官方标准安装,还是可能参考了 Bitnami 安装故障排查

我打赌是 CDN 配置出了问题。
你能分享一下你的 config/discourse.conf 吗?
另外,在你的站点设置中搜索 c0fbtc,看看是否有匹配结果。

嗨 Jay,

我已将其作为常规的 Rails 应用进行安装。以下是我所遵循的步骤:

  1. 克隆了 GitHub 仓库。
  2. 使用 Bundle 安装了 gem。
  3. 修改了 database.yml 文件,将其指向 AWS RDS 端点。
  4. 修改了 discourse.conf 文件,将其指向 AWS ElastiCache。
  5. 未在任何地方使用 S3 存储桶配置。
  6. 将代码复制到 Docker 容器中,并部署到 ECS。

我未使用预构建的 Docker 镜像,而是自行构建了 Docker 镜像。

正在删除配置文件

这似乎不太对。如果我是你,我会检查一下我的数据库是否实际上是本地的,并且有一个奇怪的名称。

我认为它应该看起来像这样:

# 数据库服务器的主机地址
# 此处留空,以便优先尝试使用套接字
db_host = discourse-test.c0fbtc1q6bvm.ap-south-1.rds.amazonaws.com
# 运行 Discourse 的数据库名称
db_name = default

S3 的用途是什么?另外,我是否需要创建一个单独的 discourse.conf 文件,而无需修改 discourse_defaults.conf 文件中的任何内容?

这与 S3 无关。

discourse.conf 文件是从你的 app.yml 生成的,你应该在那里进行修改并重新构建。

1 个赞

Richard

我从 GitHub - discourse/discourse: A platform for community discussion. Free, open, simple. · GitHub 克隆了 Discourse,但在仓库中找不到 app.yml 文件。

所有 Discourse 配置都指向 discourse_docker,而我不想使用它。我想自己构建容器。

(我得提醒你,别试图去重新发明一个已经完美运转的轮子。而且,这里的一些人可能不会太热心支持你,因为这并不能惠及社区。)

无论你做什么,最终都应确保这些值正确写入你的 discourse.conf 文件中。如果你是手动编辑的,请至少将 AWS 主机名填入 db_host,并将 db_name 保持为 default

1 个赞

你好,Richard,

我和 Vijay 在同一个团队。我们这里要解决的具体用例是将 Discourse 分叉并放入我们公司的 GitHub 仓库。在此基础上,我们将构建镜像并部署到 AWS。我们希望将其放在我们的 GitHub 中的原因是为了保持根据需求进行更改的灵活性。在适用的情况下,我们愿意回馈社区。由于我们在 Discourse 的公开仓库中找不到 Dockerfile,因此我们最终创建了自己的 Dockerfile 来构建 Docker 镜像。此外,我们使用 GitHub Actions 将 Docker 镜像部署到 AWS ECS 服务。

考虑到我们的需求,您认为我们是否可以考虑其他方法?

谢谢。

是的。我的建议是使用官方的 discourse 和 discourse_docker 仓库,并将所有更改作为插件实现。

使用官方的 discourse_docker 可以避免出现像本主题中那样的问题。同时,不 fork Discourse 而是将所有修改保留在独立的插件中,能避免偏离主分支,也无需投入大量精力将上游的变更移植回你的 fork。

开发插件的学习曲线会在几周内与合并上游变更的努力持平,此后效率将更高。

当你使用官方的 Discourse 仓库时,还可以考虑托管服务。在需要他人协助时,大家也会更热情(或费用更低)。

2 个赞

感谢您的反馈。我有几个后续问题:

  1. 采用插件方式时,是否有可能因某些需求无法通过插件实现而遇到瓶颈?例如,以高度定制化的方式管理用户角色?
  2. 如果我们采用 discourse_docker 并将其部署到我们的 AWS 账户中的 ECS,端到端的流程会是什么样的?正如我所提到的,我们目前使用 GitHub Actions 将应用部署到 AWS 账户中的 ECS。在使用公共仓库的同时,我们应该采用何种部署策略来保护我们的 AWS 凭证?
  1. 插件支持 Ruby 的猴子补丁(monkey patching)并扩展 Ember 对象,因此最终一切皆有可能。

  2. 这并非我的专长,所以我将把这个问题留给其他人。

始终从 discourse_docker 仓库的副本开始。在其中创建一个 app.yml 文件。

在 discourse_docker 的工作副本中,使用 launcher 脚本 的 bootstrap 子命令来创建 Docker 镜像。将该 Docker 镜像推送到 Docker 仓库。然后,将镜像部署到您喜欢的任何地方。

如有需要,请编写插件。在 app.yml 中列出您的自定义插件,就像其他插件一样。

5 个赞

@ashish_rawat @Vijay_Vantipalli 你们是如何在 ECS 上部署 Discourse Docker 的?我在 EC2 服务器上测试时,Discourse 运行正常。但当我将 Discourse Docker 镜像推送到 ECR 仓库,并基于该镜像创建任务时,容器无法启动,只返回退出码 1。这个问题已经困扰我超过一周了。非常希望能听听你们的建议,谢谢!

此外,我还为此单独创建了 RDS 实例以及用于 Redis 集群的 ElastiCache。

尝试检查 ./launcher start-cmd app 中的参数——可能有一些内容你漏掉没有复制到 ECS 中。

3 个赞

感谢您的快速回复!我想我只是漏掉了某个简单的步骤。我会尝试这样做。

如果这个问题超出了您的职责范围,很抱歉。我尝试添加了从 start-cmd 应用中找到的"-e"参数,但还有其他参数,如下所示:

+ /usr/bin/docker run --shm-size=512m -d --restart=always \
-h <服务器 IP> \
-e DOCKER_HOST_IP=172.17.0.1 \
--name app -t -p 80:80 \
-v /var/discourse/shared/web-only:/shared \
-v /var/discourse/shared/web-only/log/var-log:/var/log \
--mac-address <地址> local_discourse/app /sbin/boot

-v 参数真的必需吗?

是的,这些是卷挂载。Discourse 绝对需要在容器内的 /shared 路径下提供存储。

2 个赞