使用 BunnyCDN 设置 BackBlaze S3

我花了很长时间才弄清楚如何完成所有这些,因此我想制作这份指南,让其他人更容易上手。以这种方式提供图像据说可以加快网站加载速度。我的 Discourse 设置结合了 DigitalOcean 的 Droplet、BackBlaze B2 S3、BunnyCDN 以及 Cloudflare 的免费版本。

在研究了可靠性、价格和基准测试之后,我选择了这些服务。它们对我来说似乎是最佳选择。Cloudflare 有助于安全,但据我了解,它也会稍微减慢网站速度,因此您应该对此进行调研。Backblaze 与 Cloudflare 和 Bunny 都有合作伙伴关系,允许免费数据传输。

虽然 Cloudflare 被称为 CDN,但它的工作方式与普通 CDN 不同,可能无法单独用于在 Discourse 中设置 S3。您可能需要另一个 CDN 提供商,BunnyCDN 对我来说效果很好。如果有人仅使用 Cloudflare 就成功完成了设置,请告诉我如何操作:stuck_out_tongue:

如何将上传设置为 S3:
首先,您需要在 Backblaze 注册,然后创建存储桶,并将详细信息插入 Discourse 设置中:

然后,您需要在 BunnyCDN 注册并按照以下指南操作:

bunny.net - The Global Edge Platform that truly Hops 20 美元额度)

创建 BunnyCDN 拉取区域后,您需要获取正确的 URL,以便将其插入 Discourse 管理后台的“s3 cdn url”设置中。进入您的 BunnyCDN 仪表板 > 拉取区域 > 管理拉取区域 > 点击您的区域 > 复制“主机名”旁边的 URL。

URL 应类似于 example.b-cdn.net,但您需要在前面加上 https://,如下所示:https://example.b-cdn.net

在 Discourse 管理设置区域保存更改。

在浏览器中按两次 Ctrl+F5 刷新您的 Discourse 网站。

通过在 Discourse 文本编辑器中上传图片进行测试。检查测试图片元素,或查看图片源以确认是否成功。URL 应不同于您的正常域名,应类似于 example.b-cdn.net / 文件名。

现在,每次有人上传图片时,图片都会存储在您的 Backblaze 存储桶中,而不会占用 DigitalOcean Droplet 的空间:stuck_out_tongue:

将备份上传到 S3
如果您希望将 Discourse 备份设置到 Backblaze 存储桶中,您需要执行以下操作:

在我之前发布的指南中,请注意他解释您需要两个独立的存储桶。一个存储桶是公开的,这是您的用户上传论坛图片的上传存储桶。另一个存储桶是私有的,这是您的备份存储桶。对 Discourse 进行自动备份非常重要,以防任何损坏,这样您就可以加载备份并修复问题。

在 BunnyCDN 仪表板上,您应该创建第二个拉取区域。您的第一个拉取区域用于上传,这个新的拉取区域将用于备份。

bunnycdn 仪表板 > 拉取区域 > 添加拉取区域

按照我之前链接的 BunnyCDN“如何使用 BunnyCDN 加速 Backblaze B2 文件交付”指南操作,但这次将新的拉取区域链接到您的备份存储桶,而不是上传存储桶。

我建议在 BunnyCDN 的拉取区域创建页面使用“高容量层级 5 美元/TB",我认为备份不需要我用于上传存储桶的更昂贵/更快的“标准层级 10 美元/TB"。

在 Discourse 管理设置区域设置备份设置。“备份位置”应设置为 S3,“s3 端点”应指向您在 Backblaze 上的设置,例如:
s3.us-west-002.backblazeb2.com

在网站上按两次 Ctrl+F5 清除缓存

开始备份,等待其完成。然后等待 5 分钟,检查您的 Backblaze 备份文件夹,您应该在那里看到新的备份。

迁移旧图片:
此步骤是可选的,但建议执行,尤其是如果您的服务器存储空间不足。因此,您已经为新的图片上传设置好了所有内容,但旧图片也可以传输到您的存储桶中。要使此过程生效,您需要遵循以下步骤:

设置 Cloudflare CDN
此步骤是可选的,因为 Backblaze 已达成合作伙伴关系,使数据传输到 Bunny 也免费,但为了额外的安全性和其他功能,您可以让数据先经过 Cloudflare,然后让 Bunny 从 Cloudflare 放置数据的位置拉取数据。

https://help.backblaze.com/hc/en-us/articles/217666928-Using-Backblaze-B2-with-the-Cloudflare-CDN

8 个赞

只是想确认一下,我按照 Bill 的做法操作了,确实有效!唯一的限制是它仅适用于新文件,旧文件则不行。Bill 这个方法最棒的地方在于甚至不需要重新构建。不过,我还是希望有人能找出如何让旧文件也能与 S3 配合使用。

