BackBlaze B2 + Cloudfare Worker 图床

2 mins to read

虽然国内的 OSS 存储速度快,且资费便宜,但基本上都取消了测试域名,绑定自定义域名需要域名已备案。 第三方的图床则迁移麻烦。BackBlaze B2 在大厂的对象存储里面是非常便宜的,且有一定的免费额度,加上与 Cloudfare 都在带宽联盟内,他们之间并不会消耗流量,所以用来做图床是个非常好的选择。

BackBlaze B2 收费情况:空间免费10G,超出后,超出部分 $0.005/GB/月;流量每日免费1G,超出后,超出部分 $0.01/GB

方案一:Cloudfare PageRules

  1. 域名配置 cname 解析到 B2 的 friendly URL 的域名
  2. 为避免其他人使用你的域名访问 B2,配置 PageRules 锁定访问的 Bucket

假设 bucket 为 my-pics,则配置规则:https://img.exmaple.org/file/my-pics/*

这种方案的问题是会暴露 bucket 名字。

参考 Using Backblaze B2 with the Cloudflare CDN

方案二:Cloudfare Worker

使用 Cloudfare Worker 的 CLI 工具 Wrangler

下载 S3 的模板项目

wrangler generate <projectname> https://github.com/obezuk/worker-signed-s3-template

可以使用 Wrangler 登录然后配置 wrangler.toml 直接 publish 部署,也可以手工编译:

wrangler build

然后将 ./dist/worker.js 文件内容复制到 Cloudfare 配置,然后配置 Worker 的环境变量:

image-20210219232543861

Worker 部署后即可使用绑定到 Worker 的域名访问 Bucket 内的图片了,这种方案比直接使用 fetch 请求 B2 的 friendly URL 的优势在于使用了 s3 signed 签名之后访问,bucket 可以设置为 private,安全性更好。

注意 AWS_DEFAULT_REGION 一定要配置,配置成空也行,否则脚本报错。

参考 Backblaze B2 and the S3 Compatible API on Cloudflare

反盗链

如果使用图床的站点域名与图床的域名相同(包括二级域名),那么只需要打开 Cloudfare 的 Scrape Shield 中的 Hotlink 保护即可。

否则需要 Cloudfare 防火墙判断 referer 是否在你的白名单内(HotLink 的阻止访问日志也会显示在防火墙内)。

表达式生成器貌似不能定义逻辑顺序,那么直接表达式就好了:

(http.request.full_uri contains "img.wayjam.me") and ((not http.referer contains "wayjam.me") or (not http.referer contains "example.com"))

image-20210219232422677

上传

使用 PicGo 配合插件 picgo-plugin-s3 使用。