All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
Оба скрипта закоммичены как 100644, хотя соседние по каталогу backup.sh и
uptime-healthcheck.sh — 100755. На прод-VM файлы лежат с +x, поэтому
`git status` в /opt/gendesign постоянно показывает их как modified:
M ops/docker-prune.sh
M ops/restore.sh (old mode 100644 / new mode 100755, контент идентичен)
Функционально это ничего не ломает: cron зовёт docker-prune.sh через
`bash <путь>`, restore.sh запускают руками так же. Проблема в другом —
постоянный M в прод-репозитории обесценивает единственный дешёвый сигнал,
по которому видно ручную правку файла на проде. Шум надо убирать, а не
привыкать к нему.
Приводим режим к тому, что реально на диске и что уже стоит у соседей.
43 lines
1.3 KiB
Bash
Executable file
43 lines
1.3 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Restore a Postgres dump produced by backup.sh.
|
|
#
|
|
# Usage:
|
|
# ops/restore.sh /opt/gendesign/backups/gendesign_20260427_033000.sql.gz
|
|
#
|
|
# Refuses to run unless RESTORE_CONFIRM=yes is set. This is destructive —
|
|
# the dump uses --clean --if-exists, so it DROPs existing tables before recreating.
|
|
#
|
|
# Example:
|
|
# RESTORE_CONFIRM=yes ops/restore.sh ./gendesign_20260427_033000.sql.gz
|
|
|
|
set -euo pipefail
|
|
|
|
if [[ "${RESTORE_CONFIRM:-no}" != "yes" ]]; then
|
|
echo "Refusing to restore — set RESTORE_CONFIRM=yes to proceed."
|
|
echo "This will DROP existing tables and recreate from the dump."
|
|
exit 1
|
|
fi
|
|
|
|
DUMP_FILE="${1:-}"
|
|
if [[ -z "$DUMP_FILE" || ! -f "$DUMP_FILE" ]]; then
|
|
echo "Usage: $0 /path/to/dump.sql.gz"
|
|
exit 2
|
|
fi
|
|
|
|
COMPOSE_DIR=/opt/gendesign
|
|
COMPOSE_FILE=docker-compose.prod.yml
|
|
|
|
cd "$COMPOSE_DIR"
|
|
|
|
DB_USER=$(docker compose -f "$COMPOSE_FILE" exec -T postgres printenv POSTGRES_USER 2>/dev/null | tr -d '\r' || true)
|
|
DB_NAME=$(docker compose -f "$COMPOSE_FILE" exec -T postgres printenv POSTGRES_DB 2>/dev/null | tr -d '\r' || true)
|
|
DB_USER=${DB_USER:-gendesign}
|
|
DB_NAME=${DB_NAME:-gendesign}
|
|
|
|
echo "Restoring $DUMP_FILE → ${DB_NAME} as ${DB_USER}"
|
|
|
|
gunzip -c "$DUMP_FILE" | \
|
|
docker compose -f "$COMPOSE_FILE" exec -T postgres \
|
|
psql -U "$DB_USER" -d "$DB_NAME" -v ON_ERROR_STOP=1
|
|
|
|
echo "Restore complete."
|