プライベートチェーンを建てる　その１ statistics-service構築編

# はじめに

この記事はSymbolブロックチェーンでプライベートチェーンを構築するシリーズのその１です。
プライベートチェーンの構築は公式ドキュメントにも記載されています。
公式ドキュメントを参考にすると、Symbol-bootstrapを使用してプライベートテストネットを建てることができます。
ただ、公式ドキュメントではノードの構築の方法は紹介されていますが、エクスプローラーなどの周辺ツールの整備がされていません。

https://docs.symbol.dev/ja/guides/network/creating-a-private-test-net.html#private-test-networks

プライベートチェーンのノードを建ててもエクスプローラーやウォレットが使えないと色々と不便なのでそのあたりの構築方法をこのシリーズでご紹介できればと思います。

# シリーズ紹介

<details><summary>その１　statistics-service構築編（この記事です）</summary>

- 統計サービスです。エクスプローラーを正常に動かすために必要です。
- ネットワークのノードから定期的に情報を収集し、ノードの総数、正常性、地理的分布などを生成・提供してくれます。

</details>

<details><summary>その２　Symbolエクスプローラー構築編</summary>

- ブロックチェーンのコンテンツを閲覧するための読み取り専用の Web アプリケーションです。
- エクスプローラーは、特定のネットワーク上のトランザクション、アカウント、名前空間、モザイク、およびブロック情報の検索をサポートしています。

</details>

<details><summary>その３　プライベートチェーン構築編</summary>

- プライベートチェーンを構築します。
- ここではより実践的にSymbol-bootstrap組み込みのプライベートテストネットではなくあるツールを使って１から設定ファイルを作成します。

</details>

<details><summary>その４　Symbolウォレット（デスクトップウォレット）構築編</summary>

- アカウント、モザイク、名前空間、発行トランザクションを管理する Symbol のクロスプラットフォーム クライアントです。
- デスクトップウォレットはMac、Windows、および Web アプリケーションとして利用できるので、今回はWEBでアクセスする形にします。

</details>

<details><summary>その５　Faucet構築編</summary>

- Faucetとはいわゆる蛇口ですね。テストネット等で使用する基軸通貨の配布を行えるツールです。

</details>

<details><summary>その６　おまけ</summary>

- Symbol-bootstrapを使って他人に設定を共有する方法をご紹介する予定です。（もしかしたらやらないかも）

</details>

# 前提知識

全体を通して最低限以下の知識があると望ましいです。

- Linuxを扱ったことがある
- Docker、docker-composeが扱える（基本的にコマンドが叩ければOKです）
- ドメインやSSL（TLS）についての知識がある


# その１ statistics-service構築編

それでは、これよりstatistics-serviceを構築していきますが、まずはStatistics Serviceとはなんなのか？を少し説明します。

## statistics-serviceとは？


https://github.com/symbol/statistics-service

>Symbol Statistics Service
It periodically collects information from the network's nodes and produces useful metrics and insights, such as the total number of nodes, their health or their geographical distribution.

Statistics Serviceの説明をDeeplで翻訳すると以下のようになります。

>シンボル統計サービス
ネットワークのノードから定期的に情報を収集し、ノードの総数、健康状態、地理的な分布など、有用な指標や洞察を生成します。

要は、Symbolのノードを定期的に巡回し、情報を収集するツールということですね。

ちなみに、Statistics Serviceは以下のAPIを提供しています。

https://testnet.symbol.services/openapi/index.html


## Statistics Serviceを構築するのはなぜ？

なぜ、Statistics Serviceを構築するかというと、**Symbolエクスプローラーがこのサービスを利用している**からなんですね。
今のエクスプローラーはStatistics Serviceがないと動かない（動かす方法はあるがめんどくさい）です。

## Statistics Serviceの構築方法

それでは、実際にStatistics Serviceを構築していきます。

### 必要なこと（もの）
- サーバー（ローカル環境でも可）
- Docker及びdocker-composeが実行出来ること
- gitが使えること
- ドメイン（なくても可）

### タグを指定してソースコートを取得（2022/12現在 v1.1.9）

```bash
$ git clone https://github.com/symbol/statistics-service.git -b v1.1.9
```

### モジュールのインストール

```
cd statistics-service
npm install
```

公式の手順に沿うと`npm run dev`でツールは起動出来るようですが、この方法ではツールの永続化をすることはできませんので、Docker Setupを参考にDockerでツールを永続化させます。

https://github.com/symbol/statistics-service/tree/v1.1.9#installation

README.mdの手順にしたがってイメージをビルドしても良いのですが、Docker Hubに公式イメージが公開されているのでそちらを使っても問題ありません。公式のイメージを使う場合はモジュールのインストールなどは飛ばしてOKです。

https://hub.docker.com/r/symbolplatform/symbol-statistics-service/tags


ソースコードから手動でイメージをビルドする場合は以下のコマンドです。

```
$ cd statistics-service
$ docker build -t symbol-statistics-service:latest .
```

### docker-compose.ymlの作成

symbol-statistics-serviceはデータベースにmongodbを使います。
公式のREADME.mdにはmongodbの情報は載っていなかったので、私が独自に作成しました。（なので他に良い書き方があればツッコミお待ちしています）

```yaml
version: "3"
services:
    mongodb:
        environment:
            MONGO_INITDB_DATABASE: statistics
        container_name: mongodb
        restart: always
        image: mongo:latest
        volumes:
            - ../databases/db:/dbdata:rw
    app:
        container_name: statistics
        restart: always
        image: symbol-statistics-service:latest
        environment:
            - PORT=4001
            - MONGODB_ENDPOINT=mongodb://mongodb:27017
            - NODES=["http://○○.○○.○○.○○:3000,http://○○.○○.○○.○○:3000"]
        ports:
            - "3003:4001"
        depends_on:
            - mongodb
```

#### 補足

```yaml
...
        image: mongo:latest
        volumes:
            - ../databases/db:/dbdata:rw　※１
...
        restart: always
        image: symbol-statistics-service:latest　※２
        environment:
            - PORT=4001
            - MONGODB_ENDPOINT=mongodb://mongodb:27017
            - NODES=["http://sym-test-03.opening-line.jp:3000"]　※３
...
```

**※１**　statistics-serviceで収集したデータを保持する場所です。ストレージ容量に余裕のある場所を指定
**※２**　イメージ名は先程ビルドしたものかDockerHubのものを指定（公式を使う場合は **symbolplatform/symbol-statistics-service:latest** を指定）
**※３**　次回以降に作成するプライベートチェーンのノードURLを指定（今はOpeningLineさんのテストネットのノードをお借ります）

### 実行

```bash
docker-compose up -d
```

### 確認

- サーバーで実行した人

```
http://サーバーのIPアドレス:3003/nodes
```

- ローカルPCで実行した人

```
http://ローカルPCのIPアドレス:3003/nodes
```

で確認ができます。正常に起動している場合は以下の添付図のような情報が取得出来ると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/c2e91a0a-0d20-041b-1fd5-f8fec258f1f3.png)


不要になったら以下のコマンドで停止。

```
docker-compose down
```

以上で、statistics-service構築編を終わります。

次回は、**Symbolエクスプローラーの構築編**をお届けします。