prysm-pulse/scripts/gcp_startup_script.sh

75 lines
2.5 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
: '
# *** Instructions ***
# Build beacon chain for linux
bazel build --platforms=@io_bazel_rules_go//go/toolchain:linux_amd64 //beacon-chain
# Tar the binary
tar czvf /tmp/beacon-chain.tar.gz --directory=bazel-bin/beacon-chain/linux_amd64_stripped beacon-chain
# Copy to cloud storage
gsutil cp /tmp/beacon-chain.tar.gz gs://prysmaticlabs/beacon-chain-deployment.tar.gz
# Create template instance
gcloud compute instance-templates create beacon-chain \
--project=prysmaticlabs \
--image-family=debian-9 \
--image-project=debian-cloud \
--machine-type=g1-small \
--preemptible \
--scopes userinfo-email,cloud-platform \
--metadata app-location=gs://prysmaticlabs/beacon-chain-deployment.tar.gz \
--metadata-from-file startup-script=scripts/gcp_startup_script.sh \
--tags beacon-chain
# Navigate to https://console.cloud.google.com/compute/instanceTemplates/list?project=prysmaticlabs
# and create a new instance group with the template.
'
set -ex
# Talk to the metadata server to get the project id and location of application binary.
PROJECTID=$(curl -s "http://metadata.google.internal/computeMetadata/v1/project/project-id" -H "Metadata-Flavor: Google")
DEPLOY_LOCATION=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/app-location" -H "Metadata-Flavor: Google")
EXTERNAL_IP=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip" -H "Metadata-Flavor: Google")
# Install logging monitor. The monitor will automatically pickup logs send to
# syslog.
curl -s "https://storage.googleapis.com/signals-agents/logging/google-fluentd-install.sh" | bash
service google-fluentd restart &
# Install dependencies from apt
apt-get update
apt-get install -yq ca-certificates supervisor
# Get the application tar from the GCS bucket.
gsutil cp $DEPLOY_LOCATION /app.tar
mkdir -p /app
tar xvzf /app.tar -C /app
chmod +x /app/beacon-chain
# Create a goapp user. The application will run as this user.
getent passwd goapp || useradd -m -d /home/goapp goapp
chown -R goapp:goapp /app
# Configure supervisor to run the Go app.
cat >/etc/supervisor/conf.d/goapp.conf << EOF
[program:goapp]
directory=/app
command=/app/beacon-chain --p2p-host-ip=${EXTERNAL_IP} --clear-db
autostart=true
autorestart=true
user=goapp
environment=HOME="/home/goapp",USER="goapp"
stdout_logfile=syslog
stderr_logfile=syslog
EOF
supervisorctl reread
supervisorctl update
# Application should now be running under supervisor