NEM NIS1 ノードを Ubuntu24 の Docker 上に建てる


## Docker のインストール

GPG キーを追加します。

```bash
sudo apt update
sudo apt install -y 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
```

インストール

```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 <ユーザー名>
```

シェルを再起動して変更を反映させます。

```bash
exec $SHELL -l
```

## Docker 環境を構築する

`nem-docker` をクローンします。

```bash
cd ~/
git clone https://github.com/NemProject/nem-docker.git
cd nem-docker
```

`servant.config.properties.sample` を `servant.config.properties` にリネームして編集します。

```bash
cp custom-configs/servant.config.properties.sample custom-configs/servant.config.properties
vi custom-configs/servant.config.properties
```

`nem.host` に自 IP またはホスト名を入力します。
`servant.key` は、NEM スーパーノードプログラムに参加する場合、委任秘密鍵を設定します。参加しない場合は、空欄で良いでしょう。

```properties:custom-configs/servant.config.properties
# Common configuration
# short server name
nem.shortServerName = Servant

# Specifies the maximum number of threads of the thread pool.
nem.maxThreads = 100

# protocol, ports, paths
nem.protocol = http
nem.host = xxxx.xxxxxxxxx.com
nem.httpPort = 7880
nem.httpsPort = 7881
nem.webContext =
nem.apiContext =
nem.homePath =
nem.shutdownPath = /shutdown

# Servant key configuration
servant.key = XXXXXXXXXXXXXXXXXXXXXXXXXXXX...
```

:::note info
委任秘密鍵はここで確認出来ます。
サービス -> デリゲートアカウント(委任アカウント)管理を選択。
「デリゲートアカウントのキーを表示する」ボタン押下。
右に表示されたパスワードにウォレットのパスワードを入力して「＋」ボタンを押下すると**委任秘密鍵**が表示されます。
![NemWallet委任秘密鍵.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622558/fc62e39d-4c7c-42df-b33f-ece885aa7213.png)
:::

ログが root で作成されるので、先に作成するように `boot.sh` を修正します。

```bash
vi boot.sh
```

```diff_shell:boot.sh
...

mkdir -p $PWD/nem/ncc
mkdir -p $PWD/nem/nis
- chown -R 1000 nem
+ touch $PWD/nem/nis-stderr.log $PWD/nem/nis-stdout.log
+ chown -R $(id -u):$(id -g) nem

...
```

さて、ここから Docker イメージを作成して起動まで進めます。Docker イメージの作成方法は以下の 2 通りがあります。

1. 公開されているビルド済みの Jar ファイルを使用する方法
2. 公開されているソースコードからビルドする方法

通常は、ビルド済みの Jar ファイルを使用します。ただし、バージョンアップ直後でビルド済みの Jar ファイルがまだ公開されていない場合は、ソースコードからビルドして Docker イメージを作成する必要があります。

### ビルド済み Jar ファイルを使用して Docker 環境を構築する場合の修正

エラーが出るので Dockerfile を修正します。

```bash
vi Dockerfile
```

「New signature scheme, not always published」の部分をコメントアウトする。

```diff:Dockerfile
FROM fedora:37
MAINTAINER NEM Contributors
RUN dnf -y install java-11-openjdk-headless.x86_64 tar tmux supervisor procps jq unzip gnupg
RUN dnf -y upgrade nss

# NEM software
RUN curl -L http://bob.nem.ninja/nis-0.6.101.tgz > nis-0.6.101.tgz

# New signature scheme, not always published
- RUN sha=$(curl -L -s http://hugealice.nem.ninja:7890/transaction/get?hash=$(curl -L -s http://bob.nem.ninja/nis-0.6.101.tgz.sig | grep txId | sed -e 's/txId: //') | jq -r '.transaction.message.payload[10:74]') && \
-     echo "$sha nis-0.6.101.tgz"  > /tmp/sum && \
-     sha256sum -c /tmp/sum
+ #RUN sha=$(curl -L -s http://hugealice.nem.ninja:7890/transaction/get?hash=$(curl -L -s http://bob.nem.ninja/nis-0.6.101.tgz.sig | grep txId | sed -e 's/txId: //') | jq -r '.transaction.message.payload[10:74]') && \
+ #    echo "$sha nis-0.6.101.tgz"  > /tmp/sum && \
+ #    sha256sum -c /tmp/sum

RUN tar zxf nis-0.6.101.tgz

RUN useradd --uid 1000 nem
RUN mkdir -p /home/nem/nem/ncc/
RUN mkdir -p /home/nem/nem/nis/
RUN chown nem /home/nem/nem -R
```

