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>
59 lines
3.1 KiB
Markdown
59 lines
3.1 KiB
Markdown
# 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=<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`).
|