另外,备份功能也不行。至少对我来说是这样,而我做的和 Bill 完全一样。

5 个赞

您可以使用 rake 任务迁移旧文件。

1 个赞

如果您指的是这条命令,我已经尝试过了,但它没有上传旧资源:

sudo -E -u discourse bundle exec rake s3:upload_assets

我还重新生成了帖子,但依然没有成功。

任务如下:

cd /var/discourse
./launcher enter app
rails c
rake uploads:migrate_to_s3
cd /var/discourse
./launcher enter app
rails c
rake uploads:migrate_from_s3

这对你有效吗 @AntiMetaman
如果有效,我会将其添加到指南中。

我会尝试弄清楚如何正确配置备份,并相应地更新指南。我确定需要创建第二个拉取区域。

我的备份在 Backblaze 上运行正常……你遇到了什么问题?

1 个赞

我的备份使用此方法也能正常工作。您一定是哪里设置错了。我马上更新指南,说明我是如何设置备份的。@AntiMetaman

抱歉,我不太明白你的意思?既然我这边一切正常,为什么你会说我的设置有问题?

他正在和我 @itsbhanusharma 说话。我的备份无法正常工作。我的配置和 Bill 的一样。不过我没有为备份存储桶使用单独的拉取区域(pull zone),也许这就是原因。我只是在环境变量中设置了备份存储桶的名称。

我稍后会尝试 Bhanu 提出的迁移 S3 资源的建议。

我创建了两个拉取区域(pull zones),分别对应两个存储桶(upload 和 backup)。我从管理面板启动了备份,但失败了。Discourse 目前只知道备份存储桶的名称。

DISCOURSE_S3_CDN_URL: https://duelistsunite.b-cdn.net
DISCOURSE_S3_BUCKET: s3omega
DISCOURSE_S3_BACKUP_BUCKET: s3omegabackup
DISCOURSE_BACKUP_LOCATION: s3

我不确定自己漏掉了什么。是否存在 S3_CDN_BACKUP_URL?因为备份的 URL 是不同的。

@itsbhanusharma 另外,我尝试了你的方法,但 migrate_from_S3 未定义。

此外,我不确定你指的是否是 migrate_to_s3,所以我也尝试了那个,但同样显示未定义。

很抱歉造成混淆,我指的是 rake uploads:migrate_to_s3

1 个赞

看起来它会中止 rake 任务,因为它将 amazonaws.com 添加到了 URL 中,而这实际上是不正确的。这就是问题所在。如果您使用的是非亚马逊的 S3,那么 rake 任务将无法运行,因为其 URL 修改逻辑是硬编码的。

1 个赞

您能确认或否认是否在 app.yml 的环境部分添加了设置,还是将设置添加到了管理 > 设置页面?

我的备份也已通过 S3 正常运行。因此,旧文件和新上传的文件都能通过 S3 正常工作。我使用 Cloudflare 处理 SSL 和 DDoS 防护,使用 BunnyCDN 处理上传和备份拉取区域,并使用 BackBlaze 作为 S3 存储。现在一切顺利!

请注意,最好按照此处所示在 app.yml 中定义环境变量:Configure an S3 compatible object storage provider for uploads

然后重新构建,使 S3 配置全局定义,而不仅仅是在管理面板中定义。这样,在将旧文件迁移到 S3 时,您可以通过以下三个命令更轻松地完成:

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

3 个赞

不确定我漏掉了什么。是否存在 S3_CDN_BACKUP_URL?因为备份的 URL 是不同的。

你解决这个问题了吗?我也不太清楚应该在哪里放置指向备份存储桶的拉取区域(pull zone)的 URL。

编辑:我这样理解对吗:CDN 仅用于上传存储桶?关于此主题的指南建议为备份存储桶创建第二个 CDN 拉取区域。如果这是错误的,也许应该更新指南 @Bill

显然,它只需要备份存储桶的名称。根据名称,它可以获取备份 S3 URL,因为除了名称不同外,该 URL 与上传 URL 相同。这就是为什么你无需定义单独的 S3 备份 URL。当然,这是假设两个存储桶位于同一个 S3 服务中。

但如果备份存储桶是私有的,CDN 如何访问它呢?我对 CDN 还不太熟悉,可能遗漏了什么,但我怀疑 Discourse 根本不会使用 CDN 来进行备份。

是的。我去了我的备份存储桶,看到备份已上传到那里。它是私有的,但 Discourse 可以访问。如果 URL 存在,你可以设置权限。你也可以将其配置为仅允许你的站点或任何 HTTPS 源访问该存储桶。

您能否确认备份是经由 CDN 进行的,还是直接从您的 Discourse 安装程序传输到 BackBlaze B2 的?