#!/bin/sh set -eu usage() { cat <&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