三股水
BookOrbit 七牛云存储 + CDN 折腾完整记录
本文从 Obsidian 撰写发布

BookOrbit 七牛云存储 + CDN 折腾完整记录

一、Rclone 介绍

Rclone 是一款开源的命令行同步工具,支持将文件同步到 70 多种云存储服务,包括七牛云、阿里云 OSS、AWS S3、Google Drive 等。它支持双向同步、挂载(将云存储映射为本地磁盘)、加密传输等功能。在本文档中,我们使用 Rclone 将 BookOrbit 的书籍文件同步到七牛云 Kodo 存储,并尝试通过 CDN 加速访问。

二、背景与目标

  • 服务器带宽有限,多用户阅读大文件时成为瓶颈
  • 磁盘空间压力持续增加
  • 目标:将书籍文件迁移到七牛云存储,通过 CDN 加速访问,减轻服务器压力

三、方案 A:Rclone 挂载(实时同步)—— ❌ 失败

3.1 安装 Rclone

curl https://rclone.org/install.sh | sudo bash
rclone --version

3.2 配置七牛云

rclone config

交互流程:

  • 选择 n) New remote
  • name> qiniu
  • Storage> s3
  • provider> Qiniu
  • access_key_id> 粘贴七牛云 Access Key
  • secret_access_key> 粘贴七牛云 Secret Key
  • region> 直接回车(留空)
  • endpoint> 根据存储桶区域填写(如 https://s3.cn-south-1.qiniucs.com
  • 后续选项全部直接回车
  • 最后输入 y 确认保存,q 退出

测试连接:
rclone ls qiniu:bookorbit

3.3 挂载存储桶到服务器

mkdir -p /mnt/bookorbit_books
rclone mount qiniu:bookorbit /mnt/bookorbit_books --daemon --vfs-cache-mode writes --allow-other
ps aux | grep rclone | grep -v grep # 验证挂载进程

3.4 失败原因

  1. 挂载进程频繁退出,不稳定
  2. 中文文件名/目录名导致同步异常
  3. 服务器重启后需手动重新挂载
  4. 需要安装 fuse3(apt-get install fuse3 -y),但即使安装后仍不稳定

四、方案 B:定时同步(最稳妥)—— ✅ 成功

放弃实时挂载,书籍先存本地,通过 rclone sync 定时同步到七牛云。

4.1 手动同步

rclone sync /wwwroot/bookorbit/books qiniu:bookorbit --progress -v

4.2 设置定时任务

crontab -e
添加:
0 3 * rclone sync /wwwroot/bookorbit/books qiniu:bookorbit --progress >> /var/log/rclone-sync.log 2>&1

4.3 查看存储桶内容

rclone ls qiniu:bookorbit

4.4 结果

  • ✅ 数据可靠同步到七牛云
  • ✅ 不受网络波动影响
  • ✅ 中文文件名正常支持

五、方案 C:Nginx 反向代理 + CDN —— ⚠️ 部分成功

5.1 在七牛云绑定 CDN 域名

  1. 登录七牛云控制台 → 对象存储 Kodo → 进入存储桶
  2. 域名管理 → 绑定域名
  3. 加速域名:boq.xgsd.cc
  4. 在域名 DNS 解析中添加 CNAME 记录
  5. 等待解析生效

5.2 配置 Nginx

修改 Nginx 配置文件(/www/server/panel/vhost/nginx/bo.sangushui.com.conf),添加:

    location /books/ {
    proxy_pass https://boq.xgsd.cc/;
    proxy_set_header Host boq.xgsd.cc;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    expires 7d;
    add_header Cache-Control "public, immutable";
}

5.3 重载 Nginx

nginx -t
nginx -s reload

5.4 验证 CDN 是否生效

curl -I https://bo.sangushui.com/books/文件名.epub

5.5 结果

  • ✅ 直接访问 https://bo.sangushui.com/books/文件名.epub → 走 CDN,返回 x-cache-status 或 x-qiniu-zone 头
  • ❌ BookOrbit 阅读页面 /read/49/44 → 不走 CDN

六、方案 D:环境变量 —— ❌ 失败

在 docker-compose.yml 中添加:

environment:

重启容器:
docker-compose down
docker-compose up -d

结果:BookOrbit 不支持这些变量,阅读页面仍不走 CDN。

七、方案 E:修改 BookOrbit 源码(理论可行,未实施)

如果 BookOrbit 开源且你熟悉 Node.js,可以修改源码中生成文件链接的逻辑,将本地路径替换为 CDN 地址。但这需要:

  1. Fork BookOrbit 仓库
  2. 找到文件链接生成代码(可能在路由或控制器中)
  3. 修改为从环境变量读取 CDN 域名
  4. 重新构建 Docker 镜像
  5. 维护自己的分支,与上游保持同步

此方案工作量较大,且后续更新困难,仅作为理论参考。

八、核心问题分析

8.1 为什么 CDN 对阅读页面无效?

BookOrbit 的阅读页面使用动态 ID 方式访问文件,而不是直接通过文件路径:

阅读页面请求流程:
用户 → /read/49/44 → BookOrbit 应用 → 读取 /books/xxx.pdf → 输出

Nginx 能拦截的路径:
用户 → /books/xxx.pdf → Nginx → CDN

Nginx 的 location /books/ 规则拦截不到 BookOrbit 应用内部的读取操作,只对用户直接请求 /books/ 有效。

8.2 七牛云+CDN 的实际意义

目前价值:作为一个额外的异地备份,增加了数据安全性。
未实现价值:没有为在线访问提供加速,服务器带宽和磁盘压力未减轻。

8.3 实现目标的必要条件

要真正实现 CDN 加速阅读,BookOrbit 必须原生支持 S3 协议存储,例如:

环境变量:

这样应用在生成 /read/ 链接时,会直接指向 S3/CDN 地址,而不是从本地读取。

九、验证命令汇总

9.1 验证挂载进程

ps aux | grep rclone | grep -v grep

9.2 验证七牛云同步

rclone ls qiniu:bookorbit

9.3 验证 CDN

curl -I https://bo.sangushui.com/books/文件名.epub

9.4 查看同步日志

cat /var/log/rclone-sync.log

十、经验教训

  1. Rclone 挂载在生产环境不稳定,频繁退出,不要依赖
  2. 定时同步方案最可靠,适合生产环境
  3. CDN 只能加速静态文件(直接文件访问),不能加速动态页面
  4. Nginx 层代理只能拦截用户直接请求,拦截不了应用内部调用
  5. 自托管应用要真正支持 CDN,必须原生支持 S3/对象存储
  6. BookOrbit 当前架构对 CDN 支持有限,只能等官方支持 S3
  7. 中文文件名在 Rclone 挂载下可能异常,但定时同步支持良好
  8. 折腾前应先确认应用是否原生支持对象存储,避免走弯路

十一、最终结论

11.1 各方案状态

方案状态说明
Rclone 挂载❌ 失败进程不稳定,频繁退出
定时同步✅ 成功数据可靠同步到七牛云
Nginx+CDN 直接文件✅ 成功/books/ 直链走 CDN
Nginx+CDN 阅读页面❌ 失败BookOrbit 架构不支持
环境变量❌ 失败BookOrbit 不支持
修改源码⚠️ 理论可行工作量较大,维护困难

11.2 最终建议

  1. 等待 BookOrbit 官方支持 S3/对象存储
  2. 保留定时同步任务,至少数据是安全的
  3. 如需加速下载,可直接分享 /books/ 直链给用户
  4. 后续关注 BookOrbit GitHub 仓库的 Releases 和 Issues

十二、Rclone 常用命令速查

安装

curl https://rclone.org/install.sh | sudo bash

配置

rclone config

查看存储桶内容

rclone ls qiniu:存储桶名称

同步到云端

rclone sync /本地目录/ qiniu:存储桶名称 --progress -v

从云端同步到本地

rclone sync qiniu:存储桶名称 /本地目录/ --progress -v

挂载为本地磁盘

rclone mount qiniu:存储桶名称 /挂载点 --daemon --vfs-cache-mode writes --allow-other

卸载挂载

fusermount -uz /挂载点

查看挂载进程

ps aux | grep rclone | grep -v grep

😊
提交

评论区

共 2 条评论

  1. 头像
    水拍石 Lv1
    你最近没有少折腾啊,文章全是和服务器部署及代码相关的。
    3天前 陕西
    1. 头像
      XIGE 博主
      @水拍石 套上AI很轻松哈,现在我把遇到的问题,折腾的记录都让AI最终整理成文档,学习效果极好
      2天前 云南