最近 Symbol のメインネット用にノードを立てました。思ったより簡単そうだったのでついでに HTTPS 対応をしました。そのときのメモです。
簡単にいうと、 https-portal を利用して簡単かつ無料で実現できます。以下のようにノードの API に HTTPS でアクセスできるようになることがゴールです。
https://puipui.iizukak.com:3001/chain/info
テスト環境
- さくらの VPS 16G プラン
- Ubuntu 18.04
- symbol-bootstrap 1.0.2
- ドメインを取得して設定済
- Symbol のノードがすでに立ち上がっていて、 HTTP でアクセスできる状態
ポートを開ける
3001 番及び 80 番が開放されている必要があります。3001 番のほうは任意と思いますが、Symbol ノードでは 3001 が使われることが多いようです。ポートに関する対応は OS やサーバの状態によるので、一例です。
OS 側
私の場合、 Ubuntu を使っていて、 ufw コマンドでファイアウォールの設定をしています。以下のコマンドで開放します。
$ sudo ufw allow 3001 $ sudo ufw allow 80 $ sudo ufw reload $ sudo ufw status To Action From -- ------ ---- [行省略] 80 ALLOW Anywhere 3001 ALLOW Anywhere [行省略]
ufw status
したときに、80 番及び 3001 版が ALLOW になっていることを確認します。
VPS 側
さくらの VPS を利用している場合、「パケットフィルタ」という機能があります。この機能を利用している場合、さくらの VPS のコントロールパネルのパケットフィルタタブから、80 番及び 3001 番を開放します。
https-portal の組み込み
ここからがメインです。 https-portal をノードに組み込んでいきます。 symbol-bootstrap
コマンドを実行するディレクトリをカレントディレクトリとします。
$ vim target/docker/docker-compose.yml
のように好みのエディタを立ち上げ、
https-portal: container_name: https-portal image: steveltn/https-portal:1 ports: - "80:80" - "3001:443" volumes: - './ssl-certs:/var/lib/https-portal' environment: WEBSOCKET: 'true' STAGE: staging # STAGE: production DOMAINS: 'puipui.iizukak.com -> http://rest-gateway:3000' depends_on: - rest-gateway restart: 'on-failure:2'
を、 services:
以下に定義します。ドメイン名は自分のサーバのものにします。なんと設定はこれだけです。WebSocket を使ってサービスを開発されている方もいらっしゃるようなので、 WEBSOCKET: 'true'
にしました。
staging での動作確認
https-portal では、まず staging で動作確認することが推奨されています。staging 環境では、自己署名証明書を使い HTTPS 接続のテストを行います。ブラウザでアクセスすると警告が出るあれです。その後、動作確認が取れ次第 STAGE: production
にして、本番の証明書を取得して使用します。
以下のコマンドでノードを再起動します。
$ symbol-bootstrap stop $ symbol-bootstrap run --detached
https-portal の Docker コンテナが立ち上がっているか確認します。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ... 1094be58f016 steveltn/https-portal:1 "/init" 8 hours ago Up 8 hours 0.0.0.0:80->80/tcp, 0.0.0.0:3001->443/tcp https-portal ...
steveltn/https-portal:1
というイメージのコンテナが立ち上がっていれば成功しています。ブラウザで、 node/health
にアクセスして確認しましょう。
https://puipui.iizukak.com:3001/node/health
staging 環境ではブラウザで警告が出ますが、意図した挙動です。これが動けばもう勝ちです。
production での動作確認
さて、もう一度 target/docker/docker-compose.yml
をエディタで開き、
STAGE: staging # STAGE: production
の部分を
# STAGE: staging STAGE: production
と編集します。そしてノードの再起動です。
$ symbol-bootstrap stop $ symbol-bootstrap run --detached
もう一度ブラウザでアクセスしてみます。そして警告なしにつながれば、 HTTPS 対応の成功です。
デバッグ
うまく動くと良いですが、動かない場合のデバッグ方法。
Docker コンテナのログ
https-portal の Docker コンテナのログになにか出ていることがあります。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ef70b0c3a76d symbolplatform/symbol-server:gcc-1.0.0.0 "/bin/bash /symbol-c…" 8 hours ago Up 8 hours 0.0.0.0:7900->7900/tcp node 1094be58f016 steveltn/https-portal:1 "/init" 8 hours ago Up 8 hours 0.0.0.0:80->80/tcp, 0.0.0.0:3001->443/tcp https-portal
で、コンテナの ID を調べ、
$ docker logs 1094be58f016
のようにログを確認できます。DNS のエラーが出ている場合、ポートの設定をミスしている可能性があります。
symbolnodes.org
HTTPS 対応してしばらくすると、 symbolnodes に https 対応していることが表示されます。以下のような感じです。
symbolnodes への反映はリアルタイムではありません。しばらく待ってから確認します(数時間?)。
証明書発行の確認
https-portal を production 環境に設定したのにブラウザから警告が消えないなどの場合、Let's Encrypt で証明書が発行されているか確認するとよいかもしれません。 crt.sh で確認できます。例えば自分の場合、以下のように証明書の発行が確認できました。
参考にさせていただいた記事
所感
symbol-bootstrap もすごいコマンドラインツールなのですが、https-portal も相当すごいライブラリでした。これだけの手順で HTTPS 対応できるとは思っていませんでした。先人たちの努力の偉大さを感じないわけにはいきません。
投げ XYM してくださるととても嬉しいです。アドレスは こちら。