#!/usr/bin/env bash # Usage: ./backup.sh [label] # Creates backups/world-YYYY-MM-DD-HHMM[-label].tar.gz # If the container is running, flushes world via rcon and archives via # docker exec. If not, archives data/world from the host directly. 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 echo "Archiving /data/world -> ${OUT}" docker exec minecraft tar -czf - -C /data world > "${OUT}" else echo "Server not running — archiving data/world from host." tar -czf "${OUT}" -C data world fi echo "Done." ls -lh "${OUT}"