配置指南
项目中关于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。