🚀 我如何用 Cloudflare R2 + Rclone 让 60GB 服务器“无限扩容”

By LayFz on Oct 11, 2025

在配置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 不仅提供免费额度,还能按需计费,没有流量出口费用
非常适合自建类项目使用。

同时它的价格也非常美丽:

r2_pricing

🧩 技术架构概览

组件作用技术方案
应用层私有化 iCloud(照片管理)Immich
存储层承载海量文件Cloudflare R2 存储桶
连接层将 R2 挂载为本地磁盘Rclone (FUSE)

三、配置与部署步骤

1️⃣ 创建 R2 存储桶

在 Cloudflare 仪表板中:

  1. 创建一个新的 R2 存储桶(我命名为 icloud)。

  2. “R2 → 管理 API 令牌” 页面生成一个新的 S3 API 密钥。

  3. 为该密钥赋予最小但完整的权限:

    • 对象读取
    • 对象写入
    • 对象列表(List)
  4. 限制该 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 errorNo 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 或任何私有云项目, 不妨试试这套组合方案。

🌤️ 当存储不再是瓶颈,创意的边界就被彻底打开了。

评论

订阅我的博客

通过RSS订阅获取最新文章更新,不错过任何一篇技术分享

推荐使用 FeedlyInoreader 等RSS阅读器订阅