#!/bin/bash # Usage: odoo/restore # Restores an Odoo database from a backup zip inside the container. if [ -z "$2" ]; then echo "Usage: $0 " exit 1 fi CONTAINER_ID="$1" _self="$(realpath "${BASH_SOURCE[0]:-$0}")"; SBIN_ROOT="$(dirname "$(dirname "$_self")")" # parent of odoo/ source "$SBIN_ROOT/helpers" load_container_config "$CONTAINER_ID" get_contract_info DB_NAME="${DB_NAME:-$CONTAINER_ID}" log "Restoring $2 into CONTAINER_ID=$CONTAINER_ID DB_NAME=$DB_NAME" log "Postgres host: $POSTGRES_HOST" BACKUP="/mnt/backup/$2" TEMPLATE="/mnt/db_images/$2" if doas docker exec "$CONTAINER_ID" /bin/bash -c "[ -f $BACKUP ]"; then FILENAME="$BACKUP" elif doas docker exec "$CONTAINER_ID" /bin/bash -c "[ -f $TEMPLATE ]"; then FILENAME="$TEMPLATE" else die "restore: file $2 not found at $BACKUP or $TEMPLATE inside container $CONTAINER_ID" fi log "Using file: $FILENAME" # Terminate active connections then drop/recreate PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql \ -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -d postgres -c " SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$DB_NAME' AND pid <> pg_backend_pid();" \ || die "restore: failed to terminate connections on $DB_NAME" PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql \ -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -d postgres \ -c "DROP DATABASE IF EXISTS \"$DB_NAME\";" \ || die "restore: failed to drop database $DB_NAME" PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql \ -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres \ -c "ALTER ROLE \"$DB_NAME\" CREATEDB;" \ || die "restore: failed to grant CREATEDB on $DB_NAME" doas docker exec "$CONTAINER_ID" rm -rf /home/odoo/.local/share/Odoo/filestore doas docker exec "$CONTAINER_ID" rm -rf /root/.local/share/Odoo/filestore doas docker exec "$CONTAINER_ID" odoo db \ --db_host beedb \ -w "$ODOO_DB_PASSWORD" \ -r "$DB_NAME" \ load "$DB_NAME" "$FILENAME" -f \ || die "restore: odoo db load failed for $DB_NAME" PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql \ -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres \ -c "ALTER ROLE \"$DB_NAME\" NOCREATEDB;" \ || die "restore: failed to revoke CREATEDB on $DB_NAME" doas docker exec "$CONTAINER_ID" cp -r /root/.local/share/Odoo/filestore /home/odoo/.local/share/Odoo/filestore doas docker exec "$CONTAINER_ID" chown -R odoo:odoo /home/odoo/.local doas docker exec "$CONTAINER_ID" mkdir -p /var/lib/odoo/.local/share/Odoo/ doas docker exec "$CONTAINER_ID" ln -s /home/odoo/.local/share/Odoo/filestore /var/lib/odoo/.local/share/Odoo/filestore log "Restore complete, restarting container $CONTAINER_ID" docker restart "$CONTAINER_ID"