プログラミング

iPadのObsidianをSyncthingで同期する方法|無料アプリSyncTrainを使う

iPadのObsidianボルトを、無料・オープンソースのSyncTrainでSyncthingに接続して同期した手順の記録です。Folder typeをExisting folderにしないとObsidianから開けない最大の落とし穴、.stignoreの編集方法、iOSのバックグラウンド同期の制約までまとめます。

目次

はじめに

iPadでも、パソコンやスマホと同じObsidianのメモを見たいと思ったことはありませんか。
Obsidian公式のObsidian Syncは有料なので、すでにSyncthingを使っているなら追加料金なしで同期したいですよね。

私はWindows PCとAndroidスマホ、自宅サーバーの間でObsidianのボルトを同期しており、そこへiPadを追加しました。
使ったのは、無料のiOS向けSyncthingクライアント「SyncTrain」です。
初回同期では8,396ファイル、約480MBのデータが最後まで同期できました。

この記事では、SyncTrainを選んだ理由から、実際のセットアップ、私が詰まったFolder typeの設定、iOSのバックグラウンド同期の制約まで紹介します。
既存のSyncthing環境がある方なら、iPad側は無料アプリだけで追加できます。

SyncTrainとは・選んだ理由

SyncTrainは、iPadやiPhoneからSyncthingへ接続するためのアプリです。
ソースコードはGitHubのpixelspark/sushitrainで公開されています。

iOS向けのSyncthingクライアントとしてはMöbius Syncもありますが、私は次の違いからSyncTrainを選びました。

項目 SyncTrain Möbius Sync
価格 無料・アプリ内課金なし $4.99
ソース公開 全部を公開(MPL-2.0) Syncthingコア以外はクローズド
App Storeのデータ収集宣言 収集しない —
Obsidianコンテナへの同期 Existing folderで対応 Pick External Folderで対応
Shortcuts連携 あり 限定的

Möbius Syncの公式FAQでは、外部フォルダ機能について次のように警告しています。

This feature is DANGEROUS ... there is a chance data corruption or data loss can occur

SyncTrainも別アプリのコンテナへ書き込む点は同じです。
そのうえで、無料で使えて、MPL-2.0でソースがすべて公開され、開発も続いていることが決め手になりました。
導入時点の最新版はv2.6.77で、公開日は2026年5月27日でした。

みなさんそれぞれ基準はあると思うので、価格やソース公開、Shortcuts連携などを比較して選んでみてください。

前提の構成

私の環境では、自宅サーバーでSyncthingが動いており、Windows PCとAndroidスマホはすでに同期済みです。
今回のiPadも、Windows PCやAndroidスマホとは直接つながず、自宅サーバーだけに接続しました。

構成は、どの端末も自宅サーバーとだけつながるスター型です。

  • Windows PC ⇔ 自宅サーバー
  • Androidスマホ ⇔ 自宅サーバー
  • iPad ⇔ 自宅サーバー(今回追加)

iPadから自宅サーバーへの接続にはTailscaleを使っています。
TailscaleのIPアドレスは100.x.x.xのような形式で、SyncTrainに直接アドレスを追加する場合はtcp://100.x.x.x:22000のように指定します。

Syncthing自体の導入は、Obsidian SyncをSyncthingで無料代替する方法にまとめています。
Tailscaleの導入は、Tailscaleで自宅サーバーに外から安全にアクセスするをご覧ください。

それでは、iPadを追加する手順を紹介していきたいと思います。

セットアップ手順

1. iPadにTailscaleをインストールする

最初にiPadへTailscaleをインストールし、ログインして自分のtailnetへ参加させます。
これで、iPadからTailscale経由で自宅サーバーへ接続できる状態にします。

2. Obsidianをインストールして仮ボルトを作る

iPadへObsidianをインストールし、仮のボルトを1つ作ります。
この仮ボルトは使い続けるためのものではなく、Obsidianのコンテナをファイルアプリへ表示させるための捨て駒です。

仮ボルトを作らないと、ファイルアプリの「自分のiPad」にObsidianが出てきません。
後で同期先を選ぶために必要なので、先に作っておきます。

3. ファイルアプリで空のvaultフォルダを作る

ファイルアプリを開き、「自分のiPad」→「Obsidian」と進みます。
その中に、同期先となる空のvaultフォルダを作ります。

最終的な保存場所は「自分のiPad → Obsidian → vault」です。
この場所を後ほどSyncTrainのFolder typeで指定します。

4. SyncTrainをインストールする

iPadへSyncTrainをインストールします。
アプリ内課金はなく、無料で利用できます。

5. サーバー側でiPadを登録してフォルダを共有する

自宅サーバー側のSyncthingで、iPadをデバイスとして登録します。
続いて、既存のObsidianフォルダをiPadへ共有します。

