Skip to content

Instantly share code, notes, and snippets.

@44uk
Last active December 24, 2020 02:44
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save 44uk/ff9e8125a3c5ce5aa4f577130df12460 to your computer and use it in GitHub Desktop.
Save 44uk/ff9e8125a3c5ce5aa4f577130df12460 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: インスタンスの詳細の設定 高度な詳細 > ユーザーデータ に貼り付けることで、
# インスタンス起動時にcatapult-testnet-bootstrapのpeerノードのセットアップを行います。
# また、動作の確認用に最新ブロック高を外部へ公開するサービスも動作させます。
# http://__ip_addr__:50080/height.txt でブロック高を確認できます。
#
# 次の作業を行います。
# * ssh接続ポートの変更
# * docker,docker-composeのインストール
# * catapult-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.1-beta
CAT_GATEWAY=http://cat-testnet.44uk.net:3000
FRIENDLY_NAME=
NODE_HOST=
# パッケージを最新へアップデート
yum 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
usermod -a -G docker ec2-user
systemctl enable docker
systemctl start docker
# 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
# catapultノードを常時起動させる設定
# User=rootなのはDockerのマウントしたボリュームのオーナー問題を手抜き解決するため
cat << __EOD__ > /etc/systemd/system/catapult.service
[Unit]
Description=Catapult Node Daemon
After=docker.service
[Service]
Type=simple
User=root
WorkingDirectory=/home/ec2-user/catapult-testnet-bootstrap-$BOOTSTRAP_TAG/peer-assembly
Environment=COMPOSE_FILE=/home/ec2-user/catapult-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
# catapultノードブートストラップを取得
curl -L https://github.com/nemfoundation/catapult-testnet-bootstrap/archive/v$BOOTSTRAP_TAG.tar.gz | tar zx
chown -R ec2-user: catapult-testnet-bootstrap-$BOOTSTRAP_TAG
cd catapult-testnet-bootstrap-$BOOTSTRAP_TAG/peer-assembly
# knownPeersを取得して設定ファイルを生成
# リポジトリに入っている設定では都合が悪い場合に有効にしてください。
# https://github.com/nemfoundation/catapult-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 $CAT_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
# catapultサービスログ確認用
# journalctl -fu catapult
# catapultノードのブロック高情報をファイルから取り出して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
# catapultノードのブロック高情報を公開するためのサービス
cat << __EOD__ > /etc/systemd/system/cat-health-check.service
[Unit]
Description=Catapult Node simple health check
After=catapult.service
[Service]
Type=simple
User=ec2-user
Group=ec2-user
WorkingDirectory=/home/ec2-user/catapult-testnet-bootstrap-$BOOTSTRAP_TAG/peer-assembly
ExecStartPre=/usr/bin/docker run --rm --name cat-health-check -t -v /home/ec2-user/catapult-testnet-bootstrap-$BOOTSTRAP_TAG/peer-assembly/tmp:/var/www/localhost/htdocs:ro -p $HTTPD_PORT:80 -d sebp/lighttpd
ExecStart=/home/ec2-user/catapult-testnet-bootstrap-$BOOTSTRAP_TAG/peer-assembly/health-check.sh
ExecStopPost=/usr/bin/docker stop cat-health-check
Restart=always
RestartSec=60s
[Install]
WantedBy=multi-user.target
__EOD__
# ブートストラップとヘルスチェックの常時起動設定とサービスの開始
systemctl daemon-reload
systemctl enable catapult && systemctl start catapult
systemctl enable cat-health-check && systemctl start cat-health-check
# パッケージマネージャキャッシュ削除
yum clean all
# 古いカーネルを削除
package-cleanup --oldkernels --count=1 -y
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment