#!/bin/sh set -eu repo=$(CDPATH= cd -- "$(dirname "$0")/.." && pwd) cd "$repo" project="rf4-upgrade-$$" export COMPOSE_PROJECT_NAME="$project" export POSTGRES_PASSWORD=upgrade-drill-postgres-password export DATABASE_URL=postgresql+psycopg://rf4:upgrade-drill-postgres-password@db:5432/rf4_spotter compose="docker compose --env-file .env.production.example -f compose.production.yaml" previous_revision=48094a7d1b92 head_revision=20260910_recovery probe_id=00000000-0000-0000-0000-000000000099 cleanup() { status=$? if [ "$status" -ne 0 ]; then $compose ps >&2 || true $compose logs --no-color db migrate >&2 || true fi $compose down --volumes --remove-orphans >/dev/null 2>&1 || true } trap cleanup EXIT INT TERM $compose up --build -d --wait db $compose run --rm migrate alembic upgrade "$previous_revision" $compose exec -T db psql -v ON_ERROR_STOP=1 -U rf4 -d rf4_spotter -c \ "insert into fish(id,slug,name_ru,trophy_weight_g) values ('$probe_id','upgrade-probe','Проверка обновления',1234)" >/dev/null $compose run --rm migrate db_revision=$($compose exec -T db psql -At -U rf4 -d rf4_spotter -c 'select version_num from alembic_version') probe_count=$($compose exec -T db psql -At -U rf4 -d rf4_spotter -c "select count(*) from fish where id='$probe_id' and slug='upgrade-probe' and trophy_weight_g=1234") recovery_columns=$($compose exec -T db psql -At -U rf4 -d rf4_spotter -c "select count(*) from information_schema.columns where table_schema='public' and ((table_name='submission_attempt' and column_name in ('idempotency_key','catch_report_id','payload_hash')) or (table_name='import_record_event' and column_name in ('changes','provenance')))") test "$db_revision" = "$head_revision" test "$probe_count" = "1" test "$recovery_columns" = "5" printf 'Release upgrade passed: %s -> %s, control data preserved\n' "$previous_revision" "$head_revision"