Oracle Cloud Infrastructureのarm64インスタンスでSymbolノードを動かしたがRESTゲートウェイがノードと繋がらない

# はじめに

Oracle Clouod Infrastructureのarm64インスタンスでSymbolノードを動かしたぞって記事を書きたかったです。

でも表題の通りRESTゲートウェイとAPIノードの接続ができない点の解消ができなかったので、仮想マシンをセットアップして起動する手順をいったん記載します。

# 手順

## 仮想マシン作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/09ffa6ef-2148-afd5-fb2a-83d3712e9ba8.png)

シェイプはAmprereを選択します。

ノードの推奨要件には届きませんが、4コア24GBにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/722d7778-3abb-cb68-cb01-2f73a14df794.png)

ディスクは推奨容量750GBって書いてあったのですが、デフォルト値が1024GBなのでこれでいきます。IOPSも1500以上が推奨ですが、25,000あるので問題ありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/2792b1a2-fb2f-6a84-8443-afc8dc376bf8.png)

## ボリュームのアタッチ

仮想マシン作成する画面でボリュームを新規作成したので、Webコンソール上ではアタッチされています。仮想マシンの内部での作業がありますのでやっていきます。

https://qiita.com/yamada-hakase/items/eb2ca44a112b3b18164e

以下でコマンドを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/c1cc4783-d6f8-666b-e697-90d541667b33.png)

これを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/b8bd02ef-b1bd-abb3-9bec-a71a1a18f7d4.png)

アタッチのタイプにはparavirtualizedとiSCSIがあるみたいですが、iSCSIでアタッチされていましたのでその手順でやりました。

paravirtualizedだとコマンド入力のところが不要になるみたいですね。

## ボリュームのマウント

情報が少なくてよくわかってないが、以下の記事を参考にしました。

https://qiita.com/yamada-hakase/items/4360d723245126f43eb9

```
# parted /dev/sdb mklabel gpt
# parted -a optimal /dev/sdb mkpart primary 0% 100%
# parted /dev/sdb print
# mkfs.xfs /dev/oracleoci/oraclevdb1
# mkdir /mnt/data
# chown opc:opc /mnt/data
# mount /dev/oracleoci/oraclevdb1 /mnt/data
```

```
# vi /etc/fstab
/dev/oracleoci/oraclevdb1 /mnt/data xfs defaults 0 2
```


## ネットワーク・セキュリティ・グループ

作成ボタン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/13f5db55-a764-c8f2-a128-628375928a7f.png)

3000,3001,7900をあけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/74ad240b-c0ab-8e0a-b556-49b8f0c7d355.png)

インスタンスの画面で、VNICにアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/17e39a92-cb93-8491-f70b-08593e7b40e8.png)



## ポート開放

```shell
$ sudo firewall-cmd --add-port=3000/tcp --permanent
$ sudo firewall-cmd --add-port=3001/tcp --permanent
$ sudo firewall-cmd --add-port=7900/tcp --permanent
$ sudo firewall-cmd --reload
```

## Node.jsのインストール

https://github.com/nodesource/distributions?tab=readme-ov-file#installation-instructions-rpm


```shell
$ node -v
v22.4.1
```

## Dockerのインストール

Oracle Linuxですが、CentOSの手順を実施して無事インストールできました。

https://docs.docker.com/engine/install/centos/

### Docker Composeのインストール

こちらを参考にさせて頂きます。

https://qiita.com/kure/items/d691bc6afd912bbbc545


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/932ad218-1c05-8341-be58-6d739b4856aa.png)

docker-composeをdocker上で動かすみたいです。


## Symbol Bootstrapのインストール

gitが無いのでインストール

```shell
$ sudo yum install -y git
```

Symbol Bootstrapのインストール

```shell
$ git clone https://github.com/symbol/symbol-bootstrap
$ cd symbol-bootstrap
$ npm i
$ npm run build
$ sudo npm i -g .
```

## Symbol Bootstrapのセットアップ

```shell
$ mkdir alice
$ cd alice
$ symbol-bootstrap config -p mainnet -a dual
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/365bc631-522e-fbef-444e-74b2d0661555.png)

うーむ、`Running image using Exec: symbolplatform/symbol-server:gcc-1.0.3.7 bash createNodeCertificates.sh`のとこ、arm64でないイメージを使っているのにうまくいっている。

とりあえず次へ。

```shell
$ symbol-bootstrap compose
```

docker-compose.ymlを編集します。

```
$ vi target/docker/dockse-compose.yml
```

```diff_yaml
version: '2.4'
services:
    db:
        user: '1000:1000'
        environment:
            MONGO_INITDB_DATABASE: catapult
        container_name: db
-       image: mongo:6.0.14
+       image: arm64v8/mongo:6.0.14
        command: mongod --dbpath=/dbdata --bind_ip=db --wiredTigerCacheSizeGB 2
        stop_signal: SIGINT
        working_dir: /docker-entrypoint-initdb.d
        volumes:
            - ./mongo:/docker-entrypoint-initdb.d:ro
            - ../databases/db:/dbdata:rw
    node:
        user: '1000:1000'
        container_name: node
-       image: symbolplatform/symbol-server:gcc-1.0.3.7
+       image: symbolplatform/symbol-server:gcc-1.0.3.7-arm64
        command: /bin/bash /symbol-commands/start.sh /usr/catapult ./data server broker node NORMAL true
        stop_signal: SIGINT
        working_dir: /symbol-workdir
        restart: on-failure:2
        ports:
            - '7900:7900'
        volumes:
            - ../nodes/node:/symbol-workdir:rw
            - ./server:/symbol-commands:ro
        depends_on:
            - db
            - broker
    broker:
        user: '1000:1000'
        container_name: broker
-       image: symbolplatform/symbol-server:gcc-1.0.3.7
+       image: symbolplatform/symbol-server:gcc-1.0.3.7-arm64
        working_dir: /symbol-workdir
        command: /bin/bash /symbol-commands/start.sh /usr/catapult ./data broker server broker NORMAL
        stop_signal: SIGINT
        restart: on-failure:2
        volumes:
            - ../nodes/node:/symbol-workdir:rw
            - ./server:/symbol-commands:ro
        depends_on:
            - db
    rest-gateway:
        container_name: rest-gateway
        user: '1000:1000'
        environment:
            npm_config_cache: /symbol-workdir
-       image: symbolplatform/symbol-rest:2.4.4
+       image: ishidad2/symbol-rest:2.4.3
        command: npm start --prefix /app /symbol-workdir/rest.json
        stop_signal: SIGINT
        working_dir: /symbol-workdir
        ports:
            - '3000:3000'
        restart: on-failure:2
        volumes:
            - ../gateways/rest-gateway:/symbol-workdir:rw
        depends_on:
            - db
        networks:
            default:
                ipv4_address: 172.20.0.25
networks:
    default:
        ipam:
            config:
                -
                    subnet: 172.20.0.0/24
```

arm64版のrestが公式になかったので、こちらでだいさんが作成されていたのを借ります。

https://qiita.com/ishidad2/items/c57b66002d0f14ad0e35#restv243%E3%81%AEdockerimage%E3%82%92%E3%83%93%E3%83%AB%E3%83%89

## Symbol Bootstrapの起動

```shell
$ symbol-bootstrap run
```

起動しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/c0465e4f-3c04-42a8-be22-a0e79d909bc5.png)

## ヘルスチェック

```shell
$ symbol-bootstrap healthCheck
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/68e5f24a-8d7b-d886-64d7-d5d93b463587.png)


`Running image using Exec: symbolplatform/symbol-server:gcc-1.0.3.7`のところで、arm64版を使っていないので失敗するかなと思ったんですが、エラーが出ませんでした。

# APIノードとREST Gatewayがつながらない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/276d0a64-23c2-3b1b-1d38-bb213e902ee4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/2636e20f-8f1c-8664-9467-d3a53390a8d3.png)

なぜだろう。原因は最初からわからないし調べてない。いろいろ試してみてるが解決してない。

情報の取得はできるが、トランザクションがきっと送信できない。

# ちなみに

## symbol-bootstrap 1.1.10ではconfigから失敗する

```shell
$ symbol-bootstrap config -p mainnet -a dual
```

サーバー証明書か何かを作るときにdockerを起動しているようで失敗しました。それをarm64版のイメージに変えればいいのでしょうが、ちょっと大変そうな気がします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/5eb47f9d-c195-149f-1020-291596770973.png)

## ストップ＆スタートでdbコンテナの名前が変わった

`symbol-bootstrap stop`の後、`symbol-bootstrap start`したら、dbコンテナの名前が`db`から`a2df583cc223_db`に変わりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/28dbe604-b151-677f-89a0-69b07e472b9a.png)

なので`symbol-bootstrap healthCheck`が通らなくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/830c530d-6106-39a2-f8ff-467c950c5a3e.png)

理由はわかりません。

いろいろ試してたらならなくなりました。

# おわりに

次回は（あれば）、ノードを動かすのに１か月いくらかかったのかを出せたらと思います。

また、OCIについて始めたばっかりなのでリソースを適当に設定しています。勉強してどんどん変えていこうと思います。