Skip to content

Instantly share code, notes, and snippets.

@44uk
Last active January 29, 2020 09:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 44uk/a1777ee9ddcf0cf28e76a529c646d2f3 to your computer and use it in GitHub Desktop.
Save 44uk/a1777ee9ddcf0cf28e76a529c646d2f3 to your computer and use it in GitHub Desktop.
#!/bin/sh
# Amazon Linux 2 AMI (HVM), SSD Volume Type - ami-062f7200baf2fa504 (64 ビット x86) で動作確認済み
# AWS EC2 の ステップ3: インスタンスの詳細の設定 高度な詳細 > ユーザーデータ に貼り付けることで、
# インスタンス起動時にsymbol-testnet-bootstrapのpeerノードのセットアップを行います。
# また、動作の確認用に最新ブロック高を外部へ公開するサービスも動作させます。
# http://__ip_addr__:50080/height.txt でブロック高を確認できます。
#
# 次の作業を行います。
# * ssh接続ポートの変更
# * docker,docker-composeのインストール
# * symbol-testnet-bootstrapのpeer-assemblyのdocker-composeをサービス化
# * 任意のfriendly_nameを設定(変数に値を入れてください)
# * 任意のhostを設定(変数に値を入れてください)
# * (既存ノードを接続先として取得して設定)
# * 最新のブロック高を外部に公開するサービスのセットアップ
#
# セキュリティグループでは次のポートを公開してください。
# * 7900 peerノード間の通信用
# * 50022 sshd (変数で任意に変更可)
# * 50080 ブロック高公開用 (変数で任意に変更可)
SSHD_PORT=50022
HTTPD_PORT=50080
DOCKER_COMPOSE_VER=1.25.1
BOOTSTRAP_TAG=0.9.2.1-beta2
GATEWAY=http://api-xym-harvest-20.ap-northeast-1.nemtech.network
FRIENDLY_NAME=
NODE_HOST=
# パッケージを最新へアップデート
yum upgrade -y
# apt-get update -y && apt-get upgrade -y
# sshdの接続ポート変更
/bin/sed -i -e "s/^#Port 22$/Port $SSHD_PORT/" /etc/ssh/sshd_config
systemctl restart sshd
# dockerのインストールとサービス開始
yum install -y docker
systemctl enable docker && systemctl start docker
usermod -a -G docker ec2-user
# apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# apt-get update -y && apt-get install -y docker-ce
# docker-composeのインストール
curl -L https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_VER/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# docker info
# docker-compose --version
# symbolノードを常時起動させる設定
# User=rootなのはDockerのマウントしたボリュームのオーナー問題を手抜き解決するため
cat << __EOD__ > /etc/systemd/system/symbol.service
[Unit]
Description=Symbol Node Daemon
After=docker.service
[Service]
Type=simple
User=root
WorkingDirectory=/home/ec2-user/symbol-testnet-bootstrap-$BOOTSTRAP_TAG/peer-assembly
Environment=COMPOSE_FILE=/home/ec2-user/symbol-testnet-bootstrap-$BOOTSTRAP_TAG/peer-assembly/docker-compose.yaml
ExecStartPre=/usr/local/bin/docker-compose -f \$COMPOSE_FILE down
ExecStartPre=/usr/local/bin/docker-compose -f \$COMPOSE_FILE rm -f
ExecStart=/usr/local/bin/docker-compose -f \$COMPOSE_FILE up --build
ExecStop=/usr/local/bin/docker-compose -f \$COMPOSE_FILE stop
ExecStopPost=/usr/local/bin/docker-compose -f \$COMPOSE_FILE down
ExecStopPost=/usr/local/bin/docker-compose -f \$COMPOSE_FILE rm -f
ExecReload=/usr/local/bin/docker-compose -f \$COMPOSE_FILE restart
Restart=always
RestartSec=60s
[Install]
WantedBy=multi-user.target
__EOD__
# ホームディレクトリへ移動
cd /home/ec2-user
# symbolノードブートストラップを取得
curl -L https://github.com/nemfoundation/symbol-testnet-bootstrap/archive/$BOOTSTRAP_TAG.tar.gz | tar zx
chown -R ec2-user: symbol-testnet-bootstrap-$BOOTSTRAP_TAG
cd symbol-testnet-bootstrap-$BOOTSTRAP_TAG/peer-assembly
# knownPeersを取得して設定ファイルを生成
# リポジトリに入っている設定では都合が悪い場合に有効にしてください。
# https://github.com/nemfoundation/symbol-testnet-bootstrap/blob/master/peer-assembly/peer-node/userconfig/resources/peers-p2p.json
# curl -o /usr/bin/jq http://stedolan.github.io/jq/download/linux64/jq
# chmod +x /usr/bin/jq
# curl -s $GATEWAY/node/peers \
# | jq '.[] | {publicKey:.publicKey,endpoint:{host:.host,port:7900},metadata:{name:.friendlyName,roles:"Peer"}}' \
# | jq -s '{knownPeers:.}' \
# > peer-node/userconfig/resources/peers-p2p.json
# chown ec2-user: peer-node/userconfig/resources/peers-p2p.json
# 設定ファイルの書き換えと更新
# 設定ファイル生成だけ先に済ませる
docker-compose -f docker-compose.yaml up --build generate-raw-addresses store-addresses update_vars
if [ -n "$FRIENDLY_NAME" ]; then
sed -i.bak "/friendly_name/ s/[0-9A-Z]\{8\}/$FRIENDLY_NAME/" peer-node/config-input.yaml
# 設定ファイルの適用
docker-compose -f docker-compose.yaml up --build update_vars
fi
if [ -n "$NODE_HOST" ]; then
mv peer-node/userconfig/resources/config-node.properties.template{,.bk}
tr -d \\r < peer-node/userconfig/resources/config-node.properties.template.bk | sed "/^host/ s/$/$NODE_HOST/" > peer-node/userconfig/resources/config-node.properties.template
fi
# 生成されたファイルの所有者がrootになるのでec2-userに補正
chown -R ec2-user: peer-node/userconfig
# symbolサービスログ確認用
# journalctl -fu symbol
# symbolノードのブロック高情報をファイルから取り出してheight.txtとして書き込むスクリプト
cat << \__EOD__ > health-check.sh
#!/bin/bash
cd `dirname $0`
while true; do
echo "ibase=16;$(cat data/index.dat | xxd -p | fold -w2 | tac | tr -d '\n' | tr '[:lower:]' '[:upper:]')" \
| bc \
> tmp/height.txt
cat tmp/height.txt
sleep 20
done
__EOD__
chmod +x health-check.sh && chown ec2-user: health-check.sh
# web公開用ディレクトリをdockerコンテナに作らせるとオーナーがrootになってしまうので
# マウントするディレクトリを先に作っておく
mkdir -p tmp && chown ec2-user: tmp
# symbolノードのブロック高情報を公開するためのサービス
cat << __EOD__ > /etc/systemd/system/sym-health-check.service
[Unit]
Description=Catapult Node simple health check
After=symbol.service
[Service]
Type=simple
User=ec2-user
Group=ec2-user
WorkingDirectory=/home/ec2-user/symbol-testnet-bootstrap-$BOOTSTRAP_TAG/peer-assembly
ExecStartPre=/usr/bin/docker run --rm --name sym-health-check -t -v /home/ec2-user/symbol-testnet-bootstrap-$BOOTSTRAP_TAG/peer-assembly/tmp:/var/www/localhost/htdocs:ro -p $HTTPD_PORT:80 -d sebp/lighttpd
ExecStart=/home/ec2-user/symbol-testnet-bootstrap-$BOOTSTRAP_TAG/peer-assembly/health-check.sh
ExecStopPost=/usr/bin/docker stop sym-health-check
Restart=always
RestartSec=60s
[Install]
WantedBy=multi-user.target
__EOD__
# ブートストラップの常時起動設定とサービスの開始
systemctl daemon-reload
systemctl enable symbol && systemctl start symbol
systemctl enable sym-health-check && systemctl start sym-health-check
# パッケージマネージャキャッシュ削除
yum clean all
# 古いカーネルを削除
package-cleanup --oldkernels --count=1 -y
# Ubuntu向け
# apt-get clean -y && apt-get autoremove -y
# dpkg -l 'linux-image-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge
# update-grub
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment