Files
admin/.tasks/stateful-split-volume-copy.md
vitya 1eefb4d45a tasks: add stateful-split-volume-copy (moved from victor/books)
Ops-таска Фазы 1 tenant-split дизайна. Scope сужен на input юзера
«просто поднимем 2 БД»: только MariaDB volume copy + up 2 containers
через Portainer. Mongo/MinIO/DELETE/app-стеки — отдельными ops-тасками потом.

Design canon — victor/books .wiki/concepts/tenant-split.md (не дублируем здесь).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 07:53:27 +03:00

3.1 KiB
Raw Permalink Blame History

stateful-split-volume-copy

Поднять 2 MariaDB-контейнера (bookva-db + slovo-db) на VDS как копии текущего books-db через cp -a docker volume. Всё.

Контекст dev-source

Дизайн: victor/books .wiki/concepts/tenant-split.md § «Фаза 1 — Physical stateful split». Brainstorm trace: ~/projects/.workshop/.archive/2026-05-24-books-tenant-split.md. Direction: Slovo остаётся на текущем VDS, Bookva переезжает потом (см. books-vds-bookva-bootstrap).

Goal

bookva-db и slovo-db бегут на VDS на своих volume'ах (bookva-db-data / slovo-db-data) — bit-for-bit копии текущего books-db_data. Оба контейнера видят полный shared-датасет (cleanup чужих rows — отдельной задачей).

Plan (на VDS под Portainer)

Через Portainer — потому что VDS-rule: «stacks управляются через Portainer» (см. .wiki/concepts/portainer-stack-management-vds.md). Compose-файлы лежат в ~/projects/bookva-overlay/ + ~/projects/slovo-overlay/ (закрыта overlay-repos-bootstrap-bookva-slovo в victor/books, commit d0eb210).

# Pre-flight: backup
SRC=$(docker volume ls -q | grep books-db)
mkdir -p /backups
docker run --rm -v $SRC:/data:ro -v /backups:/backup alpine \
  tar czf /backup/books-db-pre-split-$(date +%Y%m%d).tar.gz -C /data .

# Stop books-db (maintenance window 5-10 мин)
docker stop books-db   # api/web/scheduler/task-runner запаникуют — это OK на короткое окно

# Copy
docker volume create bookva-db-data
docker volume create slovo-db-data
docker run --rm -v $SRC:/from:ro -v bookva-db-data:/to alpine sh -c "cp -a /from/. /to/"
docker run --rm -v $SRC:/from:ro -v slovo-db-data:/to alpine sh -c "cp -a /from/. /to/"

# Bring up new DBs (через Portainer — stack из bookva-overlay/slovo-overlay)
# либо ad-hoc compose-up если stack ещё не создан в Portainer
docker start books-db   # вернуть текущий стек

Acceptance

  • docker ps показывает bookva-db + slovo-db живыми.
  • docker exec bookva-db mariadb -uroot -p... -e 'SELECT 1'1.
  • docker exec slovo-db mariadb -uroot -p... -e 'SELECT 1'1.
  • Текущий books-db стек снова в строю (api/web/scheduler/task-runner подняты).

Out of scope (отдельные ops-таски потом)

  • Mongo volume copy (bookva-mongo + slovo-mongo).
  • MinIO bucket rename (booksbookva + slovo).
  • DELETE чужих rows из каждой БД (WHERE id_seller=<other>).
  • deleteMany чужих agenda-jobs в Mongo.
  • Up bookva-api / bookva-web / bookva-scheduler / bookva-task-runner (и зеркально для slovo) — application stacks.
  • Cleanup старых books-* контейнеров после parallel-run.

Blocker

— (overlay-репо готовы; compose-файлы в bookva-overlay/deploy/db.compose.yml / slovo-overlay/deploy/db.compose.yml).