Add script for creating backups

This commit is contained in:
2025-03-28 14:39:49 +00:00
parent 19def3ae12
commit 10b337d20a
5 changed files with 123 additions and 10 deletions

109
scripts/run_backup.sh Executable file
View File

@@ -0,0 +1,109 @@
#!/usr/bin/env bash
# This script is to be run in the root of the repository
set -e
PROJECT_DIR="."
BACKUPS_DIR_HOST="$PROJECT_DIR/backups"
BACKUPS_TO_KEEP=24
# Load environment variables from .env file
# Used for PUID and PGID
set -a # automatically export all variables
source "$PROJECT_DIR/.env"
set +a
# Create backup directory
DATE="$(date +\%Y-\%m-\%d_\%H-\%M-\%S)"
BACKUP_DIR_HOST="$BACKUPS_DIR_HOST/$DATE"
mkdir -p "$BACKUP_DIR_HOST"
mkdir -p "$BACKUP_DIR_HOST/fabric/data"
mkdir -p "$BACKUP_DIR_HOST/paper/data"
mkdir -p "$BACKUP_DIR_HOST/paper/data/plugins/Multiverse-Core"
mkdir -p "$BACKUP_DIR_HOST/paper/data/plugins/Multiverse-Inventories"
mkdir -p "$BACKUP_DIR_HOST/velocity/data/plugins/dclink-velocity"
chown -R "$PUID:$PGID" "$BACKUP_DIR_HOST"
chmod -R 770 "$BACKUP_DIR_HOST"
# Announce backup is starting
docker exec illegal_crime_fabric rcon-cli "tellraw @a [{\"text\":\"Server\",\"color\":\"light_purple\"},{\"text\":\": Backup is starting\",\"color\":\"white\"}]"
docker exec illegal_crime_paper rcon-cli "tellraw @a [{\"text\":\"Server\",\"color\":\"light_purple\"},{\"text\":\": Backup is starting\",\"color\":\"white\"}]"
# Disable autosaving
docker exec illegal_crime_fabric rcon-cli save-off
docker exec illegal_crime_paper rcon-cli save-off
# Manually save to ensure recent changes are included in backup
docker exec illegal_crime_fabric rcon-cli save-all
docker exec illegal_crime_paper rcon-cli save-all
# Dump luckperms database
PG_USER="luckperms"
PG_DB="luckperms"
BACKUP_DIR_CONTAINER="/backups/$DATE"
docker exec illegal_crime_luckperms_db pg_dump -U "$PG_USER" -F c -b -v -f "$BACKUP_DIR_CONTAINER/luckperms.sql" "$PG_DB"
# Copy WorldEdit schematics
cp -r "$PROJECT_DIR/schematics" "$BACKUP_DIR_HOST/"
# Copy dclink database
cp "$PROJECT_DIR/velocity/data/plugins/dclink-velocity/dclink.db" "$BACKUP_DIR_HOST/velocity/data/plugins/dclink-velocity/"
# Copy Multiverse files
cp -r "$PROJECT_DIR/paper/data/plugins/Multiverse-Core/worlds.yml" "$BACKUP_DIR_HOST/paper/data/plugins/Multiverse-Core/"
cp -r "$PROJECT_DIR/paper/data/plugins/Multiverse-Inventories/groups.yml" "$BACKUP_DIR_HOST/paper/data/plugins/Multiverse-Inventories/"
cp -r "$PROJECT_DIR/paper/data/plugins/Multiverse-Inventories/groups" "$BACKUP_DIR_HOST/paper/data/plugins/Multiverse-Inventories/"
cp -r "$PROJECT_DIR/paper/data/plugins/Multiverse-Inventories/players" "$BACKUP_DIR_HOST/paper/data/plugins/Multiverse-Inventories/"
cp -r "$PROJECT_DIR/paper/data/plugins/Multiverse-Inventories/worlds" "$BACKUP_DIR_HOST/paper/data/plugins/Multiverse-Inventories/"
# Copy Minecraft worlds
cp -r "$PROJECT_DIR/fabric/data/world" "$BACKUP_DIR_HOST/fabric/data/"
cp -r "$PROJECT_DIR/paper/data/survival" "$BACKUP_DIR_HOST/paper/data/"
cp -r "$PROJECT_DIR/paper/data/survival_nether" "$BACKUP_DIR_HOST/paper/data/"
cp -r "$PROJECT_DIR/paper/data/survival_the_end" "$BACKUP_DIR_HOST/paper/data/"
# Enable autosaving
docker exec illegal_crime_fabric rcon-cli save-on
docker exec illegal_crime_paper rcon-cli save-on
# Announce backup is complete
docker exec illegal_crime_fabric rcon-cli "tellraw @a [{\"text\":\"Server\",\"color\":\"light_purple\"},{\"text\":\": Backup is complete\",\"color\":\"white\"}]"
docker exec illegal_crime_paper rcon-cli "tellraw @a [{\"text\":\"Server\",\"color\":\"light_purple\"},{\"text\":\": Backup is complete\",\"color\":\"white\"}]"
# Create or update symlink pointing to latest backup
mkdir -p "$BACKUPS_DIR_HOST/markers"
LATEST_SYMLINK="$BACKUPS_DIR_HOST/markers/latest"
if [ -L "$LATEST_SYMLINK" ]; then
# Symlink exists. Updating it.
rm "$LATEST_SYMLINK"
ln -s "../$DATE" "$LATEST_SYMLINK"
elif [ -e "$LATEST_SYMLINK" ]; then
# File exists but it's not a symlink.
rm -f "$LATEST_SYMLINK"
ln -s "../$DATE" "$LATEST_SYMLINK"
else
# Symlink does not exists. Creating it.
ln -s "../$DATE" "$LATEST_SYMLINK"
fi
# Remove old backups
BACKUP_DIRS=$(find "$BACKUPS_DIR_HOST" -mindepth 1 -maxdepth 1 -type d ! -name "markers" | sort)
TOTAL_BACKUPS=$(echo "$BACKUP_DIRS" | wc -l)
echo "TOTAL_BACKUPS: $TOTAL_BACKUPS, BACKUPS_TO_KEEP: $BACKUPS_TO_KEEP"
if ((TOTAL_BACKUPS > BACKUPS_TO_KEEP)); then
BACKUPS_TO_REMOVE=$((TOTAL_BACKUPS - BACKUPS_TO_KEEP))
BACKUPS_TO_DELETE=$(echo "$BACKUP_DIRS" | head -n "$BACKUPS_TO_REMOVE")
for BACKUP in $BACKUPS_TO_DELETE; do
echo "Removing $BACKUP"
rm -r "$BACKUP"
done
fi
# Update permissions of backed up files
chown -R "$PUID:$PGID" "$BACKUPS_DIR_HOST"
chmod -R 770 "$BACKUPS_DIR_HOST"