Docker で Syncthing をデプロイする:Compose、ポート、ディレクトリマッピングの注意点

Syncthing を Docker でデプロイする手順を整理します。Docker Compose または docker run でコンテナを起動し、設定ディレクトリと同期ディレクトリを正しくマッピングし、ポート、ファイアウォール、PUID/PGID 権限、Web UI の安全設定を確認します。

Syncthing シリーズ目次

Docker で Syncthing をデプロイする構成は、NAS、家庭用サーバー、VPS によく合います。24 時間稼働する同期ノードとして、写真、文書、Markdown ノート、ダウンロードディレクトリなどを継続的に同期できます。

Docker で Syncthing を動かすときに重要なのは、「コンテナが起動するか」だけではありません。特に次の三点が重要です。

  • 設定ディレクトリを永続化すること。
  • 同期したいデータディレクトリをホストからコンテナにマッピングすること。
  • ポートと権限を事前に整理しておくこと。

ここを曖昧にすると、コンテナ更新後に設定が消えたり、Web UI に入力したパスが実際のホストディレクトリを指していなかったり、同期時に Permission denied が出たりします。

ディレクトリ設計

まずサーバーまたは NAS 上に専用ディレクトリを用意します。

1
2
mkdir -p ~/syncthing
cd ~/syncthing

このディレクトリに docker-compose.yml を置き、Syncthing の設定はサブディレクトリに保存します。

1
2
3
syncthing/
├── docker-compose.yml
└── config/

同期対象のデータディレクトリは、NAS やホスト上の既存パスを使えます。

1
2
/volume1/downloads
/volume1/photos

設定ディレクトリとデータディレクトリは分けてください。config には Syncthing 自身の設定、鍵、インデックスデータベースが入ります。downloadsphotos のようなディレクトリが、実際に同期したいデータです。

方法 1:Docker Compose

長期運用では Docker Compose を使う方が、更新、再起動、移行の見通しがよくなります。

~/syncthing/docker-compose.yml に次の内容を書きます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
version: "3"

services:
  syncthing:
    image: syncthing/syncthing:latest
    container_name: syncthing
    hostname: my-nas-syncthing
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
    volumes:
      - ./config:/var/syncthing/config
      - /volume1/downloads:/var/syncthing/downloads
      - /volume1/photos:/var/syncthing/photos
    ports:
      - 8384:8384
      - 22000:22000/tcp
      - 22000:22000/udp
      - 21027:21027/udp
    restart: unless-stopped

起動します。

1
docker compose up -d

状態を確認します。

1
2
docker compose ps
docker logs -f syncthing

Web UI を開きます。

1
http://server-ip:8384

初回アクセス後は、まず GUI のユーザー名とパスワードを設定してください。

方法 2:docker run

短時間の検証であれば、docker run でも起動できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
docker run -d \
  --name syncthing \
  --hostname my-nas-syncthing \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Asia/Shanghai \
  -p 8384:8384 \
  -p 22000:22000/tcp \
  -p 22000:22000/udp \
  -p 21027:21027/udp \
  -v /path/to/config:/var/syncthing/config \
  -v /path/to/data1:/var/syncthing/data1 \
  --restart unless-stopped \
  syncthing/syncthing:latest

/path/to/config/path/to/data1 は、実際のホストパスに置き換えてください。

例:

1
2
-v /volume1/docker/syncthing/config:/var/syncthing/config
-v /volume1/photos:/var/syncthing/photos

長期的に使うなら Compose に移行しておくと、コンテナを作り直すたびに長いコマンドを組み立て直す必要がありません。

コンテナ内パスとホストパス

Docker で最も混乱しやすいのがパスです。

たとえば Compose に次のように書いたとします。

1
2
volumes:
  - /volume1/photos:/var/syncthing/photos

左側の /volume1/photos はホストパスです。右側の /var/syncthing/photos はコンテナ内パスです。

Syncthing の Web UI で同期フォルダを追加するときは、フォルダパスにコンテナ内パスを入力します。

1
/var/syncthing/photos

これにより Syncthing が実際に操作するのは、ホスト側の次のディレクトリになります。

1
/volume1/photos

Web UI に /volume1/photos と入力しても、通常そのパスはコンテナ内には存在しません。エラーになるか、意図しない新しいディレクトリがコンテナファイルシステム内に作られる可能性があります。

設定ディレクトリは必ず永続化する

次の行は非常に重要です。

1
- ./config:/var/syncthing/config

Syncthing の設定ファイル、デバイス鍵、インデックスデータベースは設定ディレクトリに保存されます。これをホストにマウントしないと、コンテナの削除や再作成でデバイス ID が変わり、既存のペアリング関係が失効することがあります。

設定ディレクトリは、次のような安定したパスに置くのがおすすめです。

1
/volume1/docker/syncthing/config

一時ディレクトリには置かず、同期データのディレクトリとも混在させないでください。

ポートとファイアウォール

よく使うポートは次の通りです。

1
2
3
4
8384/TCP   Web UI 管理画面
22000/TCP デバイス間同期トラフィック
22000/UDP QUIC 同期トラフィック
21027/UDP ローカルネットワーク検出

Syncthing を家庭用 NAS にデプロイする場合は、通常次を確認します。

  • NAS のファイアウォールでこれらのポートが許可されているか。
  • Docker ブリッジのポートマッピングが正しいか。
  • ルーターが Wi-Fi と有線ネットワークを分離していないか。
  • スマートフォンとコンピューターが同じサブネットにいるか。

クラウドサーバーにデプロイする場合は、クラウド事業者のセキュリティグループも確認します。特に 22000/TCP22000/UDP が許可されていないと、他のデバイスは relay 経由でしか接続できず、速度が大きく低下します。

8384 は管理画面のポートです。インターネットに直接公開するのは避けてください。どうしてもリモート管理が必要な場合は、少なくとも強いパスワードを設定し、できればリバースプロキシ、HTTPS、アクセス制御、VPN と組み合わせます。

権限問題:PUID と PGID

Syncthing の Web UI は開けるのに、同期ディレクトリで次のようなエラーが出る場合があります。

1
Permission denied

多くの場合、コンテナプロセスにホストディレクトリの読み書き権限がありません。

まずホストで現在のユーザーの UID と GID を確認します。

1
id

出力例:

1
uid=1000(user) gid=1000(user) groups=1000(user)

Compose の環境変数を対応する値にします。

1
2
3
environment:
  - PUID=1000
  - PGID=1000

同時に、ホスト側ディレクトリ自体がそのユーザーに読み書きを許可しているか確認します。

1
ls -ld /volume1/photos

必要であれば所有者や権限を調整します。

1
sudo chown -R 1000:1000 /volume1/photos

NAS では、共有ディレクトリ全体に対して安易に再帰的な権限変更をしないでください。複数人で使っている共有では特に危険です。Syncthing 専用の同期ディレクトリを用意するか、NAS の権限管理画面で該当ユーザーに権限を付与する方が安全です。

Web UI の初回セキュリティ設定

コンテナ起動後、次にアクセスします。

1
http://server-ip:8384

初回アクセス時、Syncthing は通常 GUI のユーザー名とパスワード設定を促します。この手順は省略しないでください。

推奨設定:

  • すぐに GUI ユーザー名と強いパスワードを設定する。
  • 8384 をインターネットに公開しない。
  • リモートアクセスは VPN、SSH トンネル、制御されたリバースプロキシを優先する。
  • リバースプロキシを使う場合は Web UI のみを代理し、不要なポートを誤って開放しない。

管理画面を第三者に操作されると、デバイスの追加、共有フォルダの変更、同期関係の変更が可能になります。Syncthing の同期データ転送は暗号化されていますが、管理入口そのものは別途保護が必要です。

Web UI で同期ディレクトリを追加する

写真ディレクトリを例にします。Compose ではすでに次のようにマウントしています。

1
- /volume1/photos:/var/syncthing/photos

Web UI でフォルダを追加するときは、次のように設定します。

  • Folder Label:Photos など。
  • Folder ID:photos のような安定した英数字 ID。
  • Folder Path:/var/syncthing/photos
  • Sharing:共有先のデバイスを選択。
  • Folder Type:用途に応じて Send & ReceiveSend OnlyReceive Only を選択。

