背景
Backblaze 是一个对象储存供应商,它提供 6$ / 1mo 的极为便宜的对象存储价格,和 Cloudflare 的 CDN 结合之后可以达到免流的效果,因为 Backblaze 位于带宽联盟中
免流的详细教程: 使用 Cloudflare Workers 实现 B2 私有存储桶文件下载
一旦需要建站,尤其是需要大空间大流量存储的网站,Backblaze 对于这个类型的网站可能非常管用
经过本论坛的 Telegram 开发群组(https://t.me/KUNForum/14353)多次的讨论,我们认定 Backblaze 是我们目前能找到的最便宜的对象存储供应商,可以支持大部分情况下的下载需求
但是便宜的代价是 Backblaze 有一些 GUI 操作很不方便,必须要使用命令行工具来完成配置,例如下面的情况
b2 getSignedUrl 之后的 url 跨域了怎么办,b2 的 bucket 设置 CORS Rules 是无效的,难道真的要用 b2 的 cli 工具手动给 bucket 配 CORS Rules 吗
下面就从 Bucket CORS Rules
的方向来阐述一下如何使用 Backblaze 的命令行工具
以下将 Backblaze 简称为 B2
下载和文档
在这里下载 B2 的命令行工具
https://www.backblaze.com/docs/cloud-storage-command-line-tools
这是个二进制文件,直接在命令行中使用即可
工具的文档也在这里,但是 B2 的文档写的非常不清晰,所以建议问 LLM
通过命令行工具登录
首先要使用这个工具登录,才能通过这个工具来操作 bucket
./b2 account authorize
然后会提示输出
Backblaze application key ID: 输入你的 key id
Backblaze application key: 输入你的 secret key
这里的 key,Application Key 权限可能不够,需要使用 master key
登录成功后会输出类似这样的内容
{
"accountAuthToken": "1_003xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"accountFilePath": "/kun.b2_account_info",
"accountId": "ssssssssssssssss",
"allowed": {
"bucketId": "ssssssssssssssss",
"bucketName": "kun-love-ren",
"capabilities": [
"deleteFiles",
"listAllBucketNames",
"listBuckets",
"listFiles"
],
"namePrefix": null
},
"apiUrl": "https://api001.backblazeb2.com",
"applicationKey": "K001xxxxxxxxxxxxxxxxxxxxxxxxxx",
"applicationKeyId": "001xxxxxxxxxxxxxxxxxx",
"downloadUrl": "https://f001.backblazeb2.com",
"isMasterKey": false,
"s3endpoint": "https://s3.us-east-001.backblazeb2.com"
}
通过命令行工具更改 Bucket 的属性
在 b2 命令行工具的目录下新建一个 JSON 文件,写入下面的内容
[
{
"corsRuleName": "allowBrowserUploadAndDownload",
"allowedOrigins": ["http://127.0.0.1:1007", "http://127.0.0.1:2333", "http://127.0.0.1:9420", "https://kungal.com", "https://www.kungal.com", "https://kungal.org", "https://www.kungal.org", "https://www.moyu.moe"],
"allowedHeaders": ["*"],
"allowedOperations": ["s3_get", "s3_post", "s3_put", "b2_download_file_by_name", "b2_upload_file", "b2_upload_part"],
"exposeHeaders": ["ETag"],
"maxAgeSeconds": 3600
}
]
然后使用命令
./b2 bucket update --cors-rules "$(cat ./kun-love-ren.json)" kun-love-ren allPrivate
对于这里的 allPrivate,如果你的 bucket 是 public 的就写 allPublic,否则写 allPrivate
命令如果成功则会输出下面的内容
{
"accountId": "xxxxxxxxxxxx",
"bucketId": "xxxxxxxxxxxxxxxxxxxxxxx",
"bucketInfo": {},
"bucketName": "kun-love-ren",
"bucketType": "allPrivate",
"corsRules": [
{
"allowedHeaders": [
"*"
],
"allowedOperations": [
"b2_upload_part",
"b2_upload_file",
"s3_put",
"b2_download_file_by_name",
"s3_post",
"s3_get"
],
"allowedOrigins": [
"http://127.0.0.1:1007",
"http://127.0.0.1:2333",
"http://127.0.0.1:9420",
"https://kungal.com",
"https://www.kungal.com",
"https://kungal.org",
"https://www.kungal.org",
"https://www.moyu.moe"
],
"corsRuleName": "allowBrowserUploadAndDownload",
"exposeHeaders": [],
"maxAgeSeconds": 3600
}
],
"defaultRetention": {
"mode": null
},
"defaultServerSideEncryption": {
"mode": "none"
},
"isFileLockEnabled": false,
"lifecycleRules": [
{
"daysFromHidingToDeleting": 1,
"daysFromUploadingToHiding": null,
"fileNamePrefix": ""
}
],
"options": [
"s3"
],
"replication": {
"asReplicationDestination": null,
"asReplicationSource": null
},
"revision": 5
}
注意这里 allowedHeaders
写了 *
, 因为 B2 的配置文件没有办法写x-amz-*
,会报错 ERROR: '
*' in allowedHeaders, but it's not the only value. (bad_request)
到这里我们正式把整个流程操作完毕