#!/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 :)"