操作にはSyncthingのWeb UIかREST APIを使います。
Web UIへTailscale経由で接続する場合は、http://100.x.x.x:8384のようなアドレスになります。

登録するデバイスIDには、iPadのSyncTrainに表示される値を使います。

6. SyncTrainへサーバーを追加する

iPadのSyncTrainで、自宅サーバーをデバイスとして追加します。
Syncthingは相互に承認する必要があるため、iPad側とサーバー側の両方で登録を完了させます。

アドレスはdynamicのままで大丈夫です。
外出先からTailscale経由で直接つなぐアドレスとして、tcp://100.x.x.x:22000のような値を追加することもできます。

7. 共有フォルダをExisting folder...で追加する

SyncTrainで「+ Add folder...」を開き、次のように設定します。

項目 設定値
Folder ID obsidian-vaultのような自分のフォルダID。共有オファー経由では自動入力され、変更できません
Folder type Existing folder...を選び、Obsidian → vaultを指定
Synchronize All files
Share with 自宅サーバー

設定できたら、右上の「Add folder」を押します。
特に重要なのはFolder typeで、ここを既定値のまま進めるとObsidianからボルトを開けません。
理由は後の「最大の落とし穴」で詳しく説明します。

8. 初回同期を完走させる

フォルダを追加したら、SyncTrainを前面に置いたまま初回同期を進めます。
iOSではバックグラウンド実行に制約があるため、初回はアプリを開いたまま放置します。

途中で画面が消えないように、自動ロックを切っておくと確実です。
私の環境では、8,396ファイル、約480MBの初回同期が完了しました。

9. .stignoreへ競合対策を追加する

同期されたファイルの中にconflict-ignore.txtが到着したことを確認します。
確認できたら、SyncTrainの対象フォルダ設定にある「Files to ignore」を開き、.stignoreへ次の1行を追加します。

#include conflict-ignore.txt

私の環境では、このファイルでworkspace*.jsonを除外しています。

10. Obsidianの「Manage Vaults」でvaultを開く

Obsidianへ戻り、「Manage Vaults」から同期済みのvaultを開きます。
ここまで進めば、iPadで既存のObsidianボルトを閲覧できます。

11. 仮ボルトを削除する

最後に、手順2で作った仮ボルトを削除します。
仮ボルトはObsidianのコンテナを表示させるためだけに作ったものです。

私は、同期したvaultが問題なく開けることを確認してから削除しました。

最大の落とし穴:Folder typeは「Existing folder...」

私が実際に詰まったのが、フォルダ追加時のFolder typeです。
既定の「Regular folder」で追加すると同期自体は始まりますが、そのフォルダをObsidianから開けません。

Regular folderでは、SyncTrainのコンテナ内にFolder IDと同じ名前のフォルダが作られます。
たとえばFolder IDをobsidian-vaultにすると、SyncTrain側の領域にobsidian-vaultフォルダができます。

しかし、iOSのObsidianがボルトとして開けるのはObsidian自身のコンテナ内です。
そのため、SyncTrainのコンテナへ同期しても、Obsidianからはボルトとして開けません。

SyncTrainのAddFolderView.swiftでは、フォルダ追加時に次の処理が行われています。
コードの直後に日本語で説明するので、ここは読み飛ばしても大丈夫です。

if let fp = self.folderPath {
    try BookmarkManager.shared.saveBookmark(folderID: self.folderID, url: fp)
    try appState.client.addFolder(self.folderID, folderPath: fp.path(percentEncoded: false), ...)
} else {
    try appState.client.addFolder(self.folderID, folderPath: "", ...)
}

日本語にすると、Existing folderではファイルピッカーで選んだパスがfolderPathへ入り、その場所がそのまま同期先になります。
Folder IDと同じ名前のサブフォルダは作られません。

一方のRegular folderでは、folderPathが空のまま追加されます。
その結果、SyncTrainのコンテナ内にFolder ID名のフォルダが作られます。

フォルダ名をFolder IDと一致させる必要があるのは、SyncTrainのコンテナ内へ置く場合だけです。
Existing folderでコンテナ外の場所を選ぶ場合、この制約はありません。

別のデバイスから共有されたフォルダではFolder IDを変更できませんが、Folder typeは選べます。
共有オファーを受けた場合も、Existing folder...を選んでObsidian → vaultを指定してください。

追加後は、設定画面から同期先のパスを変更できません。
間違えた場合は、対象フォルダを開き、右上の三点メニューから「folder actions」へ進んで削除し、正しい設定で作り直します。

その他の注意点

Synchronizeは必ず「All files」にする

