AWS CDN 和 S3 的问题

,

@Falco 这种情况还存在吗?我记得我读到过一些关于最近使用 AWS 时出现问题的消息,但我找不到那个主题了。

我在使用各种相关主题作为指南时,在使用 AWS S3 时遇到了很多问题。

备份工作正常,但使用 Cloudfront 作为 CDN 或取消注释 DISCOURSE_USE_S3 和/或 DISCOURSE_S3_BUCKET 会导致永久加载图标出现。

我怀疑我的上传存储桶和/或 Cloudfront 分配中存在配置错误,但我一直找不到错误。上传和备份存储桶都在分发后面,并且备份工作正常,所以???

discourse-cdn.repealobbba.org CNAME —> amazonassigned.cloudfront.net

DISCOURSE_CDN_URL: https://discourse-cdn.repealobbba.org

## S3 storage config
#  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: us-east-1
  DISCOURSE_S3_ACCESS_KEY_ID: ACCESS_KEY_ID
  DISCOURSE_S3_SECRET_ACCESS_KEY: SECRET_ACCESS_KEY
  DISCOURSE_S3_CDN_URL: amazonassigned.cloudfront.net  or
#  DISCOURSE_S3_BUCKET: repeal-obbba-discuss-uploads
  DISCOURSE_S3_BACKUP_BUCKET: repeal-obbba-discuss-backups
  DISCOURSE_BACKUP_LOCATION: s3

此外,将以下内容添加到配置中

    after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

会导致 FAILED TO BOOTSTRAP 错误

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && sudo -E -u discourse bundle exec rake s3:upload_assets failed with return #<Process::Status: pid 8484 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
exec failed with the params {"cd"=>"$home", "cmd"=>["sudo -E -u discourse bundle exec rake s3:upload_assets", "sudo -E -u discourse bundle exec rake s3:expire_missing_assets"]}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.

一如既往……任何想法或建议都将不胜感激。

你需要添加将资产上传到 s3 的配置段。

哦。我错了,你正在做。

这表明存储桶配置有问题。

我想以前有一个主题可以生成配置存储桶的 json,但我不知道它是否还在。

1 个赞

同意
尽管备份存储桶上没有使用存储桶策略,但向上传输存储桶添加策略解决了引导失败的问题。
策略 json 文件可在 CloudFront>Distribution(分发)>your distribution(您的分发)>Edit origin(编辑源)处找到
Screenshot 2025-12-10 141220

不幸的是,持续的旋转等待图标仍然存在。

调整对象所有权和 ACL 没有改变结果。
Screenshot 2025-12-10 141936

当前设置。我相信它们是推荐的设置,或者我可能理解有误。
Screenshot 2025-12-10 141702
Screenshot 2025-12-10 141835

更改设置后,您需要运行 rant 任务以上传资源。

此外,您可以打开开发者控制台,查看文件是否尝试访问存储桶中的文件,或者 CDN 是否存在问题。

1 个赞

感谢您的继续…

是的,rake 任务已运行,但没有区别。

./launcher enter app
rake posts:rebake
rake uploads:migrate_to_s3
rake posts:rebake_uncooked_posts

加载指示器仍然存在。

rake uploads:migrate_to_s3 确实会产生一个错误

Migrating uploads to S3 for 'default'...
Some uploads were not migrated to the new scheme. Running the migration, this may take a while...
rake aborted!
FileStore::ToS3MigrationError: Some uploads could not be migrated to the new scheme. You need to fix this manually. (FileStore::ToS3MigrationError)
/var/www/discourse/lib/file_store/to_s3_migration.rb:156:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:126:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:106:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:36:in `each_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management.rb:17:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:104:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:100:in `block in <main>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => uploads:migrate_to_s3

至少有一个 CDN 检查器显示 discourse-cdn.repealobbba.org -->Amazon CloudFront

并且控制台仍然显示图片和 js 文件是从 CDN 加载的
Screenshot 2025-12-10 192413

资源是从 cdn 调用的,但它们在那里吗?如果不在,它们在存储桶中吗?可以从存储桶访问它们吗?

您可能在另一个存储桶中有一些上传,或者有什么东西阻止它们出现在预期位置。如果是这样,您需要像它所说的那样手动修复它们。您需要访问控制台并查看它们在上传记录中的位置。

上传资源任务似乎在工作吗?因为其他资源没有加载,所以加载指示器会一直运行。

2 个赞

是的,它们在那里,文件在存储桶中,路径为 assets
可访问:https://repeal-obbba-discuss-uploads.s3.us-east-1.amazonaws.com/assets/logo-815195ae.png

只有两个存储桶,uploads 和 backups。备份运行正常。

rake s3:upload_assets 出现错误:
rake aborted!
Aws::S3::Errors::AccessControlListNotSupported: The bucket does not allow ACLs (Aws::S3::Errors::AccessControlListNotSupported)

切换到启用 ACL 并再次运行 s3:upload_assets edit: uploads:migrate_to_s3,但是……
FileStore::ToS3MigrationError: Some uploads could not be migrated to the new scheme. You need to fix this manually. (FileStore::ToS3MigrationError)

??? 您需要手动修复此问题。(FileStore::ToS3MigrationError)

听起来您已经修复了存储桶,它现在可以上传资产了,所以网站现在应该可以工作了。处理那些无法迁移的上传是另一个(复杂的问题)。

以下是您尝试提供服务的资产之一:

