跳转到内容

R2 图片托管

商品图片由 rCommerce 服务端上传并保存在本地磁盘([media] local_path,默认 ./uploads)。为了在全球范围快速分发,把它们 同步到按店铺划分的 Cloudflare R2 bucket,并通过 bucket 的公开 URL 提供访问。

导入器在导入时决定写入 product_images.src 的 URL,依据是 IMAGE_BASE_URL 环境变量(WooCommerce 导入器下载图片到本地存储时 读取):

Terminal window
# 每个店铺都必须设置它,让图片 URL 指向 CDN 而不是 API 主机。
# 没有可靠的默认值。
IMAGE_BASE_URL=https://images.shop.example.com

在执行任何导入或重新导入之前,把它设置到店铺的服务环境中。已导入 的图片会保留旧 URL,直到用 --overwrite 重新导入(或直接改库)。

每家店铺一个 bucket(R2 → Manage R2 → Create bucket),例如 store-b-uploads。两种公开访问方式:

  1. 公开开发域名 —— 在 bucket 上启用 “Public URL”,会得到 https://pub-….r2.dev。适合测试。
  2. 自定义域名(推荐)—— 给 bucket 绑定 images.<store>.com。 在 DNS 提供商处将该主机名 CNAME 到 public.r2.dev,并保持 Cloudflare 代理开启(橙色云)。

rclone 使用 S3 兼容协议访问 R2。为每个店铺配置一个 remote:

~/.config/rclone/rclone.conf
[store-b-r2]
type = s3
provider = Cloudflare
access_key_id = <r2_access_key_id>
secret_access_key = <r2_secret_access_key>
endpoint = https://<account_id>.r2.cloudflarestorage.com
acl = private

创建只对应该 bucket 的 API token(R2 → Manage R2 → Manage R2 API Tokens)。然后把服务端的 uploads 目录同步到 bucket:

Terminal window
rclone sync /var/db/store-b/uploads store-b-r2:store-b-uploads \
--transfers 8 --checkers 16 --fast-list --delete-after

(具体本地路径取决于你的目录布局,例如配置在 /usr/local/etc/<store>、数据在 /var/db/<store>/uploads。)

在服务器上用 5 分钟一次的 cron 保持 bucket 新鲜:

*/5 * * * * /usr/local/bin/rclone sync /var/db/store-b/uploads store-b-r2:store-b-uploads --transfers 8 --checkers 16 --fast-list --delete-after >> /var/log/store-b/rclone-sync.log 2>&1

迁移到 R2 后不要删掉反向代理里 /uploads/* 的 file_server。旧的 图片记录仍指向 https://api.<store>.com/uploads/…,Caddy 中服务 /uploads/* 的块能保证它们继续可用。新导入的图片通过 IMAGE_BASE_URL 写入 R2 URL,兜底路径的流量会随时间越来越少。