diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index fd8227d..2d37629 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -1,30 +1,30 @@ --- -_last_updated_: 2026-05-29T09:40:00+03:00 -session_id: 2026-05-29-es-ransom-recurrence-true-rca +_last_updated_: 2026-05-29T13:30:00+03:00 +session_id: 2026-05-29-labtools-slow-noissue --- # Next session handoff -_Сессия: рецидив ES-инцидента → нашли ИСТИННУЮ причину (ransom-бот через открытый -`:9200`, вчерашний диагноз «оператор» опровергнут). Закрыли порт (Control #3) + re-restore. -Отдельно починили epz-поиск у ОБОИХ тенантов (tenant-config баг). accessLog откатан._ +_Сессия: разбор «labtools.ru тормозит после переезда на RUVDS». Итог — **non-issue**: +прод на RUVDS быстрый (~0.35s TTFB), «медленно» было артефактом замера с воркстейшн +(LAN-DNS резолвит домен в локальную stale-копию). Инфру не трогал, traefik не правил. +Открытые ES-incident треки прошлой сессии перенесены ниже — ещё живые._ ## Recent commits -- (этой сессии — см. ниже, коммитятся при закрытии) +- `063910e2` incident(books-vds-es): true RCA — ransom-бот через открытый :9200 - `63708fe6` tasks(NEXT_SESSION): session-close — ES restore + 2 preventive controls live -- `48a5cf39` tasks(restore-es-indices-books-vds): closed — snapshot restore + 2 preventive controls -- `e9b0a9ed` docs(tasks): restore-elasticsearch-indices-books-vds — books VDS ES stack 33 пуст +- `48a5cf39` tasks(restore-es-indices-books-vds): closed — snapshot restore + 2 controls -## Что сделали в эту сессию +## Что сделали в эту сессию (labtools) -- **True RCA:** ES (stack 33) публиковал `0.0.0.0:9200` мимо traefik. Free-ES 7.10 без auth → `curl :9200` без кредов = cluster info. Ransom-бот сносил индексы by-name (мимо Control #1 `destructive_requires_name`), оставлял `read_me` с BTC-выкупом (0.0041 BTC, кошелёк получил ~0.018 BTC с 5 жертв). Снос 28.05 20:13 UTC — через ~3ч после вчерашнего restore. -- **Control #3 (fix дыры):** убрана публикация host-порта из stack 33 (Portainer PUT `/api/stacks/33?endpointId=1`). `docker ps` → `9200/tcp` без `0.0.0.0:`, внешний `curl :9200` refused, traefik route жив. Затем `DELETE /read_me` + restore `epz,products,artmone` из `daily-2026-05-25` (counts 820604/105922/2621 green) + restart books consumers. -- **Отдельный баг — epz-поиск у ОБОИХ тенантов:** `getTenantIdSeller(config.get("tenant"))` через node-config; `tenant` не задан нигде, откуда node-config читает (ни `default.json`, ни `custom-environment-variables.json` — тот мапит только ELASTICSEARCH). `TENANT=bookva` env на bookva-web — мёртвый груз. Fix: добавил `"tenant":"slovo"`/`"bookva"` в overlay `default.json` (volumes `books-web-config`/`bookva-web-config`, бэкапы `*.bak-pre-tenant-2026-05-29`), рестарт. `config.tenant` резолвится, tenant-ошибки прекратились. **products работал и так** (другой код-путь). -- **accessLog откатан:** Control #2 сторожил не ту дверь (бот шёл мимо traefik). `traefik.yml` восстановлен из `*.bak-pre-accesslog-2026-05-28`, лог-файл удалён, traefik рестартнут. Версия с accessLog сохранена как `*.bak-with-accesslog-2026-05-29`. -- **Wiki:** concept `es-destructive-delete-incident-2026-05-26` обновлён (correction-блок + опровергнутая гипотеза + секция «Рецидив 2026-05-29» + exposure-audit). index + log обновлены. +- Жалоба: labtools.ru медленно отдаётся на RUVDS, pilorama98.ru норм. +- **Root cause = артефакт замера, не дефект прода.** Публичный DNS labtools.ru/pilorama98.ru → RUVDS `80.64.31.36`; прод TTFB ~0.35s (curl --resolve), картинки 0.13–0.5s — быстро. Но с этой воркстейшн LAN-DNS резолвит домены в **локальную stale-копию** (home traefik :4443 → IIS :8089), которая тормозит для тенанта labtools (HTML TTFB 1.45s vs pilorama 0.25s на том же :8089). +- traefik-конфиги `labtools.yml` ≡ `pilorama98.yml` побайтово (оба → host.docker.internal:8089) → в traefik чинить нечего. +- К концу сессии user подтвердил «labtools.ru стал отдаваться нормально» (видимо дорезолвился кэш на RUVDS). **Ничего не менял.** +- Memory сохранён: `workstation-lan-dns-serves-local-cms-copy` (валидировать прод только через `curl --resolve` / не-LAN, браузер через MCP тоже бьёт в локальную копию). -## Open треки +## Open треки (перенос из ES-incident сессии — ещё живые) | Трек | Готовность | Entry-point | |---|---|---| @@ -36,16 +36,18 @@ _Сессия: рецидив ES-инцидента → нашли ИСТИНН ## Спроси user'а -- **epz-поиск end-to-end не подтверждён руками** — я починил место падения (`tenant undefined`), но реальный аутентифицированный запрос из UI не делал (auth-токен). Попросить юзера проверить epz в обоих UI (bookseller.kzntsv.site = bookva, bookva.kzntsv.site = slovo). Если всплывёт downstream (seller-строка в БД / Ozon API) — смотреть логи `books-web`/`bookva-web`. -- **harden-ports**: user сказал «пока нет» на немедленный mongo-allowlist. Не начинать без явного запроса. Когда захочет — DOCKER-USER IP-allowlist (firewalld docker не контролит), + mongo 4.2 EOL upgrade + развод reused-пароля `FNud4Um47y`. +- **epz-поиск end-to-end не подтверждён руками** (из прошлой сессии) — починено место падения (`tenant undefined`), но аутентифицированный запрос из UI не делался. Проверить epz в обоих UI (bookseller.kzntsv.site = bookva, bookva.kzntsv.site = slovo). Downstream → логи `books-web`/`bookva-web`. +- **harden-ports**: user сказал «пока нет» на немедленный mongo-allowlist. Не начинать без явного запроса. ## Не делать (preemptive guards) -- **Не возвращать публикацию `:9200`** (и любых stateful-портов) на `0.0.0.0` без IP-allowlist. Auth должна быть НА сервисе, не только в traefik-мидлваре — free-ES auth не имеет. -- **Не трогать mongo/mariadb/minio порты** без подтверждения user'а — он сказал mongo «нужен» снаружи. Сначала выяснить кто коннектится (`ss -tnp | grep 27017`). -- **Не использовать `ssh + docker compose up -d`** на VDS для Portainer-stacks — только Portainer API (как делали PUT stack 33). Исключение: traefik/portainer (management-plane, ad-hoc compose — как правка `traefik.yml`). +- **Не возвращать публикацию `:9200`** (и stateful-портов) на `0.0.0.0` без IP-allowlist — free-ES без auth, ransom-бот уже отметился. +- **Не трогать mongo/mariadb/minio порты** без подтверждения user'а. +- **Не использовать `ssh + docker compose up -d`** на VDS для Portainer-stacks — только Portainer API. Исключение: traefik/portainer (management-plane). +- **Не «чинить» traefik labtools.yml вслепую** — он корректен, идентичен рабочему pilorama; медленность была локальной DNS-копией, не конфигом. - **branch ahead от origin** — push без явного grant'а (project-discipline Rule 4). Этой сессии grant НЕ давали. ## Memory updates за сессию -- Стоит сохранить: **books VDS — docker port-publish обходит firewalld; stateful-сервисы наружу = vector; ransom-бот уже отметился через :9200**. (не сохранял в memory/ — кандидат на следующий заход, см. `[[vds-kzntsv-traefik-and-minio-hostnames]]` соседний контекст books VDS.) +- ✅ `workstation-lan-dns-serves-local-cms-copy` (новый) — мигрированные CMS-домены с воркстейшн резолвятся в локальную stale-копию, не RUVDS; валидировать прод через `curl --resolve`/off-LAN. +- Кандидат с прошлой сессии (НЕ сохранён): books VDS — docker port-publish обходит firewalld; stateful-сервисы наружу = vector.