プライベートIPFSネットワークを構築する

この記事を参考に翻訳しながらまとめていきます。一部加筆修正あり。

https://labs.eleks.com/2019/03/ipfs-network-data-replication.html

プライベートIPFSネットワーク

IPFSにはパブリック・プライベートの2種類のネットワークがあります。パブリックネットワークでは全てのファイルに誰もがアクセスすることができます。多くのビジネスユース、特にエンタープライズなユースケースにおいて、データは管理下に置かれる必要があり、公開状態であることは望ましくありません。そんな時こそプライベートなIPFSネットワークが役立ちます。

この記事ではプライベートなIPFSネットワークを構築し、IPFSクラスターを使ってデータレプリケーションを実装します。IPFSにおいては、ノード単体でデータレプリケーションを実装することはできず、FilecoinやIPFSクラスターが必要になります。この記事ではIPFSクラスターを用い、3台のマシンでクラスターを形成します。

用語解説

IPFS

コンテンツアドレッシング、P2P型といった特徴を持つハイパーメディアプロトコルで強固な分散型ファイルシステムを実現します。

Private IPFS

シークレットキーを保持するピアのみに接続を許可することでプライベートネットワークを構成します。各ノードがどのノードと接続するかは指定する必要があり、ネットワーク外のノードと通信することはありません。

IPFS-Cluster(クラスター)

IPFSデーモンと併用することで機能するスタンドアロンアプリケーションで、ピンの共有やデータレプリケーションを実装します。

IPFSデーモンとIPFS
-Clusterは完全に独立したアプリ同士であり、またIPFS-ClusterはIPFSデーモンに依存するため、デーモンより後に起動させる必要があります。

使用ポート

ポート番号用途
IPFS4001他ノード間通信
5001APIサーバー
8080ゲートウェイサーバー
IPFS-Cluster9094HTTP API エンドポイント
9095IPFS プロキシーエンドポイント
9096クラスター間通信

ポートとセキュリティについては以下の記事を参照してください。

https://cluster.ipfs.io/documentation/guides/security/

4001, 9096はノード間通信で用いるので開放必須です。その他のポートについては用途により策定してください。

1. プライベートネットワークを構築

まずはIPFSのみを使ってプライベートネットワークを構築します。環境はUbuntuを想定しています。また参加ノードは3つとし、それぞれ Node0 Node1 Node2 と名付けます。

1.1 IPFSをインストール

go-ipfsをダウンロードしてインストールします。上から順に実行してください。

この手順は 全てのノード で実行します。

# アップデート$ sudo apt-get update $ sudo apt-get -y upgrade # ダウンロード$ wget https://dist.ipfs.io/go-ipfs/v0.10.0/go-ipfs_v0.10.0_linux-amd64.tar.gz $ tar -xvzf go-ipfs_v0.10.0_linux-amd64.tar.gz # インストール$ cd go-ipfs $ sudo bash install.sh # init$ cd ~ $ ipfs init # 確認$ ipfs version

1.2 シークレットキーを生成

この手順は Node0のみ で実行します。

まずはSwarm Keyを生成します。Swarm Keyは限られたノードとのみ通信するためのシークレットキーとして動作します。

ジェネレーターが用意されているのでダウンロードします。

$ go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen

次にユーティリティを用いSwarmKeyを生成、.ipfs配下に保存します。

$ ipfs-swarm-key-gen > ~/.ipfs/swarm.key

生成されたSwarmKeyはプライベートネットワークに参加する各ノードと共有する必要があります。安全な方法で共有し、各ノードの.ipfs配下に設置してください。

1.3 ノードをブートストラップする

この手順は 全てのノード で実行します。

まずはデフォルトのブートストラップノードを全て削除します。

$ ipfs bootstrap rm all

次にNode0をブートストラップノードに追加します。

$ ipfs bootstrap add /ip4/<node-ip>/tcp/4001/ipfs/<peer-id>

<node-ip> はNode0のIPアドレスを指定します。

<peer-id> はNode0のピアIDを指定します。ピアIDは以下のコマンドで確認できます。

$ ipfs id

これをNode0を含む全てのノードで実行します。

1.4 環境変数を変更

この手順は 全てのノード で実行します。

“LIBP2P_FORCE_PNET” を 1 にすることでネットワークをプライベートモードに設定できます。

$ echo 'export LIBP2P_FORCE_PNET=1' >> ~/.bashrc $ source ~/.bashrc

1.5 configを編集

この手順は 全てのノード で実行します。

.ipfsフォルダーの中に、configファイルが格納されています。これはIPFSノードに関する設定をするファイルです。このファイルを開き “Addresses” というセクションを見つけ以下のように編集してください。

... "Addresses": { "API": "/ip4/<node-ip>/tcp/5001", "Gateway": "/ip4/<node-ip>/tcp/8080", "Swarm": [ "/ip4/0.0.0.0/tcp/4001", "/ip6/::/tcp/4001" ], "Announce": [], "NoAnnounce": [] }, ...

<node-ip> には各ノードのIPを入力してください。これらはデフォルトではローカルホストを指しますが、プライベートネットワークにおいて各ノード同士が「見える」ようにするにはノードに合わせたIPに変更する必要がありあます。

1.6 ノードを起動する

この手順は 全てのノード で実行します。

ここまでで全ての設定は終わりました。次に実際にノードを建て、動作を確認します。

次のコマンドでデーモンを起動します。

$ ipfs daemon

次に動作テストをします。以下の手順でテスト用ファイルを作成、アップロードし動作を確認します。

次の手順は Node0のみ で実行します。

$ echo "hello ipfs" > test.txt $ ipfs add test.txt

CIDが返ってくるのでメモしましょう。

次の手順は Node0以外の全てのノード で実行します。

