#!/bin/sh set -eu PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) cd "$PROJECT_DIR" CONTAINER_ID=$(docker compose ps -q db) if [ -z "$CONTAINER_ID" ]; then echo "Error: The MineSeeker PostgreSQL service is not running." exit 1 fi DB_USER=$(docker inspect "$CONTAINER_ID" --format '{{range .Config.Env}}{{println .}}{{end}}' | sed -n 's/^POSTGRES_USER=//p') DB_NAME=$(docker inspect "$CONTAINER_ID" --format '{{range .Config.Env}}{{println .}}{{end}}' | sed -n 's/^POSTGRES_DB=//p') if [ -z "$DB_USER" ] || [ -z "$DB_NAME" ]; then echo "Error: Could not read PostgreSQL credentials from the db service." exit 1 fi BACKUP_DIR=${1:-"$PROJECT_DIR/backups"} mkdir -p "$BACKUP_DIR" BACKUP_DIR=$(CDPATH= cd -- "$BACKUP_DIR" && pwd) TIMESTAMP=$(date +%Y-%m-%d.%H%M%S) BACKUP_FILE="mineseeker-postgres.${TIMESTAMP}.dump" BACKUP_PATH="$BACKUP_DIR/$BACKUP_FILE" TEMP_PATH="$BACKUP_PATH.tmp" umask 077 trap 'rm -f "$TEMP_PATH"' EXIT echo "Creating PostgreSQL backup: $BACKUP_PATH" docker exec "$CONTAINER_ID" pg_dump \ --username="$DB_USER" \ --format=custom \ --create \ "$DB_NAME" > "$TEMP_PATH" mv "$TEMP_PATH" "$BACKUP_PATH" trap - EXIT echo "Backup complete: $BACKUP_PATH"