diff --git a/scripts/backup.sh b/scripts/backup.sh index 07befc5..8876d5e 100755 --- a/scripts/backup.sh +++ b/scripts/backup.sh @@ -4,6 +4,8 @@ ## The number of backups to keep BACKUPS_KEEP=24 +CONTAINER_USER_ID="2015" + # Global variables (Do NOT change) CLEANUP_FABRIC=false CLEANUP_LUCKPERMS=false @@ -18,6 +20,7 @@ main() { broadcast_status started + backup_beta || cleanup_failure backup_fabric || cleanup_failure backup_luckperms || cleanup_failure backup_paper || cleanup_failure @@ -63,6 +66,9 @@ broadcast_status() { STATUS="$1" log_info "Broadcasting backup status: $STATUS" + if docker compose exec -T beta true > /dev/null 2>&1; then + docker compose exec -u "$CONTAINER_USER_ID" -T beta mc-send-to-console "say Backup $STATUS." > /dev/null 2>&1 + fi if docker compose exec -T fabric true > /dev/null 2>&1; then docker compose exec -T fabric rcon-cli "tellraw @a [{\"text\":\"Server\",\"color\":\"light_purple\"},{\"text\":\": Backup $STATUS.\",\"color\":\"white\"}]" > /dev/null 2>&1 fi @@ -71,6 +77,28 @@ broadcast_status() { fi } +backup_beta() { + log_info "Starting Beta backup..." + + CLEANUP_BETA=false + if docker compose exec -T beta true > /dev/null 2>&1; then + CLEANUP_BETA=true + log_info "Beta server detected, disabling saves" + + docker compose exec -u "$CONTAINER_USER_ID" -T beta mc-send-to-console "save-off" > /dev/null 2>&1 + docker compose exec -u "$CONTAINER_USER_ID" -T beta mc-send-to-console "save-all" > /dev/null 2>&1 + fi + + docker compose run --rm init sh -c ' + mkdir -p "$1"/beta_data && + cp -a --reflink=auto /beta_data/world "$1"/beta_data && + cp -a --reflink=auto /beta_data/white-list.txt "$1"/beta_data && + cp -a --reflink=auto /beta_data/ops.txt "$1"/beta_data + ' -- "$BACKUP_DIR" || return 1 + + log_info "Finished Beta backup" +} + backup_fabric() { log_info "Starting Fabric backup..." @@ -240,6 +268,11 @@ cleanup() { # Ignore specified conditions to ensure cleanup runs to completion uninterrupted trap '' HUP INT QUIT ABRT TERM + if [ "$CLEANUP_BETA" = true ]; then + log_info "Re-enabling Beta saves" + docker compose exec -u "$CONTAINER_USER_ID" -T beta mc-send-to-console "save-on" > /dev/null 2>&1 + fi + if [ "$CLEANUP_FABRIC" = true ]; then log_info "Re-enabling Fabric saves" docker compose exec -T fabric rcon-cli save-on > /dev/null 2>&1 diff --git a/scripts/restore.sh b/scripts/restore.sh index 024718e..217b425 100755 --- a/scripts/restore.sh +++ b/scripts/restore.sh @@ -21,6 +21,10 @@ Commands: Restore options: --all + --beta + --beta-ops + --beta-whitelist + --beta-world --fabric --fabric-essentials --fabric-g4mespeed @@ -59,6 +63,10 @@ cmd_restore() { CLEANUP_VOLUMES=0 # Default flags + ## Beta server + RESTORE_BETA_OPS=0 + RESTORE_BETA_WHITELIST=0 + RESTORE_BETA_WORLD=0 ## Fabric server RESTORE_FABRIC_ESSENTIALS=0 RESTORE_FABRIC_G4MESPEED=0 @@ -85,6 +93,9 @@ cmd_restore() { while [ $# -gt 0 ]; do case "$1" in --all) + RESTORE_BETA_OPS=1 + RESTORE_BETA_WHITELIST=1 + RESTORE_BETA_WORLD=1 RESTORE_FABRIC_ESSENTIALS=1 RESTORE_FABRIC_G4MESPEED=1 RESTORE_FABRIC_WORLD=1 @@ -102,6 +113,24 @@ cmd_restore() { RESTORE_VELOCITY_GLOBAL_WHITELIST=1 ;; + --beta) + RESTORE_BETA_OPS=1 + RESTORE_BETA_WHITELIST=1 + RESTORE_BETA_WORLD=1 + ;; + + --beta-ops) + RESTORE_BETA_OPS=1 + ;; + + --beta-whitelist) + RESTORE_BETA_WHITELIST=1 + ;; + + --beta-world) + RESTORE_BETA_WORLD=1 + ;; + --fabric) RESTORE_FABRIC_ESSENTIALS=1 RESTORE_FABRIC_G4MESPEED=1 @@ -235,7 +264,10 @@ cmd_restore() { BACKUP_ID=$(basename "$BACKUP_DIR") # Validate options - if [ "$RESTORE_FABRIC_ESSENTIALS" -eq 0 ] \ + if [ "$RESTORE_BETA_OPS" -eq 0 ] \ + && [ "$RESTORE_BETA_WHITELIST" -eq 0 ] \ + && [ "$RESTORE_BETA_WORLD" -eq 0 ] \ + && [ "$RESTORE_FABRIC_ESSENTIALS" -eq 0 ] \ && [ "$RESTORE_FABRIC_G4MESPEED" -eq 0 ] \ && [ "$RESTORE_FABRIC_WORLD" -eq 0 ] \ && [ "$RESTORE_LUCKPERMS" -eq 0 ] \ @@ -263,6 +295,7 @@ cmd_restore() { trap restore_cleanup_trap HUP INT QUIT ABRT TERM create_snapshot || restore_cleanup_failure + restore_beta || restore_cleanup_failure restore_fabric || restore_cleanup_failure restore_luckperms || restore_cleanup_failure restore_paper || restore_cleanup_failure @@ -280,6 +313,7 @@ create_snapshot() { # Map: source volume name -> cloned volume name # Source names must match the mount points inside init declare -Ag VOLUMES=( + [beta_data]="beta_data_$BACKUP_ID" [fabric_data]="fabric_data_$BACKUP_ID" [luckperms_data]="luckperms_data_$BACKUP_ID" [paper_data]="paper_data_$BACKUP_ID" @@ -304,6 +338,7 @@ create_snapshot() { "${MOUNTS[@]}" \ init sh -ec ' for DIR in \ + beta_data \ fabric_data \ luckperms_data \ paper_data \ @@ -321,6 +356,29 @@ create_snapshot() { echo "Created snapshot successfully" } +restore_beta() { + if [ "$RESTORE_BETA_OPS" -eq 1 ]; then + echo "Restoring Beta server's op list..." + docker compose run --rm init sh -c ' + cp -a --reflink=auto "$1"/beta_data/ops.txt /beta_data + ' -- "$BACKUP_DIR" || return 1 + fi + + if [ "$RESTORE_BETA_WHITELIST" -eq 1 ]; then + echo "Restoring Beta server's whitelist..." + docker compose run --rm init sh -c ' + cp -a --reflink=auto "$1"/beta_data/white-list.txt /beta_data + ' -- "$BACKUP_DIR" || return 1 + fi + + if [ "$RESTORE_BETA_WORLD" -eq 1 ]; then + echo "Restoring Beta server's world..." + docker compose run --rm init sh -c ' + cp -a --reflink=auto "$1"/beta_data/world /beta_data + ' -- "$BACKUP_DIR" || return 1 + fi +} + restore_fabric() { if [ "$RESTORE_FABRIC_ESSENTIALS" -eq 1 ]; then echo "Restoring Fabric server's Essentials mod data..." @@ -484,6 +542,7 @@ restore_cleanup() { "${MOUNTS[@]}" \ init sh -ec ' for DIR in \ + beta_data \ fabric_data \ luckperms_data \ paper_data \