minecraft-server/up.sh

117 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
declare \
image='fedora-38' \
location='fsn1' \
name="minecraft" \
server_type='cx21' \
cloud_init_path='cloud-init.yaml' \
volume_id="${MINECRAFT_VOLUME_ID:-}" \
ipv4_id="${MINECRAFT_IPV4_ID:-}" \
ipv6_id="${MINECRAFT_IPV6_ID:-}" \
ssh_key_id="${HETZNER_SSH_KEY_ID:-}"
while getopts "hi:l:n:t:c:v:4:6:s:" arg; do
case $arg in
h)
echo 'minecraft-server up'
echo 'https://codeberg.org/pierreprinetti/minecraft-server'
echo
echo -e 'Usage:'
echo -e "\t-i: image (default: '${image}')"
echo -e "\t-l: location (default: '${location}')"
echo -e "\t-n: name (default: '${name}')"
echo -e "\t-t: type (default: '${server_type}')"
echo -e "\t-c: cloud-init path (default: '${cloud_init_path}')"
echo -e "\t-v: volume ID (default: '${volume_id}')"
echo -e "\t-4: IPv4 ID (default: '${ipv4_id}')"
echo -e "\t-6: IPv6 ID (default: '${ipv6_id}')"
echo -e "\t-s: SSH key ID (default: '${ssh_key_id}')"
echo
exit 0
;;
i)
image=$OPTARG
;;
l)
location=$OPTARG
;;
n)
name=$OPTARG
;;
t)
server_type=$OPTARG
;;
c)
cloud_init_path=$OPTARG
;;
v)
volume_id=$OPTARG
;;
4)
ipv4_id=$OPTARG
;;
6)
ipv6_id=$OPTARG
;;
s)
ssh_key_id=$OPTARG
;;
*)
exit 1
;;
esac
done
readonly \
image \
location \
name \
server_type \
cloud_init_path \
volume_id \
ipv4_id \
ipv6_id \
ssh_key_id
shift $((OPTIND-1))
declare data
data="$(jq -c \
--arg image "$image" \
--arg location "$location" \
--arg name "$name" \
--arg server_type "$server_type" \
'.
| .image=$image
| .location=$location
| .name=$name
| .server_type=$server_type
| .labels={"app": "minecraft"}
' <<< '{}')"
declare VOLUME_FSTAB_ENTRY=''
if [[ -n $volume_id ]]; then
VOLUME_FSTAB_ENTRY="$(curl -sS -X GET -H "Authorization: Bearer $HETZNER_API_TOKEN" 'https://api.hetzner.cloud/v1/volumes/34290011' | jq -j '.volume.linux_device') /mnt/minecraft-volume xfs discard,nofail,defaults 0 0"
export VOLUME_FSTAB_ENTRY
data="$(jq -c --argjson volume_id "$volume_id" '.volumes=[$volume_id]' <<< "$data")"
fi
if [[ -n $ipv4_id ]]; then
data="$(jq -c --argjson ipv4_id "$ipv4_id" '.public_net.ipv4=$ipv4_id' <<< "$data")"
fi
if [[ -n $ipv6_id ]]; then
data="$(jq -c --argjson ipv6_id "$ipv6_id" '.public_net.ipv6=$ipv6_id' <<< "$data")"
fi
if [[ -n $ssh_key_id ]]; then
data="$(jq -c --argjson ssh_key_id "$ssh_key_id" '.ssh_keys=[$ssh_key_id]' <<< "$data")"
fi
data="$(jq -c --arg cloud_init "$(envsubst '$SERVER_USER_NAME $SERVER_USER_KEY $VOLUME_FSTAB_ENTRY' < "$cloud_init_path")" '.user_data=$cloud_init' <<< "$data")"
readonly data
curl -isS \
-X POST \
-H "Authorization: Bearer ${HETZNER_API_TOKEN}" \
-H "Content-Type: application/json" \
-d "$data" \
'https://api.hetzner.cloud/v1/servers'