$ ipfs cat <cid>

<cid> には先ほどコピーしたCIDを入力します。

“hello world” と返って来れば成功です。

また、プライベートであることを確認するためにIPFS本流のパブリックゲートウェイでCIDを入力すると良いでしょう。表示されないことが分かるはずです。

1.7 IPFSデーモンの自動起動を設定する

この手順は 全てのノード で実行します。

systemdを用いて自動で起動するように設定しましょう。

$ cat <<EOF > /etc/systemd/system/ipfs.service [Unit]Description=IPFS daemonAfter=network.target[Service]User=<ユーザー名>WorkingDirectory=/home/<ユーザー名>/ExecStart=/usr/local/bin/ipfs daemonRestart=on-failure[Install]WantedBy=multi-user.targetEOF

次に現在起動しているIPFSを停止し、systemdを有効化します。

$ ipfs shutdown $ sudo systemctl daemon-reload $ sudo systemctl enable ipfs $ sudo systemctl start ipfs

ログを追うには以下のコマンドを実行します。

$ sudo journalctl -f -u ipfs

2. IPFSクラスターを構築する

ここからはIPFSクラスターを構築していきます。IPFSクラスターにより、データレプリケーションが実装できます。

IPFS-Clusterは3つのコンポーネントからなります。

ipfs-cluster-service

クラスターの設定とデーモンの起動に使われます。

ipfs-cluster-ctl

クラスター内ノード間のデータのやり取りを管理します。

ipfs-cluster-follower

ipfs-cluster-serviceの代替として作られたもので、上記二つの機能を持ち合わせます。今回の記事では使用しません。

2.1 IPFS-Clusterをインストール

この手順は 全てのノード で実行します。

以下の手順でIPFS -Clusterをインストールします。

# ダウンロード$ wget https://dist.ipfs.io/ipfs-cluster-service/v0.14.1/ipfs-cluster-service_v0.14.1_linux-amd64.tar.gz $ wget https://dist.ipfs.io/ipfs-cluster-ctl/v0.14.1/ipfs-cluster-ctl_v0.14.1_linux-amd64.tar.gz # インストール$ tar -xvzf ipfs-cluster-service_v0.14.1_linux-amd64.tar.gz $ sudo mv ipfs-cluster-service/ipfs-cluster-service /usr/local/bin $ tar -xvzf ipfs-cluster-ctl_v0.14.1_linux-amd64.tar.gz $ sudo mv ipfs-cluster-ctl/ipfs-cluster-ctl /usr/local/bin # 確認$ ipfs-cluster-service version ## ctlはserviceの起動が前提なので現時点ではバージョンの確認はできません。## serviceのデーモンを起動した後に確認しましょう。## $ ipfs-cluster-ctl version

2.2 CLUSTER_SECRETを生成

次の手順は Node0のみ で実行します。

CLUSTER_SECRET は自ノードがクラスターの一員であることを認識させるために用いられます。

$ export CLUSTER_SECRET=$(od -vN 32 -An -tx1 /dev/urandom | tr -d ' \n')$ echo $CLUSTER_SECRET$ echo 'CLUSTER_SECRET='$CLUSTER_SECRET >> ~/.bashrc $ source ~/.bashrc

生成されたCLUSTER_SECRETが返ってきます。

生成されたCLUSTER_SECRETはクラスターに参加する各ノードと共有する必要があります。安全な方法で共有してください。

次の手順は Node0以外の全てのノード で実行します。

Node0で生成されたCLUSTER_SECRETを他ノードも設定します。

$ echo 'export CLUSTER_SECRET=<cluster_secret>' >> ~/.bashrc $ source ~/.bashrc

2.3 クラスターを起動する

各ノードで順にIPFS-Clusterを起動していきます。

次の手順は Node0のみ で実行します。

$ ipfs-cluster-service init $ ipfs-cluster-service daemon

次の手順は Node0以外の全てのノード で実行します。

$ ipfs-cluster-service init $ ipfs-cluster-service daemon --bootstrap /ip4/<node-ip>/tcp/9096/ipfs/<cluster-peer-id>

<node-ip> はNode0のIPアドレスを指定します。

<peer-id> はNode0のクラスターピアIDを指定します。IPFSのピアIDとは異なります。

クラスターピアIDはデーモンの起動時に表示されます。

これでクラスターが形成されたはずです。次のコマンドで確認してみましょう。

$ ipfs-cluster-ctl peers ls

次に動作テストをします。

次の手順は Node0のみ で実行します。

$ echo "hello cluster" > test-cluster.txt $ ipfs-cluster-ctl add test-cluster.txt

CIDが返ってくるのでメモします。

$ ipfs-cluster-ctl status <cid>

クラスター内の全ノードでピンされていることがわかるはずです。

2.4 IPFS-Clusterの自動起動を設定する

この手順は 全てのノード で実行します。

systemdを用いて自動で起動するように設定しましょう。

$ cat <<EOF > /etc/systemd/system/ipfs-cluster.service [Unit]Description=IPFS-Cluster daemonAfter=network.target ipfs[Service]User=<ユーザー名>WorkingDirectory=/home/<ユーザー名>/ExecStart=/usr/local/bin/ipfs-cluster-service daemonRestart=on-failure[Install]WantedBy=multi-user.targetEOF

次に現在起動しているIPFS-Clusterを停止し、systemdを有効化します。

$ ipfs-cluster-service shutdown $ sudo systemctl daemon-reload $ sudo systemctl enable ipfs-cluster $ sudo systemctl start ipfs-cluster

ログを追うには以下のコマンドを実行します。

$ sudo journalctl -f -u ipfs-cluster

終わりに

以上でプライベートIPFSネットワークを構築し、IPFSクラスターによりデータレプリケーションを実装することができました。