https://discourse-cdn.repealobbba.org/assets/start-discourse-6f03a463.br.js

证书已损坏,这就是您的问题所在。确实有一个证书,但它与 URL 不匹配。

正如我之前建议的,请查看浏览器开发者工具中的网络选项卡,并查看此内容:

1 个赞

编辑自上文
切换到 ACLs enabled 并再次运行了 s3:upload_assets edit: uploads:migrate_to_s3

s3:upload_assets 现在可以顺利完成

我看到了网络错误。证书是 AWS 的问题吗?

再次感谢您的时间!!

是的。证书与主机名不匹配。它匹配 *.cloudfront.net

这个可以工作:https://repeal-obbba-discuss-uploads.s3.us-east-1.amazonaws.com/assets/logo-815195ae.png

这个不能工作:https://discourse-cdn.repealobbba.org/assets/start-discourse-6f03a463.br.js

这个可以工作:https://repeal-obbba-discuss-uploads.s3.us-east-1.amazonaws.com/assets/start-discourse-6f03a463.br.js

所以你需要将你的 s3 CDN 更改为 https://repeal-obbba-discuss-uploads.s3.us-east-1.amazonaws.com —— 噢,我想那是存储桶地址,所以那不太理想,但它会起作用。

1 个赞

不太喜欢“所以那不太理想” :wink:

正在查看 AWS 备用域名作为可能的解决方案。

也许只是我,但添加一个 @Discourse 内部使用的 CDN 应该不那么困难,也不需要像 @pfaffman 这样的好心人提供支持。

也许 @Falco@sam@team (无法提及团队) 可以插话??

是的,我们托管的所有站点都使用 S3 加上 CloudFront 的组合。您现在正在浏览的这个站点也是如此。

2 个赞

感谢您的确认!看到这个之后,我将 DISCOURSE_S3_CDN_URL 重新调整回 amazonassigned.cloudfront.net,希望这能解决证书和 URL 问题。
Screenshot 2025-12-11 133250

我重建并重新运行了文档中提到的所有 rake 命令。
rake posts:rebake
rake uploads:migrate_to_s3 仍然生成 FileStore::ToS3MigrationError
rake posts:rebake_uncooked_posts

rake s3:upload_assets
rake s3:expire_missing_assets

网站加载仍然没有进展。

有什么建议吗?

事实证明这很有帮助。
Screenshot 2025-12-12 001849

@chapoi 请将此主题拆分为支持内容
也许 @JammyDodger 已经移到了“安装”部分以获得更好的可见性,尽管该论坛已经正常运行了几个月。

无论如何,感谢您的关注!

安装不仅仅是设置论坛

1 个赞

收到,感谢您的澄清。

1 个赞

如上所述,请添加一个备用域名 help。
网站可以加载,但没有样式表和…

查看存储桶中没有看到 stylesheets/ 文件夹

Screenshot 2025-12-12 120937

看起来 s3:upload_assets 尚未完成。

并且存在 CORS 问题?
Screenshot 2025-12-12 121734

在理解了文档中一些具有误导性、令人困惑或对于有 BBS(可能是指某种特定背景或技术,此处保留缩写)的人来说信息量过大的内容后,我取得了进展 :distorted_face:

对于我们 BBS 用户来说,用闪烁的红色标出“您将需要两个 Cloudfront 分配”会有帮助。

以及一些关于如何操作的说明

对 S3 相关的议题进行一些更新和整合会很棒。我认为一个包含 AWS S3 CDN 和备份当前数据的总主题会很棒。

继续…

我现在有两个 Cloudfront 分配,但是:

所有的 rake 命令都成功执行,并且
并且这不再导致引导失败。

after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

CDN 检查器看起来更像一个理想的结果
Screenshot 2025-12-14 004220

总而言之,取得了进展,但来自 Discourse 基础设施团队的一些建议将非常有帮助。

呼!花了很多时间和一位非常有帮助的亚马逊工程师通了两次电话,总共超过8小时,但我认为我已经搞明白了。RepealOBBBA 网站上的运行情况非常好,而且我的流程可以复制到其他网站。

我可能会写出来,但现在先做一些记录:

  1. DISCOURSE_CDN_URL(如果使用 AWS S3)和 DISCOURSE_S3_CDN_URL 需要它们各自的 Cloudfront 分配。
  2. DISCOURSE_CDN_URL 不使用存储桶(bucket)。
  3. DISCOURSE_CDN_URL 可以是非 AWS 的 CDN。Bunny.net 效果很好。(我听说支持 S3 的 Bunny Storage 预计在 2026 年第一季度推出)
  4. DISCOURSE_CDN_URL 和 DISCOURSE_S3_CDN_URL 的 CDN 可以是带有适当 DNS 配置的品牌网址。
  5. DISCOURSE_S3_CDN_URL 需要一个上传(uploads)存储桶。
  6. 上传存储桶需要启用 ACL,并将“所有人(公开访问)”设置为“读取”,并且您必须为该存储桶设置策略。
  7. 备份(backups)存储桶不需要 ACL 或策略。

编辑:

  1. 勾选 S3 中的“对所有上传使用 CDN URL”框:对上传到 S3 的所有文件使用 CDN URL,而不仅仅是图像。不启用它总是导致我失败。

我猜很多人读完以上内容会想,哼,菲尔,这不是很明显吗,但是……我的 BBS(电子布告栏系统)思维一开始没有理解。

1 个赞