Files
4server/app/sbin/odoo/restore
T
2026-09-27 10:39:39 -03:00

75 lines
2.7 KiB
Bash
Executable File

#!/bin/bash
# Usage: odoo/restore <container_id> <file>
# Restores an Odoo database from a backup zip inside the container.
if [ -z "$2" ]; then
echo "Usage: $0 <container_id> <file>"
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"