86 lines
3.2 KiB
Bash
Executable File
86 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# Aether MariaDB Restore Script (Physical Backup)
|
|
set -e
|
|
|
|
PROJECT_ROOT="/home/scott/OSIT_dev/aether_container_env"
|
|
DEFAULT_BACKUP="${PROJECT_ROOT}/backups/mariadbbackup_1555.gz"
|
|
BACKUP_FILE="${1:-$DEFAULT_BACKUP}"
|
|
|
|
MARIADB_DATA="${PROJECT_ROOT}/srv/mariadb"
|
|
RESTORE_TEMP="${PROJECT_ROOT}/srv/restore_temp"
|
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
|
|
# Load env for password
|
|
source "${PROJECT_ROOT}/.env"
|
|
|
|
if [ ! -f "$BACKUP_FILE" ]; then
|
|
echo "ERROR: Backup file not found: $BACKUP_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
# Convert to absolute path for Docker volume mounting
|
|
BACKUP_FILE_ABS=$(readlink -f "$BACKUP_FILE")
|
|
|
|
echo "--- Starting Aether Database Restore ---"
|
|
|
|
# 1. Stop MariaDB
|
|
echo ">>> Stopping MariaDB..."
|
|
cd "${PROJECT_ROOT}" && docker compose stop mariadb
|
|
|
|
# 2. Archive current data
|
|
if [ -d "$MARIADB_DATA" ] && [ "$(ls -A $MARIADB_DATA)" ]; then
|
|
echo ">>> Archiving current data..."
|
|
BACKUP_DIR="${PROJECT_ROOT}/srv/mariadb_bak_${TIMESTAMP}"
|
|
mv "${MARIADB_DATA}" "${BACKUP_DIR}"
|
|
# Fix ownership of archived data so host user can manage it
|
|
docker run --rm -v "${BACKUP_DIR}":/bak alpine chown -R 1000:1000 /bak
|
|
fi
|
|
mkdir -p "${MARIADB_DATA}" "${RESTORE_TEMP}"
|
|
|
|
# 3. Extract and Prepare
|
|
echo ">>> Running extraction and preparation..."
|
|
docker run --rm --user 0 \
|
|
-v "${BACKUP_FILE_ABS}":/backups/import.gz \
|
|
-v "${RESTORE_TEMP}":/restore \
|
|
-v "${PROJECT_ROOT}/scripts/restore_internal.sh":/restore.sh \
|
|
mariadb:10.11 bash -c "export BACKUP_FILE=/backups/import.gz && bash /restore.sh"
|
|
|
|
# 4. Move prepared data (Using container to avoid permission issues)
|
|
echo ">>> Moving prepared data..."
|
|
docker run --rm --user 0 \
|
|
-v "${RESTORE_TEMP}":/src \
|
|
-v "${MARIADB_DATA}":/dst \
|
|
alpine sh -c "mv /src/* /dst/ 2>/dev/null || true; mv /src/.* /dst/ 2>/dev/null || true"
|
|
rmdir "${RESTORE_TEMP}"
|
|
|
|
# 5. Fix Permissions
|
|
echo ">>> Fixing ownership (999:999)..."
|
|
docker run --rm -v "${MARIADB_DATA}":/var/lib/mysql alpine chown -R 999:999 /var/lib/mysql
|
|
|
|
# 6. Start MariaDB in Maintenance Mode to reset password
|
|
echo ">>> Resetting passwords to match local .env..."
|
|
docker run -d --name ae_mariadb_maint -v "${MARIADB_DATA}":/var/lib/mysql mariadb:10.11 --skip-grant-tables
|
|
sleep 5
|
|
# Maintenance SQL: Sets root password AND ensures app user exists with correct password/grants
|
|
MAINT_SQL="FLUSH PRIVILEGES;
|
|
ALTER USER 'root'@'localhost' IDENTIFIED BY '${AE_DB_ROOT_PASSWORD}';
|
|
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '${AE_DB_ROOT_PASSWORD}' WITH GRANT OPTION;
|
|
CREATE USER IF NOT EXISTS '${AE_DB_USERNAME}'@'%' IDENTIFIED BY '${AE_DB_PASSWORD}';
|
|
ALTER USER '${AE_DB_USERNAME}'@'%' IDENTIFIED BY '${AE_DB_PASSWORD}';
|
|
GRANT ALL PRIVILEGES ON \`${AE_DB_NAME}\`.* TO '${AE_DB_USERNAME}'@'%';
|
|
FLUSH PRIVILEGES;"
|
|
|
|
docker exec ae_mariadb_maint mariadb -e "$MAINT_SQL"
|
|
docker stop ae_mariadb_maint && docker rm ae_mariadb_maint
|
|
|
|
# 7. Start MariaDB Normally
|
|
echo ">>> Starting MariaDB container normally..."
|
|
docker compose start mariadb
|
|
|
|
echo "--- Restore and Password Reset Complete! ---"
|
|
|
|
# 8. Cleanup Safety Snapshot (Only on success)
|
|
if [ -n "$BACKUP_DIR" ] && [ -d "$BACKUP_DIR" ]; then
|
|
echo ">>> Removing safety snapshot (Restore successful)..."
|
|
rm -rf "$BACKUP_DIR"
|
|
fi |