フォルダ追加時のSynchronizeは「All files」を選びます。
「Selected files」には、READMEに記載された次の既知問題があります。

  1. ローカルでファイル名を変更しても、リモートでは削除と新規作成として扱われ、名前変更が同期されません。
  2. リモートでファイル名を変更した場合、選択していないファイルは表示されません。
  3. ローカルで新しく作ったファイルが未選択だと同期されません。

Obsidianのボルト全体を同期する今回の用途では、All filesで大丈夫です。

.stignoreはSyncTrainの画面から編集する

iPadの.stignoreは、ファイルアプリから直接編集するのではありません。
SyncTrainで対象フォルダを開き、フォルダ設定内の「Files to ignore」画面から編集します。

画面内には「Ignore patterns」セクションがあり、「Add line」「Set default patterns」「Remove all patterns」「Save」の各ボタンがあります。
#include conflict-ignore.txtを追加して「Save」を押した後は、確認画面で「Apply patterns」を選びます。

「Apply patterns and clean folder」は選ばないでください。
こちらは新しい無視パターンを適用するだけでなく、無視対象になったファイルをiPadのローカルフォルダから削除します。

画像の除外はしない(iOSでは不要)

Androidでは、同期した画像がギャラリーアプリに並んでしまうため、SyncthingでAndroidだけ画像を同期させないの設定で画像を除外しています。
一方、iPadでは画像を除外していません。
iOSの写真アプリはアプリのサンドボックス内をスキャンしないため、Androidのようなギャラリー汚染が起きないからです。

バックグラウンド同期の実態

iOSでは、SyncTrainをバックグラウンドで動かし続けることはできません。
これはiOSの制約で、Möbius Syncでも同じです。

開発者が挙げている同期手段は次の4つです。

手段 内容
短時間バックグラウンドタスク 最大30秒。アプリ起動の30分後以降に要求され、低電力モードでは動きません
長時間バックグラウンドタスク 最大5分。外部電源とインターネットの両方へ接続している場合だけ動きます
継続バックグラウンドタスク iOS 26以降で最大1時間。アプリ内で明示的にタップして開始する必要があります
Shortcuts連携 ループさせて同期を繰り返します

どの手段も、実際のスケジュールと実行時間はiOSが決めるため、動作の保証はありません。

SyncTrain側には、バックグラウンド同期に関する3つのトグルがあります。
Shortcutsを組まない場合は、この設定に任せることになります。

トグル 内容
While charging (long) 充電中の長時間同期
While on battery (short) バッテリー駆動時の短時間同期
Briefly after leaving app アプリを離れた直後の短時間同期

Obsidianと組み合わせる方法としては、Shortcutsのオートメーションも紹介されています。
まず「Rescan folder」→「Synchronize for a while」の順に実行するカスタムショートカットを1つ作ります。
次に、Obsidianを開いたときと閉じたときの2つのオートメーションから、そのショートカットを呼び出します。
このとき「実行前に尋ねる」はオフにします。

ただし、私はまだこのShortcutsオートメーションを組んでいません。
当面はSyncTrainにある3つのトグルへ任せています。

iPadで読むだけなら、同期が遅れても表示される内容が少し古いだけで、コンフリクトは起きません。
iPadでも編集する場合は、書く前と書いた後に同期を走らせます。

まとめ

いかがでしたか。
既存のSyncthing環境があれば、無料のSyncTrainを使ってiPadのObsidianボルトを追加できます。
私の環境では、8,396ファイル、約480MBの初回同期を完走できました。

手順をまとめると次のとおりです。

  1. iPadへTailscaleを入れてtailnetへ参加させる
  2. Obsidianを入れ、コンテナを表示するための仮ボルトを作る
  3. ファイルアプリでObsidian → vaultの空フォルダを作る
  4. SyncTrainをインストールする
  5. サーバー側でiPadを登録し、Obsidianフォルダを共有する
  6. SyncTrainへ自宅サーバーを追加し、両方の端末で承認する
  7. Folder typeをExisting folder...、SynchronizeをAll filesにして共有フォルダを追加する
  8. SyncTrainを前面に置き、自動ロックを切って初回同期を完走させる
  9. 「Files to ignore」で#include conflict-ignore.txtを追加し、「Apply patterns」を選ぶ
  10. Obsidianの「Manage Vaults」から同期済みのvaultを開く
  11. 同期後、不要になった仮ボルトを削除する

最大の落とし穴は、Folder typeを既定のRegular folderのままにしないことです。
ここさえExisting folderに変えて正しい保存先を選べば、後は手順どおりに進められるかと思います。

この記事が誰かの役に立てばうれしいです。

コメント

読み込んでいます…

この記事を書いた人

リットン

都内金融機関で経営企画とデータアナリストをしているアラサー。
文系の非エンジニアですが、独学で始めた Python と生成AIにすっかりはまりました。
プログラミング・サッカー・ミステリ紹介など、好きなことを好きに書いています。

プロフィールを見る →