# 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). ```bash # 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 (`books` → `bookva` + `slovo`). - DELETE чужих rows из каждой БД (`WHERE id_seller=`). - 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`).