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である必要がありますが、例外としてローカルホストのシグナリングサーバも許容されているため気軽に開発用途で使用できます。
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に
docker
とdocker-compose
を入れる -
docker-compose.yml
を作成し実行 - (スタートアップスクリプトに追加)
VPSの準備
OSにubuntu20.10を選択したのでここらへんを参考にして一通りセットアップしました。
注意点と言うほどでもないが、ファイヤーウォールの設定で80(HTTP)と443(HTTPS)はあけておく必要があります。たいていクラウドサービス側で設定できるのでそちらで設定しました。
シグナリングサーバ用のドメインを取得
有料で取得してもよいが、今回はfreenomというサービスを使用しました。
いろいろと注意点もあるのでそこらへんはたくさんある他の記事などをググって見ていただけると良いと思います。
無料ドメインは12ヶ月で更新が必要なんですが忘れそうですね。他でドメインを取得したときにそのサブドメインに移行しようかと思っています。
docker
とdocker-compose
を入れる
VPSにこちらの通り。
- docker https://docs.docker.com/engine/install/ubuntu/
- docker-compose https://docs.docker.com/compose/install/
docker-compose.yml
を作成し実行
こちらの通りに実行するだけです。
注意点として、ドメインが浸透してないとエラーで止まるので少し時間を空けたほうが良いということがあります。
(スタートアップスクリプトに追加)
やらなくてもいいですが、これをしておくことで不測の事態で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