#!/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