diff --git a/.gitignore b/.gitignore index e7f2f5d..e7777c0 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ data/.rcon-cli.yaml # Backup snapshots data.*.bak/ *.bak/ +backups/ # Port-forward runtime state portforward.log diff --git a/backup.sh b/backup.sh new file mode 100755 index 0000000..325190c --- /dev/null +++ b/backup.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# Usage: ./backup.sh [label] +# Creates backups/world-YYYY-MM-DD-HHMM[-label].tar.gz +# If the minecraft container is running, flushes world via rcon first. +set -euo pipefail + +cd "$(dirname "$0")" + +LABEL="${1:-}" +STAMP="$(date +%Y-%m-%d-%H%M)" +SUFFIX="${LABEL:+-$LABEL}" +OUT="backups/world-${STAMP}${SUFFIX}.tar.gz" + +mkdir -p backups + +if docker ps --format '{{.Names}}' | grep -qx minecraft; then + echo "Server running — flushing world via rcon..." + docker exec minecraft rcon-cli save-off >/dev/null + docker exec minecraft rcon-cli save-all flush >/dev/null + trap 'docker exec minecraft rcon-cli save-on >/dev/null || true' EXIT +else + echo "Server not running — archiving world as-is." +fi + +echo "Archiving data/world -> ${OUT}" +tar -czf "${OUT}" -C data world + +echo "Done." +ls -lh "${OUT}"