Skip to content

Instantly share code, notes, and snippets.

@coolaj86
Last active December 3, 2021 07:25
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save coolaj86/b82f96c48046683340995f9289523566 to your computer and use it in GitHub Desktop.
Save coolaj86/b82f96c48046683340995f9289523566 to your computer and use it in GitHub Desktop.

Updated

See https://github.com/therootcompany/libreoffice-as-a-service/tree/main/scripts/builder.

From tonight's stream

https://youtu.be/b5afTOZVIq4

example.env

GODADDY_DOMAIN=example.com
GODADDY_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
GODADDY_API_SECRET=xxxxxxxxxxxxxxxxxxxxxx

DIGITALOCEAN_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Create (VPS + DNS)

Creates an instance with the tag delete-me and a random domain prefixed with dev-, such as dev-ab12.example.com.

#!/bin/bash
set -e
set -u

source .env

function do_api() {
    my_method="${1}"
    my_path="${2}"
    my_json="${3:-}"

    if [[ -n ${my_json} ]]; then
        curl -fsSL -X "${my_method}" "https://api.digitalocean.com${my_path}" \
            -H "Authorization: Bearer ${DIGITALOCEAN_TOKEN}" \
            -H "Content-Type: application/json" \
            -d "${my_json}"
    else
        curl -fsSL -X "${my_method}" "https://api.digitalocean.com${my_path}" \
            -H "Authorization: Bearer ${DIGITALOCEAN_TOKEN}"
    fi
}

function gd_api() {
    my_method="${1}"
    my_path="${2}"
    my_json="${3:-}"

    if [[ -n ${my_json} ]]; then
        curl -fsSL -X "${my_method}" "https://api.godaddy.com${my_path}" \
            -H "Authorization: sso-key ${GODADDY_API_KEY}:${GODADDY_API_SECRET}" \
            -H "Content-Type: application/json" \
            -d "${my_json}"
    else
        curl -fsSL -X "${my_method}" "https://api.godaddy.com${my_path}" \
            -H "Authorization: sso-key ${GODADDY_API_KEY}:${GODADDY_API_SECRET}"
    fi
}

# "ssh_keys": [ { id, name, public_key, fingerprint } ]
echo "Getting SSH Keys"
my_keys="$(do_api GET "/v2/account/keys" | jq '[.ssh_keys[].id]')"

my_domain="${GODADDY_DOMAIN}"
# TODO XXXX
my_branch="dev-dev-$(openssl rand -hex 2)"
if ! echo "${my_branch}" | grep '^dev-' > /dev/null; then
    exit 1
fi
my_sub="$(echo "${my_branch}" | cut -c 5-)"
my_date="$(date '+%FT%H:%M:%S')"

# TODO attach volumes
echo "Creating droplet"
my_droplet="$(
    do_api POST "/v2/droplets" '{
          "name": '"\"${my_sub}.${my_domain}\""',
          "region": "nyc3",
          "size": "s-1vcpu-1gb",
          "image": "ubuntu-20-04-x64",
          "ssh_keys": '"${my_keys}"',
          "backups": true,
          "ipv6": true,
          "monitoring": true,
          "user_data": "!#/bin/bash\necho \"hello\" > /heya",
          "with_droplet_agent": true,
          "volumes": [],
          "tags": [ "delete-me", '"\"${my_date}\""' ]
        }' | jq '.droplet.id'
)"

# assign resource to project
echo "Reassigning Droplet ${my_droplet} to Project"
my_project="d5cff68d-9a7c-45a4-9c62-f43ae1a501d7"
do_api POST "/v2/projects/${my_project}/resources" '{
          "resources": [
            "do:droplet:'"${my_droplet}"'"
          ]
        }'

my_status=""
my_ipv4=""
my_ipv6=""
while true; do
    echo 'checking for IP addresses...'
    my_stats="$(
        do_api GET "/v2/droplets/${my_droplet}" |
            jq '{ status: .droplet.status, ipv4: .droplet.networks.v4[] | select(.type == "public") | .ip_address, ipv6: .droplet.networks.v6[] | select(.type == "public") | .ip_address }'
    )"
    my_ipv4="$(echo "$my_stats" | jq -r '.ipv4')"
    my_ipv6="$(echo "$my_stats" | jq -r '.ipv6')"

    if [[ -n $my_ipv4 ]]; then
        break
    fi
    sleep 2
done

echo "setting A (IPv4) record to ${my_ipv4}..."
gd_api PUT "/v1/domains/${GODADDY_DOMAIN}/records/A/${my_sub}" '[
      {
          "data": "'"${my_ipv4}"'",
          "ttl": 600
      }
    ]'
if [[ -n ${my_ipv6} ]]; then
    echo "setting AAAA (IPv6) record to ${my_ipv6}"
    gd_api PUT "/v1/domains/${GODADDY_DOMAIN}/records/AAAA/${my_sub}" '[
      {
          "data": "'"${my_ipv6}"'",
          "ttl": 600
      }
    ]'
fi

while true; do
    echo 'checking for "active" status...'
    my_status="$(
        do_api GET "/v2/droplets/${my_droplet}" |
            jq -r '.droplet.status'
    )"
    echo "Status: '${my_status}'"
    if [[ "active" == "$my_status" ]]; then
        break
    fi
    sleep 10
done

my_count=1
while [[ ${my_count} -lt 10 ]]; do
    echo "($my_count) testing SSH connection..."
    my_count=$((my_count + 1))
    if ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=1 -o ConnectionAttempts=1 \
        "root@${my_ipv4}" "echo hello"; then
        break
    fi
    sleep 10
done

echo "attempting basic server setup..."
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "root@${my_ipv4}" "
  curl -fsSL https://webinstall.dev/ssh-adduser | bash
  curl -fsSL https://webinstall.dev/vps-addswap | bash
"

ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "app@${my_sub}.${my_domain}"

Delete (VPS + DNS)

Deletes by tag delete-me and domains with the prefix dev-.

#!/bin/bash
set -e
set -u

source .env

curl -X DELETE -fsS "https://api.digitalocean.com/v2/droplets?tag_name=delete-me" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer ${DIGITALOCEAN_TOKEN}"

my_subs="$(
    echo "$(
        curl -fsS "https://api.godaddy.com/v1/domains/${GODADDY_DOMAIN}/records/A" \
            -H "Authorization: sso-key ${GODADDY_API_KEY}:${GODADDY_API_SECRET}" \
            -H "Accept: application/json" | jq -r '.[].name' | grep '^dev-'
        curl -fsS "https://api.godaddy.com/v1/domains/${GODADDY_DOMAIN}/records/AAAA" \
            -H "Authorization: sso-key ${GODADDY_API_KEY}:${GODADDY_API_SECRET}" \
            -H "Accept: application/json" | jq -r '.[].name' | grep '^dev-'
    )" | sort -u
)"

for my_sub in ${my_subs}; do
    echo "deleting ${my_sub}..."
    curl -sS -X DELETE "https://api.godaddy.com/v1/domains/${GODADDY_DOMAIN}/records/A/${my_sub}" \
        -H "Authorization: sso-key ${GODADDY_API_KEY}:${GODADDY_API_SECRET}"
    curl -sS -X DELETE "https://api.godaddy.com/v1/domains/${GODADDY_DOMAIN}/records/AAAA/${my_sub}" \
        -H "Authorization: sso-key ${GODADDY_API_KEY}:${GODADDY_API_SECRET}"
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment