自架跨裝置-obsidian-同步windows--raspberry-pi--android--iphone哪些行得通哪些是死路為什麼

自架跨裝置 Obsidian 同步(Windows + Raspberry Pi + Android + iPhone):哪些行得通、哪些是死路、為什麼

一份 2026-06 的實戰紀錄:把同一個 Obsidian vault 自架、免費地,同步到一台 Windows 桌機、一台 24 小時開機的 Raspberry Pi、三台 Android 手機、一台 iPhone。

不是又一篇「快樂路徑」教學——各工具的官方文件都寫得很好。這篇補的是平常少有人寫的部分:那些撞牆的死路、為什麼別走、以及各平台特有的陷阱(尤其是 ARM 樹莓派和 iOS)。如果你正要做同一件事,這篇大概能幫你省下好幾個晚上。

作者:fifthadj。歡迎自由取用,不負任何保證——工具更新很快,請把這篇當「某個時間點的快照」,不是會維護的權威指南。


先講結論——最後行得通的方案

裝置 同步方式
Windows 桌機 Syncthing(同時兼任 iOS 的「橋」,見下)
Raspberry Pi 4(24 小時開機的 Linux 中樞) Syncthing 中樞 + CouchDB(給 iOS 用)
Android 手機(×3) Obsidian App + Syncthing-Fork
iPhone Obsidian App + Self-hosted LiveSync ↔︎ CouchDB

兩套同步刻意並存:

  • 桌機 + Android → Syncthing。 點對點、即時、雙向、私密(走 mesh VPN)。Android 的 Obsidian 可以「Open folder as vault」,直接開 Syncthing 同步的資料夾。
  • iPhone → obsidian-livesync(CouchDB)。 因為 iOS 的 Obsidian 不能開外部資料夾(沙盒限制),所以「Syncthing 同步到某資料夾」這招在 iOS 是死路。LiveSync 改成在 App 內部、透過資料庫同步。

最重要的一條心得:唯一長得像 Obsidian、用起來像 Obsidian 的,就是 Obsidian 本人。 每一個「用瀏覽器看你的 vault」的捷徑,付出的代價都比省下的多。


目標與限制

  • 一個 Obsidian vault,約 1.4 GB / 約 4,300 個檔——但大多是圖片(約 3,000 張 PNG/JPG,從 OneNote 匯入);真正的 .md 筆記只有約 1,100 篇。
  • 裝置:1 台 Windows PC、1 台 Raspberry Pi 4(arm64,當 24h 開機的主機)、3 台 Android、1 台 iPhone。
  • 需求:自架、免費、私密(全部走 mesh VPN,我用 Tailscale),最好能即時雙向

哪些行不通(以及為什麼)——先讀這段

在認命改用原生 App 之前,我用「網頁方案」試了三種讓手機/瀏覽器存取 vault 的辦法。三種現在都移除了。把原因寫下來,免得重蹈覆轍。

1. SilverBullet——設計上就會弄斷 Obsidian 的短連結

SilverBullet 是個很棒的自架、可編輯 markdown PWA。但 Obsidian 用的是扁平短連結——[[筆記名]],不含資料夾路徑——靠全 vault 搜尋來解析。SilverBullet 把 [[名稱]] 當成「從根目錄算的絕對頁名」。 所以在有資料夾的 vault 裡,每一個短連結都會斷:它指向根目錄、那裡沒有那頁、你就得到空白或「建立新頁」。

而且沒有設定可以改。社群的解法是寫腳本把每個連結改寫成完整路徑——等於把整個 vault 動刀。不值得。(SilverBullet 很好——前提是你的 vault 本來就是在 SilverBullet 裡長出來的;拿來吃既有的 Obsidian vault 就水土不服。)

2. obsidian-remote——想法對,但在 ARM 上壞掉

obsidian-remote 在容器裡跑真正的 Obsidian 桌面版,串流到你的瀏覽器。這確實解掉了相容性問題(它就是 Obsidian)。但是:

  • 它的 :arm64 映像桌面後端(xrdp + Guacamole,一套 s6 監管的服務)在 Raspberry Pi 上起不來:主 xrdp daemon 從不 listen 3389,log 反覆出現 s6-svwait: ... xrdp-sesman: No such file or directory。網頁前端有服務,但桌面 session 一直沒起來。
  • 就算它能跑,從一台 Pi 24 小時串流一個 Electron 桌面也很吃資源,而且手機上用觸控操作 VNC 桌面體驗很差。

順帶一提:給容器加大 /dev/shm(預設只有 64 MB)用 --shm-size=1g 是 Docker 裡跑 Electron/Chromium 類 App 的必要動作——但這個案例加了也沒救活。

