Blog 图床方案:Backblaze B2 (私密桶) + Cloudflare Workers + PicGo
2025-4-2
| 2025-7-9
字数 3417阅读时长 9 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
Jul 9, 2025 07:26 AM
notion image

旧方案

去年我用 Backblaze B2 + Cloudflare 实现了免费图床(主要是给 Obsidian 用的)。介绍这种方案的文章很多,大同小异。比如下面这两篇写的很详细了:
甚至 Backblaze 官方也有文档:
这种方案有以下好处:
  • Backblaze 免费账户提供 10 GB 的存储空间以及每天 1G 的下载流量。
  • Backblaze 和 Cloudflare 同属带宽联盟 (Bandwidth Alliance),两者之间的流量免费。也就是说,通过 Cloudflare 访问 Backblaze 存储的图片,不计流量费。
  • Cloudflare 全球有310个数据中心,有CDN加持,从任何地方访问图片都不会太慢。
  • Backblaze B2 支持多种上传方式。除了 Web 界面外,还有 CLI 工具 和 Picgo 等第三方客户端。
这种方案的思路:
  1. Backblaze B2 公开桶 (Public Bucket) 存储图片。
  1. Cloudflare DNS 设置 CNAME 指向存储服务器域名 (如: f004.backblazeb2.com),实现自定义域名访问。
  1. Cloudflare 设置 Page Rules ,实现 URL Rewrite 隐藏真实路径。还可设置缓存时间、去除 x-bz 信息等。

旧方案不能用了

但现在 Backblaze 创建桶的策略发生了变化:必须支付一次性的费用(1 美刀),或者账户有过付费记录才可以创建公开桶(应该是防止滥用),否则只能创建私密桶 (Private Bucket)。
notion image
储存在公开桶的图片,直接访问 URL 就能看到。但私密桶的图片不行,访问 URL 是这个结果:
notion image
所以,如果不想付费的话,上述方案无效了。
直到我看到了这篇 官方文档 才知道,原来 Backblaze 早就提出新方案了。

新方案

新方案的思路是:
  1. Backblaze B2 私密桶存储图片。
  1. Cloudflare Worker 通过应用程序密钥 (Application Key) 实现认证访问 Backblaze B2 私密桶,并缓存图片。
具体流程:
  1. 用户访问页面,请求图片地址,触发 Cloudflare Worker ,
  1. Worker 用应用程序密钥签名,访问 Backblaze B2 私密桶,
  1. Backblaze B2 验证签名,返回图片给 Worker ,
  1. Worker 显示图片到页面,用户看到图片。
前提条件:
  1. 注册好 Cloudflare 账户
  1. 注册好 Backblaze 账户
  1. 有域名托管在 Cloudflare
  1. 安装好 PicGo (支持 Win/Mac/Linux 平台)
我们开始吧!

一、创建 Backblaze B2 私密桶

登录 Backblaze ,默认来到桶 (Buckets) 页面。
提示:Backblaze 的中文界面机翻味道实在太浓,请先右下角切换为 English 。
点击 Create a Bucket ,在 Bucket Unique Name 项填入桶名称(我填的 it-is-just-a-test-bucket),其余项保持默认即可。然后点击 Create a Bucket 按钮。
notion image
提示:虽然是私密桶,但桶名应尽可能复杂,避免被他人猜测到,产生不必要的麻烦。
私密桶生成了。记下 Endpoint 的值,后面要用到两次。
notion image
点击 Lifecycle Settings ,选择 Keep only the last version of the file 。点击 Update Bucket 按钮。
notion image

二、创建应用程序密钥 (Application Key)

点击页面左侧菜单 Account 项下的 Application Keys ,然后点击 Add a New Application Key ,在 Name of Key 项填写应用程序密钥名称(我填的 my-key-for-uploading),其余保持默认即可。点击 Create New Key 按钮。
notion image
创建应用程序密钥后,复制信息保存好(关掉就不再显示了!),后面要用到两次。
notion image

三、创建 Cloudflare Worker

登录 Cloudflare ,点击页面左侧菜单中 Workers 和 Pages ,右侧页面中点击 创建应用程序
notion image
来到 创建应用程序 页面,点击 创建 Worker 按钮。
notion image
部署 “Hello World” 脚本 页面,填入 Worker 名称(我填的 test-worker),点击 部署 按钮,一个简单的 Worker 就部署好了。
notion image
点击 编辑代码 按钮,在页面中把左侧编辑区中的代码替换为以下代码:
然后点击 保存并部署 按钮。

四、配置 Cloudflare Worker

返回新创建的 Worker 页面,点击上方 设置 选项卡,再点击左侧 变量
notion image
点击 添加变量 按钮,依次添加 5 个变量,变量名称 和 值 分别为:
添加完后,如下图所示:
notion image
为安全起见,输入完 B2_APPLICATION_KEY 的值后,点击右侧的 加密 按钮,会显示 此值在保存后无法再进行查看
notion image
点击 保存并部署 按钮,完成部署。
notion image

五、自定义域名

点击左侧 触发器 ,然后点击 添加自定义域 按钮:
notion image
项填入域名/子域名(我填的 test.standat42.com),然后点击 添加自定义域 按钮:
notion image
自定义域名生效需要时间:
notion image
已生效的自定义域名:
notion image

六、配置 Backblaze B2 私密桶

回到 Backblaze ,定位到新建的私密桶,点击 Bucket Settings
notion image
Bucket Info 项填入:
提示:86400 表示缓存一天,可以设置更大。
notion image
最后点击 Update Bucket 按钮。

七、访问测试

  1. 上传图片到私密桶
定位到新建的私密桶,点击 Upload/Download 按钮,然后继续点击 Upload 按钮,上传一个图片(如 test-image.jpg)。
notion image
  1. 查看图片 URL
点击图片文件名,查看图片 URL:
notion image
  1. 访问测试
直接访问 S3 URL (https://it-is-just-a-test-bucket.s3.us-west-004.backblazeb2.com/test-image.jpg) 是看不到图片的。
notion image
访问自定义域名的 URl (https://test.standat42.com/test-image.jpg) 则可以看到图片。
notion image
说明 Cloudflare Worker 生效了。
打开开发者工具,刷新页面,在 网络 选项卡中点击 test-image.jpg 查看,Cf-Cache-Status 的值为 HIT ,说明 Cloudflare 已经缓存成功。
notion image

八、配置 PicGo

  1. 安装 S3 插件
点击左侧 插件设置 ,右边搜索 S3 ,安装即可。
notion image
  1. 启用 Amazon S3 图床
点击左侧 PicGo设置 里,右边把 Amazon S3 启用。
notion image
  1. 配置 Amazon S3 图床
在左侧 图床设置 里,点击 Amazon S3
notion image
右边这样配置:
点击 确定 按钮。
提示:因为我上传前会把图片按日期和文章命名好,所以我在 PicGo设置 里把 上传前重命名 和 时间戳重命名 都关掉了,这样可以保证上传后图片名不会被改掉。
  1. 上传测试
点击左侧 上传区 ,把图片拖入右边即可上传。
notion image
上传后点击左侧 相册 ,右边可显示已上传图片。
notion image

延伸阅读

相关文章
  • 工具
  • picgo
  • b2
  • 图床
  • cloudflare
  • 手机端使用AdGuard配合Clash实现广告过滤以及上网加速基于 Cloudflare Worker 和 Pages 以及TG_BOT的图床/视频床/文件床服务
    Loading...