为上传配置与 S3 兼容的对象存储提供商

现在可以用了吗?

1 个赞

太好了。我花了很长时间,但除了它现在能工作之外,我还学到了很多关于 Discourse 配置的知识!

谢谢!

2 个赞

好的。我决定发布我在进行此配置时创建的分步指南。

如何配置 Discourse 论坛 S3 备份和 S3 CDN (Itechguides.com)

本指南中的步骤适用于使用 DigitalOcean Space 和 StackPack CDN。

3 个赞

@pfaffman 我想知道您是否能帮助我解决这个额外的备份问题:

在完成 S3 备份和克隆配置后,我的自动备份没有运行。下面的截图显示了我的配置。

我可以手动运行备份。问题在于计划的自动备份——它们没有运行。

1 个赞

不知道。你可以查看 sidekiq 作业并确保它们正在运行。应该可以正常工作。

1 个赞

4 篇帖子已拆分为新主题:Google Cloud S3 技巧

您好,

感谢您纠正我的帖子。但我无法编辑我的帖子以避免误导信息。

你好,

我有点卡住了,感到困惑,希望有人能帮帮我。
我最初安装了 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 会是什么样的?

谢谢!

1 个赞

你是否包含了这一部分?

我很久以前提交了一个包含模板的 PR,但我认为它从未得到关注。

另外,更改存储桶很困难。你不仅需要将所有资产从旧存储桶复制到新存储桶,还需要更新数据库以使用新存储桶。我相信有一个关于此的主题。

如果你使用环境变量(你应该这样做),这些设置将不再显示在 Web UI 中。

1 个赞

一个帖子已合并到现有主题:Google Cloud S3 技巧

是的。如果我没记错的话,上面有讨论说 Google 不允许某些操作(可能是列表访问?),但有一个解决方法是使用某种“旧版”的东西。我记得是这样的。你得翻阅上面的 100 多条消息才能找到。如果可行,如果你能更新 OP(原始帖子)说明你是如何做到的,那就太好了,这样下一个需要知道的人就能更容易地找到它。

1 个赞

再次感谢您的回答!

关于 Google Bucket 的警告是关于将其用于备份,因为它无法列出文件。
我已经在如何修复此问题上发帖了

您是建议我在 OP 中添加该信息吗?我认为我无法做到。

再说一遍,备份有效,但根据 OP 的说法,资产的上传不起作用,即使没有存储旧版存储桶所有者的权限也应该可以工作。

我认为这里可能存在回归,您怎么看 @Falco

1 个赞

可能存在回归。您确定已添加了仅 Google 需要的自定义

吗?

2 个赞

哦。嗯,我以为有人已经发过了。 :person_shrugging:

我当时就是这么建议的。这是一个wiki,所以我很确定你可以,虽然我不能100%确定涉及到什么信任级别。

1 个赞

感谢您的回复,是的,我已包含它:

请注意,我尝试了带子文件夹和不带子文件夹的情况
DISCOURSE_S3_BUCKET: discourse-uploads/discourse-uploads

DISCOURSE_S3_BUCKET: discourse-uploads

再次感谢

2 个赞

@tuanpembual 最初是这样做的,但指的是 Storage Legacy Object Owner 而不是 Storage Legacy Bucket Owner

我只是一个“基本用户”,那一定是我无法编辑的原因。

3 个赞

我将尝试总结我对这些问题的回答:

  • 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
  • 是否可以在配置中设置存储桶的子文件夹?

您可以使用前缀来组织存储在 Amazon S3 存储桶中的数据。前缀是对象键名称开头的字符字符串。前缀的长度可以是任意的,但受对象键名称的最大长度(1,024 字节)限制。您可以将前缀视为一种以类似于目录的方式组织数据的方法。但是,前缀不是目录。

  • 一旦这奏效,之前上传的图片会被传输到存储桶吗?如果我重新烘焙,之前上传的图片的 URL 会是什么样的?
3 个赞

您好,我一直在寻找对象存储提供商,我在 OP 中看到,对于其中一些提供商,您需要“跳过 CORS 并手动配置它”。我对 CORS 或任何配置都不熟悉,所以我应该避开那些需要此设置的提供商,还是可以轻松设置?

1 个赞

如果你需要提问(就像我一样),那么我会选择另一个。

1 个赞

确认一下,一旦我完成了

rake uploads:migrate_to_s3
rake posts:rebake

这些步骤,我就可以完全删除本地的 uploads 文件夹了,对吗?

1 个赞