附件图床自动化同步 prompt
功能描述
搭建自动化脚本,定时从 Cloudflare R2 同步桶拉取 Obsidian vault,扫描笔记中的本地视频/附件引用,将文件复制到图床桶,替换笔记中的链接为远程 URL,删除本地文件,Git 提交版本备份,再推回同步桶。
环境信息
- OS: Rocky Linux 9 / Ubuntu / CentOS(24 小时运行的服务器)
- Vault 本地路径:
/path/to/your-vault
- Python 3: 已安装
- Git: 已安装
前置条件
1. Cloudflare R2 配置
需要准备两个 R2 存储桶:
同步桶(存储整个 Obsidian vault)
- 桶名:
your-vault-bucket
- Access Key ID:
YOUR_SYNC_ACCESS_KEY_ID
- Secret Access Key:
YOUR_SYNC_SECRET_ACCESS_KEY
图床桶(存储视频/附件)
- 桶名:
your-image-bed-bucket
- Access Key ID:
YOUR_IMAGEBED_ACCESS_KEY_ID
- Secret Access Key:
YOUR_IMAGEBED_SECRET_ACCESS_KEY
- 公开域名:
https://your-domain.r2.dev
获取方式: Cloudflare Dashboard → R2 → 创建桶 → 管理 R2 API 令牌
2. GitHub 仓库配置
创建私有仓库用于版本备份:
- 仓库名:
your-vault-backup
- 类型: Private(保护隐私)
- 初始化: 不勾选 README(本地已有文件)
3. rclone 配置
在交互式配置中创建两个 remote:
remote 1:
r2-sync(同步桶)- type: s3
- provider: Cloudflare
- access_key_id: YOUR_SYNC_ACCESS_KEY_ID
- secret_access_key: YOUR_SYNC_SECRET_ACCESS_KEY
- acl: private
remote 2:
r2-imagebed(图床桶)- type: s3
- provider: Cloudflare
- access_key_id: YOUR_IMAGEBED_ACCESS_KEY_ID
- secret_access_key: YOUR_IMAGEBED_SECRET_ACCESS_KEY
- acl: private
4. SSH 密钥配置(用于 GitHub)
脚本实现
1. Python 处理脚本
文件:
/path/to/scripts/media-to-imagebed.py2. 主调度脚本(含 Git 备份)
文件:
/path/to/scripts/sync-and-migrate.sh3. 安装脚本
文件:
/path/to/scripts/setup.sh4. Cron 定时任务
工作原理
流程说明:
- R2 Pull: 从 Cloudflare R2 同步桶拉取最新 vault 到本地
- 附件迁移: Python 脚本扫描 Markdown 文件,将本地附件上传到 R2 图床,替换为远程链接,删除本地文件
- Git 备份: 提交所有变更到本地 Git 仓库,推送到 GitHub(版本控制 + 异地备份)
- R2 Push: 将处理后的纯文本 vault 推回 R2 同步桶,供各设备同步
双保险架构
层级 | 功能 | 优势 |
R2 同步 | 实时多端同步 | 毫秒级同步,设备间无缝切换 |
Git 备份 | 版本历史记录 | 可回滚到任意版本,防止误删 |
为什么需要 Git?
- R2 同步是覆盖式的,没有历史记录
- Git 提供完整的时间机器,可查看/恢复任意历史版本
- GitHub 作为异地备份,即使 R2 出问题也能恢复
- 纯文本仓库体积小,Git 处理速度快
注意事项
- 首次运行: 建议先手动运行一次
sync-and-migrate.sh确保流程正常
- 备份: 重要数据建议先在本地备份一份
- 网络: NAS 需要有稳定的出站网络连接(HTTPS)
- 费用: R2 有免费额度,超出后会产生费用,请留意使用量
- 安全: Access Key 和 SSH key 请妥善保管,不要上传到公开仓库
故障排查
问题 | 可能原因 | 解决方案 |
rclone 连接失败 | 密钥错误或网络问题 | 检查 rclone config 和防火墙 |
Git push 失败 | SSH 认证失败 | 检查 SSH key 是否正确添加到 GitHub |
文件未上传 | 路径配置错误 | 检查 VAULT_PATH 和 ATTACHMENTS_DIR |
链接未替换 | 文件格式不匹配 | 确认 MEDIA_EXTENSIONS 包含你的文件类型 |
Cron 不执行 | 权限或路径问题 | 使用绝对路径,检查日志文件 |
扩展建议
- 添加 Telegram/钉钉通知功能,同步失败时告警
- 支持更多附件类型(如 PDF、压缩包)
- 添加上传后图片压缩/转码功能
- 添加 Web 界面查看同步状态和日志
- 配置 GitHub Actions 自动备份到多个仓库