Symbol Dual (Peer+API) ノードの起動


## MongoDB インストール

### 公開鍵のインポート

MongoDB の公開鍵 GPG キーをインポートします。

```bash
curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \
   sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg \
   --dearmor
```

### リストファイルを作成する

Ubuntu 24 用のリストファイルを作成する。

```bash
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list
```

### MongoDB のインストール

```bash
sudo apt update
sudo apt install -y mongodb-org
```

## 作業ディレクトリへの移動

```bash
cd /opt/symbol-node
```

## MongoDB の準備

### DB データ格納ディレクトリの作成

Symbol のデータを格納するディレクトリを作成する。

```bash
mkdir /opt/symbol-node/dbdata
```

### MongoDB の起動

```bash
mongod --dbpath=dbdata --wiredTigerCacheSizeGB 2
```

### MongoDB の初期化

初回起動時は、データベースもコレクションも無い状態なので、catapult データベースを作成し、初期化します。
もう一つコンソールを開いて、以下を実行します。

```bash
cd /opt/symbol-node/mongo
mongosh catapult mongoDbDrop.js
mongosh catapult mongoDbPrepare.js
cd ..
```

しばらく、MongoDB は使用しないので`Ctrl + C`で終了します。

## Rest の準備

### Rest のコピー

`/opt/symbol-node/symbol-node`に持って行きます。

```bash
cd /opt/symbol-node
cp -r ~/symbol/client/rest app
cd app
npm i
cd ..
```

### コンフィグの編集

`rest/rest.json`を編集します(app/resources 内の rest.json は使用しません)。
各ホストをループバック IP に変更します。また、ノードの証明書とプロパティへのパスを設定します。`deployment`と`nodeMetadata`の変更は任意です。

```rest/rest.json
...
        "db": {
                "url": "mongodb://127.0.0.1:27017/",
...
        "apiNode": {
                "host": "127.0.0.1",
                "port": 7900,
                "timeout": 1000,
                "tlsClientCertificatePath": "../certificates/node.crt.pem",
                "tlsClientKeyPath": "../certificates/node.key.pem",
                "tlsCaCertificatePath": "../certificates/ca.crt.pem",

                "inflationPropertyFilePath": "../resources/config-inflation.properties",
                "networkPropertyFilePath": "../resources/config-network.properties",
                "nodePropertyFilePath": "../resources/config-node.properties"
        },

        "websocket": {
                "mq": {
                        "host": "127.0.0.1",
...
                "file": {
                        "formats": ["prettyPrint"],

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

                        "filename": "../logs/rest/catapult-rest.log",
                        "maxsize": 20971520,
                        "maxFiles": 100
                }
...
        "deployment": {
                "deploymentTool": "n/a",
                "deploymentToolVersion": "n/a",
                "lastUpdatedDate": "n/a"
        },

        "nodeMetadata": {
                "_info": "replace the body of this object with custom fields and objects to personalize your node"
        }
}
```

## Symbol

### ノードのコンフィグ編集

`resources/config-extensions-server.properties`を編集します。  
`extension.filespooling`と`extension.partialtransaction`を有効にする。

```resources/config-extensions-server.properties
[extensions]

# api extensions
extension.filespooling = true
extension.partialtransaction = true
...
```

`resources/config-extensions-broker.properties`を編集します。  
すべての拡張機能を有効にする。

```resources/config-extensions-broker.properties
[extensions]

# addressextraction must be first because mongo and zeromq depend on extracted addresses
extension.addressextraction = true
extension.mongo = true
extension.zeromq = true

extension.hashcache = true
```

`resources/config-extensions-recovery.properties`を編集します。

```resources/config-extensions-recovery.properties
[extensions]

# addressextraction must be first because mongo and zeromq depend on extracted addresses
extension.addressextraction = true
extension.mongo = true
extension.zeromq = true

extension.filespooling = false
extension.hashcache = true
```

`resources/config-node.properties`を編集します。  
`enableAutoSyncCleanup`を無効にする。
`roles`に Api を追加する。

```resources/config-node.properties
...
enableAutoSyncCleanup = false
...
roles = Peer, Api
...
```

`resources/config-database.properties`を編集します。  
`databaseUri`をループバック IP に変更する。

```resources/config-database.properties
[database]

databaseUri = mongodb://127.0.0.1:27017
...
```

`peers-api.json`を作成します。API を持つノードのリストなのですが、`peers-p2p.json` のコピーで問題ないでしょう。もし、Peer ノードが含まれていたら外す。

```bash
cp resources/peers-p2p.json resources/peers-api.json
```

## Dual ノードの起動

server が起動しているなら、停止させる。
また、すでに同期したデータがある場合はデータを削除する。
コンソールを 5 つ立ち上げ、以下の順番にコマンドを実行する。

```bash
cd /opt/symbol-node
mongod --dbpath=dbdata --wiredTigerCacheSizeGB 2
```

```bash
cd /opt/symbol-node/app
npm start ../rest/rest.json
```

```bash
cd /opt/symbol-node
catapult.broker .
```

```bash
cd /opt/symbol-node
catapult.server .
```

### ポートの開放

```bash
sudo ufw allow 3000
```

### 動作確認

正常な応答があるか確認します。

```bash
curl -s http://localhost:3000/node/health | jq
curl -s http://localhost:3000/chain/info | jq
curl -s http://localhost:3000/node/info | jq
curl -s http://localhost:3000/node/unlockedaccount | jq
curl -s http://localhost:3000/network/properties | jq
```

### ノードの停止

起動の逆順に停止します。

- server
- broker
- rest
- MongoDB

## 次回

https://qiita.com/ccHarvestasya/items/d3e23aade0a077ccd0b4