iizukak の雑記

忘れる前に書いとこう

Symbol ノード HTTPS 対応備忘録

最近 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 対応していることが表示されます。以下のような感じです。

f:id:iizukak:20210325223157p:plain

symbolnodes への反映はリアルタイムではありません。しばらく待ってから確認します(数時間?)。

証明書発行の確認

https-portal を production 環境に設定したのにブラウザから警告が消えないなどの場合、Let's Encrypt で証明書が発行されているか確認するとよいかもしれません。 crt.sh で確認できます。例えば自分の場合、以下のように証明書の発行が確認できました。

f:id:iizukak:20210325223511p:plain

参考にさせていただいた記事

所感

symbol-bootstrap もすごいコマンドラインツールなのですが、https-portal も相当すごいライブラリでした。これだけの手順で HTTPS 対応できるとは思っていませんでした。先人たちの努力の偉大さを感じないわけにはいきません。

投げ XYM してくださるととても嬉しいです。アドレスは こちら