TS=$(date +%F_%H%M)
mkdir -p /opt/terraform-web/backend/backups
Шаг 1 — Бэкап прода (первым делом, обязательно)
pg_dump -U tfweb_user -h localhost -Fc terraform_web \
> /opt/terraform-web/backend/backups/pre_mig_$TS.dump
ls -lh /opt/terraform-web/backend/backups/pre_mig_$TS.dump
→ пришли мне размер файла (убедимся, что дамп не пустой).
Шаг 2 — Проверить текущую «голову» alembic
cd /opt/terraform-web/backend
/opt/terraform-web/venv/bin/alembic current
→ пришли мне вывод. Жду add_vm_groups_001 (наша миграция ждёт именно её как down_revision).
- если так — идём дальше;
- если другое (пусто / уже add_os_images_001 / что-то новее) — стоп, разберёмся, почему.
Шаг 3 — Сгенерировать точный SQL офлайн (БД не меняется)
cd /opt/terraform-web/backend
/opt/terraform-web/venv/bin/alembic upgrade add_vm_groups_001:head --sql \
> /tmp/mig_$TS.sql
cat /tmp/mig_$TS.sql
→ пришли мне весь mig_$TS.sql. Проверю глазами перед применением: должны быть только CREATE TABLE os_images, три индекса (ix_os_images_sha256, uq_os_images_owner_sha256, партиальный uq_os_images_catalog_sha256),
idx_os_images_expires, ADD COLUMN image_id в vm_requests/user_vms + их индексы, и в конце UPDATE alembic_version. Ничего лишнего — только тогда «зелёный свет».
Шаг 4 — Тест на копии прода (прод НЕ трогаем)
createdb -U tfweb_user -h localhost terraform_web_migtest
pg_restore -U tfweb_user -h localhost -d terraform_web_migtest \
/opt/terraform-web/backend/backups/pre_mig_$TS.dump
psql -U tfweb_user -h localhost -d terraform_web_migtest \
--single-transaction -f /tmp/mig_$TS.sql
Проверить, что таблица появилась:
psql -U tfweb_user -h localhost -d terraform_web_migtest \
-c "\d os_images" -c "\di uq_os_images_catalog_sha256"
→ пришли вывод. Если ок — убираем копию:
dropdb -U tfweb_user -h localhost terraform_web_migtest
Упало на копии → чиним локально, прод так и не увидел сломанную миграцию.
Шаг 5 — Применить к проду атомарно (только после успешного теста)
psql -U tfweb_user -h localhost -d terraform_web \
--single-transaction -f /tmp/mig_$TS.sql
Шаг 6 — Проверка
/opt/terraform-web/venv/bin/alembic current # должно стать add_os_images_001
→ пришли вывод.
Пока БД на этом останавливаемся — сервисы перезапустим уже после того, как разложим файлы кода (шаг из общего порядка). Если после всего что-то не так — есть задокументированный откат из дампа pre_mig_$TS.dump.
---
Начинай с Шага 1–2 и пришли мне вывод alembic current — по нему подтвержу, что цепочка миграций сходится, и дам добро на Шаг 3. Как только скажешь, что предпочитаешь для переноса файлов (USB-tar или rsync), подготовлю и
эту часть.