现在可以用了吗?
太好了。我花了很长时间,但除了它现在能工作之外,我还学到了很多关于 Discourse 配置的知识!
谢谢!
好的。我决定发布我在进行此配置时创建的分步指南。
如何配置 Discourse 论坛 S3 备份和 S3 CDN (Itechguides.com)
本指南中的步骤适用于使用 DigitalOcean Space 和 StackPack CDN。
@pfaffman 我想知道您是否能帮助我解决这个额外的备份问题:
在完成 S3 备份和克隆配置后,我的自动备份没有运行。下面的截图显示了我的配置。
我可以手动运行备份。问题在于计划的自动备份——它们没有运行。
不知道。你可以查看 sidekiq 作业并确保它们正在运行。应该可以正常工作。
您好,
感谢您纠正我的帖子。但我无法编辑我的帖子以避免误导信息。
你好,
我有点卡住了,感到困惑,希望有人能帮帮我。
我最初安装了 Bitnami,但意识到这会给我带来很多麻烦,所以我使用标准安装重新安装了。
我能够恢复我的备份,一切都很好,尽管我从 2.8 升级到了 2.9 beta。
我再次在我的 Google Bucket 上测试了我的备份,它仍然运行得非常好。
请注意,所有 S3 配置都是通过 Web 界面完成的,而不是通过环境变量。
出于 GDPR 原因,我在欧洲创建了一个新的备份存储桶(我们称之为 discourse-backup-eu),现在我已经能够更改环境变量,我设置了 DISCOURSE_S3_ENDPOINT:https://storage.googleapis.com,重建了应用程序,在 Web 界面中更改了备份存储桶名称,重新运行了备份,我非常高兴地看到备份文件出现在我在欧洲的新备份存储桶中。
现在我想让上传文件到另一个存储桶,并避免填满我的虚拟机磁盘空间。
所以我配置了一个新的存储桶(我们称之为 discourse-uploads),将其设置为公共,并将 Storage Legacy Bucket Owner 角色授予了我在该新存储桶上的服务帐户。
然后,我按照此处的说明,向我现有的负载均衡器(我们称之为 https://www.example.com)添加了一个规则,使用启用了 Cloud CDN 的后端存储桶。规则是 /discourse-uploads/* 指向 discourse-uploads 存储桶。
我用存储桶根目录下的一个 test.jpg 测试了我的 CDN,但无法通过 https://www.example.com/discourse-uploads/test.jpg 访问它,我不得不创建了一个名为 discourse-uploads 的子文件夹,将 test.jpg 移到里面,现在我可以通过 https://www.example.com/discourse-uploads/test.jpg 看到我的测试图片。
在 Web UI 中,我更改了“s3 upload bucket”下的虚拟存储桶名称(在设置备份时我被迫将其设置为一个虚拟名称)为 discourse-uploads,将 CDN URL 填为 https://www.example.com/discourse-uploads,并勾选了“enable s3 uploads”。
从那时起,如果我尝试上传图片,我会在浏览器窗口中看到一个弹出窗口,显示“无效参数”(来自一个 422 错误,其 JSON 内容基本相同)。
我尝试重新烘焙所有帖子,但没有效果,我仍然收到错误。
所以我想,我应该尝试使用环境变量而不是 Web UI。
并使用以下配置:
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: whatever
DISCOURSE_S3_INSTALL_CORS_RULE: false
FORCE_S3_UPLOADS: 1
DISCOURSE_S3_ENDPOINT: https://storage.googleapis.com
DISCOURSE_S3_ACCESS_KEY_ID: MY_KEY_ID
DISCOURSE_S3_SECRET_ACCESS_KEY: MY_ACCESS_KEY
DISCOURSE_S3_CDN_URL: https://www.example.com/discourse-uploads
DISCOURSE_S3_BUCKET: discourse-uploads/discourse-uploads
DISCOURSE_S3_BACKUP_BUCKET: discourse-backup-eu
DISCOURSE_BACKUP_LOCATION: s3
我重建了应用程序。
然后我无法再打开 discourse,因为没有一个资产被上传到存储桶,并收到 404 错误。
https://www.example.com/discourse-uploads/assets/admin-31467dc73634cbfb81799737c43df0e2939307d893ef32713f1d0770bcb3532c.br.js
我曾认为直接上传到存储桶的子文件夹有点牵强,尽管 OP 建议它有效(至少对于备份存储桶)。
将环境变量更改为
DISCOURSE_S3_BUCKET: discourse-uploads
(考虑到之后我可以玩主机规则来避免上传到子文件夹)
并重建以查看是否有任何东西被上传,但没有任何东西被上传到存储桶,并且 discourse 由于 404 错误仍然无法打开。
所以我的问题是:
- Web UI 和环境变量会冲突吗?
- 资产应该何时上传到存储桶?
- 我该如何调试这个问题?我在日志中看不到任何错误。
- 是否可以在配置中设置存储桶的子文件夹?
- 一旦这奏效,之前上传的图片会被传输到存储桶吗?如果我重新烘焙,之前上传的图片的 URL 会是什么样的?
谢谢!
你是否包含了这一部分?
我很久以前提交了一个包含模板的 PR,但我认为它从未得到关注。
另外,更改存储桶很困难。你不仅需要将所有资产从旧存储桶复制到新存储桶,还需要更新数据库以使用新存储桶。我相信有一个关于此的主题。
如果你使用环境变量(你应该这样做),这些设置将不再显示在 Web UI 中。
一个帖子已合并到现有主题:Google Cloud S3 技巧
是的。如果我没记错的话,上面有讨论说 Google 不允许某些操作(可能是列表访问?),但有一个解决方法是使用某种“旧版”的东西。我记得是这样的。你得翻阅上面的 100 多条消息才能找到。如果可行,如果你能更新 OP(原始帖子)说明你是如何做到的,那就太好了,这样下一个需要知道的人就能更容易地找到它。
再次感谢您的回答!
关于 Google Bucket 的警告是关于将其用于备份,因为它无法列出文件。
我已经在如何修复此问题上发帖了
您是建议我在 OP 中添加该信息吗?我认为我无法做到。
再说一遍,备份有效,但根据 OP 的说法,资产的上传不起作用,即使没有存储旧版存储桶所有者的权限也应该可以工作。
我认为这里可能存在回归,您怎么看 @Falco?
可能存在回归。您确定已添加了仅 Google 需要的自定义
吗?
哦。嗯,我以为有人已经发过了。 ![]()
我当时就是这么建议的。这是一个wiki,所以我很确定你可以,虽然我不能100%确定涉及到什么信任级别。
感谢您的回复,是的,我已包含它:
请注意,我尝试了带子文件夹和不带子文件夹的情况
DISCOURSE_S3_BUCKET: discourse-uploads/discourse-uploads
和
DISCOURSE_S3_BUCKET: discourse-uploads
再次感谢
@tuanpembual 最初是这样做的,但指的是 Storage Legacy Object Owner 而不是 Storage Legacy Bucket Owner
我只是一个“基本用户”,那一定是我无法编辑的原因。
我将尝试总结我对这些问题的回答:
- Web UI 和环境变量会冲突吗?
- 资产应该何时上传到存储桶?
通过将此代码段添加到 app.yml 的 hook 部分,它将在after_assets_precompile(在重建应用程序期间)之后上传。
- 我该如何调试这个问题?日志中没有显示任何错误
通过运行:
cd /var/discourse
sudo ./launcher enter app
sudo -E -u discourse bundle exec rake s3:upload_assets --trace
- 是否可以在配置中设置存储桶的子文件夹?
我真的需要为上传和备份使用单独的存储桶吗?
不,您不必这样做,但这通常是最简单的设置方式。本质上,您需要使用两个不同的存储桶或为备份存储桶设置一个前缀。例如,以下组合将起作用:
- 不同的存储桶
- s3_upload_bucket:
your-uploads-bucket- s3_backup_bucket:
your-backups-bucket
- 不同的前缀
- s3_upload_bucket:
your-uploads-bucket/uploads- s3_backup_bucket:
your-uploads-bucket/backups
- 一旦这奏效,之前上传的图片会被传输到存储桶吗?如果我重新烘焙,之前上传的图片的 URL 会是什么样的?
我已经在我的 Discourse 实例中启用了 S3 上传(已经运行了一段时间);我该如何处理现有的本地上传?
要将现有上传迁移到 S3,您可以执行几个 rake 任务。要执行此操作,您需要 SSH 访问权限、root 权限,并且已进入 discourse 应用程序(如管理批量操作中所述)。哦,而且您必须在 app.yml 中设置一些环境变量。这不适合胆小的人。
完成所有这些之后,您就可以执行 rake 任务了:
rake uploads:migrate_to_s3 rake posts:rebake完成这些任务后(并且上传运行良好),您就不再需要将上传包含在备份中。作为奖励,您将能够从命令行恢复备份,以防发生灾难(只需将 app.yml 的副本保存在某处)。
您好,我一直在寻找对象存储提供商,我在 OP 中看到,对于其中一些提供商,您需要“跳过 CORS 并手动配置它”。我对 CORS 或任何配置都不熟悉,所以我应该避开那些需要此设置的提供商,还是可以轻松设置?
如果你需要提问(就像我一样),那么我会选择另一个。
确认一下,一旦我完成了
rake uploads:migrate_to_s3
rake posts:rebake
这些步骤,我就可以完全删除本地的 uploads 文件夹了,对吗?

