定义 DISCOURSE_S3_CDN_URL 以链接 S3 CDN URL 中的资源

你可以在此处查看我们设置的变量:infra/modules/services/discourse/web.yml at master · debtcollective/infra · GitHub

以下是我们设置的与 S3/CDN 相关的变量:

  • DISCOURSE_CDN_URL
  • DISCOURSE_S3_ACCESS_KEY_ID
  • DISCOURSE_S3_BACKUP_BUCKET
  • DISCOURSE_S3_CDN_URL
  • DISCOURSE_S3_REGION
  • DISCOURSE_S3_SECRET_ACCESS_KEY
  • DISCOURSE_S3_UPLOAD_BUCKET
  • USE_DB_S3_CONFIG: true

我认为 DISCOURSE_S3_BUCKET 已被弃用,取而代之的是 DISCOURSE_S3_UPLOAD_BUCKETDISCOURSE_S3_BACKUP_BUCKET。你应该设置这两个变量。

这就是我的假设,但除非我同时设置 DISCOURSE_S3_UPLOAD_BUCKETDISCOURSE_S3_BUCKET,否则我无法取得任何进展。正如上面代码片段所示,use_s3? 仍在查找 s3_bucket 而不是 s3_upload_bucket

据我所知,设置 DISCOURSE_BACKUP_BUCKET 也无法解决该问题。

如果我同时设置了这两个存储桶环境变量,就能再前进一步,但现在遇到了一个新问题:Discourse 忽略了我的 S3 CDN 网址,试图从我的基础路径加载资源。这导致了 CSP 错误,因为内容安全策略仅包含来自我的 S3 CDN 的资源路径。

应该是 DISCOURSE_S3_BACKUP_BUCKET,而不是 DISCOURSE_BACKUP_BUCKET。除此之外,如果您使用两个 Cloudfront 分发来设置所有变量,应该可以正常工作。如果您查看我们的设置,会发现我们并没有定义 DISCOURSE_S3_BUCKET

我不确定是否还需要重新构建(rebake)。

@Falco 据我所记得,其中一个非常反直觉的地方在于,将 DISCOURSE_S3_CDN_URL 设置为环境变量/全局设置与将其配置为站点设置在行为上存在差异。也许你在撰写 howto 时需要注意这一点。

是的,抱歉,这是我上一篇文章中的笔误。DISCOURSE_S3_BACKUP_BUCKET 并没有为我设置 GlobalSetting 中的 s3_bucket。我不清楚你是如何在未设置 DISCOURSE_S3_BUCKET 的情况下运行那个 rake 任务的。

顺便说一句,我非常感谢你的帮助,也明白这并不是你需要解决的问题,所以谢谢。

没问题,这不算什么大碍。我忘了提,我们在 app.yml 文件中也定义了 USE_DB_S3_CONFIG: trueinfra/modules/services/discourse/web.yml at master · debtcollective/infra · GitHub