3. Perlite——能用,但它是唯讀檢視器

Perlite 是個專為 Obsidian vault 做的 PHP 網頁檢視器,所以它能正確解析短連結(實測:[[001_foo]] 渲染成 /folder/subfolder/001_foois-unresolved: 0),而且是 server 端渲染(快——不必把 1.4 GB 灌進瀏覽器)。如果你只要唯讀瀏覽,它就是對的工具。但我要編輯,而且預設主題沒打動人。可敬,但用錯地方。

ARM 注意:常見的 sec77/perlite Docker 映像只有 amd64 + armv7,沒有 arm64。在 64 位元 Pi 上,改用「現成 nginx + PHP-FPM 跑 bare PHP」部署即可(它本來就只是一堆 PHP 檔 + 一個 vault 資料夾)。

三者的共同結論: 重度 Obsidian 結構的 vault(短連結 + 資料夾 + 大量附件)撐不過輕量網頁仿製品;而「真 Obsidian 跑在瀏覽器」在 ARM 上又太脆。把真 Obsidian 裝到每台裝置上


哪些行得通

桌機 + Android:Syncthing

  • 桌機和 24h 開機的 Pi 都裝 Syncthing;配對;把 vault 資料夾以 send-receive(雙向)分享。
  • 混版沒問題。 我最後是 Windows 跑 v2.1.x(winget)、Pi 跑 v1.30(官方 apt repo 的 stable channel 當時還是 1.x)。Syncthing 保證 v2 ↔︎ v1.27+ 線傳相容,別硬要統一版本。
  • 連線:同網段靠 local discovery 直接連;離開網段就把每個 peer 的 mesh VPN 位址寫死(tcp://<vpn-ip>:22000),到哪都能連。我把 global discovery + relay 都關掉,筆記就完全不碰 Syncthing 的公共設施。
  • 值得開的安全網:staggered 版本控制(每檔還原,存在 .stversions/)和合理的 .stignore(見下)。
  • Android:裝 Syncthing-Fork(Catfriend1——維護中的 fork;原本的官方 Android App 已停更)+ Obsidian App。把 vault 同步到一個一般資料夾,例如 /storage/emulated/0/Obsidian/Vault不要用 App 私有的 Android/data/...——Obsidian 讀不到別的 App 的沙盒),然後在 Obsidian 用「Open folder as vault」開它。

iPhone:obsidian-livesync + CouchDB(因為 iOS 是另一回事)

iOS 的 Obsidian 不能開任意外部資料夾——它只能把 vault 放在 iCloud 或 App 自己的容器裡。所以 Syncthing 同步來的資料夾它碰不到(這也順便否決了「iOS 上用 Möbius Sync / SyncTrain」的念頭——它們同步了檔案,但 Obsidian 一樣開不到)。自架的解法是 obsidian-livesync,它透過 CouchDB 資料庫在 Obsidian 內部同步。

  • 在 24h 開機的主機上跑 CouchDB(couchdb:3,Docker;映像是多架構、含 arm64)。
  • 套用 LiveSync 要求的 CouchDB 設定(single-node、給 app://obsidian.md + capacitor://localhost 的 CORS、require_valid_user、放大的 max_http_request_size / max_document_size)。
  • 透過反向代理在你的 mesh VPN 上以 HTTPS 對外。
  • 橋: LiveSync 是個 Obsidian 外掛、不是伺服器——所以得有「某個在跑 Obsidian + LiveSync 的東西」把既有(Syncthing 同步的)vault 餵進 CouchDB。最簡單可靠的選擇就是你桌機上的 Obsidian + LiveSync 外掛。只要它開著,就把「Syncthing 檔案 ↔︎ CouchDB」接起來。
    • 老實說的取捨:iPhone 的改動要傳到 Android/桌機,得等桌機的 Obsidian 開著(iPhone ↔︎ CouchDB 本身隨時是通的)。把橋改放在 24h 開機的 Pi 上則需要無頭 Obsidian(xvfb + 把 GUI App 當 24h daemon)——做得到,但是整套最脆的一塊,而且還得用 .stignore 把 LiveSync 外掛設定隔離、免得它傳染給你的 Syncthing 裝置。為了穩定,我選桌機當橋。

踩坑 / 排錯(真正有用的部分)

Syncthing

  • Android 上「連得上、馬上掉、每約 20 秒重連一次、完全沒傳輸」→ 是電池最佳化把 App 砍了。把 Syncthing-Fork 設成電池不受限制、保持背景常駐。這是 Android 上最大的時間黑洞。
  • 裝置連上了,但資料夾停在 0% / 沒在傳」→ 接受「裝置」≠ 接受「資料夾」。這是兩個動作。如果資料夾分享提示一直沒跳(連通知都開了也沒跳),從伺服器端重送邀請:把該裝置從資料夾的分享清單移除再重加(syncthing cli config folders <id> devices <DEVICE_ID> delete 然後 ... devices add --device-id <ID>),或開該裝置的 Web GUI 在那邊接受那條黃色「wants to share」橫幅。
  • 新裝置必須真的連上 mesh VPN(已登入/已連線),不是「裝好了」就好。
  • 位元組不同、但行數一樣的同步衝突幾乎都是 CRLF vs LF——純外觀差異、內容相同。驗證一下(去掉 \r 再比)就可以刪掉那些 .sync-conflict-* 副本,無害。
  • .stignore 擋掉每機各自會變動的東西,例如:
    (?d).DS_Store
    (?d)Thumbs.db
    (?d)desktop.ini
    /.trash
    /.obsidian/workspace.json
    /.obsidian/workspace-mobile.json
    /.obsidian/cache
  • vault 在手機上太大?我的 1.4 GB 大多是圖。要讓某台手機只同步文字,就在那台的 Syncthing-Fork 設 ignore patterns(*.png*.jpg_resources…)並在第一次同步前設好,或在 iOS 用 LiveSync 的「Maximum file size」。(ignore patterns 是每裝置各自的,其他裝置照樣保有圖片。)

CouchDB + LiveSync

  • couchdb Docker 映像是用 uid 5984 跑的——掛載的 data/etc 目錄要 chown -R 5984:5984,否則它寫不進去。
  • single_node=true,CouchDB 才會在第一次啟動建好 _users/_replicator
  • LiveSync 的設定順序是地雷: 資料的那台(桌機)先設定、並推送/初始化遠端;空的那台(iPhone)後設定、並抓下來(fetch)。如果空的那台去推送,會用「空的」蓋掉遠端。
  • 第一台 = 手動設定。「Setup URI」(一串 obsidian://setuplivesync?settings=... + 它的 passphrase)是你在第 1 台產生、拿去第 2 台匯入的(貼上、或掃 QR)。別把你的 CouchDB 網址貼進「Setup URI」欄——會跳「Setup-URI not valid」。
  • LiveSync 一開始的「STORAGE → DB」階段是本機的(把檔案讀進本機 DB);在這階段結束、replication 開始前,遠端的 doc_count 不會動。耐心點,盯遠端 DB 的 doc_count/大小來確認真的在上傳。

nginx 反向代理

  • nginx -t && systemctl reload nginx 之後,新加的 location 可能會短暫 404(舊 worker 還在收尾)——等幾秒再下「我設錯了」的結論。
  • 對於掛在 subpath、但本身改寫路徑的 App(例如 CouchDB 在 /couchdb/),proxy_pass http://127.0.0.1:5984/;帶結尾斜線會去掉前綴。對於需要看到自己前綴的 App(自己設 base-path/URL-prefix),proxy_pass不要帶結尾斜線。
  • CouchDB + LiveSync 需要大/不限的 client_max_body_size,以及 WebSocket-friendly 的代理設定。

跨平台編輯陷阱

  • 用 Windows 編輯器改 Linux 設定檔(.sh.ini、systemd unit)可能寫成 CRLF、弄壞 shebang/解析——請在 Linux 端改或強制 LF。
  • 每台裝置各跑一個 Obsidian=各自有自己的 .obsidian/——自己決定要不要同步它(共用主題/外掛,但要注意 workspace.json 一直變動),還是 .stignore 掉(每裝置獨立)。

還會再做一次嗎?

對大多數人:

  • 桌機 + Android: Syncthing + Obsidian App 很讚,免費、私密、即時。只要記得電池最佳化那個坑。
  • iPhone 是難的那塊。 自架=obsidian-livesync + CouchDB(加上上面說的橋的取捨)。如果你不介意付費,官方的 Obsidian Sync 在 iOS 上省事很多。iCloud 大概只有在你整套 Apple 生態系 + 有 Mac 時才好用。
  • 想用輕量網頁 App 在既有 Obsidian vault 上頂替 Obsidian。把真 Obsidian 裝到裝置上。

老實的總結:工具本身不稀奇——價值在於哪些路是死路、為什麼,以及那些 ARM/iOS 的眉角。希望這份清單能幫你省下我繞過的那些彎路。

留言

這個網誌中的熱門文章

架站資源整理清單

這次多機聯防的程式筆記