add backup.sh
This commit is contained in:
commit
e4de729e98
108
backup.sh
Normal file
108
backup.sh
Normal 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
|
Loading…
Reference in New Issue
Block a user