initial commit
This commit is contained in:
117
scripts/backup/restore-gitea.sh
Executable file
117
scripts/backup/restore-gitea.sh
Executable file
@@ -0,0 +1,117 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
Usage: $(basename "$0") BACKUP_ID [DB_NAME] [DB_USER]
|
||||
|
||||
Restore the Gitea data volume and database from a backup run identified by BACKUP_ID.
|
||||
BACKUP_ID should match the directory name under ./backups (e.g. 2025-11-17_12-30).
|
||||
DB_NAME and DB_USER default to environment variables GITEA_DB / GITEA_DB_USER,
|
||||
falling back to "gitea" / "gitea" if unset.
|
||||
EOF
|
||||
}
|
||||
|
||||
if [ "${1:-}" = "--help" ] || [ "${1:-}" = "-h" ]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ $# -lt 1 ] || [ $# -gt 3 ]; then
|
||||
usage >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BACKUP_ID=$1
|
||||
ROOT_DIR=$(cd "$(dirname "$0")/../.." && pwd)
|
||||
BACKUPS_DIR="$ROOT_DIR/backups/$BACKUP_ID"
|
||||
|
||||
load_env_file() {
|
||||
local file=$1
|
||||
if [ -f "$file" ]; then
|
||||
# shellcheck disable=SC1090
|
||||
set -a
|
||||
. "$file"
|
||||
set +a
|
||||
fi
|
||||
}
|
||||
|
||||
# Load shared or service-specific environment files if present
|
||||
load_env_file "$ROOT_DIR/.env"
|
||||
|
||||
DB_NAME=${GITEA_DB:-${GITEA_DB_NAME:-gitea}}
|
||||
DB_USER=${GITEA_DB_USER:-gitea}
|
||||
DB_PASSWORD=${GITEA_DB_PASSWORD:-${GITEA_DB_PASS:-}}
|
||||
|
||||
DB_NAME=${2:-$DB_NAME}
|
||||
DB_USER=${3:-$DB_USER}
|
||||
|
||||
if [ ! -d "$BACKUPS_DIR" ]; then
|
||||
printf 'Backup directory not found: %s\n' "$BACKUPS_DIR" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
COMPOSE_CMD="docker compose"
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
printf 'Stopping Gitea service before restore...\n'
|
||||
if ! $COMPOSE_CMD stop gitea >/dev/null 2>&1; then
|
||||
printf 'Warning: could not stop Gitea service (it may already be stopped).\n' >&2
|
||||
fi
|
||||
|
||||
ARCHIVE="gitea_data_${BACKUP_ID}.tar.gz"
|
||||
HOST_FILE="$BACKUPS_DIR/$ARCHIVE"
|
||||
CONTAINER_PATH="/backups/$BACKUP_ID/$ARCHIVE"
|
||||
|
||||
if [ ! -f "$HOST_FILE" ]; then
|
||||
printf 'Archive missing: %s\n' "$HOST_FILE" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf 'Restoring gitea_data from %s\n' "$HOST_FILE"
|
||||
$COMPOSE_CMD run --rm restore restore-volume gitea_data "$CONTAINER_PATH"
|
||||
|
||||
DB_DUMP_DIR="$BACKUPS_DIR"
|
||||
DB_DUMP_FILE="$DB_DUMP_DIR/${DB_NAME}_${BACKUP_ID}.sql"
|
||||
DB_DUMP_GZ="$DB_DUMP_FILE.gz"
|
||||
|
||||
if [ -f "$DB_DUMP_GZ" ]; then
|
||||
DB_SOURCE="$DB_DUMP_GZ"
|
||||
elif [ -f "$DB_DUMP_FILE" ]; then
|
||||
DB_SOURCE="$DB_DUMP_FILE"
|
||||
else
|
||||
DB_SOURCE=""
|
||||
fi
|
||||
|
||||
if [ -n "$DB_SOURCE" ]; then
|
||||
if [ -z "$DB_PASSWORD" ]; then
|
||||
printf 'Database dump found (%s) but GITEA_DB_PASSWORD not set; skipping DB restore.\n' "$DB_SOURCE" >&2
|
||||
else
|
||||
printf 'Restoring database %s from %s\n' "$DB_NAME" "$DB_SOURCE"
|
||||
DROP_FLAG=${GITEA_DROP_EXISTING_DB:-${DROP_EXISTING_DB:-1}}
|
||||
RESTORE_ENV_ARGS="-e PGPASSWORD=$DB_PASSWORD -e DROP_EXISTING_DB=$DROP_FLAG"
|
||||
if [ -n "${POSTGRES_ADMIN_USER:-}" ] && [ -n "${POSTGRES_ADMIN_PASSWORD:-}" ]; then
|
||||
RESTORE_ENV_ARGS="$RESTORE_ENV_ARGS -e POSTGRES_ADMIN_USER=$POSTGRES_ADMIN_USER -e POSTGRES_ADMIN_PASSWORD=$POSTGRES_ADMIN_PASSWORD"
|
||||
fi
|
||||
if [ -n "${POSTGRES_ADMIN_DB:-}" ]; then
|
||||
RESTORE_ENV_ARGS="$RESTORE_ENV_ARGS -e POSTGRES_ADMIN_DB=$POSTGRES_ADMIN_DB"
|
||||
fi
|
||||
if [ -n "${GITEA_DB_HOST:-}" ]; then
|
||||
RESTORE_ENV_ARGS="$RESTORE_ENV_ARGS -e POSTGRES_HOST=$GITEA_DB_HOST"
|
||||
elif [ -n "${POSTGRES_HOST:-}" ]; then
|
||||
RESTORE_ENV_ARGS="$RESTORE_ENV_ARGS -e POSTGRES_HOST=$POSTGRES_HOST"
|
||||
fi
|
||||
# shellcheck disable=SC2086
|
||||
$COMPOSE_CMD run --rm $RESTORE_ENV_ARGS restore \
|
||||
restore-db "/backups/$BACKUP_ID/$(basename "$DB_SOURCE")" "$DB_NAME" "$DB_USER" "$DB_PASSWORD"
|
||||
fi
|
||||
else
|
||||
printf 'No database dump found for %s in %s\n' "$DB_NAME" "$DB_DUMP_DIR" >&2
|
||||
fi
|
||||
|
||||
printf '\nRestore command completed. Restart Gitea when ready.\n'
|
||||
|
||||
printf 'Starting Gitea service...\n'
|
||||
if ! $COMPOSE_CMD up -d gitea; then
|
||||
printf 'Warning: failed to start Gitea service. Please start it manually.\n' >&2
|
||||
fi
|
||||
Reference in New Issue
Block a user