Cloudreve 是一款功能强大的私有网盘系统,支持多种存储后端,其中包括兼容 S3 的对象存储。Backblaze B2 提供了 S3 Compatible API,非常适合个人用户。
目标是实现:
- 上传文件至 Backblaze B2
- Cloudreve 前端支持断点续传、分片上传
- 使用私有 bucket,保护文件隐私
本文记录本人成功将 Cloudreve 与 Backblaze B2 对接作为私人网盘的完整流程,涉及配置 S3 存储策略、解决分片上传失败、CORS 报错、ETag 缺失等问题。下文默认你已经部署好了 Cloudreve。
一、Backblaze B2 配置
创建 Bucket: 登录 Backblaze 控制台, 创建私有 bucket。如果启用Default Encryption则被加密的文件将不会出现在未来创建的快照中,也就是说,如果你依赖 snapshots 来备份数据,则这些加密文件不会包含在内。Object Lock保持Disable即可。
创建应用密钥
限定该密钥只能访问新创建的 bucket,也可以设置为ALL。授权 Read & Write 权限。其它可选项不管。- 记下生成的keyID、applicationKey
二、Cloudreve 存储策略配置
- 在 Cloudreve 管理后台的存储策略配置中,选择存储类型为 AWS S3
- 参数填写。Bucket 名称,Endpoint,Region(从Endpoint中截取,例如us-east-005),keyID / applicationKey(使用刚才生成的应用密钥)
- 其它配置参数保持不变,一路向下!你可能在 CORS policy 这一步遇到问题,先点跳过,解决方法看后面章节。这个时候,你已经初步设置好了 Cloudreve 部分,但你在 Cloudreve 中上传文件时可能报错 Network Error。原因是 Backblaze B2 默认不暴露 ETag header,且未开放 S3 PUT/POST 操作跨域访问。你需要回到 Backblaze 中进行设置
三、CORS 设置(关键!)
为了解决上传出错问题,你需要额外设置。
参考:使用 B2 CLI 设置 CORS, 对应官方文档:Backblaze B2 (S3 兼容)
解决:
linux环境下下载并安装 B2 CLI 工具
# 1. 下载最新版 B2 CLI 二进制文件 wget https://github.com/Backblaze/B2_Command_Line_Tool/releases/latest/download/b2-linux -O b2 # 2. 添加执行权限 chmod +x b2 # 3. 移动到系统路径,方便全局调用(可选) sudo mv b2 /usr/local/bin/
登录Backblaze 账户,你需要提前在 B2 控制台创建 Master Application Key 或 具有修改 bucket 权限的 Key(即前文创建的那个)
b2 authorize-account
系统会提示你输入:Application Key ID 和 Application Key,登录成功后,B2 CLI 就可以操作你的 bucket。
应用修改后的 CORS 规则,替换下面
为你创建的名称。 b2 bucket update <bucketName> allPrivate --cors-rules '[{"corsRuleName":"cloudreveCorsUpload","allowedOrigins":["*"],"allowedHeaders":["authorization","content-type","x-bz-file-name","x-bz-content-sha1"],"allowedOperations":["b2_download_file_by_id","b2_download_file_by_name","b2_upload_file","b2_upload_part","s3_put","s3_post","s3_get","s3_delete"],"exposeHeaders":["ETag"],"maxAgeSeconds":3600}]'
确认修改是否完成
b2 bucket get <bucketName>
输出中必须含有
"exposeHeaders": ["ETag"]
- 立即测试上传,确认:小文件上传无误;大文件(>chunk)自动分片上传成功;中文文件名支持(建议搭配自动重命名)
四、Cloudreve 忘记密码
Cloudreve 忘记密码后重置密码,不用修改数据库。 进入 Cloudreve Docker 容器终端,然后执行指令:
./cloudreve --database-script ResetAdminPassword
接着你的终端/日志中就会出现重置后的密码了
评论