我认为你说得对,因为这会改变 S3 存储桶的定义方式(discourse/lib/tasks/s3.rake at 427d54b2b00fa94474c0522eaed750452c4e7f43 · discourse/discourse · GitHub bug。

请检查一下设置该选项是否能解决问题。

亲爱的 @eatcodetravel,感谢您精彩的帖子。

我正尝试像您一样设置 CloudFront。

我需要将 asset 文件夹上传到我的 S3 存储桶,还是会自动完成?

Discourse 更新后会发生什么?如果不会自动完成,我是否需要重新上传主题?

谢谢。

当然。

def ensure_s3_configured!
  unless GlobalSetting.use_s3? || use_db_s3_config
    STDERR.puts "错误:请确保已在 config/discourse.conf 或环境变量中配置 S3"
    exit 1
  end
end

use_db_s3_config 免去了你设置额外变量的麻烦。这一定是 global_setting.rb 中的一个 bug,因为我应该可以直接设置 DISCOURSE_S3_UPLOAD_BUCKET,除非它与 DISCOURSE_S3_BUCKET 存在差异。不过,我认为你说得对,后者应该已被弃用。

无论 global_setting.rb 中是否存在 bug,我仍然遇到一个问题:Discourse 仍在默认位置查找资源,而不是在我的 S3 CDN 上查找,尽管我已经声明了所有变量,并且 DISCOURSE_ENABLE_S3_UPLOADS 已设置为 true。

有一个任务用于此:bundle exec rake uploads:migrate_to_s3。配置好存储桶后,请运行该任务以将上传内容迁移到 S3。最近几个月 S3/CDN 有所变更,文档尚未更新,因此请务必备份并做好预案,以防出现问题。

我首次启用此功能时,在理清所有问题期间曾出现过短暂停机。

我想这是因为你缺少 DISCOURSE_CDN_URL。我们的配置如下:

DISCOURSE_CDN_URL: 'https://d16zv78c963s69.cloudfront.net' # 指向服务器
DISCOURSE_S3_CDN_URL: 'https://community-cdn-prod.debtcollective.org' # 指向 S3 存储桶

样式表从服务器获取,因此使用 DISCOURSE_CDN_URL。JavaScript 文件上传到 S3 存储桶,并使用 DISCOURSE_S3_CDN_URL@Falco 在这里向我解释了这一点。

是的,我看到了。我已经设置了 DISCOURSE_CDN_URL,但问题依旧。不过我现在有点累了,可能在折腾的过程中漏掉了什么。明天再继续处理吧。谢谢你的帮助。

这会同时将图片文件和作为 JS 文件的资源上传到 S3 吗?我应该使用 CloudFront URL 还是仅用 S3 就足够了?感谢您的帮助。

bundle exec rake uploads:migrate_to_s3 命令仅将附件上传至 S3,该任务只需运行一次。启用 S3 后,新上传的文件将自动保存至 S3 存储桶。

若要上传资源文件,请使用 bundle exec rake s3:upload_assets 命令,该命令需在每次重建或升级后运行。

我按照你提到的操作了,上传到 S3(图片等)成功了,但是assets 出现了以下错误:

ERROR: Ensure S3 is configured in config/discourse.conf or environment vars

我设置了以下两项:

DISCOURSE_CDN_URL: 'https://d16zv78c963s69.cloudfront.net' # 指向服务器
DISCOURSE_S3_CDN_URL: 'https://community-cdn-prod.debtcollective.org' # 指向 S3 存储桶

这可能与 USE_DB_S3_CONFIG: true 有关。尝试设置该变量,看看是否有效。

以下是我设置的所有与 S3/CDN 相关的变量:

是的,谢谢 :slightly_smiling_face:。这解决了问题。

不过还有一个有趣的问题:Discourse 试图从错误的路径访问资源文件。它尝试从 brotli_asset 路径访问,但 S3 存储桶中并没有这个路径。

此外,它还试图从 CDN URL 访问 JavaScript 和样式表文件,但存储桶中也没有这些文件。

@ufukayyildiz 我相信你遇到的所有问题在这个帖子中都有解答。我刚刚也完成了完全相同的设置。

简而言之,你需要确保在资源预编译完成后上传了这些资源。

等等
我有一点不明白。

为什么要将这些数据设置在 ENV 中?

我举个例子。

通过在管理面板中设置 S3 数据,一切都能正常工作,所有内容都能正确上传到 S3。我的 ENV 中没有任何设置。这样有问题吗?如果一切都能正常工作,这些设置是必须的吗?

第二个例子情况不同,因为我无法将旧数据迁移到 S3(只有新数据有效)。但在这里,将这些数据输入到 app.yml 文件(DISCOURSE_S3_ACCESS_KEY_ID: ‘key’ 等)中没有任何变化,它仍然无法工作(即

rake uploads:migrate_to_s3

无法执行)

你能给我解释一下吗?

不是的,环境变量提供了一种额外的配置方式,例如在您获得管理面板访问权限之前。