利用 rclone bisync 備份 Obsidian

前言

之前在 Windows 電腦上使用 Dropbox , 手機使用 Dropsync 來同步 Obsidian 筆記, 但 Arch Linux 上沒有官方的 Dropbox client, 後來查到 RCLONE 支援不少雲端硬碟服務, 就算以後 Dropbox 收攤, 也可以無痛轉移, 乾脆就測試看看, 因為要先授權 RCLONE 對接 Dropbox, 擔心動到其他資料, 所以我是另建一個 Dropbox 帳號, 再分享主帳號的 Obsidian 資料夾給分身帳號

bisync 根據官方文件目前還在 beta 版, 使用的時候謹慎為上

首先使用 –resync –resync-mode “newer” –dry-run 測試, 檢查 log 有沒有問題, 接著拿掉 –dry-run, 最後拿掉 –resync 與 –resync-mode “newer”

1
rclone bisync ~/Documents/Dropbox_Obsidian/Obsidian/ dropbox_obsidian:DropSync/Obsidian -MvP  --check-access --check-filename TODO.md --resync --resync-mode "newer" --dry-run 

-M 保存 metadata
-P 顯示目前進度 Progress
-v 詳細輸出說明
-check-access 確保兩個資料夾下都有某個相同檔案, 以免設定錯誤


指令存成 Script

測試指令沒問題後, 請 Claude 和 ChatGPT 加上判斷邏輯和說明及 log, 搭配 git 做紀錄來避免某天砍錯檔案, 再把指令儲存成 script, 存成 ~/Documents/Dropbox_Obsidian/improved-rclone-bisync-git-script.sh, 內容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/bin/bash

# === 配置變數 ===
BACKUP_DIR="$HOME/Documents/Dropbox_Obsidian/Obsidian/"
GIT_REPO="$HOME/Documents/Dropbox_Obsidian"
RCLONE_REMOTE="dropbox_obsidian"
RCLONE_PATH="DropSync/Obsidian"
LOG_FILE="$HOME/Documents/Dropbox_Obsidian/backup-sync.log"
LOCK_FILE="/tmp/backup-sync.lock"
CONFLICT_DIR="$HOME/Documents/Dropbox_Obsidian/.conflicts"
MAX_CONFLICT_AGE=30 # 天

# === 日誌函數 ===
log_message() {
local level="${2:-INFO}"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $1" | tee -a "$LOG_FILE"
}

# === 清理函數 ===
cleanup() {
rm -f "$LOCK_FILE"
log_message "清理完成" "INFO"
}

# === Git 提交變更 ===
git_commit_changes() {
cd "$GIT_REPO" || { log_message "無法進入 Git 倉庫" "ERROR"; exit 1; }

# 暫存所有變更
git add -A

# 檢查是否有變更需要提交
if ! git diff --cached --quiet; then
git commit -m "本地備份 - $(date '+%Y-%m-%d %H:%M:%S')" || {
log_message "Git 提交失敗" "ERROR"
exit 1
}
log_message "已提交本地變更" "INFO"
else
log_message "沒有需要提交的變更" "INFO"
fi
}

# === 處理同步衝突 ===
handle_sync_conflict() {
local conflict_file="$1"
local conflict_backup="$CONFLICT_DIR/$(basename "$conflict_file")_$(date '+%Y%m%d_%H%M%S')"
mkdir -p "$CONFLICT_DIR"
mv "$conflict_file" "$conflict_backup"
log_message "已處理衝突檔案:$conflict_backup" "WARN"
}

# === 主邏輯 ===
main() {
# 確保單例執行
exec 200>"$LOCK_FILE" || exit 1
flock -n 200 || { log_message "程序已在執行中" "ERROR"; exit 1; }
trap cleanup EXIT

# 1. 提交本地 Git 變更
git_commit_changes

# 2. Rclone Bisync 同步
log_message "----"
log_message "開始 Rclone Bisync 同步" "INFO"
rclone bisync "$BACKUP_DIR" "$RCLONE_REMOTE:$RCLONE_PATH" \
-M \
--conflict-resolve "newer" \
--track-renames \
--check-access \
--check-filename TODO.md \
--verbose \
--recover \
--log-file "$LOG_FILE" || {
log_message "Rclone Bisync 同步失敗" "ERROR"
exit 1
}

# 3. 處理 Rclone 衝突檔案
conflict_files=$(find "$BACKUP_DIR" -type f -name "*_RCLONE_CONFLICT*")
if [[ -n "$conflict_files" ]]; then
# 處理衝突檔案
find "$BACKUP_DIR" -type f -name "*_RCLONE_CONFLICT*" -print0 | while IFS= read -r -d '' conflict_file; do
handle_sync_conflict "$conflict_file"
done
else
log_message "未發現衝突檔案,跳過處理" "INFO"
fi

# 4. 再次提交因 Rclone 引發的本地變更
git_commit_changes

# 5. 清理舊的衝突檔案
find "$CONFLICT_DIR" -type f -mtime +"$MAX_CONFLICT_AGE" -delete
log_message "清理過期衝突檔案完成" "INFO"

log_message "備份與同步流程完成" "INFO"
}

# === 執行主函數 ===
main

KDE Autostart

接著在 ~/.config/autostart   下面新增一個 obsidian_sync.desktop , 內容如下

1
2
3
4
5
6
7
8
[Desktop Entry]  
Name=Obsidian Sync
Comment=執行 Rclone 備份與同步 Obsidian
Exec=konsole --noclose --workdir /home/USERNAME/Documents/Dropbox_Obsidian -e /home/USERNAME/Documents/Dropbox_Obsidian/improved-rclone-bisync-git-script.sh
Icon=folder-sync
Terminal=false
Type=Application
Categories=Utility;

之後啟動 KDE 桌面的時候就會自動執行同步, 並且跳出視窗說明同步進展, 萬一有狀況可以手動介入處理 ,不過 RCLONE 速度有點慢, 還是比不上 Dropbox Windows Client

另外我也把 obsidian_sync.desktop 複製到桌面, 就可以手動同步

然後把 improved-rclone-bisync-git-script.sh 檔案放在 ~/.config/plasma-workspace/shutdown/, 關機的時候就會再同步一次

參考資料

參考資料:
RCLONE Bisync 官方文件
Arch Wiki : KDE