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>
This commit is contained in:
@@ -5,6 +5,23 @@ _Updated: 2026-05-25 (`unify-backup-notifications` 🟢 closed — 3 scripts п
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## ⚪ [stateful-split-volume-copy] — поднять `bookva-db` + `slovo-db` на VDS как копии `books-db` через `cp -a` volume
|
||||||
|
|
||||||
|
Ops-таска для Фазы 1 дизайна `tenant-split` из victor/books. Scope сужен 2026-05-25 (user: «просто поднимем 2 БД»): только MariaDB volume copy + up 2 контейнеров. Mongo / MinIO / DELETE / app-стеки — отдельными ops-тасками потом.
|
||||||
|
|
||||||
|
**Контекст dev-source:** дизайн в victor/books `.wiki/concepts/tenant-split.md` § «Фаза 1». Compose-файлы готовы в `bookva-overlay` / `slovo-overlay` (commit d0eb210 в books).
|
||||||
|
|
||||||
|
**Acceptance:** `docker ps` показывает живые `bookva-db` + `slovo-db`, оба отвечают `SELECT 1`. Текущий `books-db` стек снова в строю после maintenance window.
|
||||||
|
|
||||||
|
**Status:** ready
|
||||||
|
**Where I stopped:** (not started — lean playbook готов в [stateful-split-volume-copy.md](stateful-split-volume-copy.md))
|
||||||
|
**Next action:** под maintenance window 5-10 мин на VDS — execute 5 команд из task-файла. Backup → stop books-db → cp -a в 2 volume'а → up 2 новых контейнера через Portainer → start books-db.
|
||||||
|
**Blocker:** —
|
||||||
|
**Branch:** master
|
||||||
|
<!-- created-by: vitya / 2026-05-25 / moved from victor/books .tasks/ (scope is ops/VDS, not books-code) -->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Status legend:
|
Status legend:
|
||||||
🔴 Active — only one at a time
|
🔴 Active — only one at a time
|
||||||
|
|||||||
58
.tasks/stateful-split-volume-copy.md
Normal file
58
.tasks/stateful-split-volume-copy.md
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
# 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`).
|
||||||
Reference in New Issue
Block a user