† IPFSを実行しながら学んでいく6 ~ 自分だけのプライベートIPFSネットワークを作って ~

2022.07.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

IPFSをインストールし実行すると、デフォルトではパブリックな分散ネットワークに接続されます

接続しているピアを以下のように確認することができます。

$ ipfs swarm peers
/ip4/104.131.131.82/udp/4001/quic/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
/ip4/128.199.253.187/udp/4001/quic/p2p/12D3KooWB9d8RTihyv1uK6E9N7ymZoLg9gmneWgSpHh1bVEjykqu
/ip4/144.168.197.150/udp/4001/quic/p2p/12D3KooWB7qad7jrhpuegYgmcyES68wsm1rZQfSPoeMihL9YCkRK
~~~

今回はパブリックではなく、プライベートなピアを構築したいと思います。 自分だけ、もしくは仲間内や会社内だけの利用といったユースケースを想定しています。

やってみる

go-ipfsを使い、ローカルPCにあるipfsと、AWSのEC2上のipfsの2つのノードを持つネットワークにしてみます。

※ ローカルPCはipfsをすでにインストール済みとして進めます

<img src="https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2022/07/Untitled-Diagram.drawio-1.png" alt="" width="431" height="311" class="alignnone size-full wp-image-909513" />

ブートストラップノードは、他のノードが他のピ​​アを見つけるために接続できるIPFSノードで、AWS上に作成します。 クライアントノードであるローカルPCからだけアクセスできることを目指します。

Amazon LinuxにGoをインストール

go-ipfsの実行するのでGo言語をインストールする必要があります

ダウンロードページからLinux用のバイナリをダウンロードします。

ダウンロード後、ファイルを解凍します。

$ tar -C /usr/local -xzf go1.18.4.linux-amd64.tar.gz
$ ll /usr/local/go/bin/
 go
 gofmt

/usr/local/go/bin/の下に実行ファイルができるので、ここをパスに追加します。

$ export PATH=$PATH:/usr/local/go/bin
$ go version
go version go1.18.4 linux/amd64

Amazon LinuxにIPFSをインストール

t2.microのインスタンスを起動しておきます(IPFSには512MiBのメモリが必要)

ここから最新のLinuxバイナリをからダウンロードします

※ 執筆時(2022/07/13)では、v0.14.0-rc1

$ wget https://dist.ipfs.io/kubo/v0.14.0-rc1/kubo_v0.14.0-rc1_linux-amd64.tar.gz

ファイルを解凍し、

$ tar -xvzf kubo_v0.14.0-rc1_linux-amd64.tar.gz

フォルダに移動後、インストールスクリプトを実行します

$ cd kubo
$ sudo bash install.sh
Moved ./ipfs to /usr/local/bin

以下のコマンドを実行してインストールの確認をします

$ ipfs --version
ipfs version 0.14.0-rc1

初期化

ノードを初期化します

$ ipfs init --profile server

プライベートにしてみる

IPFSではswarmという機能があります。これは、

インターネット上の他のipfsピアとの接続をオープンし、リッスンし、維持するコンポーネントです。

ipfs swarmコマンドを使って操作することができます。

プライベートなネットワークにするには、swarm.keyというものを作成し、これをネットワーク内で共有できる状態にすることが必要とのこと。

go-ipfs-swarm-key-genというプログラムで作れるので、ありがたく使わせてもらいます。

$ go install github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen@latest
$ ipfs-swarm-key-gen > ~/.ipfs/swarm.key

作成されたswarm.keyを、クライアントノードにコピーします。

クライアントノードでの保存場所は、ipfs実行ユーザーの.ipfsフォルダ内です

次は、両方のノードからブートストラップの情報を削除します。のちにプライベートネットワーク用に構成するためです。

$ ipfs bootstrap rm --all
removed /dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN
~~~
~~~

削除後、ブートストラップノードを含む各ノードにブートストラップノードのIPアドレスとピアID(ハッシュアドレス)を追加します。

ブートストラップノードのピアIDは以下のコマンで表示できます。

$ ipfs config show | grep PeerID
    "PeerID": "<<id>>"

ピアIDを控えたら、以下のコマンドを全てのノードで実行します。

$ ipfs bootstrap add /ip4/<ブートストラップノードのIPアドレス>/tcp/4001/ipfs/<ブートストラップノードのピアID>

プライベートネットワークの起動

設定が終わったので、ネットワークを起動してIPFSのテストをしてみます。

デーモンを起動します。

$ ipfs daemon
Initializing daemon...
go-ipfs version: 0.13.0
Repo version: 12
System version: amd64/darwin
Golang version: go1.18.3
Swarm is limited to private network of peers with the swarm key
Swarm key fingerprint: 3b9a01d450f4a47bff077eddb86d436a
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/192.168.1.104/tcp/4001
Swarm listening on /ip6/240f:6c:3036:1:52d4::1005/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip4/192.168.1.104/tcp/4001
Swarm announcing /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready

上記の出力の中に、

Swarm is limited to private network of peers with the swarm key

というのがありますが、プライベートで構成しているとこのログが出力されるようです。

ipfs swarm peersでピア情報を表示させると、

$ ipfs swarm peers
/ip4/13.231.120.86/tcp/4001/p2p/12D3KooWLFzHcmx4SkvDNcnnLfW2q2gN4djRSTF9kLA37cwEjznk

このように追加したノードの情報だけが出力されるはずです。

IPFSにファイルを追加

一つのノードで適当なファイルを作成し、IPFSに追加してみます

$ echo "Hello World!" > hoge.txt
$ ipfs add hoge.txt
added QmTUBaeR86fxQFewstqDERdENdWRWz7EcF59VXZaHD9uiu hoge.txt

その後、もう片方のノードでファイルを参照できるか確認します。

$ ipfs cat QmTUBaeR86fxQFewstqDERdENdWRWz7EcF59VXZaHD9uiu
Hello World!

上記のように、catで追加したテキストファイルの内容が出力されると成功です

webuiを確認したところ、ピアの数も1となっており、今回の環境と一致していました。

IPFSのプライベートネットワークの作成と検証はこれで終了です。