この Docker ノードが NAS の中心ノードであれば、よくある設定は次の通りです。

  • 通常の文書:Send & Receive
  • スマートフォン写真の集約:NAS 側で Receive Only
  • 配布用ディレクトリ:NAS 側で Send Only

どれを選ぶかはデータの流れで決めます。すべてのフォルダを何も考えず双方向同期にするのは避けましょう。

コンテナの更新

Compose を使っている場合、更新は通常次のように行います。

1
2
docker compose pull
docker compose up -d

設定ディレクトリとデータディレクトリが正しくマウントされていれば、コンテナを更新してもデバイス ID、ペアリング関係、同期フォルダ設定は失われません。

更新前に設定ディレクトリをバックアップしておくこともできます。

1
tar -czf syncthing-config-backup.tar.gz ./config

設定ディレクトリにはデバイス秘密鍵が含まれます。バックアップファイルを公共の場所へ安易にアップロードしないでください。

よくある問題

Web UI が開けない

まずコンテナが動作しているか確認します。

1
2
docker ps
docker logs syncthing

次にポートマッピングを確認します。

1
docker port syncthing

コンテナが正常でも開けない場合は、ホストのファイアウォール、NAS のファイアウォール、クラウドサーバーのセキュリティグループを確認します。

追加したディレクトリが存在しないと言われる

Web UI に入力したパスがコンテナ内パスか確認してください。

たとえばホストパスが次の場合:

1
/volume1/downloads

コンテナ内パスが次の場合:

1
/var/syncthing/downloads

Web UI には後者を入力します。

Relay 経由のみで速度が遅い

まず次を確認します。

  • 22000/TCP が許可されているか。
  • 22000/UDP が許可されているか。
  • ルーターのポート転送が正しいか。
  • クラウドサーバーのセキュリティグループが TCP と UDP の両方を許可しているか。
  • ローカルファイアウォールが Docker のマッピングポートをブロックしていないか。

Relay は接続性を高めますが、大量の同期トラフィックを長期的に任せる用途には向きません。

同期後のファイル権限がおかしい

まずコンテナの実行ユーザーが正しいか確認し、次にホストディレクトリの権限を確認します。Linux、NAS、Windows 共有フォルダでは権限モデルが異なります。Syncthing を権限修復ツールとして使わないでください。

複数 OS 間で同期する場合は、通常のファイルとディレクトリを対象にし、複雑な ACL、所有者、拡張属性に依存するシステムディレクトリは避けるのが無難です。

より安定した使い方

NAS やサーバーを中心ノードとして使うなら、次のように設計できます。

  1. NAS 上で Docker により Syncthing を実行する。
  2. 設定ディレクトリを /volume1/docker/syncthing/config にマウントする。
  3. データ種別ごとに個別にマウントする。例:/volume1/photos/volume1/notes
  4. スマートフォンやコンピューターから NAS のデバイス ID を追加する。
  5. 重要なディレクトリでは NAS 側でファイルバージョン管理を有効にする。
  6. Web UI は LAN または VPN 内からのみアクセスする。
  7. NAS 自体にも独立したバックアップを用意し、同期を唯一のバックアップにしない。

この構成では、Syncthing がデバイス間同期を担当し、NAS が常時稼働とバージョンの緩衝役を担います。本当のバックアップは、スナップショット、外付けディスク、オフサイトバックアップに任せます。

まとめ

Docker で Syncthing をデプロイするときの要点は、「コンテナのライフサイクル」と「同期データのライフサイクル」を分離することです。

コンテナはいつでも更新、再作成、移行できます。しかし設定ディレクトリとデータディレクトリは、ホスト上に安定して保持する必要があります。Web UI ではコンテナ内パスを入力し、ホスト側の権限は PUIDPGID、ディレクトリ権限で処理し、ポートは実際のネットワーク環境に合わせて開放します。

このあたりを明確にしておけば、Syncthing は NAS、サーバー、個人デバイス間の軽量な同期レイヤーとして非常に使いやすくなります。

记录并分享
Hugo で構築されています。
テーマ StackJimmy によって設計されています。