Created
June 13, 2020 21:15
-
-
Save lae/a33339a0ee670745831ddd13ecdcb157 to your computer and use it in GitHub Desktop.
minecraft server differential backup
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# Runs a backup of the Hololive Fan Minecraft server and stores it offsite. | |
# Bits and pieces from https://github.com/nicolaschan/minecraft-backup (MIT License) | |
ROOT=/home/lae/.hololive-mc | |
MCROOT=$ROOT/data | |
WORLD=world | |
SAVEROOT=$ROOT/backups | |
OFFSITE_SAVEROOT="lae@10.17.3.10:/mnt/umaru/backups/hololive-mc" | |
SSH_ARGS="-i $ROOT/backup.key" | |
# the server should accept an rsync command with the above key, authorized_keys: | |
# command="rsync --server -vlogDtprCze.iLsfxC --delete . /mnt/umaru/backups/hololive-mc/" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ7zsWDB0f9tJmDnMJnKUCNp79rUuIGMWfi6OAWaalf+ hololive-mc backup key | |
RCONCMD="docker-compose exec -T minecraft rcon-cli" | |
execute-command () { | |
local COMMAND=$1 | |
cd $ROOT | |
$RCONCMD "$COMMAND" | |
} | |
message-players () { | |
local MESSAGE=$1 | |
local HOVER_MESSAGE=$2 | |
message-players-color "$MESSAGE" "$HOVER_MESSAGE" "gray" | |
} | |
message-players-error () { | |
local MESSAGE=$1 | |
local HOVER_MESSAGE=$2 | |
message-players-color "$MESSAGE" "$HOVER_MESSAGE" "red" | |
} | |
message-players-success () { | |
local MESSAGE=$1 | |
local HOVER_MESSAGE=$2 | |
message-players-color "$MESSAGE" "$HOVER_MESSAGE" "green" | |
} | |
message-players-color () { | |
local MESSAGE=$1 | |
local HOVER_MESSAGE=$2 | |
local COLOR=$3 | |
if [[ -z "$HOVER_MESSAGE" ]]; then | |
echo "$MESSAGE" | |
execute-command "tellraw @a [\"\",{\"text\":\"[backup.sh] \",\"color\":\"gray\",\"italic\":true},{\"text\":\"$MESSAGE\",\"color\":\"$COLOR\",\"italic\":true}]" | |
else | |
echo "$MESSAGE ($HOVER_MESSAGE)" | |
execute-command "tellraw @a [\"\",{\"text\":\"[backup.sh] \",\"color\":\"gray\",\"italic\":true},{\"text\":\"$MESSAGE\",\"color\":\"$COLOR\",\"italic\":true,\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"$HOVER_MESSAGE\"}]}}}]" | |
fi | |
} | |
rdiff-backup --compare $MCROOT/$WORLD $SAVEROOT/$WORLD >/dev/null | |
if [[ $? -eq 0 ]]; then | |
echo "No differences found. Not running backup." | |
exit | |
fi | |
START_TIMESTAMP=$(date +%s) | |
echo "Creating a backup." | |
# Disable world autosaving | |
execute-command "save-off" | |
# Backup world | |
START_TIME=$(date +"%s") | |
rdiff-backup $MCROOT/$WORLD $SAVEROOT/$WORLD | |
RDIFF_STATUS=$? | |
rdiff-backup --remove-older-than 2W --force $SAVEROOT/$WORLD | |
CLEAN_STATUS=$? | |
sync | |
rsync -Cazz --info=STATS --delete -e "ssh $SSH_ARGS" $SAVEROOT/ $OFFSITE_SAVEROOT/ | |
RSYNC_STATUS=$? | |
END_TIME=$(date +"%s") | |
# Enable world autosaving | |
execute-command "save-on" | |
# Save the world | |
execute-command "save-all" | |
# Notify players of completion | |
STATISTICS=$(rdiff-backup-statistics --begin-time $START_TIME $SAVEROOT/$WORLD) | |
CHANGED_SIZE=$(echo "$STATISTICS" | grep -oP "(?<=^TotalDestinationSizeChange ).*" | grep -oP "(?<=\().*(?=\))") | |
NEW_FILES=$(echo "$STATISTICS" | grep -oP "(?<=^NewFiles )\d+") | |
CHANGED_FILES=$(echo "$STATISTICS" | grep -oP "(?<=^ChangedFiles )\d+") | |
TIME_DELTA=$((END_TIME - START_TIME)) | |
if [[ $RDIFF_STATUS -eq 0 && $CLEAN_STATUS -eq 0 && $RSYNC_STATUS -eq 0 ]]; then | |
echo "success: $TIME_DELTAs, $CHANGED_SIZE changed (files: $CHANGED_FILES changed, $NEW_FILES new)" | |
else | |
message-players-error "Backup failed to complete!" "Please notify @lae in #gaming." | |
echo -e "rdiff: $RDIFF_STATUS\nclean: $CLEAN_STATUS\nrsync: $RSYNC_STATUS" | |
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[Unit] | |
Description=Executes a backup of the Hololive Fan Minecraft server | |
Wants=holomc-backup.timer | |
[Service] | |
ExecStart=/home/lae/.hololive-mc/backup.sh | |
Slice=holomc-backup.slice |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[Unit] | |
Description=Run Holo-MC backup every 8 hours | |
Requires=holomc-backup.service | |
[Timer] | |
Unit=holomc-backup.service | |
OnUnitActiveSec=1h | |
[Install] | |
WantedBy=timers.target |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment