NEMのノード(スーパーノード可)を建ててみよう Ubuntu 18.04

##はじめに
NEMでハーベストするためにはNEMのフルノードに接続することが必要ですが、
ノードによって定員が定められており、なかなか空いてないことがあります。
そこで今回は自分でNEMのノードを建ててみることにします。
また、この手順で定期的に報酬が受けられるNEMのスーパーノードを建てることもできます。

##手順

###ドメインの準備

####ドメインの取得
今回はipv4アドレスでも構いません。必要な場合のみドメインを取得してください。

###サーバーの準備

####サーバーの用意

Linuxサーバーを立ち上げます。
今回はドイツにある[CONTABO](https://contabo.com/?show=vps)の「VPS L SSD」、OSは「Ubuntu 18.04」を選びました。
メールでroot/passwordが送られてくるのでそれでログインしてください。
8コア、RAM 30GB、SSD 800GB、帯域600Mbit/s、帯域利用無制限、DDoS保護で月15ユーロはVPSでは格安の部類だと思います。
![e41e240c2001c4fc927af94fe4dd44b1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232554/4de23952-eaba-8c66-4694-76fa434bdda0.png)

###サーバの初期設定
root/passwordで入り、初期設定を行います。

####タイムゾーン、NTPの設定
サーバーを日本時間にします。
`timedatectl set-timezone Asia/Tokyo`

NTPサーバーを設定します。今回はサーバーがドイツにあるので、ドイツのNTPサーバーを使う方が良いでしょう。
`sed -i 's/#NTP=/NTP=2.de.pool.ntp.org/g' /etc/systemd/timesyncd.conf`

####スワップファイルの設定
CONTABOの場合、既に2GBのスワップが最初から設定されていますが、増やしたい場合は一度既存のスワップファイルを消して作り直しましょう。
現在の割り当てを消去して10GB割り当てます。
`swapoff /swapfile && sudo rm /swapfile`
`fallocate -l 10G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile`

####ファイアウォールの設定

#####SSH制限
SSHポートは攻撃を受けやすいので、ファイアーウォールで接続制限しましょう。
接続元は自宅の固定IPや、踏み台サーバーの固定IPが良いでしょう。

`ufw allow from xxx.xxx.xxx.xxx to any port 22` 

ポート番号を変えてさらに接続制限するのも有効です。

```vi /etc/ssh/sshd_config
Port yyyyy```を追記。 (yyyyyは任意のポート番号)
その場合はファイアーウォールも忘れずに設定しましょう。
`ufw allow from xxx.xxx.xxx.xxx to any port yyyyy`

#####ポート解放
今回はTCP 7778、7880、7890を外部に公開する必要があります。
`ufw allow 7778/tcp`
`ufw allow 7880/tcp`
`ufw allow 7890/tcp`

#####ファイアウォールの起動
ファイアウォールを起動します。
`sudo ufw enable`

####Ubuntuのアップデート
Ubuntuをアップデートして最新版にします。
`sudo apt update`
`sudo apt -y dist-upgrade`

####ノード用ユーザーの作成
nemというユーザーを作成します。
`adduser nem`
2回パスワードを聞かれるので、入力したら後はエンターキーで省略しましょう。

ユーザーnemにsudoを与えます
`gpasswd -a nem sudo`

####Java8のインストール
Java8をインストールします。
`apt install -y openjdk-8-jre`
バージョン確認
`java -version`

####unzipのインストール
`apt install unzip`

####DNSの設定
ドメインを指定しない場合は必要ありません。

###サーバーの設定

####ユーザーをnemに変更します。
`su - nem`

####NISとservantのダウンロードと展開
[NEMのサーバー](http://bob.nem.ninja/)からnisとservantをダウンロードします。
※2019/12/08現在ではnis-0.6.97とservant_0_0_4が最新版となります。
`wget http://bob.nem.ninja/nis-0.6.97.tgz`
`wget http://bob.nem.ninja/servant_0_0_4.zip`

それぞれ展開します
`tar xzf nis-0.6.97.tgz`
`unzip -q servant_0_0_4.zip`

それらをnemServerという1つのフォルダにまとめます
`mv servant package`
`mv package nemServer`
`chmod -R g-w nemServer`

####設定ファイルの設定

ここでは、NEMのnano walletの情報を使用します。
事前にデリゲートアカウントを有効化してください。

![2f63152eec2eb56f78d95487b58ea74d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232554/df73fae1-42d4-48ea-eacd-84d339b35d3f.png)

#####NISサーバの設定
`cd nemServer/nis`
念のため設定ファイルのパックアップをとっておきます
`cp -p config.properties config.properties.org`

`vi config.propaties` 46～47行目あたりと77行目あたり

```config.propaties
#nis.bootKey = #0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
#nis.bootName = foobar
↓
nis.bootKey = <委任秘密鍵>
nis.bootName = <任意の名前>

nis.unlockedLimit = 4
↓
nis.unlockedLimit = 30
```

NISサーバーにメモリを3GB割り当てる予定なので、ハーベスト接続人数を30人に増やしています。

#####NISサーバの起動設定
`cd ~/nemServer`
`vi nix.runNis.sh`

最近はサーバーの最小標準構成が4GB以上が推奨されているようですので、とりあえず3GBのメモリをNISサーバーに割り当てます。
また、Java8の最適化のため「G1GC」オプションを追加しています。

```nix.runNis.sh
#!/bin/bash

cd nis
java -Xms3G -Xmx3G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -cp ".:./*:../libs/*" org.nem.deploy.CommonStarter
cd -
```

割り当てメモリを増やせば前述のハーベスト接続人数も更に増やすことができますし、動作も安定します。

####NISサーバーの仮起動
`cd ~/nemServer`
NISサーバーの仮起動を行います
`nohup ./nix.runNis.sh < /dev/null &`
`tail -f nohup.out`で確認できます
Ctrl+Cで終了

####Servantサーバの設定
`cd ~/nemServer/servant`
念のため設定ファイルのパックアップをとっておきます
`cp -p config.properties config.properties.org`
`vi config.properties`

```config.properties.org
nem.host = <put vps ip address here>
↓
nem.host = <サーバーのIPもしくはドメイン名を入れます>

servant.key = <put your NIS boot key here>
↓
servant.key = <委任秘密鍵>
```

####Servantサーバーの仮起動
`cd ~/nemServer/servant`

実行権限を付けておきます
`chmod u+x startservant.sh`

Servantサーバーの仮起動を行います
`nohup ./startservant.sh < /dev/null &`
`tail -f nohup.out`で確認できます
Ctrl+Cで終了

####NISサーバーおよびServantサーバーの停止
`sudo pkill -SIGTERM -f org.nem`

###NISサーバーのデータベースダウンロード

####データベースのダウンロード
初回起動時間短縮のために、予め用意されたデータベースをダウンロードして解凍しておきます。
`cd ~/nemServer`
`wget http://bob.nem.ninja/nis5_mainnet.h2-2293k.db.zip`
`unzip -q nis5_mainnet.h2-2293k.db.zip`

一度NISサーバーの仮起動をしたときにできたファイルを消去します
`rm ~/nem/nis/data/*`

解凍したデータを移動します
`mv nis5_mainnet.h2.db ~/nem/nis/data/`

###自動起動の設定
NISサーバーとServantサーバーが自動起動するように設定します。

####NISサーバーの自動起動

`sudo vi /etc/systemd/system/nem-nis.service`

```/etc/systemd/system/nem-nis.service
[Unit]
Description = NEM NIS Server
After = network.target

[Service]
WorkingDirectory = /home/nem/nemServer
ExecStart = /home/nem/nemServer/nix.runNis.sh
Restart = always
Type = simple
User = nem
Group = nem
LimitNOFILE=100000

[Install]
WantedBy = multi-user.target
```

####Servantサーバーの自動起動

`sudo vi /etc/systemd/system/nem-servant.service`

```/etc/systemd/system/nem-servant.service
[Unit]
Description = NEM Servant program
After = network.target nem-nis.target

[Service]
WorkingDirectory = /home/nem/nemServer/servant
ExecStart = /home/nem/nemServer/servant/startservant.sh
Restart = always
Type = simple
User = nem
Group = nem
LimitNOFILE=100000

[Install]
WantedBy = multi-user.target
```

#####systendへの登録と起動
NISサーバーとServantサーバーをsystemdに登録します
`sudo systemctl daemon-reload`
`sudo systemctl enable nem-nis.service`
`sudo systemctl enable nem-servant.service`

NISサーバーとServantサーバー起動します
`sudo systemctl start nem-nis.service`
`sudo systemctl start nem-servant.service`

####動作確認

#####NISサーバ動作確認
http://xxx.xxx.xxx.xxx:7890/node/extended-info (しばらく"Service Unavailable"エラー発生)で委任公開鍵やNISバージョン表示され
http://xxx.xxx.xxx.xxx:7890/chain/height にてブロック高が表示されれば、NISサーバーは稼働しています。

#####Servantサーバ動作確認
http://xxx.xxx.xxx.xxx:7880/nr/metaData にて 委任公開鍵やServantのバージョンが表示されれば、稼働しています。

###スーパーノードとして登録

####スーパーノード登録方法
アカウントに残高が300万XEM以上あればスーパーノードして登録でき、スーパーノード報酬が貰えますが、
事前に登録が必要です。
NEMのNano Walletから専用アカウントにメッセージを送りましょう。

宛先に `NAFUND-BUKIOS-TMD4BN-XL7ZFE-735QHN-7A3FBS-6CMY`
と入力し、メッセージに
`enroll  (nemServer/servant/config.propertieのIPアドレスもしくはドメイン名) (nemServer/nis/config.propertieの任意の名前) (委任公開鍵)`
と入力し、送信しましょう。

![459d3acf93c200597d590b72bbad1d91.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232554/a6181b4c-2752-d077-77e0-228a592d8a2e.png)

ほどなく[Nem Node Rewards](https://supernodes.nem.io/)に登録され、状況が確認できます。
間違えてしまった場合、NEM FORUMに報告して訂正してもらう必要があります。

##おわりに
以上がNEMノードおよびスーパーノードの建て方となります。
NEMも一時期に比べて入手しやすくなったので、定期的に報酬が貰えるスーパーノードを建てるチャンスかもしれません。
しかしながら、自身や利用者のためにもハッキングから防ぐためにセキュリティには細心の注意を払うことも必要です。
また、NEMのアカウントはTREZORなどのハードウェアウォレットを使用することもお勧めします。

##参考サイト
[みなりん*のブログ - NEM スーパーノード](https://mizunashi-rin.hatenablog.jp/)
[TecAdmin.net - How to Install JAVA 8 on Ubuntu 18.04/16.04, Linux Mint 19/18](https://tecadmin.net/install-oracle-java-8-ubuntu-via-ppa/)