Cloudflare R2 使用与配置文档
本项目支持以 Cloudflare R2 作为对象存储后端(S3 兼容)。本文档介绍:
- 开通与注册 Cloudflare R2
- 获取 S3 兼容的访问密钥(Access Key/Secret Key)与 Endpoint
- 在本项目中通过管理面板配置 R2
- 验证上传/下载与排障
一、开通 Cloudflare R2
- 访问 Cloudflare 控制台并登录:
https://dash.cloudflare.com/ - 左侧菜单选择「R2 存储」(R2 Storage)。
- 首次使用按提示开通 R2(可能需绑定支付方式,具体以 Cloudflare 展示为准)。
- 创建 Bucket:
- 点击「Create bucket」。
- 输入 Bucket 名称(建议全小写、短横线分隔),例如:
fireflycloud-data。 - 记下 Bucket 名称,后续需要在项目中填写。
二、获取 S3 兼容访问密钥与 Endpoint
R2 提供 S3 兼容 API,需要以下信息:
- Account ID(账号 ID)
- S3 兼容 Endpoint(形如
https://<ACCOUNT_ID>.r2.cloudflarestorage.com) - Access Key ID / Secret Access Key(访问密钥对)
- Bucket 名称(上一步创建)
获取步骤:
- 在 R2 页面,进入顶部的「Settings」或左侧的「R2」→「S3 API」页面。
- 复制「Account ID」。
- 找到「S3-compatible API」的 Endpoint,通常为:
https://<ACCOUNT_ID>.r2.cloudflarestorage.com
- 生成密钥对:
- 点击「Create API token」或「Create Access Key」。
- 选择 S3 兼容(Read/Write)模板或自定义权限。
- 生成后会得到:Access Key ID 与 Secret Access Key。
- 仅在创建时显示 Secret,请妥善保存,切勿泄露。
注意:
- 本项目使用服务端直传与预签名下载(GetObject 预签名),无需将密钥暴露到前端。
- Endpoint 与协议需与前端访问协议一致(http/https 不可混用),生产环境建议全站 https。
三、在本项目中配置 R2(推荐:管理面板)
本项目默认通过「管理面板 → 存储配置」写入数据库中的 storage_config,无需在环境变量中填 R2 凭据。
步骤:
- 启动后端与前端(参考根目录
README.md)。 - 登录系统并进入「系统管理/管理面板」。
- 打开「存储配置」或「Storage Configuration」页面。
- 选择存储类型为「R2」。
- 填写以下字段:
- R2 Endpoint:例如
https://<ACCOUNT_ID>.r2.cloudflarestorage.com - R2 Access Key:上一步生成的 Access Key ID
- R2 Secret Key:上一步生成的 Secret Access Key
- R2 Bucket:你的存储桶名称(如
fireflycloud-data) - 是否启用混合模式(可选):
enableMixedMode(保留其他存储能力,用于平滑迁移或分策略)
- R2 Endpoint:例如
- 保存配置。
内部实现要点(便于排障与审计):
- 后端通过
@aws-sdk/client-s3初始化 S3 Client:region: "auto"endpoint: <你的 R2 Endpoint>credentials: { accessKeyId, secretAccessKey }forcePathStyle: true
- 代码位置:
backend/src/services/storage/storage-service.ts(R2 客户端与上传/下载逻辑)backend/src/services/storage/r2-helpers.ts(PutObject/GetObject/ListObjects 及签名 URL 等)
四、验证与使用
1) 上传验证
- 使用前端文件管理或上传组件上传一个小文件。
- 若配置正确,后端会通过
PutObject将文件写入 R2,对应日志可在后端日志或管理面板运行日志中查看。 - 数据库
files表会记录:storageType = "r2"、storagePath = <对象键>。
2) 浏览与统计(可选)
- 若页面提供 R2 浏览/统计功能,将通过
ListObjectsV2读取对象列表并计算使用量(带缓存)。
3) 下载验证
- 本项目默认使用预签名下载链接(GetObject +
getSignedUrl)。 - 触发下载时,后端会生成临时有效的下载 URL 并返回给前端,避免公开暴露对象权限。
五、Next.js 侧需要的配置
- 前端仅需正确指向后端 API:在项目根目录配置:
bash
# .env(或 .env.local / .env.production)
NEXT_PUBLIC_API_URL=https://your-api.example.com # 确保与后端一致的协议(https/https),不可混用- 切勿将 R2 的 Access Key/Secret Key 写入任何前端环境变量或代码中!密钥只应保存在后端配置(数据库)或后端私密环境中。
六、常见问题(FAQ)
无法上传(500 / R2 client not configured):
- 检查管理面板的 R2 字段是否完整:Endpoint、Access Key、Secret Key、Bucket。
- 确认 Endpoint 正确,格式通常为
https://<ACCOUNT_ID>.r2.cloudflarestorage.com。 - 确保后端进程可访问外网,并且系统时间准确(签名请求依赖时钟)。
无法下载或下载链接过期:
- 预签名链接默认有效期为 1 小时(代码可调整)。
- 确认对象键(storagePath)存在且与上传时一致。
列表为空或前缀路径异常:
- R2 采用 Key-Value 的对象命名,
/只是约定俗成的分隔符。确保前缀传递与对象键一致。
- R2 采用 Key-Value 的对象命名,
跨域或协议混用导致下载失败:
- 本项目前端下载已内置若干降级策略(隐藏 iframe 等)。生产环境请统一使用 HTTPS,并确保
NEXT_PUBLIC_API_URL与站点协议一致。
- 本项目前端下载已内置若干降级策略(隐藏 iframe 等)。生产环境请统一使用 HTTPS,并确保
是否支持自定义域名直链:
- R2 支持为 Bucket 绑定自定义域并配置访问策略。但本项目默认使用预签名下载,适合私有访问与短期授权场景。若需公共直链与 CDN,自行在 Cloudflare 中为 R2 绑定域名并调整项目策略。
七、进阶:混合模式(enableMixedMode)
- 启用后,项目可同时保留本地/OneDrive/R2 等能力,用于迁移或按用户策略分配存储。
- 用户级策略可在管理面板的「存储策略/挂载」中配置,将指定用户/目录映射到 R2 路径(如
r2Path)。
八、排障建议
- 打开后端日志的 DEBUG 级别(
LOG_LEVEL=DEBUG),观察 R2 初始化与 PutObject/GetObject 的日志。 - 使用 Cloudflare R2 控制台检查对象是否写入,或通过 S3 工具(如 AWS CLI 配置自定义 Endpoint)验证。
- 检查服务器系统时间与时区(建议使用 NTP),避免预签名时间偏差导致的认证失败。
九、参考
- Cloudflare R2 文档:
https://developers.cloudflare.com/r2/ - AWS SDK for JavaScript (v3):
https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/