B2 存储桶挂载 alist 和兰空图床

B2 存储桶挂载 alist 和兰空图床

B2 存储桶是指 backblaze 的对象存储服务,支持 aws s3 协议,其免费计划有 10G 的空间和 30G 每月的流量,且必须绑定信用卡才可以创建公开桶,否则只能作为私有桶自用,无法对外分享。由于 B2 和 CF 同属一个流量联盟,可以利用 CF 的 CDN 实现无限流量,且可以通过 cf worker 反代实现私有桶的公开访问。下文将一一讲解:

🏅前置条件

  • 有一个 CF 账号和一个已托管的域名
  • 注册一个 B2 的账号,
    • 注册地址:点此直达
    • 填入一个邮箱,会发送一封验证邮件给你
    • 验证后设置登录密码,登录

🏅创建一个私有桶

  • 进入 管理页面
  • 点击创建一个桶,记录下页面的端点地址:Endpoint,类似于:s3.eu-central-004.backblazeb2.com (如果要创建公开桶,则必须绑定信用卡,会扣除 1 刀的费用)

image.png

image.png

  • 创建访问 ID 和秘钥
    • 点击左侧 Application Keys,再点击 Add a New Application Key注意:是 Application Key 不是 Master Application Key
    • 给秘钥取一个名字,权限选择 Read and Write,其他默认,点击创建,会出现一组 keyID 秘钥,记录下来备用。注意:秘钥只会出现 1 次

image.png

  • 修改桶设定,设置缓存
    • 回到管理页面主页,点击 桶设定
      image.png
    • 在桶信息处,填写 {"cache-control":"public, max-age=72000"},再点击 更新桶
      image.png
  • 上传一个文件,获取直链地址,也就是下图中的 友好 URLS3 URL ,记录备用。友好 URL 的格式示例: https://直链域名/file/桶名称/文件名.jpg

image.png

到此,B2 存储桶的设置已经完成(公开桶也是一样,多了一道绑卡的流程),下面转到 CF 去操作

🏅先说私有桶

创建一个反代 worker

  • 进入仓库 找到 worker-private.js 文件
  • 复制其所有内容到一个新的 CF WORKER 中
  • 设置以下环境变量
    • ALLOW_LIST_BUCKET = false
    • B2_APPLICATION_KEY = 你创建的应用秘钥
    • B2_APPLICATION_KEY_ID = 你创建的应用 keyID
    • B2_ENDPOINT = 端点域名,例如 s3.eu-central-004.backblazeb2.com,不要 https
    • BUCKET_NAME = 你创建的私密桶名称,例如:b2pan123
  • 绑定一个自定义域名,例如 b2.332211.xyz
  • 现在你已经可以用域名访问桶内的文件了
    • 用你 绑定的域名 替换 友好 URL 的域名/file/桶名称 即可
    • 类似这样的格式:https://b2.332211.xyz/截图.jpg,不要 /file/桶名称

🏅再说公开桶

你需要先绑定信用卡创建一个公开桶,创建方法和私有桶基本一致

打开 CF,在托管域名的 DNS 中设置 CNAME 记录

  • 假设 CF 托管域名为 332211.xyz
  • 在其 DNS 中新增一个 cname 记录
  • 名称:随意,此处以 b2pan 为例
  • 值:填写上面获得的 友好URL 的域名,如:f003.backblazeb2.com,不要带 https
  • 得到 1 个域名:b2pan.332211.xyz,就是你存储桶的代理域名(或者叫自定义域名)

创建一个 worker,粘贴以下内容,修改汉字部分,部署

1
2
3
4
5
6
7
8
9
10
addEventListener("fetch", (event) => {
event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
const url = new URL(request.url);
const newPath = `/file/改为你自己的存储桶名称${url.pathname}`;
const newUrl = new URL(newPath, url.origin);
return fetch(newUrl, request);
}

给 worker 项目绑定一个路由

  • 区域:选择你的主域名,即 332211.xyz
  • 值:填写 b2pan.332211.xyz/*
  • 现在也可以通过 https://worker域名/文件名.jpg 来访问桶内的文件
  • 示例:https://b2pan.332211.xyz/截图.jpg

题外话

  • 公开桶不进行 woker 反代也是可以访问桶内文件的
  • 其访问格式为:https://worker域名/file/桶名称/文件名.jpg
  • 示例:https://b2pan.332211.xyz/file/b2pan123/截图.jpg
  • 但是,如果不进行反代,alist 挂载以及兰空图床挂载会失败

🏅挂载到 Alist

  • 在 alist 中新建一个存储
  • 驱动类型:对象存储
  • 挂载路径:随便填,最前面有个 /
  • webdav 策略:302 重定向
  • 根文件夹路径:/

image.png

🏅挂载到兰空图床(picgo 也是一个道理)

需要先修改兰空图床的代码

  • 无论你是何种部署方式,找到 lsky-pro/app/Services/ImageService.php 文件,在约 358 行找到这一句代码
1
bucket: $configs->get(MinioOption::Bucket),
  • 在它下面追加一行:
1
options: ['params' => ['ACL' => '']],
  • 示例:
1
2
3
4
5
6
StrategyKey::Minio => new AwsS3V3Adapter(
// ...
bucket: $configs->get(MinioOption::Bucket),
options: ['params' => ['ACL' => '']], // <-- 这里是新增的一行
// ...
),
  • 重启兰空图床的服务

到兰空管理后台设置存储策略

不截图了,文字描述一下:

  • 名称:随意
  • 存储策略:Minio
  • 访问域名:你的 worker 项目域名 (私有桶) 或 DNS 的 cname 域名 (公开桶),需要前缀 https://
  • AccessKey:填写 keyID
  • SecretKey:填写应用秘钥
  • 连接地址:你 b2 存储桶的端点地址,需要前缀 https://
  • 区域:可留空,不想留空就填写端点地址的前半截,如 eu-central-003
  • 存储桶名称:填写桶名称
  • 点击保存

现在已经可以通过兰空图床上传图片并生成直链了

#cloudflare #反代 #图床 #网盘