add backup.sh

This commit is contained in:
cuqmbr 2025-08-12 21:23:24 +00:00
commit e4de729e98

108
backup.sh Normal file
View File

@ -0,0 +1,108 @@
#!/bin/bash
set -uo pipefail
trap 's=$?; echo "$0: error on line "$LINENO": $BASH_COMMAND"; exit $s' ERR
IFS=$'\n\t'
# ~~~
reverse() {
# first argument is the array to reverse
# second is the output array
declare -n arr="$1" rev="$2"
for i in "${arr[@]}"
do
rev=("$i" "${rev[@]}")
done
}
function get_age_days {
local seconds_in_day=86400
local given_date_epoch=$(date -d "${1}" +%s)
local current_date_epoch=$(date +%s)
age=$(echo "(${current_date_epoch} - ${given_date_epoch}) / ${seconds_in_day}" | bc)
echo ${age}
}
# ~~~
BACKUP_NAME="$(date --iso-8601=seconds)"
PATH_TO_BACKUPS="${HOME}/backups/snapshots"
BACKUP_RETENTION_DAYS=14
REMOTE_DATA_PATH="/opt/mcsmanager/daemon/data/InstanceData/minecraft/dev"
LOCAL_DATA_PATH="${HOME}/backups/data"
SSH_CONNECTION="mcsmanager@daemon.panel.bebrashield.net"
SSH_KEY_PATH="${HOME}/.ssh/id_ed25519"
# Order: proxy, limbo, lobby, survival, mariadb
INSTANCE_UUIDS=(7cf021ac0c1e48c0bbfed308b3f93723 cd5e8059ddb14aa3abaee014585ef8c0 63309fcbc86d4c28a90c152bcc7d623f 29ba4cc6e35b43dea90931db6286bac0 1b0120b79fd54f55b7e920b76c4ef509)
reverse INSTANCE_UUIDS REV_INSTANCE_UUIDS
APIKEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
DAEMONID="a477ff5827b44a1c8c95e035c1da6c2c"
# ~~~
# Stop all containers on remote which data will be copied to local
for uuid in "${INSTANCE_UUIDS[@]}"; do
echo "Stopping ${uuid}..."
curl --fail-with-body \
-H 'Content-Type: application/json; charset=utf-8' \
-H 'X-Requested-With: XMLHttpRequest' \
"https://panel.bebrashield.net/api/protected_instance/stop?apikey=${APIKEY}&daemonId=${DAEMONID}&uuid=${uuid}"
echo ''
echo "Stopped ${uuid}."
sleep 10
done
echo "Creating backup of old files..."
# Create backup of old data
btrfs subvolume snapshot -r ${LOCAL_DATA_PATH} ${PATH_TO_BACKUPS}/${BACKUP_NAME}
echo "Backup of old files created."
echo "Copying files..."
# Copy data to local machine
rsync --delete-after --archive --no-inc-recursive --progress --info progress2 --compress --partial --recursive --rsh "ssh -i ${SSH_KEY_PATH}" ${SSH_CONNECTION}:${REMOTE_DATA_PATH} ${LOCAL_DATA_PATH}
echo "Files copied."
echo "Removing old backups..."
# Remove old backups
for path_to_snapshot in $(find ${PATH_TO_BACKUPS}/* -prune -print | sort -r); do
snapshot_name=$(basename "${path_to_snapshot}")
age_days=$(get_age_days "${snapshot_name}")
if [ ${age_days} -lt ${BACKUP_RETENTION_DAYS} ]; then
echo "Skipping '"${path_to_snapshot}"'. Age in days is ${age_days}"
else
btrfs property set ${path_to_snapshot} ro false
btrfs subvolume delete ${path_to_snapshot}
fi
done
echo "Old backups removed."
# Start all containers on remote which data was copied to local
for uuid in "${REV_INSTANCE_UUIDS[@]}"; do
echo "Starting ${uuid}..."
curl --fail-with-body \
-H 'Content-Type: application/json; charset=utf-8' \
-H 'X-Requested-With: XMLHttpRequest' \
"https://panel.bebrashield.net/api/protected_instance/open?apikey=${APIKEY}&daemonId=${DAEMONID}&uuid=${uuid}"
echo ''
echo "Started ${uuid}."
sleep 10
done