はじめに
こちらの記事を参考に、Raspberry Pi+Self-hosted LiveSyncでObsidianの同期環境を作りました。
ただ、記事の手順どおりに進めたところ途中でエラーが出たので、構成を少し変えて構築しました。さらに、構築後に「スマホにQRコードで参加できたのに、変更がまったく同期されない」という問題でしばらく詰まりました。
この記事では、参考記事からの変更点と、同期されない問題の原因と解決方法をまとめます。Self-hosted LiveSyncはv1.0系で設定画面やコマンド名が大きく変わっているので、同じところで詰まっている人の参考になればうれしいです。
ラズパイ本体のセットアップ(OSの書き込み・SSH接続)とTailscaleの導入は、今回の作業より前に済ませていました。この記事ではそれ以降の手順を扱います。
環境
| 項目 | 内容 |
|---|---|
| サーバー | Raspberry Pi(Raspberry Pi OS 64bit) |
| DB | Apache CouchDB 3(Docker) |
| ネットワーク | Tailscale(tailscale serve でHTTPS化) |
| PC | Windows / Obsidian 1.14.4 |
| モバイル | iPhone / iPad |
| プラグイン | Self-hosted LiveSync 1.0.36 |
参考記事からの変更点
| 項目 | 参考記事 | 今回 | 理由 |
|---|---|---|---|
| CouchDBのイメージ | couchdb:latest |
couchdb:3 |
将来のメジャーアップデートで急に壊れないように固定 |
| CouchDBの設定 | プラグインの「Detect and Fix」で修正 |
local.ini で事前に設定 |
CORSなどを最初から入れておく |
| ポートの公開 | -p 5984:5984 |
-p 127.0.0.1:5984:5984 |
ラズパイの外から直接アクセスさせない |
| 接続URL | http://100.x.x.x:5984 |
https://<ホスト名>.<tailnet名>.ts.net |
モバイル版ObsidianはHTTPSが必要なため(後述) |
| E2EE | なし | あり | 好みで有効化 |
構築手順
0. OSが64bitか確認する
dpkg --print-architecture
arm64 と出ればOKです。armhf と出た場合は32bit版なので、Raspberry Pi OS Lite (64-bit) を入れ直す必要があります。
- CouchDBの公式Dockerイメージは amd64 / arm64 / ppc64le 向けしかなく、32bit ARMでは
no matching manifest for linux/arm/v7になります。 - Docker Engine v29以降は、32bit版Raspberry Pi OS向けのパッケージが提供されていません。
-
uname -mは32bit OSでもaarch64と表示されることがあるので、判定にはdpkgを使うのが確実です。
1. Dockerを入れる
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
exit
SSHで入り直してから、動作確認をします。
docker run --rm hello-world
2. CouchDBの設定ファイル(local.ini)を作る
mkdir -p ~/couchdb/data
cat > ~/couchdb/local.ini <<'EOF'
[couchdb]
single_node = true
max_document_size = 50000000
[chttpd]
require_valid_user = true
max_http_request_size = 4294967296
enable_cors = true
[chttpd_auth]
require_valid_user = true
authentication_redirect = /_utils/session.html
[httpd]
WWW-Authenticate = Basic realm="couchdb"
[cors]
origins = app://obsidian.md,capacitor://localhost,http://localhost
credentials = true
headers = accept, authorization, content-type, origin, referer
methods = GET,PUT,POST,HEAD,DELETE
max_age = 3600
EOF
single_node = true にしておくと、_users などのシステムDBが起動時に自動で作られます。
3. CouchDBを起動する
docker run -d --name livesync \
-e COUCHDB_USER=ユーザー名 \
-e COUCHDB_PASSWORD=パスワード \
-v "$HOME/couchdb/data:/opt/couchdb/data" \
-v "$HOME/couchdb/local.ini:/opt/couchdb/etc/local.ini" \
-p 127.0.0.1:5984:5984 \
--restart unless-stopped \
couchdb:3
動作確認です。{"couchdb":"Welcome",...} が返ればOKです。
curl -u ユーザー名:パスワード http://127.0.0.1:5984/
パスワードは英数字だけの長いものにしておくと、記号のエスケープでつまずかずに済みます。
4. Tailscale serveでHTTPS化する
sudo tailscale serve --bg 5984
sudo tailscale serve status
初回は、HTTPS証明書を有効にするための https://login.tailscale.com/... というURLが表示されることがあります。ブラウザで開いて承認してください(MagicDNSも必要です)。
serve status に表示される https://<ホスト名>.<tailnet名>.ts.net が、Obsidianに入力するURLになります。PCのTailscaleをONにした状態で https://<ホスト名>.<tailnet名>.ts.net/_utils を開き、CouchDBの管理画面が出ればサーバー側は完成です。
この機能を使うと、ホスト名が公開の証明書ログ(Certificate Transparency)に載ります。本名など、知られたくない言葉をホスト名に入れないようにしましょう。
参考記事にある「Disable key expiry」(ラズパイが180日でTailscaleからログアウトされないようにする設定)も、あわせて設定しておくのがおすすめです。
5. Obsidianの設定
PC(1台目)とスマホ(2台目以降)の設定は、参考記事の⑤・⑥の手順どおりです。違うのは次の点だけです。
- URLは
https://<ホスト名>.<tailnet名>.ts.netにする(:5984は付けない) -
local.iniで設定済みなので、「Detect and Fix CouchDB Issues」のチェックはそのまま通る - 同期モードは、すべての端末で「LiveSync」にする
ハマったこと:QRで参加できたのに、変更が同期されない
症状
- PCからQRコードでiPhone・iPadに参加させ、最初の取り込みまではできた
- ところが、その後どの端末で編集しても、ほかの端末に反映されない
- 右上の「Sync:」は 💤(LiveSync有効・変更待ち)で、エラーは出ていない
- 同期モードも、PC・iPhoneともに「LiveSync 同期」になっている
確認したこと(原因ではなかったもの)
-
Scram Switches:初回の取り込み(Fetch)の途中で止まると、「Suspend file watching」「Suspend database reflecting」がONのまま残ることがあります。今回はどちらもOFFでした。
- v1.0系では、設定の 🛠️「Maintenance and recovery」→「Hatch」→「Scram Switches」にあります(旧版の「Hatch」タブではありません)。
- プラグインのバージョン:全端末で同じでした。
原因:端末間の設定の不一致で、同期が始まっていなかった
コマンドパレットの「Self-hosted LiveSync: Generate full report for opening the issue with debug info」でデバッグレポートを出してみると、同期を始めようとするたびに次のログが出ていました。
Fetched synchronisation parameters
Synchronisation parameters fetched successfully
LiveSyncの前に、まずOneShotを開始します...
OneShot同期を開始... (pullOnly)
Some mismatches have been detected in the configuration between devices. Running a manual replication will attempt to resolve this issue.
サーバーに接続できませんでした。
-
Synchronisation parameters fetched successfullyが出ているので、サーバーとの通信自体はできています。 - 「サーバーに接続できませんでした」は紛らわしい表示で、実際は 端末間の設定の不一致を検出したため、同期を始めずに止めている 状態でした。
- 編集内容はPC内のローカルDBに保存されるだけ(ログ上は
STORAGE -> DB)で、サーバーには一度も送られていませんでした。ステータスバーも↓ 0のままです。 - 表示が 💤 でも、実際には同期が止まっていることがある、というのが今回いちばんの落とし穴でした。
ログのメッセージどおり手動同期(v1.0系では「Self-hosted LiveSync: Sync now」。旧「Replicate now」)を実行しましたが、不一致を解決するダイアログは表示されず、状況は変わりませんでした。
レポートの冒頭には ⚠️ Missing functions in onBindFunction: ModuleResolvingMismatchedTweaks... という警告も出ていました。設定の不一致を解決する部分の警告なので、ダイアログが出なかったことと関係しているのかもしれません。ただ、確認はできていません。
なぜ設定の不一致が起きたのか、根本原因は特定できていません。過去にも、同じメッセージがバージョンの違いによる誤検出で出ていた例(GitHub Issue #1180、1.0.28で修正)があります。
解決:PCを基準にサーバーを作り直し、スマホ側も作り直す
1. バックアップを取る
PCの保管庫フォルダを、フォルダごとコピーしておきます。スマホだけで書いた内容がある場合は、先にPCへ写しておきます(この作業で消えるため)。
2. PCでサーバーを上書きする
設定の 🛠️「Maintenance and recovery」→「Maintenance」→「Total Overhaul」→ 「Overwrite Server Data with This Device's Files」 を実行します。
確認画面では、次のように選びました。
- チェックボックス3つ(ほかの端末の変更が失われる可能性/ほかの端末は作り直しが必要/元に戻せない)にすべてチェック
- 「I have created a backup of my Vault.」を選択
- Advanced の「Use this device's settings」にチェック:サーバー側に残っている設定を読み込まず、このPCの設定を基準に作り直すオプションです。今回は設定の不一致が原因だったので、これを選びました。
完了後、PCのステータスは 💤 で ↓ 1 になり、ようやくサーバーとのやり取りが始まりました。
3. iPhoneでローカルDBを作り直す
iPhoneでも、🛠️「Maintenance and recovery」→「Maintenance」→「Rebuilding Operations (Local)」→ 「Reset Synchronisation on This Device」 を実行します。日本語表示では「リモートからローカルデータベースを復元または再構築」という名前でした。
4. 同期モードをLiveSyncに戻す(ここでも詰まった)
作り直したあと、ノートの中身はPCと同じになりました。ところが、iPhoneにまた「Some mismatches have been detected…」の通知が出て、ステータスは ⏹️(停止)のまま、編集しても同期されません。
原因は、作り直しのときに同期モードが「LiveSync」から外れていた ことでした。同期設定で同期モードを「LiveSync 同期」に戻したところ、PC ⇔ iPhone の同期が動くようになりました。
ローカルDBの作り直しやサーバーの上書きのあとは、全端末で同期モードがLiveSyncになっているかを必ず確認しましょう。
v1.0系で名前・場所が変わっていたもの
古い記事を見ながら作業すると見つからないものが多かったので、まとめておきます。
| 古い記事での名前 | v1.0系(Obsidian 1.13以降)での名前・場所 |
|---|---|
| コマンド「Replicate now」 | コマンド「Sync now」 |
| 「Hatch」タブ | 🛠️「Maintenance and recovery」の中の「Hatch」 |
| 「Rebuild everything」など | 🛠️「Maintenance and recovery」→「Maintenance」→「Overwrite Server Data with This Device's Files」 |
| 「Fetch from remote」など | 同上 →「Reset Synchronisation on This Device」 |
| 他の端末用のQRコード | 📲「Set up other devices」 |
ステータス表示の見方
画面右上(またはステータスバー)の「Sync:」の表示です。
| 表示 | 意味 |
|---|---|
| ⏹️ | 停止中。同期モードがLiveSyncになっていない可能性が高い |
| 💤 | LiveSync有効・変更待ち(ただし、今回のように裏で止まっていることもある) |
| ⚡️ | 同期中 |
| ⚠ | エラー(TailscaleがOFFになっていないかなどを確認) |
| ↑ / ↓ の数字 | 送信・受信した数。編集しても増えなければ同期されていない |
iPhone・iPadは、Obsidianを開いている間だけ同期されます。
まとめ
- 32bit OSでは公式のCouchDBイメージが動かないので、Raspberry Pi OSは64bit版にする
-
tailscale serveを使えば、証明書の管理なしでHTTPS化でき、スマホからも接続できる - 「💤なのに同期されない」ときは、デバッグレポートで
Some mismatches have been detectedが出ていないか確認する - 設定の不一致は、PCを基準に「Overwrite Server Data with This Device's Files」(+「Use this device's settings」)で作り直し、スマホ側は「Reset Synchronisation on This Device」で直った
- 作り直したあとは、同期モードがLiveSyncに戻っているか確認する
参考
- Raspberry Pi + Self-hosted LiveSyncでObsidianの爆速同期環境を構築する(nobadag)
- vrtmrz/obsidian-livesync(GitHub)
- obsidian-livesync docs/settings.md
- obsidian-livesync docs/troubleshooting.md
- Issue #1180: Some mismatches have been detected in the configuration between devices
- Install Docker Engine on Raspberry Pi OS (32-bit / armhf)(Docker Docs)
- Enabling HTTPS(Tailscale Docs)