配置兼容S3的对象存储提供商用于上传

有人用过 SeaweedFS 吗?鉴于 MinIO 的不确定性,我一直在关注这个选项,并将尝试一下,看看是否存在与 Discourse 的任何兼容性问题。

我通过使用以下规则集使 R2 正常工作:

  ## 此行集允许上传和下载 R2 S3 托管的文件..
  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: auto
  DISCOURSE_S3_ACCESS_KEY_ID: access-key-id
  DISCOURSE_S3_SECRET_ACCESS_KEY: access-key
  DISCOURSE_S3_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_S3_BUCKET: exotics-unlimited
  DISCOURSE_S3_BACKUP_BUCKET: exotics-unlimited-backups
  DISCOURSE_BACKUP_LOCATION: s3
#  DISCOURSE_CDN_URL: https://eufiles.technospider.com
  DISCOURSE_S3_ENDPOINT: https://71*****5d4976.r2.cloudflarestorage.com
#  DISCOURSE_INCLUDE_S3_UPLOADS_IN_BACKUPS: true
  DISCOURSE_S3_INSTALL_CORS_RULE: false

当我注释掉 CDN_URL 行后,它就能正常工作了。我猜 R2 自动创建 CDN 的特性意味着你不需要那一行,实际上添加它会破坏东西。
我注释掉了包含图片的行,只是为了保持我的备份大小较小。我使用的是 R2 的免费套餐,不想超出我的限制。

没错。你真的不应该使用 DISCOURSE_INCLUDE_S3_UPLOADS_IN_BACKUPS,除非你要迁移离开 S3。将所有图片从 S3 下载下来,然后包含在存储在……S3 上的备份中,这没有意义。我曾经在一个 AWS 存储桶上启用了该设置,结果每天下载每张图片都导致了高额账单。

这应该是一个独立的 CDN,指向你的 Discourse 服务器,而不是 S3 存储桶。有些东西,比如头像,我不太确定还有什么,是从你的服务器提供的。它不起作用的原因是你指向了你的 S3 CDN,而不是站点 CDN。

您的意思是如果您使用两家不同的公司?一家用于存储桶,一家用于CDN?我对这个不太了解,所以请用对三年级学生解释的方式告诉我……
我知道当您在R2界面中创建一个“自定义域名”时,它会充当CDN,这就是我最初尝试添加该行的原因。

无论如何,它对我的测试站点一直运行得很完美,除非它还应该做而没有做其他事情,否则我建议更新原始帖子,以显示Cloudflare现在可以与Discourse一起使用。

不。你不能那样做。只有一个 S3 密钥/密钥。我试图想出一个使用包括 S3 上传的理由,但没有。

那是针对 S3 存储桶,而不是针对你的网站。有两个不同的变量 DISCOURSE_S3_CDN_URLDISCOURSE_CDN_URL。你把它们当作是同一个。你不能为网站使用 CDN,但当你设置该变量时它不起作用的原因是你给它提供了错误的 CDN。

好的,我以为我对自己在做什么有点了解,但现在我觉得我完全迷失了。

那么 S3 CDN 和 CDN 有什么区别?

如果我把注释掉的那两个对调一下,它还能工作吗?

我还注意到我的欢迎横幅的背景图片有一个奇怪的问题,这和这些有关系吗?

14 个帖子已拆分到新主题:AWS CDN 和 S3 的问题

大家好,只是想告诉大家 Hetzner 的对象存储似乎运行得相当不错。这些是我添加到 app.yaml 中的设置:

DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: whatever
DISCOURSE_S3_INSTALL_CORS_RULE: false
DISCOURSE_S3_ENDPOINT: https://nbg1.your-objectstorage.com
DISCOURSE_S3_ACCESS_KEY_ID: xxxx
DISCOURSE_S3_SECRET_ACCESS_KEY: xxxx
DISCOURSE_S3_CDN_URL: xxxx
DISCOURSE_S3_BUCKET: discourseuploads
DISCOURSE_S3_BACKUP_BUCKET: discoursebackups
DISCOURSE_BACKUP_LOCATION: s3

显然,请用您自己的设置替换以下内容:

DISCOURSE_S3_ENDPOINT: (使用您创建对象存储桶的位置在 Hetzner 控制面板中获取的 URL)
DISCOURSE_S3_ACCESS_KEY_ID: (不言自明)
DISCOURSE_S3_SECRET_ACCESS_KEY: (不言自明)
DISCOURSE_S3_CDN_URL: (在此处使用从您的 Hetzner 存储桶 URL 拉取的 CDN URL)

在接下来的几周/几个月内,我会在我的测试服务器上密切关注它,但到目前为止一切顺利。

4 个赞

补充说明:此问题已不再存在——Cloudflare 已修复该问题,R2 存储桶现已与 S3 兼容。我已将外部备份配置到 Cloudflare R2,并刚刚成功将数据完整恢复到另一台服务器。(每月 10GB 以内免费)

只需从 Cloudflare R2 对象存储获取 bucket name(用于 s3 backup bucket)、access key IDsecret access key 以及 jurisdiction-specific endpoint,然后填入 Discourse 的 S3 设置或 app.yml/web_only.yml 等配置文件中即可。

1 个赞

这真是个好消息!应该有人相应地编辑一下原帖。

~~我不知道新的(大致)文档更新机制是如何工作的——据说它们存储在某处?https://github.com/discourse/discourse/tree/main/docs,但我没看到自托管文档。:woman_shrugging:~~ 算了,我在 Wiki 编辑页面看到了“建议编辑”链接。我将提交一个更新建议。

编辑:关于 Cloudflare R2 对象存储的更新已提交

帖子已拆分至新主题:迁移至兼容 S3 的 R2 后,头像加载耗时较长

我建议进行更新——修复了 OP 内容中指向各个部分的损坏链接,并更新了 Cloudflare R2 配置说明。

3 个赞

谢谢 :folded_hands:

这本来可以帮我省事,这样我就不需要输入更多字符了

1 个赞

@chapoi @Lilly

在欧洲,也可以使用符合欧盟 GDPR 规定的 S3 兼容存储,例如 hetzner.de 。他们在欧盟境内运营着位于德国和芬兰的 ISO/IEC 27001:2022 认证数据中心。也许可以将此信息添加到上面的主列表中。

hetzner.de 示例配置

配置项
S3 端点 https://[datacenter].your-objectstorage.com
S3 端点数据中心 [datacenter] = hel1 (赫尔辛基), fsn1 (法尔肯施泰因), nbg1 (纽伦堡)
S3 访问密钥 ID Hetzner S3 访问密钥
S3 秘密访问密钥 Hetzner S3 秘密密钥(仅在创建 S3 存储时显示一次)
S3 上传存储桶 Hetzner S3 存储桶名称
启用 S3 上传 true

请注意,必须忽略“服务器配置为将文件上传至 S3,但未配置 S3 CDN”的警告。hetzner.de 目前尚未提供全球 CDN 功能。详情请参见 https://docs.hetzner.com/storage/general/which-storage-is-right-for-me