🚀 我如何用 Cloudflare R2 + Rclone 让 60GB 服务器“无限扩容”
在配置immichapp时,通过nginx代理,必须在域名后面加上“/api”
一、背景:当 SSD 变成瓶颈
作为一名独立开发者,我一直都很在意 服务器资源的高效利用。
我的主力机器在美国,配置是 3 核 CPU + 4GB 内存 + 60GB SSD。
这套配置其实挺香的,跑多个项目都没压力。
但 60GB 的 SSD,却成为了我部署 私有照片/视频存储服务 Immich 的最大障碍。
Immich 是一个类似 iCloud 的私有云替代方案,支持自动备份照片和视频。
然而,这类项目的最大痛点就是——存储消耗巨大。
很快,我的 SSD 就被塞满了。
于是我联系服务器供应商想加点盘,结果报价直接劝退👇

💸 官方报价:1.08 美元 / GB / 年
换算下来,1TB 存储要 1100 美元一年。
我还尝试找了其他厂商,但方案都不理想:
要么是 SSD 很大但 CPU 太弱,要么反过来。
不是浪费性能,就是价格离谱。

于是我开始思考另一种思路:
能不能把“计算”和“存储”分开?
计算仍在本地服务器上完成,而存储则交给云端的对象存储服务。
这样既能保留性能,又能无限扩容。
二、解决方案:Cloudflare R2 + Rclone
经过多方比较,我最终选择了 Cloudflare R2。
R2 不仅提供免费额度,还能按需计费,没有流量出口费用,
非常适合自建类项目使用。
同时它的价格也非常美丽:

🧩 技术架构概览
| 组件 | 作用 | 技术方案 |
|---|---|---|
| 应用层 | 私有化 iCloud(照片管理) | Immich |
| 存储层 | 承载海量文件 | Cloudflare R2 存储桶 |
| 连接层 | 将 R2 挂载为本地磁盘 | Rclone (FUSE) |
三、配置与部署步骤
1️⃣ 创建 R2 存储桶
在 Cloudflare 仪表板中:
-
创建一个新的 R2 存储桶(我命名为
icloud)。 -
在 “R2 → 管理 API 令牌” 页面生成一个新的 S3 API 密钥。
-
为该密钥赋予最小但完整的权限:
- 对象读取
- 对象写入
- 对象列表(List)
-
限制该 API Key 只能访问:
- 指定的 IP
- 指定的 存储桶
📍Endpoint 格式为:
[账户ID].r2.cloudflarestorage.com

2️⃣ 安装 Rclone 与依赖
sudo apt update && sudo apt install rclone rsync -y
使用交互式命令配置远程连接:
rclone config
配置时输入 Access Key、Secret Key、Endpoint 等信息,
我将远程命名为 icloud。
3️⃣ 使用 systemd 实现永久挂载
为了让系统重启后仍能自动挂载,我创建了一个 systemd 服务:
sudo nano /etc/systemd/system/rclone-icloud.service
内容如下:
[Unit]
Description=Rclone Mount R2 (icloud) for Immich
Requires=network-online.target
After=network-online.target
[Service]
User=root
Type=forking
ExecStart=/usr/bin/rclone mount icloud:icloud /mnt/icloud --config=/root/.config/rclone/rclone.conf --daemon --allow-other --vfs-cache-mode full
ExecStop=/bin/fusermount -uz /mnt/icloud
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
加载并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable rclone-icloud.service
sudo systemctl start rclone-icloud.service
检查挂载情况:
df -h | grep icloud
4️⃣ 稳定迁移数据:Rclone Copy
一开始我直接往挂载盘写入数据,结果偶尔会遇到
Input/output error 或 No such file or directory。
后来我发现最稳妥的做法是:
先用 Rclone 的 API 命令直接复制数据,再重新挂载。
# 停止 Immich
docker compose down
# 卸载挂载点
sudo systemctl stop rclone-icloud.service
sudo umount -l /mnt/icloud
# 执行数据复制(断点续传 + 校验完整性)
sudo rclone copy /immich-app/library/ icloud:icloud -P --checksum
复制完成后,所有文件就安全地存入 R2 存储桶。
5️⃣ 让 Immich 使用 R2 存储
重新挂载 Rclone 服务:
sudo systemctl start rclone-icloud.service
然后修改 .env 文件中的上传路径:
UPLOAD_LOCATION=/mnt/icloud
最后重新启动容器:
docker compose up -d
至此,Immich 已成功运行在 Cloudflare R2 的存储上。
四、成果与启发
部署完成后,我的服务器发生了质的变化:
✅ 无限扩容 再也不用担心 SSD 空间不足。
💰 成本极低 按需付费,比扩容 SSD 便宜几十倍。
⚙️ 计算与存储彻底分离 CPU 与内存专注处理逻辑,存储交给 Cloudflare。
五、结语
这次尝试让我真正体会到了“鱼与熊掌可以兼得”的感觉。 通过 Cloudflare R2 + Rclone, 我成功让一台 60GB SSD 的小机器拥有了“无限”存储空间。
如果你也想在有限的服务器上搭建 Immich、Nextcloud 或任何私有云项目, 不妨试试这套组合方案。
🌤️ 当存储不再是瓶颈,创意的边界就被彻底打开了。