#!/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 credentials from .env files if present load_env_file "$ROOT_DIR/.env" DB_NAME=${ODOO_DB:-odoo} DB_USER=${ODOO_DB_USER:-odoodbuser} DB_PASSWORD=${ODOO_DB_PASSWORD:-} 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 Odoo service before restore...\n' if ! $COMPOSE_CMD stop odoo >/dev/null 2>&1; then printf 'Warning: could not stop Odoo service (it may already be stopped).\n' >&2 fi restore_volume() { volume=$1 archive_name=$2 host_file="$BACKUPS_DIR/$archive_name" container_path="/backups/$BACKUP_ID/$archive_name" if [ ! -f "$host_file" ]; then printf 'Skipping %s: archive missing (%s)\n' "$volume" "$host_file" >&2 return 0 fi printf 'Restoring %s from %s\n' "$volume" "$host_file" $COMPOSE_CMD run --rm restore restore-volume "$volume" "$container_path" } restore_volume odoo-config "odoo_config_${BACKUP_ID}.tar.gz" restore_volume odoo-db-data "odoo_db_data_${BACKUP_ID}.tar.gz" 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 ODOO_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=${ODOO_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 "${ODOO_DB_HOST:-}" ]; then RESTORE_ENV_ARGS="$RESTORE_ENV_ARGS -e POSTGRES_HOST=$ODOO_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 commands completed. Restart the dependent services when ready.\n' printf 'Starting Odoo service...\n' if ! $COMPOSE_CMD up -d odoo; then printf 'Warning: failed to start Odoo service. Please start it manually.\n' >&2 fi