⛓️

symbol-bootstrapのPeerにlight-restを付ける

2025/01/09に公開

まだ docker イメージが作成されていないので、直接 light-rest をインストールします。
お試しでやってみたい方以外は、バージョンアップを待った方が良いと思います。

環境

  • Ubuntu 24.04
  • Docker 27.4.1
  • Node.js 20.18.1
  • symbol-bootstrap 1.1.11

docker

docker のインストールが終わっている場合はスキップ。

docker の apt リポジトリ追加

GPG キーの追加。

bash
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

リポジトリ追加。

bash
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

docker のインストール

docker パッケージをインストール。

bash
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-compose

docker を使用するユーザーにdockerグループを追加。

bash
sudo usermod -aG docker ユーザー名

Node.js のインストール

Node.js のインストールが終わっている場合はスキップ。

Node.js のバージョン管理ができる Volta 経由でインストールします。light-rest が v20 を要求するようなので、v20 をインストールします。

bash
sudo curl https://get.volta.sh | bash
exec $SHELL -l
volta install node@20

symbol-bootstrap

symbol-bootstrap のインストールが終わっている場合でも、カスタムプリセットにtrustedHostslocalNetworksの設定が必要です。

symbol-bootstrap のインストール

任意の場所にクローンします。

bash
git clone https://github.com/symbol/symbol-bootstrap.git
cd symbol-bootstrap

npm パッケージをインストールしてビルド。

bash
npm i
npm run build

symbol-bootstrap をグローバルインストール。

bash
npm install -g .

ノードのセットアップ

ノードのワーキングディレクトリ作成

ノードデータを格納するディレクトリを作成します。場所はどこでも良いです。

bash
sudo mkdir /opt/symbol-node
sudo chown ユーザー名: /opt/symbol-node
cd /opt/symbol-node

カスタムプリセットの作成

カスタムプリセットを設定します。
ハーベストの設定とホストの設定は、各自変更してください。

trustedHosts172.20.0.1を追加して、/node/unlockedaccountを使用できるようにします。
また、localNetworksにも172.20.0.1を追加して、ホスト側をコンテナのローカルと判断させます。これにより、light-rest がtarget/nodes/node/certにある証明書を使用できるようになります。

bash
vi custom-preset.yml
custom-preset.yml
maxUnlockedAccounts: 100
delegatePrioritizationPolicy: Age
beneficiaryAddress: 報酬を受け取るアドレス

nodes:
  - host: ホスト名
    friendlyName: フレンドリー名
    voting: false

maxChainBytesPerSyncAttempt: 10MB
blockDisruptorMaxMemorySize: 1000MB

trustedHosts: 127.0.0.1, 172.20.0.1
localNetworks: 127.0.0.1, 172.20.0.1

ノード設定の生成と docker compose の生成

ノードのメインキーなどの暗号化用のパスワードの設定があるので、任意のパスワードを設定してください(忘れないようメモを取っておいて下さい)。

bash
symbol-bootstrap config -p mainnet -a peer -c custom-preset.yml --upgrade
symbol-bootstrap compose --upgrade

ポート開放

ノード間通信の 7900 と light-rest の 3000 を開けます。

bash
sudo ufw allow 7900
sudo ufw allow 3000

ノードの起動

以下のコマンドでノードを起動します。

bash
symbol-bootstrap run -d

なお、メンテナンス等で停止したい場合は、stopでノードを停止します。

bash
symbol-bootstrap stop

light-rest

light-rest のインストール

symbol のクローンと light-rest のコピー

任意の場所にクローンします。
まだ、devにマージされていないので、client/light-restブランチを指定してクローンします。

bash
git clone https://github.com/symbol/symbol.git -b client/light-rest

rest をノードディレクトリにコピーします。
target ディレクトリに入れるのが良いとは思いますが、target ディレクトリを消すこともあるので外に置いてます。

bash
cp -r symbol/client/rest /opt/symbol-node
cd /opt/symbol-node/rest

light-rest の設定変更

bash
vi resources/rest.light.json
resources/rest.light.json
{
    "network": {
-        "name": "testnet",
-        "description": "catapult public test network"
+        "name": "mainnet",
+        "description": "catapult public main network"
    },

    "port": 3000,
-    "protocol": "HTTPS",
+    "protocol": "HTTP",
    "sslKeyPath": "",
    "sslCertificatePath": "",
    "crossDomain": {
        "allowedHosts": ["*"],
        "allowedMethods": ["GET"]
    },

    "apiNode": {
        "host": "127.0.0.1",
        "port": 7900,
        "timeout": 1000,
-        "tlsClientCertificatePath": "/",
-        "tlsClientKeyPath": "/",
-        "tlsCaCertificatePath": "/"
+        "tlsClientCertificatePath": "../target/nodes/node/cert/node.crt.pem",
+        "tlsClientKeyPath": "../target/nodes/node/cert/node.key.pem",
+        "tlsCaCertificatePath": "../target/nodes/node/cert/ca.cert.pem"
    },

    "throttling": {
        "burst": 20,
        "rate": 5
    },

    "logging": {
        "console": {
            "formats": ["colorize", "simple"],

            "level": "verbose",
            "handleExceptions": true
        },
        "file": {
            "formats": ["prettyPrint"],

            "level": "verbose",
            "handleExceptions": true,

            "filename": "catapult-rest.log",
            "maxsize": 20971520,
            "maxFiles": 100
        }
    },

    "deployment": {
        "deploymentTool": "",
        "deploymentToolVersion": "",
        "lastUpdatedDate": ""
    }
}

依存 npm パッケージをインストール

bash
npm i

light-rest の確認

light-rest を一旦起動します。

bash
npm run start-light resources/rest.light.json

もう一つコンソールを立ち上げて rest が正常に動作しているか確認します。

bash
curl -s http://127.0.0.1:3000/chain/info | jq
curl -s http://127.0.0.1:3000/node/info | jq
curl -s http://127.0.0.1:3000/node/peers | jq
curl -s http://127.0.0.1:3000/node/server | jq
curl -s http://127.0.0.1:3000/node/unlockedaccount | jq

正常に動作していることが確認出来たら、Ctrl + Cで light-rest を終了します。

サービス化

Light Rest Gateway サービス

bash
sudo vi /etc/systemd/system/symbol-light-rest.service
/etc/systemd/system/symbol-light-rest.service
[Unit]
Description=Symbol Light Rest Gateway
Requires=network.target
BindsTo=symbol.service

[Service]
Type=idle
ExecStart=/home/ユーザー名/.volta/bin/npm run start-light resources/rest.light.json
User=ユーザー名
Group=ユーザー名
WorkingDirectory=/opt/symbol-node/rest
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

symbol-bootstrap サービス

bash
sudo vi /etc/systemd/system/symbol.service
/etc/systemd/system/symbol.service
[Unit]
Description=Symbol Node
Requires=network.target symbol-light-rest.service
PartOf=symbol-light-rest.service

[Service]
Type=idle
ExecStart=/home/ユーザー名/.volta/bin/symbol-bootstrap run -d
ExecStopPost=/home/ユーザー名/.volta/bin/symbol-bootstrap stop
TimeoutStopSec=300
User=ユーザー名
Group=ユーザー名
WorkingDirectory=/opt/symbol-node
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

サービスをリロード

bash
sudo systemctl daemon-reload

Symbol ノード起動と停止

Symbol ノード起動

bash
sudo systemctl start symbol

依存関係を設定しているので、これだけで Symbol Peer ノードと light-rest が起動します。

Symbol ノード停止

bash
sudo systemctl stop symbol

Symbol Peer ノードと同時に light-rest も停止します。

Discussion