commit e4de729e98ff0953cc67bf0db4d8a060a52589cf Author: cuqmbr Date: Tue Aug 12 21:23:24 2025 +0000 add backup.sh diff --git a/backup.sh b/backup.sh new file mode 100644 index 0000000..d3ed57f --- /dev/null +++ b/backup.sh @@ -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