generated from john/python-template
59 lines
2.1 KiB
Bash
59 lines
2.1 KiB
Bash
#!/usr/bin/env sh
|
|
set -eu
|
|
|
|
if [ "$#" -lt 1 ]; then
|
|
echo "Usage: $0 <path-to-postgres-dump>"
|
|
exit 1
|
|
fi
|
|
|
|
dump_file="$1"
|
|
COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.production.yml}"
|
|
ENV_FILE="${ENV_FILE:-.env.production}"
|
|
|
|
if [ ! -f "${dump_file}" ]; then
|
|
echo "Backup file not found: ${dump_file}"
|
|
exit 1
|
|
fi
|
|
|
|
backup_dir="$(dirname "${dump_file}")"
|
|
backup_name="$(basename "${dump_file}")"
|
|
timestamp="$(printf '%s' "${backup_name}" | sed -n 's/^postgres-\([0-9]\{8\}-[0-9]\{6\}\)\.dump$/\1/p')"
|
|
uploads_file=""
|
|
config_file=""
|
|
if [ -n "${timestamp}" ]; then
|
|
candidate_uploads="${backup_dir}/uploads-${timestamp}.tar.gz"
|
|
candidate_config="${backup_dir}/config-${timestamp}.tar.gz"
|
|
if [ -f "${candidate_uploads}" ]; then
|
|
uploads_file="${candidate_uploads}"
|
|
fi
|
|
if [ -f "${candidate_config}" ]; then
|
|
config_file="${candidate_config}"
|
|
fi
|
|
fi
|
|
|
|
docker compose --env-file "${ENV_FILE}" -f "${COMPOSE_FILE}" exec -T postgres sh -lc \
|
|
"PGPASSWORD=\"\$POSTGRES_PASSWORD\" psql -U \"\$POSTGRES_USER\" -d postgres -c \"DROP DATABASE IF EXISTS \\\"\$POSTGRES_DB\\\";\""
|
|
|
|
docker compose --env-file "${ENV_FILE}" -f "${COMPOSE_FILE}" exec -T postgres sh -lc \
|
|
"PGPASSWORD=\"\$POSTGRES_PASSWORD\" psql -U \"\$POSTGRES_USER\" -d postgres -c \"CREATE DATABASE \\\"\$POSTGRES_DB\\\";\""
|
|
|
|
cat "${dump_file}" | docker compose --env-file "${ENV_FILE}" -f "${COMPOSE_FILE}" exec -T postgres sh -lc \
|
|
"PGPASSWORD=\"\$POSTGRES_PASSWORD\" pg_restore -U \"\$POSTGRES_USER\" -d \"\$POSTGRES_DB\" --clean --if-exists --no-owner --no-privileges"
|
|
|
|
if [ -n "${uploads_file}" ]; then
|
|
cat "${uploads_file}" | docker compose --env-file "${ENV_FILE}" -f "${COMPOSE_FILE}" run --rm --no-deps --entrypoint sh app -lc \
|
|
"mkdir -p /app/uploads && find /app/uploads -mindepth 1 -delete && tar -xzf - -C /app/uploads"
|
|
fi
|
|
|
|
if [ -n "${config_file}" ]; then
|
|
tar -xzf "${config_file}" -C .
|
|
fi
|
|
|
|
echo "Restore complete from: ${dump_file}"
|
|
if [ -n "${uploads_file}" ]; then
|
|
echo "Restored uploads archive: ${uploads_file}"
|
|
fi
|
|
if [ -n "${config_file}" ]; then
|
|
echo "Restored config archive: ${config_file}"
|
|
fi
|