From 63708fe6592784d6123c8843828383ca62a6d4e1 Mon Sep 17 00:00:00 2001 From: vitya Date: Thu, 28 May 2026 20:12:11 +0300 Subject: [PATCH] =?UTF-8?q?tasks(NEXT=5FSESSION):=20session-close=20?= =?UTF-8?q?=E2=80=94=20ES=20restore=20+=202=20preventive=20controls=20live?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- .tasks/NEXT_SESSION.md | 145 ++++++++++------------------------------- 1 file changed, 34 insertions(+), 111 deletions(-) diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index 5d57bec..308020b 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -1,133 +1,56 @@ --- -_last_updated_: 2026-05-28T16:30:00+03:00 -session_id: 2026-05-28-prod-epz-search-outage-admin-handoff +_last_updated_: 2026-05-28T20:30:00+03:00 +session_id: 2026-05-28-restore-es-indices-books-vds-closure --- # Next session handoff -_Сессия: новая admin task `restore-elasticsearch-indices-books-vds` -заведена по итогам диагностики prod outage в репозитории `books`._ +_Сессия: восстановили 3 ES индекса на canonical (books VDS stack 33) через +snapshot restore + добавили 2 preventive control'а против повтора. Таска +🟢 closed. Wiki concept + closure note записаны._ ## Recent commits -- (pending — этот сеанс ничего не commit'ил; .tasks/STATUS.md + - .tasks/restore-elasticsearch-indices-books-vds.md + - .tasks/NEXT_SESSION.md готовы к одному commit'у) +- `48a5cf39` tasks(restore-es-indices-books-vds): closed — snapshot restore + 2 preventive controls +- `e9b0a9ed` docs(tasks): restore-elasticsearch-indices-books-vds — заведение таски на prod outage +- `068f7b26` docs(iis-migration): owner DNS-flip instructions (labtools, tandemmebel) +- `11554d45` wiki(ingest): vds-kzntsv network-stack mismatch RCA + ifupdown anti-pattern +- `dacc39a1` tasks(modulair-rag-vds-redeploy): follow-ups #1-3 done -## Контекст инцидента +## Что закрыли в эту сессию -В репо `books` сегодня диагностировали prod outage поиска slovo (товары + -EPZ): `/api/{epz,products}/search` возвращают 500 `index_not_found_exception`. -Эндпоинты лезут на canonical ES `https://elasticsearch.kzntsv.site/` (books -VDS Portainer stack 33) — и не находят там ни `epz`, ни `products`. +- **Restore (46 сек):** `POST /_snapshot/kreknin/daily-2026-05-25/_restore` с `indices=epz,products,artmone`. Counts == source (820604/105922/2621), green. +- **RCA:** 5 индексов удалены через ES API `DELETE _all` 2026-05-26 10:21 UTC, **1ч 11мин после создания bookva-es**. Best guess — оператор в cutover-prep попал на canonical вместо internal-only bookva-es:9200. Caller identity unrecoverable (audit/accessLog отсутствовали). +- **Control #1:** `action.destructive_requires_name=true` env var на stack 33 — wildcard/`_all` DELETE теперь 400. By-name работает. Verified. +- **Control #2:** Traefik JSON accessLog в `/letsencrypt/access.log` — будущие DELETE с IP/user/method/path в логе. Restart traefik сделан, log файл генерится. +- **Wiki:** `concepts/es-destructive-delete-incident-2026-05-26.md` (recovery runbook + preventive controls + cross-refs). Index + log обновлены. -**curl `_cat/indices`** на двух сторонах: +## Open треки -- `elasticold.kzntsv.site` (Windows rollback, live) — **полный набор**: epz - 820604 / products 105922 / artmone 2621. -- `elasticsearch.kzntsv.site` (books VDS stack 33) — **0 индексов**, cluster - green, 0 active primary shards. Даже `read_me` плейсхолдер из миграции - 25.05 пропал. +| Трек | Готовность | Entry-point | +|---|---|---| +| `books-bookva-user-whitelist-gathering` | ⚪ ready — gathering от учредителя Bookva | `.tasks/STATUS.md` line ~221 | +| `stateful-split-volume-copy` | ⚪ ready — maintenance window 5–10 мин | `.tasks/STATUS.md` line ~97 | +| `infra-inventory` | ⚪ ready — two-tier (public + admin) | `.tasks/STATUS.md` line ~150 | +| `books-stateful-split-execution` | 🔵 blocked — deps в `victor/books` | `.tasks/STATUS.md` line ~250 | +| `books-vds-bookva-bootstrap` | 🔵 blocked — Bookva billing + provision | `.tasks/STATUS.md` line ~161 | +| `books-dns-cutover-bookva` | 🔵 blocked — после `books-vds-bookva-bootstrap` | `.tasks/STATUS.md` line ~191 | -**Окно поломки:** 27.05 10:24 MSK (последний рестарт `books-api`/`books-web`, -ошибок в их stderr ещё не было) → 28.05 13:59 UTC (первая фиксация -`index_not_found_exception` в логах). В этом окне на books VDS шла работа -`bookva-tenant-cutover-prep` (Step 2 — 9 Portainer stacks создавались, в т.ч. -**bookva-es=37**). Возможный конфликт volume/audit на stack 33 — выяснить -forensics'ом. - -Snapshot repo `kreknin` на target ES зарегистрирован (location=/snapshots). -`pre-migration-2026-05-25` снапшот был только с `read_me` placeholder, для -restore не годится. Но **в kreknin могут быть post-25.05 daily snapshots** -(`books-vds-backup-daily-kreknin` пайплайн closed 25.05) — проверить -`_snapshot/kreknin/_all?verbose=true`, искать снимок с непустыми -epz/products/artmone. - -## LIVE сейчас - -- **books-app prod**: поиск slovo (товары + EPZ) лежит, пользователи видят - 500 на `/epz/search`. Заведена `epz-search-seller-pin-tenant` ⚪ в `books` - репо как side-issue (хардкод `findByPk(1)`), но **не блокер этого outage'а**. -- **Source ES** на Windows host жив (`elasticold.kzntsv.site` через traefik - basicAuth) — не disabled per migration policy, годится для повторного - reindex. -- **Target ES** на books VDS жив (cluster green, отвечает 200 на - `_cluster/health`), но индексов нет. - -## Что делать на следующей сессии (по приоритету) - -### 1. **Forensics + restore** — `restore-elasticsearch-indices-books-vds` ⚪ - -Полный playbook + acceptance в task-файле. Старт: - -```bash -# на books VDS — Portainer audit stack 33 -curl -fsS -H "X-API-Key: $PORTAINER_TOKEN" \ - https://portainer.kzntsv.site/api/stacks/33 | jq '.UpdateDate, .Status' -sudo docker volume inspect /usr/docker/elasticsearch/data -sudo ls -lah /usr/docker/elasticsearch/data/nodes/0/indices/ 2>/dev/null -``` - -Затем — `curl _snapshot/kreknin/_all?verbose=true` на target → если post-25.05 -snapshot с непустыми индексами есть → restore. Иначе — reindex повторно -по `migrate-elasticsearch-to-books-vds.md` Steps 4–6 (730MB, ~5–10 мин). - -После — `docker restart books-api books-web books-task-runner books-job-scheduler` -(на случай stale connection pool у consumer'ов). - -### 2. **(carried) Registry GC** — ~20G storage reclaim - -Из прошлого handoff'а, всё ещё pending. Read-only=true ~5–15 мин: - -```bash -sudo docker exec registry registry garbage-collect --delete-untagged=true /etc/docker/registry/config.yml -sudo du -sh /opt/stacks/registry -``` - -### 3. **(carried) Cleanup netplan artifacts** — low priority, оставить - -`/etc/netplan/01-eth0.yaml`, `/etc/netplan/50-cloud-init.yaml`, -`/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg` — не влияют (netplan -masked), оставить пока кто-нибудь не решит снять mask. - -### 4. **(carried) board-viewer-build unhealthy** — пред-инцидент - -Не связан с outage'ом. Опционально разобрать через -`sudo docker logs board-viewer-build | tail -50`. +Активных 🔴 / 🟡 нет. ## Спроси user'а -- **ES restore сейчас или подождать low-traffic окно?** Reindex 730MB / 5–10 - мин, slovo поиск всё это время уже лежит — задержка не критична для бэка, - только для пользователей. Snapshot restore (если есть свежий) — быстрее. -- **Push** wiki + memory + tasks — push'нуть commit'нутые изменения в origin? - (Per project-discipline нужен per-session grant, пока не давал.) -- **Cleanup netplan artifacts** — оставить или зачистить? (carried) +- **Logrotate для `access.log`** (~30–50 MB/day, disk free 63G): отдельная micro-task сейчас, или отложить до первого ощутимого роста? Записан как follow-up в task closure + wiki concept, но не оформлен. +- **`pass books-vds/full-env` comment outdated** — в нём ещё написано «NOT Portainer-managed: elasticsearch, mongo, minio, books-db…». На самом деле migration 25.05 (`books-vds-stacks-to-portainer`) их мигрировала. Поправить при следующем pass-edit. Сейчас? +- **`stack33-put-2026-05-28.json` в `.scratch/`** — он gitignore'нут (transient drop). Если хочется keep как audit artefact — нужно отдельно архивировать. ## Не делать (preemptive guards) -- **НЕ stop / recreate Portainer stack 33** до forensics. Если volume - накосячил из-за recreate — повторный recreate может затереть оставшиеся - следы (logs, audit). -- **НЕ удалять `kreknin` repo / старые snapshot'ы** до confirm'а что restore - не нужен. `pre-migration-2026-05-25` сам по себе не годится, но **в repo - могут лежать другие snapshots** от daily пайплайна. -- **НЕ менять consumer config'и в `books`** на elasticold обратно. На VPS - bind-mount уже sed'нут на canonical с 25.05 — пусть остаётся. Восстановим - данные на canonical endpoint'е, не двигаем endpoint. -- **НЕ unmask netplan/systemd-networkd** на vds-kzntsv (carried — anti-pattern - для Rusonyx). -- **НЕ reboot VDS без необходимости** (carried). -- **НЕ делать registry GC без `read-only=true`** (carried). +- **Не снимать `action.destructive_requires_name=true`** на canonical ES. Если ОЧЕНЬ нужен wildcard DELETE — сначала остановиться и подумать на каком endpoint. +- **Не использовать `ssh + docker compose up -d`** на VDS для управления Portainer stacks — anti-pattern из CLAUDE.md. Только Portainer API / UI (как делали PUT stack 33 в эту сессию). +- **Никогда не делиться `elasticsearch.kzntsv.site`** между slovo и bookva. Bookva-es сейчас internal-only через docker network — это правильно. Если когда-нибудь нужен external — отдельный hostname. +- **branch ahead by 1 commit от origin/master** — push без explicit user grant (project-discipline Rule 4). Сейчас в working tree 2 unpushed commit'а: `e9b0a9ed` + `48a5cf39`. ## Memory updates за сессию -- (нет новых memory-файлов — incident self-contained в task file с pointers - на migration playbook) - -## Wiki ингест - -- (нет на этом раунде — после restore, если forensics выявит конкретный - trigger «X recreate стирает Y volume», стоит ингестнуть в - `.wiki/concepts/portainer-stack-volume-pitfalls.md` или подобное; пока - гипотеза только) +(нет на этом раунде — ничего не сохраняли в `~/.claude/projects/.../memory/`)