devAlice
← Multi-OS

ファイル同期 — Syncthing で Mac ↔ Windows フォルダを P2P 同期

クラウドを使わず2台のマシン間でフォルダをリアルタイム同期。dotfiles / メモ / プロジェクトをどこでも同一に保つ。

Mac と Windows を両方使っていれば、必ずこの問いにぶつかる:「今日作ったファイル、どうやってもう一方の機に持っていくんだ?」 USB、Dropbox、iCloud、OneDrive、Git、SCP — それぞれに明確な弱点がある。クラウドはサイズ制限とプライバシーの懸念があり、Git はバイナリや中間ファイルには向かず、SCP は自動化できない。以前はクラウドストレージで全て解決できると思っていた。いまでは P2P 直接同期こそがプライバシーとコストの両方を満たす選択だと考える — 中央サーバーを経由しないからだ。

Syncthing がこれを解決する:P2P + オープンソース + 無料。中央サーバーなしに2台が直接同期する。インターネットが届かないときは LAN にフォールバックする。このガイドでは Mac + Windows 11 のセットアップと実践的な同期パターンを解説する。

TL;DR

  1. 両方に Syncthing をインストール — Mac は brew、Windows は winget
  2. 各機のデバイス ID を交換 — 初回1回だけの登録
  3. フォルダを共有 — 片方が提案し、もう片方が承認
  4. .stignore で deps / シークレットを除外 — node_modules や .env は絶対に同期しない

前提条件

  • Mac:macOS 12+(Homebrew インストール済み)— Mac 初期設定
  • Windows:Windows 10/11(winget 利用可能)— Windows 初期設定
  • 両機が同一 LAN にあると最速(ネットワーク越しにも動作する)
  • 同期には両機が起動している必要がある(スリープ中の機はウェイク後に同期される)

1. Syncthing を選ぶ理由 — 代替案との比較

ツールモデルサイズ制限データの場所コスト評価
Syncthing(推奨)P2P、OSSディスクのみ自分の機器無料M0–M2 推奨
iCloud Driveクラウド5GB 無料 / 有料 200GB+Apple月額Mac 優先、Win クライアントは機能限定
OneDriveクラウド5GB 無料 / 有料 100GB+MS月額Win 向き、Mac も動作
Dropboxクラウド2GB 無料 / 有料 2TBDropbox月額無料枠が非常に小さい
Resilio SyncP2P、クローズド無制限自分の機器月額(Pro)有料の上位版
Gitバージョン管理リポ上限ありGitHub など無料大きなバイナリ/中間ファイルには不向き
rsync(手動)同期無制限自分の機器無料自動化なし

Syncthing の強み:サイズ制限なし、データは自分のディスクのみ(プライバシー)、無料、両 OS で対等なクライアント。

弱点:両機が同時に起動している必要がある(バックアップ用途には不向き)、コンフリクトは手動解決、GUI がシンプルすぎる(ブラウザベース)。

2. インストール

Mac

brew install --cask syncthing
# またはバックグラウンドサービスとして(ログイン時に自動起動)
brew services start syncthing

GUI:http://127.0.0.1:8384 — ブラウザの管理 UI。

Windows 11

# winget(管理者権限不要)
winget install -e --id Syncthing.Syncthing

または Syncthing Windows Setup インストーラー(トレイアイコン + 自動起動付き)。

インストール後、トレイアイコンを右クリック → 「Open」で GUI 起動(http://127.0.0.1:8384)。

Mac は GUI を自動で開く。Windows はトレイから起動。どちらも同じウェブ UI を使う。

3. 初回ペアリング — 2台を接続する

3.1 デバイス ID を取得

各機の Syncthing UI で:

  1. 右上の ActionsShow ID
  2. 長い文字列(XXXXXXX-XXXXXXX-...)をコピー

3.2 Mac に Windows を追加

  1. Mac の Syncthing UI → Add Remote Device(右下)
  2. Device ID:Windows の ID を貼り付け
  3. Device NameWin11-Desktop(任意)
  4. 保存

3.3 Windows 側で承認

ほぼ即座に Windows に通知が表示される:Device <Mac ID> wants to connectAdd Device → 名前を MacBook-Pro → 保存。

両方の UI でお互いが Connected(緑)と表示される。

同一 LAN なら 5秒で接続。インターネット越しは 1〜2分(Discovery + Relay の後)。

4. 最初の共有フォルダ

4.1 Mac → Windows 方向

Mac の UI で:

  1. Add Folder
  2. Folder Labelnotes(任意)
  3. Folder IDnotes-mac-win(一意、両方で一致が必要)
  4. Folder Path/Users/{me}/Documents/notes
  5. Sharing タブ → Win11-Desktop にチェック
  6. 保存

4.2 Windows 側でパスを指定して承認

Windows UI に通知:「MacBook-Pro wants to share folder 'notes-mac-win'」→ Add

  1. Folder PathC:\Users\{me}\Documents\notes(Mac の構成を反映させると管理しやすい)
  2. 保存

4.3 結果

両フォルダが Up to Date(緑)になるまで待つ。初回はすべてをコピーするため、合計サイズに比例した時間がかかる。その後の変更は素早く伝播する(通常 5秒以内)。

5. .stignore — 同期しないものを指定

よくあるミスは node_modules / .git / .env を同期してしまうこと。依存関係は各マシンで再構築すべきであり、Git フォルダは同期中に破損するリスクがあり、.env は機密情報だ。すべて除外しよう。

5.1 テンプレートのダウンロード

開発フォルダ向け:

.stignore
# Mac/Linux
curl -fsSL https://devalice.jaceclub.com/assets/multi-os/file-sync/stignore-dev.txt -o /path/to/folder/.stignore
shasum -a 256 /path/to/folder/.stignore
# Expected: f003177e7026492848825e42c4b4845d1c68f787b923ce44854cb47e9c859827
# Windows PowerShell
Invoke-WebRequest -Uri https://devalice.jaceclub.com/assets/multi-os/file-sync/stignore-dev.txt -OutFile C:\path\to\folder\.stignore
Get-FileHash C:\path\to\folder\.stignore -Algorithm SHA256

5.2 適用

  1. .stignore を同期フォルダのルートに置く
  2. Syncthing UI → そのフォルダ → EditIgnore Patterns タブ → Use .stignore を有効化
  3. Rescan を実行 → 除外対象ファイルが即座に除外される

5.3 必須の除外パターン

パターン理由
node_modules.venvtarget依存関係 — 各マシンでビルドする
.git破損リスク + Git はそのために使う
distbuild.nextビルド成果物 — 再現可能
.env.env.local*.pemid_*シークレット — 絶対に同期しない
.DS_StoreThumbs.dbOS のメタデータ
*.logtmpログ / 一時ファイル

6. 実践パターン

6.1 Dotfiles 同期

ホームディレクトリ全体の同期は危険(シークレット漏えいのリスク)。~/dotfiles/ フォルダにまとめてシンボリックリンクを張る方法が安全だ。

~/dotfiles/
├── .gitconfig
├── .zshrc
├── .vimrc
└── .tmux.conf
# Mac/Linux
ln -s ~/dotfiles/.zshrc ~/.zshrc
ln -s ~/dotfiles/.gitconfig ~/.gitconfig
# Windows — PowerShell プロファイルの場所は異なる
ln -s C:\Users\me\dotfiles\Microsoft.PowerShell_profile.ps1 $PROFILE

~/dotfiles/ を Syncthing で共有する。OS 固有の設定はサブフォルダで分岐する(dotfiles/commondotfiles/macdotfiles/windows)。

6.2 メモ同期

Obsidian / Logseq の vault フォルダを共有する。iCloud / OneDrive よりコンフリクトが少ない(Syncthing のコンフリクトはファイル単位で、行単位ではない — 同時編集には注意)。

6.3 プロジェクトソースの同期(注意点あり)

原則:Git が使えるときは Git を優先する。Syncthing はローカル同期が必要な付随ファイル(スクラッチ、環境固有設定、実験メモ)のみに限定する。

ソースフォルダを同期せざるを得ない場合は、.stignore.git必ず含める。Git の内部が同期の途中で書き換えられると reflog/index が破損するリスクがある。

6.4 Send Only / Receive Only

フォルダの種類(フォルダ → Edit → Folder Type):

  • Send & Receive(デフォルト)— 双方向
  • Send Only — このマシンがマスター。相手側の変更は無視・拒否される
  • Receive Only — 受信のみ。ローカルの変更は伝播しない

バックアップ受信マシンを Receive Only に設定すると、意図しない双方向上書きを防げる。ただし真のバックアップには専用ツール(restic、Time Machine)を使うこと。

7. コンフリクトの処理

両側が同じファイルを同時に編集した場合、Syncthing は自動的にコンフリクトファイルを作成する:

  • foo.md(最後に使われたバージョン)
  • foo.sync-conflict-20260512-153012-DEVICE.md(もう一方のバージョン)

手順

  1. 両方を開いて差分を確認(VS Code「Compare with Active」または diff foo.md foo.sync-conflict-*.md
  2. foo.md に統合する
  3. sync-conflict ファイルを削除する

頻繁にコンフリクトが起きる場合は、同じフォルダを同時編集している証拠。メモは機器ごとのサブフォルダ(notes/mac/notes/win/)に分けて回避しよう。

8. セキュリティ

デバイス認証

  • デバイス ID は公開鍵のハッシュ(TLS ベース)。なりすましは不可
  • 新しいデバイスの接続要求は両端で明示的な承認が必要

データ転送

  • すべての通信は TLS 1.2+
  • LAN 内は直接接続、インターネット越しは公開 Relay 経由 — Relay は暗号文のみを中継

推奨設定

UI → Settings → GUI Authentication

  • GUI Username + GUI Password を設定する(外部ネットワークのノートPC では特に重要)
  • 設定しないと、同一 LAN にいる誰でも http://your-ip:8384 にアクセスできてしまう

UI → Settings → Connections

  • Listen Address:デフォルト
  • NAT Traversal ✅(自動ホールパンチング)

シークレット向けの .stignore

  • .env*.pemid_*.aws/credentials必ず除外する
  • このガイドの stignore-dev.txt には既に含まれている

検証

両機でこれらをすべてパスすること:

  1. Mac で notes/test.md を作成 → 10秒以内に Windows に現れる
  2. Windows で notes/test.md を編集 → 10秒以内に Mac に反映される
  3. Mac で notes/test.md を削除 → 10秒以内に Windows から消える
  4. 両側で同時に編集 → sync-conflict-... ファイルが出現する(§7 の手順で処理)
  5. 片側で作成した node_modules / .env などがもう一方に届かない

トラブルシューティング

2台が互いを認識できない

  • 同一 LAN にいる?(インターネット越しは最大5分待つ)
  • ファイアウォールで Syncthing のポート 22000 が許可されているか
  • Mac:システム設定 → ネットワーク → ファイアウォールをオフ、または Syncthing を許可
  • Windows:PowerShell Get-NetFirewallApplicationFilter | ? { $_.Program -match 'syncthing' }

同期が遅い

  • 巨大なフォルダ(ファイルが数万個)— 初回スキャンに時間がかかる。フォルダ → Edit → Rescan Interval を長くする
  • インターネット越しに Relay 経由 → 遅い。同一 LAN での接続を優先する
  • ディスク I/O ボトルネック — SSD 推奨

「Out of sync」が解消しない

  • フォルダ → Override Changes(Send & Receive の場合)— このマシンをマスターに強制
  • または Revert Local Changes(Receive モード)
  • どちらもデータが失われる可能性がある。事前にバックアップを

.stignore が効かない

  • フォルダ → Edit → Ignore Patterns で Use .stignore にチェックが入っているか確認
  • .stignore はフォルダのルートに置く(サブフォルダではない)
  • Rescan をトリガーする(フォルダ → ⋮ → Rescan)

Windows のトレイアイコンが表示されない

  • winget install では自動起動しない場合がある
  • Syncthing Windows Setup インストーラーはトレイ + 自動起動を追加する
  • またはタスクスケジューラでログオン時に syncthing.exe --no-console --no-browser を実行する

シークレットが誤って同期された

  1. 両機からファイルを即座に削除する
  2. Syncthing のゴミ箱移動機能を使える(フォルダ → File Versioning)
  3. シークレット自体を即座にローテーション(API キーなど)— もう一方の機がアクセスした前提で
  4. 再発防止のためパターンを .stignore に追加する

参考資料

更新履歴

  • 2026-05-12:初稿。代替案比較 + セットアップ(Mac+Win)+ 5つのパターン + コンフリクト処理 + 6つのトラブルシューティング事例 + .stignore テンプレートアセット。