配置指南

项目中关于R2存储相关配置

Created: 04/24/2026
Updated: 04/24/2026

写在前面

R2必须配置,要不然生图成功后只能展示供应商的图,但是供应商生成的图可能对方平台几天就删除了,还是得有自己的存储承接

使用R2之前,你最好有个VISA卡:例如 招商全币种信用卡(后来了解到去闲鱼搜索”代绑“”虚拟卡“也可以成功通过),因为用存储虽然有免费额度,但是Cloudflare担心你可能用超,所以需要录入下支付方式才能使用R2;

项目使用Cloudflare R2支撑图片生成的存储

Cloudflare R2 亮点:免费量大

项目 每月免费额度
标准存储容量 10 GB-month(等于每月最高可存 10 GB)
Class A 操作(如写入/列出对象) 1,000,000 次/月
Class B 操作(如读取对象) 10,000,000 次/月
出站流量(Egress) 始终免费(无论使用多少)

项目中需要先使用Admin权限账户去/admin/settings/storage更新R2配置,要不然会像下面报错

访问下面链接

https://www.cloudflare.com/zh-cn/

登录后,按照下图点击创建bucket

在本地记录下你创建的bucket name

配置Custom domain

注意:如果你没有域名,需要先买域名:购买便宜域名

在本地记录下你创建的 domain

配置R2_ACCESS_KEY_ID、R2_SECRET_ACCESS_KEY

选择Create User API token

点击”Create User API Token“

然后访问http://localhost:3000/admin/settings/storage将其配置进去

下图中
Cloudflare Access Key:对应上面的Access Key ID
Cloudflare Secret Key: 对应上面的Secret Access Key
Bucket Name: 对应上面新建的bucket name
Endpoint: 对应上面的 Use jurisdiction-specific endpoints for S3 clients:下的Default
Domain: 对应上面你设置的Custom domain

保存后,此时重启服务 pnpm run dev,可以在http://localhost:3000/admin/settings/general 测试图片文件上传,提示上传成功后可以即时的看到图片,当然也可以去CloudflareR2上去看下这张图是否已经上传到

项目中R2在生图场景中

任务成功时拿到的是第三方原始图链,而不是同步直传,
     refreshAITaskStatus 会先把 taskInfo 规范成双地址结构:sourceUrl + r2Url +
     status,shipany-template-gpt-image2/src/shared/services/
     ai_task_status.ts:50、shipany-template-gpt-image2/src/shared/services/
     ai_storage_migration.ts:157。当图片任务成功且仍有 pending 项时,会触发
     triggerAsyncR2Migration(task.id),shipany-template-gpt-image2/src/shared/
     services/ai_task_status.ts:93。migrateAITaskToR2 会逐张把 sourceUrl 下载后
     上传到 R2,key 规则是 ai/image/YYYY-MM-DD/img_xxx.ext,并把结果写回
     taskInfo.storage.images[].r2Url,同时把 output/images 改成“优先用 r2Url,没
     有才退回 sourceUrl”,shipany-template-gpt-image2/src/shared/services/
     ai_storage_migration.ts:194、shipany-template-gpt-image2/src/shared/
     services/ai_storage_migration.ts:276、shipany-template-gpt-image2/src/
     shared/services/ai_storage_migration.ts:139。失败项会标成 failed,之后可通
     过受保护接口 /api/ai/storage/retry-r2 做批量重试,shipany-template-gpt-
     image2/src/app/api/ai/storage/retry-r2/route.ts:3