tasks(NEXT_SESSION): handoff — books-vds disk-full closed, Bookva->slovo scoping, key-revocation guard

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-04 12:29:19 +03:00
parent b0559fdbed
commit b04033d15a

View File

@@ -1,37 +1,55 @@
--- ---
_last_updated_: 2026-05-31T12:00:00+03:00 _last_updated_: 2026-06-04T12:00:00+03:00
session_id: 2026-05-31-vehicles-loader-verify-email-fix session_id: 2026-06-04-books-vds-disk-full-remediation
--- ---
# Next session handoff # Next session handoff
_Сессия: live-verify прогона `vehicles-loader 0.4.0` на проде СТО Стайер + находка/фикс email-бага. _Сессия: разбор disk-full алерта Rusonyx на books VDS (89.253.255.133). Причина найдена,
Таска `vehicles-loader-progress-deploy` закрыта 🟢. Прод стабилен, ничего не висит._ диск 96%→44%, спам-петля заглушена, guard поставлен. Ничего не висит. Вики обновлён + закоммичен (`b0559fdb`)._
## Recent commits ## Recent commits
- `c588326c` tasks(vehicles-loader-progress-deploy): close 🟢 — verify ok + email-recipient fix - `b0559fdb` wiki(books-vds): disk-full incident 2026-06-04 + Bookva->slovo job scoping
## Что сделано (verify прогона Sun 31.05 06:21→07:53 MSK) ## Что сделано (books VDS, 04.06)
-Progress-logging 0.4.0 работает: журнал показал движение по всем фазам (▶/батчи/✓/delete-sweep), -**Диск 96%→44%** (53/122 ГБ). Освобождено ~64 ГБ: обрезаны runaway json-логи
НЕ тишина. `Finished … Deactivated successfully` (exit 0). `importRun id=4 ok`, `reportJson errors:[]`. `books-task-runner` (32.8 ГБ) + `bookva-task-runner` (5.6 ГБ); снесены 11 orphan
-**Email-баг починен:** `STOSTAYER_MAIL_TO=site@stostayer.ru` (отчёт слался сам себе) → BuildKit-билдеров + 9 `*_state` volumes (~26 ГБ).
`vitya.kuznetsov@gmail.com` в `/etc/stostayer/vehicles-loader.env` на хосте (бэкап -**Durable guard:** `/etc/logrotate.d/docker-containers` (copytruncate 200M, rotate 3) +
`vehicles-loader.env.bak.20260531`). `FROM=site@stostayer.ru` без изменений (SMTP-аккаунт релея). hourly `/etc/cron.d/docker-logrotate`. Без рестарта докера. crond active, тест-ран чистый.
Доставка на gmail подтверждена тест-письмом (`ACCEPTED=[gmail]`, `250 queued as 8732C122F18`). -**Root cause:** `books-task-runner` (тенант slovo) error-loop'ил в Ozon по продавцу
**Подхватится автоматом на след. прогоне 06:21 — отдельно проверять не нужно** (но если хочешь **Bookva (client_id 50542)**, чей `api_key` в `books-db.sellers` **намеренно подменён на
100% — глянь, что боевой отчёт за 01.06 реально упал в gmail). слововский** (`9683…`) как ревокация доступа books→Bookva-Ozon. Спам шёл из legacy
seller-перебирающих agenda-джоб без скоупа.
-**Фикс:** проставлен `data.idSeller=2` (slovo) пяти legacy-джобам в `books-job-scheduler-mongo`
(`ozon fbs postings syncronization`, `generate old prices`, `ozon fbs products syncronization`,
`create ozon products in incorrect state report`, `put on sale products`). Залипшие overdue-прогоны
оборваны (unlock `lockedAt:null` + `docker restart books-task-runner`).
**Invalid-Api-Key 6448/мин → 0**, джобы отработали по slovo и перепланировались.
-**Deploy-durable** (user спрашивал): эти джобы legacy (без `data._fromConfig`), reconciler
(`RECONCILER_ENABLED=true`) трогает только `_fromConfig`-джобы; в `tasks.json` (в образе) у них
`schedule:null` → пропускает. Эмпирика: `stocks-sync idSeller:2` пережил деплой 31.05.
- ✅ Сверка полноты: 7 seller-перебирающих тасок — все заскоуплены; reconciler-gen джобы уже на
`salesChannels:[2]`. Группа В снята: Bookva-канал = `type=ym` (Яндекс), Ozon-канала Bookva нет.
## Follow-up'ы по vehicles-loader (НЕ блокеры, живут в `stostayer.new`, не в .admin) ## ⚠️ НЕ ДЕЛАТЬ (специфично для этого инцидента)
- **НЕ «чинить» ключ Bookva (50542) в `books-db.sellers`** — он сломан НАМЕРЕННО (подменён на
слововский) как ревокация. Живой ключ Bookva — в `bookva-db`/конфиге, для тенанта bookva.
Если снова увидишь `Invalid Api-Key` по 50542 в books-стеке — это не баг ключа, а недо-скоупленная
джоба. Полный разбор: `.wiki/entities/books-vds.md` § Disk-full incident.
## Follow-up'ы (НЕ блокеры)
| Что | Деталь | | Что | Деталь |
|---|---| |---|---|
| units-фаза медленная | 1h 31m на 100529 rows (vehicles 3884 за 3с для сравнения). Кандидат — батч-инсёрт / индексы. Весь прогон = практически только units. | | Каноничный фикс скоупа | legacy seller-джобы стоит перенести в `tasks.json` со скоупом ИЛИ вывести из эксплуатации (возможно, дублируют reconciler-gen). Mongo-правка надёжна, но если релиз даст им `schedule` в tasks.json без скоупа — Bookva-доступ вернётся. → сказать разработчикам books. |
| generation `unmatched:51` | 51 поколение не сматчилось при импорте. Не ошибка, но проверить — не теряем ли данные. | | wiki-drift | `bookva-*` stack + books-task-runner/scheduler не в stack-inventory `books-vds.md`; нужен re-inventory. |
| `config/default.json` дефолт `to` | всё ещё `site@stostayer.ru` (прод перекрыт env, но дефолт вводит в заблуждение). Выровнять в репо `stostayer.new`. | | Native log rotation | daemon.json `max-size`/`max-file` + docker restart — не делал (нужен maintenance window); logrotate-guard покрывает. |
## Открытые треки (.admin, перенос — ещё живые) ## Открытые треки (.admin — ещё живые)
| Трек | Готовность | Entry-point | | Трек | Готовность | Entry-point |
|---|---|---| |---|---|---|
@@ -39,19 +57,13 @@ _Сессия: live-verify прогона `vehicles-loader 0.4.0` на прод
| `books-bookva-user-whitelist-gathering` | ⚪ ready — gathering от учредителя | `.tasks/STATUS.md` | | `books-bookva-user-whitelist-gathering` | ⚪ ready — gathering от учредителя | `.tasks/STATUS.md` |
| `stateful-split-volume-copy` / `infra-inventory` | ⚪ ready | `.tasks/STATUS.md` | | `stateful-split-volume-copy` / `infra-inventory` | ⚪ ready | `.tasks/STATUS.md` |
## Спроси user'а
- (vehicles-loader) Делать ли follow-up'ы (units-perf / generation-unmatched / default.json)? Все три —
в репо `stostayer.new`, не в .admin. Не срочные.
## Не делать (preemptive guards) ## Не делать (preemptive guards)
- **Не форсить baseline-reset** vehicles-loader без явного запроса — шлёт клиенту внеплановое email.
- **Не возвращать `:9200` / stateful-порты на `0.0.0.0`** без IP-allowlist (books VDS, ransom-бот). - **Не возвращать `:9200` / stateful-порты на `0.0.0.0`** без IP-allowlist (books VDS, ransom-бот).
- **Не `ssh + docker compose up -d`** на VDS Portainer-stacks — только Portainer API (искл. traefik/portainer). - **Не `ssh + docker compose up -d`** на VDS Portainer-stacks — только Portainer API (искл. traefik/portainer).
- **branch ahead от origin** — push без явного grant'а (Rule 4). Этой сессии grant НЕ давали. - **branch ahead от origin** — push без явного grant'а (Rule 4). Этой сессии grant НЕ давали.
## Memory updates за сессию ## Memory updates за сессию
- (нет нового на этом раунде) — email-фикс зафиксирован в task-файле + STATUS.md, схема деплоя и - (нет нового файла) — инцидент + корректный root-cause + «не чинить ключ Bookva» зафиксированы
инфра-гочи уже в `stostayer.new/.wiki/concepts/client-infra-access.md`. в `.wiki/entities/books-vds.md` (закоммичено `b0559fdb`).