|
#!/usr/bin/env bash
|
|
|
|
# XXX: this script is intended to be run from a fresh Digital Ocean droplet
|
|
|
|
# NOTE: you must set this manually now
|
|
echo "export DO_API_TOKEN=\"yourtoken\"" >> ~/.profile
|
|
|
|
sudo apt-get update -y
|
|
sudo apt-get upgrade -y
|
|
sudo apt-get install -y jq unzip python-pip software-properties-common make
|
|
|
|
# get and unpack golang
|
|
curl -O https://dl.google.com/go/go1.16.5.linux-amd64.tar.gz
|
|
tar -xvf go1.16.5.linux-amd64.tar.gz
|
|
|
|
## move binary and add to path
|
|
mv go /usr/local
|
|
echo "export PATH=\$PATH:/usr/local/go/bin" >> ~/.profile
|
|
|
|
## create the goApps directory, set GOPATH, and put it on PATH
|
|
mkdir goApps
|
|
echo "export GOPATH=/root/goApps" >> ~/.profile
|
|
echo "export PATH=\$PATH:\$GOPATH/bin" >> ~/.profile
|
|
# **turn on the go module, default is auto. The value is off, if tendermint source code
|
|
#is downloaded under $GOPATH/src directory
|
|
echo "export GO111MODULE=on" >> ~/.profile
|
|
|
|
source ~/.profile
|
|
|
|
mkdir -p $GOPATH/src/github.com/tendermint
|
|
cd $GOPATH/src/github.com/tendermint
|
|
# ** use git clone instead of go get.
|
|
# once go module is on, go get will download source code to
|
|
# specific version directory under $GOPATH/pkg/mod the make
|
|
# script will not work
|
|
git clone https://github.com/tendermint/tendermint.git
|
|
cd tendermint
|
|
## build
|
|
make tools
|
|
make build
|
|
#** need to install the package, otherwise terdermint testnet will not execute
|
|
make install
|
|
|
|
# generate an ssh key
|
|
ssh-keygen -f $HOME/.ssh/id_rsa -t rsa -N ''
|
|
echo "export SSH_KEY_FILE=\"\$HOME/.ssh/id_rsa.pub\"" >> ~/.profile
|
|
source ~/.profile
|
|
|
|
# install terraform
|
|
wget https://releases.hashicorp.com/terraform/0.11.7/terraform_0.11.7_linux_amd64.zip
|
|
unzip terraform_0.11.7_linux_amd64.zip -d /usr/bin/
|
|
|
|
# install ansible
|
|
sudo apt-get update -y
|
|
sudo apt-add-repository ppa:ansible/ansible -y
|
|
sudo apt-get update -y
|
|
sudo apt-get install ansible -y
|
|
|
|
# required by ansible
|
|
pip install dopy
|
|
|
|
# the next two commands are directory sensitive
|
|
cd $GOPATH/src/github.com/tendermint/tendermint/networks/remote/terraform
|
|
|
|
terraform init
|
|
terraform apply -var DO_API_TOKEN="$DO_API_TOKEN" -var SSH_KEY_FILE="$SSH_KEY_FILE" -auto-approve
|
|
|
|
# let the droplets boot
|
|
sleep 60
|
|
|
|
# get the IPs
|
|
ip0=`terraform output -json public_ips | jq '.value[0]'`
|
|
ip1=`terraform output -json public_ips | jq '.value[1]'`
|
|
ip2=`terraform output -json public_ips | jq '.value[2]'`
|
|
ip3=`terraform output -json public_ips | jq '.value[3]'`
|
|
|
|
# to remove quotes
|
|
strip() {
|
|
opt=$1
|
|
temp="${opt%\"}"
|
|
temp="${temp#\"}"
|
|
echo $temp
|
|
}
|
|
|
|
ip0=$(strip $ip0)
|
|
ip1=$(strip $ip1)
|
|
ip2=$(strip $ip2)
|
|
ip3=$(strip $ip3)
|
|
|
|
# all the ansible commands are also directory specific
|
|
cd $GOPATH/src/github.com/tendermint/tendermint/networks/remote/ansible
|
|
|
|
# create config dirs
|
|
tendermint testnet
|
|
|
|
ansible-playbook -i inventory/digital_ocean.py -l sentrynet install.yml
|
|
ansible-playbook -i inventory/digital_ocean.py -l sentrynet config.yml -e BINARY=$GOPATH/src/github.com/tendermint/tendermint/build/tendermint -e CONFIGDIR=$GOPATH/src/github.com/tendermint/tendermint/networks/remote/ansible/mytestnet
|
|
|
|
sleep 10
|
|
|
|
# get each nodes ID then populate the ansible file
|
|
id0=`curl $ip0:26657/status | jq .result.node_info.id`
|
|
id1=`curl $ip1:26657/status | jq .result.node_info.id`
|
|
id2=`curl $ip2:26657/status | jq .result.node_info.id`
|
|
id3=`curl $ip3:26657/status | jq .result.node_info.id`
|
|
|
|
id0=$(strip $id0)
|
|
id1=$(strip $id1)
|
|
id2=$(strip $id2)
|
|
id3=$(strip $id3)
|
|
|
|
# remove file we'll re-write to with new info
|
|
old_ansible_file=$GOPATH/src/github.com/tendermint/tendermint/networks/remote/ansible/roles/install/templates/systemd.service.j2
|
|
rm $old_ansible_file
|
|
|
|
# need to populate the `--p2p.persistent-peers` flag
|
|
echo "[Unit]
|
|
Description={{service}}
|
|
Requires=network-online.target
|
|
After=network-online.target
|
|
|
|
[Service]
|
|
Restart=on-failure
|
|
User={{service}}
|
|
Group={{service}}
|
|
PermissionsStartOnly=true
|
|
ExecStart=/usr/bin/tendermint node --mode validator --proxy-app=kvstore --p2p.persistent-peers=$id0@$ip0:26656,$id1@$ip1:26656,$id2@$ip2:26656,$id3@$ip3:26656
|
|
ExecReload=/bin/kill -HUP \$MAINPID
|
|
KillSignal=SIGTERM
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
" >> $old_ansible_file
|
|
|
|
# now, we can re-run the install command
|
|
ansible-playbook -i inventory/digital_ocean.py -l sentrynet install.yml
|
|
|
|
# and finally restart it all
|
|
ansible-playbook -i inventory/digital_ocean.py -l sentrynet restart.yml
|
|
|
|
echo "congratulations, your testnet is now running :)"
|