附件图床自动化同步 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.py

2. 主调度脚本(含 Git 备份)

文件: /path/to/scripts/sync-and-migrate.sh

3. 安装脚本

文件: /path/to/scripts/setup.sh

4. Cron 定时任务

工作原理

流程说明:
  1. R2 Pull: 从 Cloudflare R2 同步桶拉取最新 vault 到本地
  1. 附件迁移: Python 脚本扫描 Markdown 文件,将本地附件上传到 R2 图床,替换为远程链接,删除本地文件
  1. Git 备份: 提交所有变更到本地 Git 仓库,推送到 GitHub(版本控制 + 异地备份)
  1. R2 Push: 将处理后的纯文本 vault 推回 R2 同步桶,供各设备同步

双保险架构

层级
功能
优势
R2 同步
实时多端同步
毫秒级同步,设备间无缝切换
Git 备份
版本历史记录
可回滚到任意版本,防止误删
为什么需要 Git?
  • R2 同步是覆盖式的,没有历史记录
  • Git 提供完整的时间机器,可查看/恢复任意历史版本
  • GitHub 作为异地备份,即使 R2 出问题也能恢复
  • 纯文本仓库体积小,Git 处理速度快

注意事项

  1. 首次运行: 建议先手动运行一次 sync-and-migrate.sh 确保流程正常
  1. 备份: 重要数据建议先在本地备份一份
  1. 网络: NAS 需要有稳定的出站网络连接(HTTPS)
  1. 费用: R2 有免费额度,超出后会产生费用,请留意使用量
  1. 安全: 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 自动备份到多个仓库

文件结构