你可以在此处查看我们设置的变量: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_BUCKET 和 DISCOURSE_S3_BACKUP_BUCKET。你应该设置这两个变量。
这就是我的假设,但除非我同时设置 DISCOURSE_S3_UPLOAD_BUCKET 和 DISCOURSE_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)。
RGJ
(Richard - Communiteq)
24
@Falco 据我所记得,其中一个非常反直觉的地方在于,将 DISCOURSE_S3_CDN_URL 设置为环境变量/全局设置与将其配置为站点设置在行为上存在差异。也许你在撰写 howto 时需要注意这一点。
是的,抱歉,这是我上一篇文章中的笔误。DISCOURSE_S3_BACKUP_BUCKET 并没有为我设置 GlobalSetting 中的 s3_bucket。我不清楚你是如何在未设置 DISCOURSE_S3_BUCKET 的情况下运行那个 rake 任务的。
顺便说一句,我非常感谢你的帮助,也明白这并不是你需要解决的问题,所以谢谢。
亲爱的 @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 相关的变量:
是的,谢谢
。这解决了问题。
不过还有一个有趣的问题:Discourse 试图从错误的路径访问资源文件。它尝试从 brotli_asset 路径访问,但 S3 存储桶中并没有这个路径。
此外,它还试图从 CDN URL 访问 JavaScript 和样式表文件,但存储桶中也没有这些文件。
@ufukayyildiz 我相信你遇到的所有问题在这个帖子中都有解答。我刚刚也完成了完全相同的设置。
简而言之,你需要确保在资源预编译完成后上传了这些资源。
eextra
(Sylwia)
39
等等
我有一点不明白。
为什么要将这些数据设置在 ENV 中?
我举个例子。
通过在管理面板中设置 S3 数据,一切都能正常工作,所有内容都能正确上传到 S3。我的 ENV 中没有任何设置。这样有问题吗?如果一切都能正常工作,这些设置是必须的吗?
第二个例子情况不同,因为我无法将旧数据迁移到 S3(只有新数据有效)。但在这里,将这些数据输入到 app.yml 文件(DISCOURSE_S3_ACCESS_KEY_ID: ‘key’ 等)中没有任何变化,它仍然无法工作(即
rake uploads:migrate_to_s3
无法执行)
你能给我解释一下吗?
riking
(Kane York)
40
不是的,环境变量提供了一种额外的配置方式,例如在您获得管理面板访问权限之前。