🌟

js-ipfsのシグナリングサーバを立てる

2021/04/14に公開

はじめに

https://github.com/ipfs/js-ipfs

IPFSをブラウザでも動かすことができる、js-ipfsですが、ブラウザではTCPやUDTは使えないためWebRTCを利用してP2P通信を行うことになります。

WebRTCを利用する場合、シグナリングサーバ(ランデブーサーバ)が必要になってしまうため、js-ipfsは現状完全な分散型ではないアーキテクチャになっています。

公式からデモ用にいくつかのシグナリングサーバが公開されています。

https://wrtc-star1.par.dwebops.pub/
https://wrtc-star2.sjc.dwebops.pub/

ただし、これらはあくまで実践的なデモや実験用なので、プロダクション用途には使うなということです。実際たまに落ちていることがあります。したがって自分のWebアプリケーションでIPFSを使いたい場合は自分でシグナリングサーバを立てる必要があります。

ローカルでシグナリングサーバを立てる

シグナリングサーバはhttpsである必要がありますが、例外としてローカルホストのシグナリングサーバも許容されているため気軽に開発用途で使用できます。

https://github.com/libp2p/js-libp2p-webrtc-star#rendezvous-server-aka-signaling-server

libp2p-webrtc-starのnpmパッケージを使用してローカルにシグナリングサーバを立てることができます。npxコマンドを使うと以下の1コマンドで立てることが可能です。(デフォルトのport:9090、 host:'0.0.0.0')

$ npx -p libp2p-webrtc-star star-signal --port=13579 --host=127.0.0.1

ブラウザ側で使うときにはcreate時のオプションでSwarmAddressに'/ip4/127.0.0.1/tcp/13579/wss/p2p-webrtc-star'を渡してあげれば使用できます。

// 実装例
const ipfsConfig: IPFSConfig = {
Addresses: {
Swarm: [
  // '/dns4/wrtc-star1.par.dwebops.pub/tcp/443/wss/p2p-webrtc-star',
  // '/dns4/wrtc-star2.sjc.dwebops.pub/tcp/443/wss/p2p-webrtc-star',
  '/ip4/127.0.0.1/tcp/13579/wss/p2p-webrtc-star',
],
},
Discovery: {
MDNS: { Enabled: true, Interval: 10 },
webRTCStar: { Enabled: true },
},
};

await ipfs.create({
config: ipfsConfig,
});

ブラウザで起動してコンソールをみるとログが出ており、サーバーに接続できていることがわかります。

シグナリングサーバーを立てる

サーバーに立てるには以下の手順が必要です。詳細に書くほどでもないので以下ダイジェスト版になります。

  • VPSを準備
  • シグナリングサーバ用のドメインを取得
  • ドメインのAレコードにVPSのIPを設定(反映されるのに時間がかかるので予めやっておくとよい)
  • VPSにdockerdocker-composeを入れる
  • docker-compose.ymlを作成し実行
  • (スタートアップスクリプトに追加)

VPSの準備

OSにubuntu20.10を選択したのでここらへんを参考にして一通りセットアップしました。
https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-20-04-ja

注意点と言うほどでもないが、ファイヤーウォールの設定で80(HTTP)と443(HTTPS)はあけておく必要があります。たいていクラウドサービス側で設定できるのでそちらで設定しました。

シグナリングサーバ用のドメインを取得

有料で取得してもよいが、今回はfreenomというサービスを使用しました。

http://www.freenom.com/ja/index.html

いろいろと注意点もあるのでそこらへんはたくさんある他の記事などをググって見ていただけると良いと思います。
無料ドメインは12ヶ月で更新が必要なんですが忘れそうですね。他でドメインを取得したときにそのサブドメインに移行しようかと思っています。

VPSにdockerdocker-composeを入れる

こちらの通り。

docker-compose.ymlを作成し実行

こちらの通りに実行するだけです。

https://github.com/libp2p/js-libp2p-webrtc-star/blob/master/DEPLOYMENT.md#ssl--localhost-development

注意点として、ドメインが浸透してないとエラーで止まるので少し時間を空けたほうが良いということがあります。

(スタートアップスクリプトに追加)

やらなくてもいいですが、これをしておくことで不測の事態でVPSが再起動した際に即シグナリングサーバが立ち上がるようになります。
こちらを参考に設定しました。 https://techgrump.com/create-a-custom-startup-script-in-ubuntu-20-04/

自分の環境だとExecStartの値の頭にbashをつけないと実行できなかったので、custom-startup.serviceは以下のようになりました。

[Unit]
Description=Custom Startup

[Service]
ExecStart=bash /home/hogehoge/scrypts/startup.sh

[Install]
WantedBy=multi-user.target

完成

なんだかんだ時間がかかったが、まとめてみるとなんてことはないなという感想。むしろこれだけで、httpsのサーバーが立つことに感動しました。

サーバーのセッティング周りは気を使うので結局そこが一番時間がかかるんですよね。

以上です。

Discussion