#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}" OUTPUT_FILE="" COMPRESS=1 if [[ -f "$ENV_FILE" ]]; then set -a # shellcheck disable=SC1090 source "$ENV_FILE" set +a fi usage() { cat <&2; exit 1; } require_running_db() { if ! docker compose ps --status running --services 2>/dev/null | grep -qx 'ac-database'; then die "ac-database is not running. Start it with: docker compose up -d ac-database" fi } # ── argument parsing ────────────────────────────────────────────────────────── while (($#)); do case "$1" in --output) OUTPUT_FILE="$2"; shift ;; --no-compress) COMPRESS=0 ;; -h|--help) usage; exit 0 ;; *) printf 'Unknown option: %s\n\n' "$1" >&2; usage >&2; exit 1 ;; esac shift done # ── main ────────────────────────────────────────────────────────────────────── cd "$ROOT_DIR" require_running_db if [[ -z "$OUTPUT_FILE" ]]; then mkdir -p "$ROOT_DIR/backups" timestamp="$(date '+%Y-%m-%d_%H-%M-%S')" if [[ "$COMPRESS" -eq 1 ]]; then OUTPUT_FILE="$ROOT_DIR/backups/${timestamp}.sql.gz" else OUTPUT_FILE="$ROOT_DIR/backups/${timestamp}.sql" fi fi mkdir -p "$(dirname "$OUTPUT_FILE")" log "exporting all databases → $OUTPUT_FILE" log "this may take a few minutes for large worlds..." if [[ "$COMPRESS" -eq 1 ]]; then docker compose exec -T ac-database bash -lc \ "mysqldump -uroot -p\"\$MYSQL_ROOT_PASSWORD\" \ --all-databases \ --add-drop-database \ --single-transaction \ --quick \ --routines \ --triggers \ --events" \ | gzip -6 > "$OUTPUT_FILE" else docker compose exec -T ac-database bash -lc \ "mysqldump -uroot -p\"\$MYSQL_ROOT_PASSWORD\" \ --all-databases \ --add-drop-database \ --single-transaction \ --quick \ --routines \ --triggers \ --events" \ > "$OUTPUT_FILE" fi log "done: $OUTPUT_FILE ($(du -sh "$OUTPUT_FILE" | cut -f1))" log "" log "to restore on the new server:" if [[ "$OUTPUT_FILE" == *.gz ]]; then log " bash scripts/db-import.sh --from $OUTPUT_FILE" else log " bash scripts/db-import.sh --from $OUTPUT_FILE" fi