前提と注意事項
この記事では以下を前提としています。
- Ubuntu22.04
この記事のゴール
Ubuntu に Syncthing をインストールし、他の Syncthing をインストール済みの端末と、指定したディレクトリの同期を行うところまでをゴールとします。
Syncthing について
Syncthing は、オープンソースのファイル同期ソフトウェアです。主に個人間でデータを安全に同期するために使用され、異なるデバイス間でファイルを自動的に同期させることができます。このソフトウェアはプライバシーを重視しており、データをサードパーティのクラウドサーバーを通さずに直接デバイス間で転送します。 以下が Syncthing の公式サイトと公式リポジトリになります。
事前準備
Syncthing をapt
経由でインストールできるよう、以下をインストールしておきます。jq
は Syncthing が出力する内容を整形するために使用します。
$ sudo apt install curl apt-transport-https ca-certificates jq
Syncthing を Ubuntu にインストールする
本記事では、Syncthing の公式ドキュメントに従って、apt
を使って Syncthing をインストールする方法を解説します。
まず PGP キーを追加するために以下を実行します。
$ sudo mkdir -p /etc/apt/keyrings
$ sudo curl -L -o /etc/apt/keyrings/syncthing-archive-keyring.gpg https://syncthing.net/release-key.gpg
続いて以下を実行してapt
のソースリストに syncthing を追加します。stable
とcandidate
の両方を追加します。
$ echo "deb [signed-by=/etc/apt/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list
$ echo "deb [signed-by=/etc/apt/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing candidate" | sudo tee /etc/apt/sources.list.d/syncthing.list
あとは以下によって Syncthing をインストールします。
$ sudo apt update
$ sudo apt install syncthing
上記を実行後、以下のようにバージョンを確認できれば Syncthing のインストールが完了です。
$ syncthing --version
syncthing v1.27.7-rc.1 "Gold Grasshopper" (go1.22.2 linux-amd64) [email protected] 2024-04-22 03:45:18 UTC [noupgrade]
Syncthing の ID を生成する
Syncthing を使って端末間で同期を取るには、同期を取りたい端末間で ID を共有する必要があります。Syncthing の ID は、Syncthing をインストールした端末ごとに異なります。以下のsyncthing generate
コマンドを実行して、Syncthing の ID を生成します。
$ syncthing generate
以下が実行結果です。
$ syncthing generate
2024/04/24 01:32:30 INFO: Generating ECDSA key and certificate for syncthing...
2024/04/24 01:32:30 INFO: Device ID: 2AL49P8-AKSS6NQ-TIJBNLA-E88CSQS-ANPIJMS-KPMLQ9O-CKID4WZ-MM29QQH
2024/04/24 01:32:30 INFO: Default folder created and/or linked to new config
上記に表示されている2AL49P8-AKSS6NQ-TIJBNLA-E88CSQS-ANPIJMS-KPMLQ9O-CKID4WZ-MM29QQH
が ID になります。
次に Syncthing を起動し、ステータスを確認する。
Syncthing を起動、ステータスを確認する
以下を実行して Syncthing を起動します。なお、--no-browser
オプションをつけることでブラウザを開かずに Syncthing を起動できます。CUI のみの環境で Syncthing を使う場合に便利です。
$ syncthing start --no-browser
上記を実行すると、色々とログが出力されます。別のターミナルで以下を実行すると Syncthing のステータスを確認できます。
$ syncthing cli show system
以下が実行結果です。
$ syncthing cli show system
{
"alloc": 20980288,
"connectionServiceStatus": {
"dynamic+https://relays.syncthing.net/endpoint": {
"error": null,
"lanAddresses": [
"relay://172.100.111.122:22067/?globalLimitBps=204800\u0026id=2AL49P8-AKSS6NQ-TIJBNLA-E88CSQS-ANPIJMS-KPMLQ9O-CKID4WZ-MM29QQH\u0026networkTimeout=2m0s\u0026pingInterval=1m0s\u0026providedBy=delroth+%28eden%29\u0026
sessionLimitBps=102400\u0026statusAddr=%3A22070"
],
[
40/153
]
"wanAddresses": [
"relay://172.100.111.122:22067/?globalLimitBps=204800\u0026id=2AL49P8-AKSS6NQ-TIJBNLA-E88CSQS-ANPIJMS-KPMLQ9O-CKID4WZ-MM29QQH\u0026networkTimeout=2m0s\u0026pingInterval=1m0s\u0026providedBy=delroth+%28eden%29\u0026
sessionLimitBps=102400\u0026statusAddr=%3A22070"
]
},
"quic://0.0.0.0:22000": {
"error": null,
"lanAddresses": [
"quic://0.0.0.0:22000",
"quic://10.146.0.3:22000",
"quic://[f12t:22sa:321d::7a9x:mb12]:22000"
],
"wanAddresses": [
"quic://0.0.0.0:22000",
"quic://34.84.173.252:22000"
]
},
"tcp://0.0.0.0:22000": {
"error": null,
"lanAddresses": [
"tcp://0.0.0.0:22000",
"tcp://10.146.0.3:22000",
"tcp://[f12t:22sa:321d::7a9x:mb12]:22000"
],
"wanAddresses": [
"tcp://0.0.0.0:0",
"tcp://0.0.0.0:22000"
]
}
},
"cpuPercent": 0,
"discoveryEnabled": true,
"discoveryErrors": {
"global@https://discovery-v6.syncthing.net/v2/": "Post \"https://discovery-v6.syncthing.net/v2/\": dial tcp[
2604:a880: 400:d0: : 185c:f001
]: 443: connect: network is unreachable"
},
"discoveryMethods": 5,
"discoveryStatus": {
"IPv4 local": {
"error": null
},
"IPv6 local": {
"error": null
},
"global@https://discovery-v4.syncthing.net/v2/": {
"error": null
},
"global@https://discovery-v6.syncthing.net/v2/": {
"error": "Post \"https://discovery-v6.syncthing.net/v2/\": dial tcp [1928:a110:311:d0::109c:f111]:443: co
nnect: network is unreachable"
},
"global@https://discovery.syncthing.net/v2/": {
"error": null
}
},
"goroutines": 92,
"guiAddressOverridden": false,
"guiAddressUsed": "127.0.0.1:8384",
"lastDialStatus": {
"tcp://153.246.232.95:22000": {
"error": null,
"when": "2024-04-24T01:37:39Z"
},
"tcp://[1211:1266:s340:ad00:2918:347f:936a:13e1]:22000": {
"error": "dial tcp [1211:1266:s340:ad00:2918:347f:936a:13e1]:22000: connect: network is unreachable",
"when": "2024-04-24T01:37:39Z"
},
"tcp://[f12t:22sa:321d::7a9x:mb12]:22000": {
"error": null,
"when": "2024-04-24T01:37:39Z"
}
},
"myID": "2AL49P8-AKSS6NQ-TIJBNLA-E88CSQS-ANPIJMS-KPMLQ9O-CKID4WZ-MM29QQH",
"pathSeparator": "/",
"startTime": "2024-04-24T01:37:30Z",
"sys": 32183560,
"tilde": "/home/username",
"uptime": 344,
"urVersionMax": 3
}
以上のように Syncthing のステータスが表示されれば、Syncthing が正常に起動しています。また、myID
として先ほど生成した ID が表示されていることを確認してください。
なお、以下のように表示される場合は Syncthing が起動していない可能性が高いため、syncthing start
で起動してみてください。
$ syncthing cli show system
syncthing: error: Get "http://127.0.0.1:8384/rest/system/status": dial tcp 127.0.0.1:8384: connect: connection refused
同期したい端末を指定する
上記までを同期したい端末で行い、その端末の ID を取得しておきます。 例えば、ここでは以下のような状況を想定します。
端末A
:Syncthing の ID が2AL49P8-AKSS6NQ-TIJBNLA-E88CSQS-ANPIJMS-KPMLQ9O-CKID4WZ-MM29QQH
端末B
:Syncthing の ID が3AO29Pd-LS201KA-KTIBMAK-D11AYMC-UTOISQJ-AURGN81-CXLW1XI-AL19JSU
上記の場合、端末A
にて以下を実行して端末B
を同期対象として指定します。
$ syncthing cli config devices add --device-id 3AO29Pd-LS201KA-KTIBMAK-D11AYMC-UTOISQJ-AURGN81-CXLW1XI-AL19JSU
また、端末B
でも以下を実行して端末A
を指定します。
$ syncthing cli config devices add --device-id 2AL49P8-AKSS6NQ-TIJBNLA-E88CSQS-ANPIJMS-KPMLQ9O-CKID4WZ-MM29QQH
以上で同期するための準備が完了です。
同期するフォルダを指定する
まず確認のために現在同期対象となっているディレクトリを以下で確認します。
$ syncthing cli config folders list
default
上記からdefault
という名前のディレクトリが同期対象となっていることがわかります。ただし、注意が必要なのは、default
という名前そのもののディレクトリが端末A
にあるわけではありません。default
は Syncthing 上のラベル名であり、実際に端末A
のどのディレクトリを指しているかは以下で確認できます。
$ syncthing cli config folders default dump-json | jq .path
"/home/username/Sync"
上記のように/home/username/Sync
がdefault
として指定されていることがわかります。/home/username/Sync
が現時点で端末A
の同期対象となっているディレクトリです。
次に実際に同期対象としたいディレクトリを指定します。以下のようにして/home/username/video-content
を同期対象とします。
$ syncthing cli config folders add --id "ejnes-fjwna" --label "video" --path "/home/username/video-content"
上記によって、ラベル名がvideo
でパスが/home/username/video-content
のディレクトリが同期対象となります。また、ejnes-fjwna
という文字列は、私が適当に設定したディレクトリの ID です。この ID は Syncthing が自動的に生成するものではなく、ユーザーが設定するものです。この ID は他の端末と同期する際に使用します。そのため、ユニークである必要があります。
これで端末A
での作業は完了しました。あとは端末B
で同期を許可するために以下のコマンドを実行します。
$ syncthing cli config devices 2AL49P8-AKSS6NQ-TIJBNLA-E88CSQS-ANPIJMS-KPMLQ9O-CKID4WZ-MM29QQH auto-accept-folders set true
上記を実行すると、端末B
では端末A
からの同期要求を自動的に許可するようになります。もし手動で許可したい場合は、以下のようにして設定を変更します。
$ syncthing cli config devices 2AL49P8-AKSS6NQ-TIJBNLA-E88CSQS-ANPIJMS-KPMLQ9O-CKID4WZ-MM29QQH auto-accept-folders set false
もし同期したい端末が Windows である場合や Web 管理画面を使える場合は、Syncthing の Web 管理画面で以下のように表示されます。
上記で「追加」をクリックすると、以下のように、ローカルでどこのフォルダに追加するかなどの設定ダイアログがき、「保存」ボタンをクリックすることで同期を開始できます。
あとは同期対象としたディレクトリに新しくファイルやディレクトリを追加すれば、端末間で同期されます。
まとめ
以上で Ubuntu に Syncthing をインストールし、他の Syncthing をインストール済みの端末と、指定したディレクトリの同期を行う手順を解説しました。Syncthing を活用すると、サーバ間でのファイル同期やバックアップを簡単に行うことができます。