Loading...

2024-04-30(火) 15:00

💻 UbuntuにSyncthingをインストールする手順

UbuntuSyncthing
P2Pでのファイル同期環境を簡単に構築できるオープンソースであるSyncthingをUbuntuにインストールする手順について解説します。

目次

前提と注意事項

この記事では以下を前提としています。

  • Ubuntu22.04

この記事のゴール

Ubuntu に Syncthing をインストールし、他の Syncthing をインストール済みの端末と、指定したディレクトリの同期を行うところまでをゴールとします。

Syncthing について

Syncthing は、オープンソースのファイル同期ソフトウェアです。主に個人間でデータを安全に同期するために使用され、異なるデバイス間でファイルを自動的に同期させることができます。このソフトウェアはプライバシーを重視しており、データをサードパーティのクラウドサーバーを通さずに直接デバイス間で転送します。 以下が Syncthing の公式サイトと公式リポジトリになります。

Syncthing

Syncthing is a continuous file synchronization program.

syncthing.net

syncthing/syncthing

Syncthing is a continuous file synchronization program.

github.com

事前準備

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を起動する
$ syncthing start --no-browser

上記を実行すると、色々とログが出力されます。別のターミナルで以下を実行すると Syncthing のステータスを確認できます。

Syncthingのステータスを確認する
$ syncthing cli show system

以下が実行結果です。

Syncthingのステータスを確認する
$ 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のステータスが表示されない場合
$ 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を同期対象として指定します。

端末Aで実行
 $ syncthing cli config devices add --device-id 3AO29Pd-LS201KA-KTIBMAK-D11AYMC-UTOISQJ-AURGN81-CXLW1XI-AL19JSU

また、端末Bでも以下を実行して端末Aを指定します。

端末Bで実行
 $ 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で同期を許可するために以下のコマンドを実行します。

端末Bで端末Aからの同期を許可
$ syncthing cli config devices 2AL49P8-AKSS6NQ-TIJBNLA-E88CSQS-ANPIJMS-KPMLQ9O-CKID4WZ-MM29QQH auto-accept-folders set true

上記を実行すると、端末Bでは端末Aからの同期要求を自動的に許可するようになります。もし手動で許可したい場合は、以下のようにして設定を変更します。

端末Bで端末Aからの同期を許可
$ syncthing cli config devices 2AL49P8-AKSS6NQ-TIJBNLA-E88CSQS-ANPIJMS-KPMLQ9O-CKID4WZ-MM29QQH auto-accept-folders set false

もし同期したい端末が Windows である場合や Web 管理画面を使える場合は、Syncthing の Web 管理画面で以下のように表示されます。

Syncthingの同期要求

上記で「追加」をクリックすると、以下のように、ローカルでどこのフォルダに追加するかなどの設定ダイアログがき、「保存」ボタンをクリックすることで同期を開始できます。

Syncthingの同期ディレクトリの設定

あとは同期対象としたディレクトリに新しくファイルやディレクトリを追加すれば、端末間で同期されます。

まとめ

以上で Ubuntu に Syncthing をインストールし、他の Syncthing をインストール済みの端末と、指定したディレクトリの同期を行う手順を解説しました。Syncthing を活用すると、サーバ間でのファイル同期やバックアップを簡単に行うことができます。