Syncthing

提供: ArchWiki
2024年3月13日 (水) 12:37時点におけるKgx (トーク | 投稿記録)による版 (→‎トラブルシューティング: 同期)
ナビゲーションに移動 検索に移動

関連記事

Syncthing はオープンソースのファイル同期クライアント・サーバーアプリケーションです。Go で書かれており、Block Exchange Protocol を実装しています。Syncthing ノード間のトランジットは TLS を使って全て暗号化され、全てのノードは暗号証明書によって一意に識別されます。

インストール

syncthing パッケージをインストールしてください。

Syncthing は制御・監視用の #Web-GUI を提供します。GUI のラッパーを使う場合は #Syncthing-GTK を参照してください。

使用方法

Syncthing の起動

ターミナルから手動で syncthing バイナリを実行して起動します。コマンドライン操作のドキュメント に使用可能なパラメータが説明されています。

ノート: syncthing を複数実行することもできますが、syncthing によってデータベースがロックされるため一人のユーザーが実行できるインスタンスはひとつだけです。データベースのロックに関するエラーがないかログを確認してください。

Syncthing の自動起動

Syncthing を systemd のシステムサービスあるいはユーザーサービスとインストールすることで起動時に自動的に実行できます。

システムサービス

サーバーで Syncthing を使用する場合、システムサービスとして Syncthing を実行するよう設定することで、ユーザーがログインしていなくてもシステムのブート時に起動するようになります。

syncthing@myuser.service起動有効化してください。myuser は実際のユーザー名に置き換えてください。

ユーザーサービス

ユーザーサービスとして Syncthing を起動するよう設定した場合、Syncthing はユーザーがシステムに (グラフィカルなログイン画面や SSH などで) ログインした後に起動するようになります。(マルチユーザーの) デスクトップコンピュータで使用する場合はユーザーサービスを使ってください。無駄に Syncthing のインスタンスを起動しなくなります。

ユーザーサービスを使うときはユーザーユニット syncthing.service起動有効化してください (--user フラグが必要です、詳しくは systemd/ユーザーを参照)。

Syncthing-GTK

syncthing-gtkGTK+ によるグラフィカルユーザーインターフェースです。デスクトップ通知NautilusNemo、Caja との統合などの機能が追加されています。

Syncthing は Syncthing-GTK から起動できます。インターフェイスの設定から起動時に syncthing-gtk を実行させて、syncthing デーモンを起動するように設定してください。

警告: systemd と syncthing-gtk の両方で syncthing デーモンを起動すると、インスタンスが2つ起動して CPU を無駄に消費する可能性があります。systemd で syncthing を起動しないようにするか、syncthing デーモンの起動を待機するように syncthing-gtk を設定してください。

Web-GUI

Syncthing を起動したら、デフォルトで localhost のポート 8384 からウェブインターフェイスを使うことができます。

ヒント: リモートから GUI にアクセスする場合、FAQ を見てください。

設定

インストールしたら Syncthing はすぐに使うことができます。ウェブインターフェイスから新しいサーバーやフォルダを追加できます。シンプルなネットワークをセットアップする方法は Syncthing のはじめに を読んで下さい。

最初の起動時に、~/Sync にデフォルトリポジトリが作成されます。ウェブ管理インターフェイスで確認できます。右側が追加したノードのリストで、左側がリポジトリ(他のノードと共有するフォルダ)のリストになります。

新しくノードを追加するには、ノードのリストの下方にある "Add Node" をクリックして下さい。ノードの Node ID (他のマシンで Edit > Show ID をクリックすることで確認できます) と名前、アドレスの入力を求められます。アドレスに "dynamic" と指定すると、syncthing アナウンスサーバーによって自動的にノード間でアドレスが交換されます。Node ID についてもっとよく知りたい場合は、Syncthing のドキュメント を読んで下さい。

設定を保存すると、syncthing サーバーを再起動するように表示されます。再起動することで変更が適用されます。

次に、デフォルトノードの設定を変更するか (名前をクリックして Edit)、データを共有する新しいノードを作成します。データを共有したいノードにチェックを入れれば、アクセスできるようになります。

ローカルネットワークの設定

大抵の場合、ノートパソコンや Android はネットワークアドレス変換 (NAT) ルーターを通してローカルエリアネットワーク (LAN) を共通しているため、以下のように設定することが推奨されます:

  • それぞれのノードでローカルおよびグローバルディスカバリを有効化して、携帯端末が LAN を離れて外からインターネットに接続しているときでも探索できるようにする。
  • それぞれのマシンで listen ポートtcp://:22010, tcp://:22011, tcp://:22012 のように異なるものに変える。グローバルディスカバリサーバーから違って見えるようになり、NAT を離脱したときに他のローカルデバイスに "Connected to myself - should not happen" メッセージが表示されなくなります。
  • 可能であれば UPnP ポートフォワーディングを有効化する、あるいは手動でポートを転送する。新しいノードが探知されたとき、Syncthing は listen ポートを使用しようとします。ポートが閉じられていた場合、ローカルで開いているポートを検索します。Syncthing で NAT traversal が有効になっているときは、UPnP を使ってランダムな外部ポートを内部の listen ポート (例: 22010) にマッピングします。この挙動が好ましくない場合、各ポートを手動で LAN 内の適切なマシンに転送してください。両側で開いているポートが見つからなかった場合、リレー が使われます。

inotify を使う

inotify (inode notify) はファイルシステムの変更を検出してアプリケーションに変更を報告する Linux カーネルのサブシステムです。inotify の機能は Syncthing と統合されており、高度な設定のメニューからフォルダごとに有効化できます。将来的にはフォルダの設定 UI から設定できるようになります。

また、inotify のサポートは syncthing-gtk によっても提供されていますが、その場合 GUI が実行されているときだけ inotify が機能します (メンテナンスが止まっている syncthing-inotify[リンク切れ: アーカイブ: aur-mirror] に依存しません)。

ヒント: Too many open files というエラーが表示される場合、以下のように設定してデフォルトの fs.inotify.max_user_watches の値を増やしてください:
/etc/sysctl.d/40-max-user-watches.conf
fs.inotify.max_user_watches=524288

インフラに参加

グローバルディスカバリサーバーあるいはリレーサーバーを立ち上げて Syncthing のインフラストラクチャ に参加することが可能です。

リレーの実行

Syncthing はデバイスに直接接続できないときに リレー を使ってデバイスに接続する機能があります。リレーされた接続はエンドツーエンドで暗号化されるため、リレーサーバーは IP アドレスとデバイス ID に以外に接続情報を知ることがありません。

リレーサーバー は誰でも立ち上げることができ、自動的に Syncthing のリレープール に参加して全ての Syncthing ユーザーから使えるようになります。リレーを実行するには syncthing-relaysrv をインストールして syncthing-relaysrv.service起動有効化してください。転送速度などのオプションはコマンドラインから設定できます。以下のようにサービスのドロップインファイルを使って ExecStart ディレクティブで設定します:

/etc/systemd/system/syncthing-relaysrv.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/syncthing-relaysrv -global-rate 500000 -provided-by relayprovidername
ノート: リレーはデフォルトで 22067 ポート (データ用) と 22070 ポート (サービスの状態用) を使います。TCP 接続を許可してください。必要であれば -listen-status-srv オプションでデフォルトのポートを上書きできます。
ヒント: 特定のリレーの統計情報はデフォルトでポート 22070 からアクセスできます。例: http://108.28.183.249:22070/status

ディスカバリサーバーの実行

Syncthing は グローバルディスカバリ を使ってインターネット上のピアを検索します。全てのデバイスは起動時にディスカバリサーバーにデバイス ID と IP アドレス、ポートと現在時刻を通知します。ディスカバリサーバーに特定のデバイス ID のリクエストがあると、JSON 形式で保存された情報が返されます。

例えば https://discovery-v4-2.syncthing.net/v2/?device=ITZRNXE-YNROGBZ-HXTH5P7-VK5NYE5-QHRQGE2-7JQ6VNJ-KZUEDIU-5PPR5AM というリクエストで {"seen":"2017-12-06T14:04:39.005929Z","addresses":["tcp://212.129.18.55:22000"]} という情報が返ってきます。

ディスカバリサーバー は誰でも立ち上げることができます。syncthing-discosrvAUR パッケージをインストールしてください。

ディスカバリサーバーを動かすには証明書が必要であり、できるだけ /var/discosrv に保存してください。そして syncthing ユーザーやグループが証明書ファイルを読み込めるようにパーミッションを設定してください。いまのところ、systemd ユニットファイルを編集して証明書を手動で指定する必要があります (他の変更したい設定も同じく記述してください。詳しくは [1] を参照):

/usr/lib/systemd/system/syncthing-discosrv.service
[Unit]
Description=Syncthing discovery server
After=network.target

[Service]
User=syncthing
Group=syncthing
ExecStart=/bin/sh -c "/usr/bin/syncthing-discosrv -db-dsn='file:///var/discosrv/discosrv.db' -cert /var/discosrv/chain.pem -key /var/discosrv/key.pem"
Restart=on-failure
SuccessExitStatus=2

PrivateDevices=true
ProtectSystem=full
ProtectHome=true
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

クライアントからディスカバリサーバーを使えるようにするには、設定から Global Discovery Servers 変数に https://yourserver:8443/ (デフォルトポートの場合) などと記述してください。カンマで区切ることで複数のディスカバリサーバーを指定することができます。

自己署名証明書を使う場合、ドメインにディスカバリサーバー ID を追加しないとクライアントは接続を拒否します。ID はディスカバリサーバーの起動時に標準出力に出力されます。Global Discovery Servers のエントリを修正して ID を追加してください: https://yourserver.com:8443/?id=AAAAAAA-BBBBBBB-CCCCCCC-DDDDDDD-EEEEEEE-FFFFFFF-GGGGGGG-HHHHHHH

ヒントとテクニック

無駄なログ出力を止める

何もしていないときでも Syncthing は大量のログを出力することがあります。サービスの ExecStart を以下のように上書きすることで出力を直接フィルタリングすることができます ("grep" は必要に応じて調整してください):

/etc/systemd/system/syncthing@.service.d/nospam.conf
[Service]
ExecStart=
ExecStart=/bin/bash -c 'set -o pipefail; /usr/bin/syncthing -no-browser -no-restart -logflags=0 | grep -v "INFO: "'

VirtualBox で実行

Syncthing は VirtualBox の仮想マシン (VM) の中でローカル・グローバルに接続することができます。ネットワークアダプタは 標準の NAT モードを使います。

Syncthing が VM の中で listen するポートは既にホストが使用しているポートを避ける必要があります。例えば、ホストでデフォルトの 22000 ポートを使っている場合は、VM では 22001 を使います。VM の中で listen ポートを変更するには GUI の設定から Sync Protocol Listen Addressestcp://:22001 などとします。

それから設定でホストの 22001/TCP ポートをゲストに転送する必要があります。以下のコマンドで転送できます:

$ VBoxManage modifyvm myvmname --natpf1 "syncthing,tcp,,22001,,22001"

上記の設定ではリレーは必要ありません。ローカルデバイスはポート 22001 で VM に接続でき、グローバルデバイスには開いているポートからアクセスできます。

ノート: local discovery in this setup is limited because the discovery listening port 21027 is already used by the host. The guest is therefore not able to build a table of local announcements though it can still broadcast to the local network via the VM NAT and announce itself. The steps described above allow to run a functioning server in the default NAT configuration but bridged networking is recommended for an optimal setup.

プロキシ経由で実行

Syncthing はプロキシ経由で実行してファイアウォールを超えたり SSH でトンネリングして使うことができます。プロキシの使用に関するドキュメント によれば、all_proxy 環境変数を設定して socks5 プロキシタイプを使うことを指定する必要があります。

  • サービスをスクリプトやコマンドラインから起動している場合、以下のように変数を設定してください:
export all_proxy="socks5://proxy_address:proxy_port"
export no_proxy="127.0.0.1"
  • サービスとして起動している場合、サービスファイルで以下のように変数を設定してください:
/etc/systemd/system/multi-user.target.wants/syncthing@myuser.service
[Service]
Environment="all_proxy=socks5://proxy_address:proxy_port"
Environment="no_proxy=127.0.0.1"

設定したら systemd デーモンをリロードしてください:

# systemctl daemon-reload

そして syncthing@myuser.service再起動してください。

トラブルシューティング

データベースの問題

ある段階でデータベースの問題が発生する可能性があります。ファイルの再スキャンとデータベースの再同期を強制するには、次のコマンドを使用します:

$ syncthing -reset-database

root として実行した場合でも、読み取り専用のファイルシステムエラーが発生する

ユーザー (root など) に書き込み権限があるにもかかわらず、読み取り専用のファイルシステムがあると Syncthing が警告する場合は、テンプレートユニットの定義を確認してください:

$ systemctl cat syncthing@.service

[Service] 内に Hardening 部分があり、その下に、デフォルトで full に設定される ProtectSystem ディレクティブがあります。このディレクティブの詳細については、systemd.exec(5) § SANDBOXING を参照してください。

ドロップインファイル を作成して、ニーズに合った値に値をオーバーライドします。/etc のサブフォルダーを同期しようとしている場合は、ProtectSystem=true でうまくいくはずです。

その他

Debugging Syncthing を見てください。