### 自分でビルドした Jar から Docker 環境を構築する場合の修正

2025/04/05 現在、NEM NIS1 クライアントの最新バージョンは v0.6.102 です。  
最新版は [GitHub の公式リポジトリ](https://github.com/NemProject/nem) で確認できます。

NEM NIS1 クライアントをビルドするよう、Dockerfile を修正します。

```bash
vi Dockerfile
```

```diff:Dockerfile
FROM fedora:37
MAINTAINER NEM Contributors
- RUN dnf -y install java-11-openjdk-headless.x86_64 tar tmux supervisor procps jq unzip gnupg
+ RUN dnf -y install java-11-openjdk-headless.x86_64 tar tmux supervisor procps jq unzip gnupg git maven
RUN dnf -y upgrade nss

- # NEM software
- RUN curl -L http://bob.nem.ninja/nis-0.6.101.tgz > nis-0.6.101.tgz
-
- # New signature scheme, not always published
- RUN sha=$(curl -L -s http://hugealice.nem.ninja:7890/transaction/get?hash=$(curl -L -s http://bob.nem.ninja/nis-0.6.101.tgz.sig | grep txId | sed -e 's/txId: //') | jq -r '.transaction.message.payload[10:74]') && \
-     echo "$sha nis-0.6.101.tgz"  > /tmp/sum && \
-     sha256sum -c /tmp/sum
-
- RUN tar zxf nis-0.6.101.tgz
+ RUN alternatives --set java java-11-openjdk.x86_64
+ RUN git clone https://github.com/NemProject/nem -b v0.6.102 nis1
+ WORKDIR /nis1/infra
+ RUN ./package.build.sh build.log
+ RUN ./package.prepare.sh
+ RUN sed -i 's/nem\.network = \r/nem.network = mainnet/g' package/nis/config.properties
+ RUN cp -r package /package
+ WORKDIR /

RUN useradd --uid 1000 nem
RUN mkdir -p /home/nem/nem/ncc/
RUN mkdir -p /home/nem/nem/nis/
RUN chown nem /home/nem/nem -R
```

## NEM NIS1 クライアントの起動

NEM NIS1 クライアントを起動します。

```bash
./boot.sh
```

初回起動時にはノード名の入力を求められるため、任意のノード名を入力してください。

```plaintext
$ ./boot.sh
No config file was found. We need to generate one, even if you run only NCC
Enter the name you want to assign to your node:
<任意のノード名を入力して[Enter]>
Enter the boot key of your node. If you do not know what this is, press enter and one will be generated for you
[Enter]
```

初回起動時は、Docker イメージの作成に時間がかかる場合があります。以下のようなログが表示されれば、正常に完了しています。

```plaintext
Starting NIS
nis: started
All done, here are the services running:

ncc                              STOPPED   Not started
nis                              RUNNING   pid 17, uptime 0:00:02
perms                            RUNNING   pid 14, uptime 0:00:02
servant                          STOPPED   Not started
```

### スーパーノードプログラムに参加する場合は servant を起動

```bash
./service.sh start servant
```

## 動作確認

```bash
curl http://localhost:7890/node/info | jq
```

ノード情報が返ってくれば正常に動作しています。

```bash
curl http://localhost:7890/chain/height | jq
```

ブロック高が返ってきて、値が徐々に増加していれば正常に動作しています。

## NEM NIS1 クライアントの停止

```bash
./stop.sh
```

## 参考

https://qiita.com/curupo/items/84b1d3e76e1aef2e2f34