See https://github.com/therootcompany/libreoffice-as-a-service/tree/main/scripts/builder.
GODADDY_DOMAIN=example.com
GODADDY_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
GODADDY_API_SECRET=xxxxxxxxxxxxxxxxxxxxxx
DIGITALOCEAN_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
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}"
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