ファイル同期 — 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
- 両方に Syncthing をインストール — Mac は brew、Windows は winget
- 各機のデバイス ID を交換 — 初回1回だけの登録
- フォルダを共有 — 片方が提案し、もう片方が承認
.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 無料 / 有料 2TB | Dropbox | 月額 | 無料枠が非常に小さい |
| Resilio Sync | P2P、クローズド | 無制限 | 自分の機器 | 月額(Pro) | 有料の上位版 |
| Git | バージョン管理 | リポ上限あり | GitHub など | 無料 | 大きなバイナリ/中間ファイルには不向き |
| rsync(手動) | 同期 | 無制限 | 自分の機器 | 無料 | 自動化なし |
Syncthing の強み:サイズ制限なし、データは自分のディスクのみ(プライバシー)、無料、両 OS で対等なクライアント。
弱点:両機が同時に起動している必要がある(バックアップ用途には不向き)、コンフリクトは手動解決、GUI がシンプルすぎる(ブラウザベース)。
2. インストール
Mac
brew install --cask syncthing
# またはバックグラウンドサービスとして(ログイン時に自動起動)
brew services start syncthingGUI: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 で:
- 右上の Actions → Show ID
- 長い文字列(
XXXXXXX-XXXXXXX-...)をコピー
3.2 Mac に Windows を追加
- Mac の Syncthing UI → Add Remote Device(右下)
- Device ID:Windows の ID を貼り付け
- Device Name:
Win11-Desktop(任意) - 保存
3.3 Windows 側で承認
ほぼ即座に Windows に通知が表示される:Device <Mac ID> wants to connect → Add Device → 名前を MacBook-Pro → 保存。
両方の UI でお互いが Connected(緑)と表示される。
同一 LAN なら 5秒で接続。インターネット越しは 1〜2分(Discovery + Relay の後)。
4. 最初の共有フォルダ
4.1 Mac → Windows 方向
Mac の UI で:
- Add Folder
- Folder Label:
notes(任意) - Folder ID:
notes-mac-win(一意、両方で一致が必要) - Folder Path:
/Users/{me}/Documents/notes - Sharing タブ →
Win11-Desktopにチェック - 保存
4.2 Windows 側でパスを指定して承認
Windows UI に通知:「MacBook-Pro wants to share folder 'notes-mac-win'」→ Add
- Folder Path:
C:\Users\{me}\Documents\notes(Mac の構成を反映させると管理しやすい) - 保存
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 SHA2565.2 適用
.stignoreを同期フォルダのルートに置く- Syncthing UI → そのフォルダ → Edit → Ignore Patterns タブ → Use .stignore を有効化
- Rescan を実行 → 除外対象ファイルが即座に除外される
5.3 必須の除外パターン
| パターン | 理由 |
|---|---|
node_modules、.venv、target | 依存関係 — 各マシンでビルドする |
.git | 破損リスク + Git はそのために使う |
dist、build、.next | ビルド成果物 — 再現可能 |
.env、.env.local、*.pem、id_* | シークレット — 絶対に同期しない |
.DS_Store、Thumbs.db | OS のメタデータ |
*.log、tmp | ログ / 一時ファイル |
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/common、dotfiles/mac、dotfiles/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(もう一方のバージョン)
手順
- 両方を開いて差分を確認(VS Code「Compare with Active」または
diff foo.md foo.sync-conflict-*.md) foo.mdに統合する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、*.pem、id_*、.aws/credentialsは必ず除外する- このガイドの
stignore-dev.txtには既に含まれている
検証
両機でこれらをすべてパスすること:
- Mac で
notes/test.mdを作成 → 10秒以内に Windows に現れる - Windows で
notes/test.mdを編集 → 10秒以内に Mac に反映される - Mac で
notes/test.mdを削除 → 10秒以内に Windows から消える - 両側で同時に編集 →
sync-conflict-...ファイルが出現する(§7 の手順で処理) - 片側で作成した
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を実行する
シークレットが誤って同期された
- 両機からファイルを即座に削除する
- Syncthing のゴミ箱移動機能を使える(フォルダ → File Versioning)
- シークレット自体を即座にローテーション(API キーなど)— もう一方の機がアクセスした前提で
- 再発防止のためパターンを
.stignoreに追加する
参考資料
- Mac 初期設定 / Windows 初期設定 — Homebrew/winget の前提条件
- Mac ↔ Windows 入力共有 — 姉妹ガイド
- Syncthing 公式ドキュメント — フォルダタイプ、バージョニング、API
.stignore構文
更新履歴
- 2026-05-12:初稿。代替案比較 + セットアップ(Mac+Win)+ 5つのパターン + コンフリクト処理 + 6つのトラブルシューティング事例 +
.stignoreテンプレートアセット。