Build All（ball）　サーバを借りたらすぐ SYMBOLノード ！

**※このシェルスクリプトは、contabo vps1 OS:ubuntu 22.04/24.04 での動作確認をしています。**
　
　
ログインする時に開く端末又は、コマンドプロンプトは、画面を広くすると、見やすいです。　
サーバを借りたら　まず rootでログイン。
　
　
 ログインしたら、そのまま、その場所から、
```
wget b.dusanjp.com/ball/ball
```
シェルスクリプト`ball`をダウンロードします。
　
　
```
sh ball
```
シェルスクリプト`ball`を起動。
後は表示にしたがって操作して行って下さい。
symbolDualNodeが起動します。
　
　
**シェルスクリプト `ball` の内容**
```
#!/bin/bash

#開始の表示
echo 
echo "＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊"
echo "＊　　　　　　symbolノード起動スクリプト 'Build-All'　　　　　　　  ＊"
echo "＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊"
echo 

#あたらしいユーザを設定
echo 
echo "＊＊＊あたらしいユーザの登録をします。＊＊＊"
echo "ノードの操作に使う、あたらしいユーザを作成します。作成したいユーザー名を入力して下さい。"
read username
echo 
echo "あたらしいユーザ '"$username"' の登録をします。"
echo "パスワードを入力し、[ENTER]、再度確認の為にパスワードを再度入力し、[ENTER]、"
echo "その後、[ENTER]を6回入力して下さい。"
adduser $username
gpasswd -a $username sudo
echo "'"$username"' が、あたらしくユーザに追加され、sudo権限が与えられました。"

#sshdポートの設定変更
echo 
echo "＊＊＊sshdポートの変更をします。＊＊＊"
echo "サーバにログインする際の 'sshdポート' をデフォルトの '22' から変更します。変更したい 'sshdポート' を入力して下さい。"
read sshd
echo 
echo "sshdポートを '22' から、'"$sshd"' へ変更しています。"
sed -i -e s/"#Port .*"/"Port 22"/ /etc/ssh/sshd_config
sed -i -e s/"Port .*"/"Port $sshd"/ /etc/ssh/sshd_config
sed -i -e s/"PermitRootLogin .*"/"PermitRootLogin no"/ /etc/ssh/sshd_config
systemctl restart sshd

#sshdポートの変更_ubuntu24.04対応
echo "sshdポート変更の、ubuntu24.04への対応をします。"
echo "Port "$sshd > /etc/ssh/sshd_config.d/99-override.conf
sed -i -e s/".*ListenStream=.*"/"ListenStream=$sshd"/ /usr/lib/systemd/system/ssh.socket
systemctl daemon-reload
sudo systemctl restart ssh

echo "sshdポートが、'22' から、'"$sshd"' へ変更されました。"

#サーバのIPアドレスの取得
ip=$(curl -4 ifconfig.me)
echo 
echo "このサーバの 'IP' は "$ip" です。このサーバにログインする際は、この 'IP' を使用して下さい。"

#次回以降にログインする際のログイン方法の表示
echo "！！！このサーバは、次回からのログインは、rootとしてのログインは出来なくなります。！！！"
echo "次回からこのサーバにログインする為には以下の命令を実行して下さい"
echo "ssh -p "$sshd" "$username"@"$ip

#ノードの名称の設定
echo
echo "＊＊＊symbolノードの作成の為の設定をします。＊＊＊" 
echo "symbolノードに付ける名称 'friendlyName' を入力して下さい。"
read friendlyname
echo "ノード設定の 'friendlyName' 設定には、'"$friendlyname"' を設定します。"

#サーバのIPアドレスの表示
echo 
echo "このサーバの IP は、'"$ip"' です。ノードの 'host' 設定には、この IP '"$ip"' を設定します。"

#ノードの networkの設定
echo 
echo "ノードの network を選択して下さい。networkは、'testnet' と、'mainnet' があります。"
echo "'m' を入力して[ENTER]で、mainnet になります。"
echo "それ以外の文字を入力して[ENTER]で、testnet になります。"
read a

if [ $a = "m" ]; then
        network="mainnet"
else
        network="testnet"
fi
echo "ノードの 'network' 設定には、'"$network"' を設定します。"
#----------

#ファイアウォールのインストールと変更したsshdポートの許可
echo "ファイアウォールのインストールと設定をしています。あたらしく設定した '"$sshd"' を許可しています。"
apt-get install ufw
ufw allow $sshd/tcp

#ファイアウォールの開始
echo 
echo "ファイアウォールを開始します。yと入力し、[ENTER]を入力して下さい。"
ufw enable
ufw status

echo 
echo "＊＊＊ノードを建てる為の環境を構築します。（少し時間が掛かります）.......＊＊＊"

#dockerのインストールとその権限のあたらしいユーザへの付与
echo 
echo "dockerをインストールして、ユーザに権限の付与をしています。"
curl https://get.docker.com | sh
usermod -aG docker $username
systemctl start docker
systemctl enable docker
docker --version

echo 
echo "docker-composeをインストールして、ユーザに権限の付与をしています。"
#docker-composeのインストールとその権限のあたらしいユーザへの付与
curl -L https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version

#dockerの再起動
echo 
echo "dockerの設定を有効にする為に、dockerを再起動しています。"
systemctl restart docker

#node jsのインストール
echo 
echo "node.jsをインストールしています。"
curl -sL https://deb.nodesource.com/setup_20.x | sudo -E bash -
apt-get install -y nodejs
npm install -g npm
node -v
npm -v

#jqのインストール
echo 
echo "jqをインストールしています。"
apt-get install -y jq

#あたらしいユーザのホームディレクトリへの移動
echo 
echo "あたらしいユーザのホームディレクトリに移動します。"
echo "あたらしいユーザのホームディレクトリは、'/home/"$username"' になります。"　
cd /home/$username


#あたらしいユーザ上で使用する aliasの設定
echo 
echo "あたらしいユーザ上で、主に使用する命令を簡略化する alias を設定しています。"
alias=`cat .bashrc|grep "symbol-bootstrap run -d"`
if [ -z "$alias" ]; then
sudo -u $username cat << __EOD__ >> .bashrc

alias run="symbol-bootstrap run -d"
alias stop="symbol-bootstrap stop"
alias hc="symbol-bootstrap healthCheck"
alias ci="curl localhost:3000/chain/info|jq"
alias ni="curl localhost:3000/node/info|jq"
alias np="curl localhost:3000/node/peers|jq"
alias nu="curl localhost:3000/node/unlockedaccount|jq"
alias ns="curl localhost:3000/node/server|jq"
alias nep="curl localhost:3000/network/properties|jq"
alias nef="curl localhost:3000/network/fees/rental|jq"
alias up="docker-compose up -d"
alias down="docker-compose down"
alias dp="docker ps"
alias od="od -L target/nodes/node/data/index.dat | awk 'BEGIN{}{print $2}'"
alias pn="cat target/nodes/node/server-config/resources/*node*"
alias ph="cat target/nodes/node/server-config/resources/*har*"
alias pf="cat target/nodes/node/server-config/resources/*fin*"
alias nm="curl localhost:3000/node/metadata|jq"
alias nginxstart="sudo systemctl start nginx"
alias nginxstop="sudo nginx -s quit"
alias nginxstatus="systemctl is-active nginx"
alias nch="curl localhost:7890/chain/height|jq"
alias nni="curl localhost:7890/node/info|jq"
alias nnm="curl localhost:7880/nr/metaData|jq"
alias nstop="sudo pkill -SIGTERM -f org.nem"

__EOD__
 
fi


#githubからの symbol-bootstrapのダウンロードとそのインストール
echo 
echo "symbol-bootstrapを githubからダウンロードしています。"
rm -rf symbol-bootstrap
#git clone https://github.com/symbol/symbol-bootstrap
git clone https://github.com/nemneshia/symbol-bootstrap.git
echo 
echo "symbol-bootstrapをインストールしています。"
cd symbol-bootstrap
npm install
npm run build
npm install -g .
chown -R $username ../symbol-bootstrap

cd ../
echo 
echo "インストールした symbol-bootstrapのバージョンを表示します。"
symbol-bootstrap --version

#ノードの動作用ディレクトリ”symbolNode”の作成
echo 
echo "ノード動作用のディレクトリ'symbolNode'を、あたらしいユーザのホームディレクトリ '"$(pwd)"' ディレクトリに作成しています。"
rm -rf symbolNode
sudo -u $username mkdir -p symbolNode
cd symbolNode

#ノード設定ファイル”custom.yml”の作成
echo 
echo "ノード設定ファイル 'custom.yml' を、'symbolNode' ディレクトリの中に作成しています。"
sudo -u $username cat <<EOF > custom.yml
assembly: dual
preset: $network

nodes:
    -
        host: $ip
        friendlyName: $friendlyname
        #voting: （ﾃﾞﾌｫﾙﾄでは false 有効にする場合は true）
        #beneficiaryAddress: （ﾃﾞﾌｫﾙﾄでは mainAccountのｱﾄﾞﾚｽ）
        #maxUnlockedAccounts: （ﾃﾞﾌｫﾙﾄでは 10）
        #minFeeMultiplier: （ﾃﾞﾌｫﾙﾄでは 100）
        
        #以下の4行はあらかじめﾉｰﾄﾞｱﾄﾞﾚｽを決める時に秘密鍵を設定する
        mainPrivateKey: #mainの秘密鍵
        transportPrivateKey: #transportの秘密鍵
        remotePrivateKey: #remoteの秘密鍵
        vrfPrivateKey: #vrfの秘密鍵

#httpsを有効にする為には以下の3行の"#"を削除して下さい。hostにﾄﾞﾒｲﾝが設定されている事が必要です。       
#httpsProxies:
#    -
#        excludeDockerService: false

EOF

#ノード設定ファイルの表示と説明
echo 
echo "＊＊＊以下に表示するものは、ノード設定ファイル 'custom.yml' の内容です＊＊＊"
echo 
echo "---ノードの設定ファイル 'custom.yml' ここから---"
cat custom.yml
echo "---ノードの設定ファイル 'custom.yml' ここまで---"
echo 
echo "ノードの設定を変更する際には、このファイル 'custom.yml' を変更して下さい。"
echo "このノード設定ファイルは、'symbolNode/custom.yml' にあります。"
echo "'custom.yml' の変更は、"
echo "'cd symbolNode' で、作業ディレクトリ 'symbolNode' に入って、"
echo "'symbol-bootstrap stop' で、ノードを停止させてから、"
echo "'vi custom.yml' で、編集、変更を保存して下さい。"
echo "'symbol-bootstrap start -c custom.yml --upgrade -d' で、変更がノードに反映します。"
echo 
echo "＊＊＊これから、ノードを開始します。続けるには、[ENTER]を押して下さい。＊＊＊"
read a

#一括でノードを開始
echo 
echo "＊＊＊ノードを開始しています。＊＊＊"
echo "ノードを操作する際に入力するパスワードを設定します。パスワードを入力したら[ENTER]を入力して下さい。"
echo "パスワードを入力せずに[ENTER]でも構いませんが、その際はノードの固有アドレスの秘密鍵は暗号化されません。"
sudo -u $username symbol-bootstrap start -c custom.yml -d

#ノードの起動確認
echo 
echo "＊＊＊ノードの起動状態を確認しています。＊＊＊"
sudo -u $username symbol-bootstrap healthCheck
echo 
echo "以上は、'cd symbolNode'"
echo "'symbol-bootstrap healthCheck' で、表示出来ます。"
echo 
echo "＊＊＊ノードが正常に動作を始めました。＊＊＊"
echo "次に、ノードの現在のブロック高を表示します。"
echo "続けるには、[ENTER]を押して下さい。"
read a
curl localhost:3000/chain/info|jq
echo
echo "以上は、'curl localhost:3000/chain/info|jq' で、表示出来ます。"
echo "次に、ノードの情報を表示します。"
echo "続けるには、[ENTER]を押して下さい。"
read a
curl localhost:3000/node/info|jq
echo 
echo "以上は、'curl localhost:3000/node/info|jq' で、表示出来ます。"
echo 
echo "＊＊＊ノードは開始しました。＊＊＊"
echo "次に、ノードの固有アドレスを表示します。"
echo "続けるには、[ENTER]を押して下さい。"
read a


#ノードアドレスの表示
echo 
echo "以下に表示するものは、ノードの固有アドレスを記録した、'addresses.yml' の内容です。"
echo "このノード固有アドレスファイルは、'symbolNode/target/addresses.yml' にあります。"
echo "---ノードの固有アドレス 'addresses.yml' ここから---"
cat target/addresses.yml
echo "---ノードの固有アドレス 'addresses.yml' ここまで---"
echo
echo "次に、ノードの状態の確認と、ノードの操作の主な方法を説明します。"
echo "続けるには、[ENTER]を押して下さい。"
read a

#ノードの状態の確認や操作する主な命令の説明
echo 
echo "ノードの状態を確認するには、"
echo "①　ノードの名前等を見るには、"
echo "curl localhost:3000/node/info|jq"
echo 
echo "②　ノードの同期状態を見るには、"
echo "curl localhost:3000/chain/info|jq"
echo 
echo "③　ノードの接続状態を見るには、"
echo "curl localhost:3000/node/peers|jq"
echo 
echo "④　ノードの健康状態を見るには、"
echo "symbol-bootstrap healthCheck"
echo "又は、"
echo "curl localhost:3000/node/health|jq"
echo 
echo "⑤　ノードの委任状態を見るには、"
echo "curl localhost:3000/node/unlockedaccount|jq"
echo 
echo "⑥ ノードを停止するには、"
echo "cd symbolNode"
echo "symbol-bootstrap stop"
echo 
echo "⑦ ノードを開始するには、"
echo "cd symbolNode"
echo "symbol-bootstrap run -d"
echo 
echo "⑧ノードのブロックデータを削除して同期をやり直すには、"
echo "cd symbolNode"
echo "symbol-bootstrap resetData"
echo  
echo "以上のコマンドを命令して下さい。以上が主なノードを扱う方法です。"

#次回以降にログインする際のログイン方法の表示
echo 
echo "＊＊＊これで、ノード作成と起動作業は、完了しました。＊＊＊"
echo "この root での、ログイン状態での作業は終了しました。"
echo "！！！このサーバは、次回からのログインは、root としてのログインは出来なくなります。！！！"
echo "！！！今回ログインに使用した　'ssh root@"$ip"'　は、使用出来ません！！！"
echo "！！！次回からこのサーバにログインする為には以下の命令を実行して下さい！！！"
echo "ssh -p "$sshd" "$username"@"$ip
echo
echo "あたらしい端末から、上記の命令でサーバにログイン出来たら、この端末はログアウトして構いません。"
echo "次回以降にログインしたノードの作業ディレクトリは '/home/"$username"/symbolNode' にあります"
echo 

#別の端末でログイン出来たかの確認
a="n"
while [ $a = "n" ]
do

	echo "！！！別の端末から、上記のコマンドで、あたらしいユーザにログイン出来ましたか？！！！"
	echo "ログイン出来た場合は、'n' 以外の文字を入力するか、入力はしないで、[ENTER]を押して下さい。"
	echo "ログイン出来なかった場合は、'n' を入力して、[ENTER]を押して下さい。"
	read a

	if [ ! $a = "n" ]; then
		echo "別の端末から、サーバにログイン出来たので、この端末は、閉じて構いません。"
		echo "おつかれさまでした！これで、ノードの起動スクリプトは、終了します。"
		exit 0
	elif [ -z "$a" ]; then
		echo "別の端末から、サーバにログイン出来たので、この端末は、閉じて構いません。"
		echo "おつかれさまでした！これで、ノードの起動スクリプトは、終了します。"
		exit 0
	fi

	#変更したい  sshdポートの入力
	echo "'sshdポート' の再設定をします。現在の 'sshポート' は、'"$sshd"' です。"
	echo "？？？変更したい 'sshdポート' を入力して、[ENTER]を押して下さい？？？"
	read sshd

	#ファイアウォールのリセット
	echo "ファイアウォールをリセットしています。'y' と入力して、[ENTER]を押して下さい。"
	ufw reset

	#sshdポートの設定変更
	echo "'sshdポート' の設定を変更しています。"
	sed -i -e s/".*Port .*"/"Port $sshd"/ /etc/ssh/sshd_config
	systemctl restart sshd
	
	#sshdポートの変更_ubuntu24.04対応
	echo "sshdポート変更の、ubuntu24.04への対応をします。"
	echo "Port "$sshd > /etc/ssh/sshd_config.d/99-override.conf
	sed -i -e s/".*ListenStream=.*"/"ListenStream=$sshd"/ /usr/lib/systemd/system/ssh.socket
	systemctl daemon-reload
	sudo systemctl restart ssh
	
	echo "'sshdポート' を '"$sshd"' に設定しました。"

	#ファイアウォールの設定と再起動
	echo "ファイアウォールを設定して、再起動しています。'y' と入力して、[ENTER]を押して下さい。"
	ufw allow $sshd/tcp
	ufw enable

	echo 
	echo "！！！下記のコマンドが、あたらしいログイン命令になります。！！！"
	echo "ssh -p "$sshd" "$username"@"$ip
	echo 

done

```