diff --git a/.wiki/concepts/sched-ozon-creds-stub-contract.md b/.wiki/concepts/sched-ozon-creds-stub-contract.md new file mode 100644 index 0000000..c247336 --- /dev/null +++ b/.wiki/concepts/sched-ozon-creds-stub-contract.md @@ -0,0 +1,68 @@ +--- +title: sched-ozon-creds-stub-contract +type: concept +status: live +tags: [books, sched, ozon, creds, tenant-split, anti-leak] +related: [[books-vds]], [[portainer-stack-management-books-vds]] +--- +# Sched Ozon creds stub contract (slovo/bookva) + +Контракт кредов Ozon между двумя тенантами books на books VDS. **Каждый стек ходит +в Ozon только своими кредами**: Slovo — client_id 94191, Bookva — client_id 50542. +Мисматч-пары (client_id ↔ чужой ключ) в обеих БД — **намеренные заглушки**, НЕ баги +и НЕ артефакты копирования. Зафиксировано владельцем 2026-08-23 после того, как +.admin «починил» заглушку и вызвал инцидент. + +## Почему заглушки + +Tenant-split (volume-copy) оставил ОБОИХ sellers в обеих БД. Если бы в каждой БД +лежали рабочие ключи обоих кабинетов — любой стек мог бы ходить в Ozon под чужим +кабинетом (утечка/перекос данных). Заглушка делает чужой кабинет **недостижимым**: +Ozon отвечает `Invalid Api-Key (code 5)` на мисматч-пару. + +## Матрица (актуально 2026-08-23) + +| БД | id_seller | client_id | api_key | статус | +|---|---|---|---|---| +| slovo (books-db) | 1 | 50542 | `968302d1-…` (slovo-ключ) | **заглушка** (мисматч) | +| slovo (books-db) | 2 | 94191 | `968302d1-…` (slovo-ключ) | рабочий | +| bookva (bookva-db) | 1 | 50542 | `ddc24146-…` (bookva-ключ) | рабочий | +| bookva (bookva-db) | 2 | 94191 | `ddc24146-…` (bookva-ключ) | **заглушка** (мисматч) | + +Хэши SHA2 (проверка целостности): slovo-ключ = `d6227b…`, bookva-ключ = `f700f3…`. +Оба ключа — штатные креды, живут в git (`.slovo.cmd`/`.bookva.cmd` обёртки +`packages/tools`), не выдуманы. + +Проверка Ozon API (2026-08-23): 94191 + slovo-ключ → 200 OK; 50542 + slovo-ключ → +Invalid; 50542 + bookva-ключ → 200 OK. + +## Как это безопасно + +- Код-фикс `2a38fb5` (break в outer catch `ozonFbsPostingsSyncronization.js`) — + задеплоен на оба task-runner 2026-08-23. all-sellers диспатч (data:null), + упёршийся в заглушку → `Invalid Api-Key` → **break → фейл-фаст, БЕЗ спина** + (до фикса — бесконечный while(true) ~75 req/сек, инцидент 2026-08-23). +- Расписания с корректным `data.idSeller` (slovo=2, bookva=1) заглушек вообще не + касаются — ходят только своим продавцом. + +## Verify (если кто-то засомневается) + +```sql +-- slovo: seller 1 должен быть 50542 + 968302d1 (заглушка) +SELECT id_seller, client_id, LEFT(api_key,8) FROM sellers ORDER BY id_seller; +-- bookva: seller 2 должен быть 94191 + ddc24146 (заглушка) +``` + +## НЕ делать (guards) + +- **НЕ «чинить» мисматч-пары** — это контракт. «Починил» → slovo-стек начинает + ходить в Ozon как Bookva → утечка. +- Не трогать bookva-БД seller 1 (рабочий) и slovo-БД seller 2 (рабочий). +- Изменение ключей — только через владельца кабинета (Ozon) + письмо books. + +## Инцидент-ссылка + +2026-08-23: спин `ozonFbsPostingsSyncronization` (невалидный ключ + no-break код) → +полный разбор в переписке `books/.agents/inbox/` (отчёты .admin 10:22→12:50Z) и +тасках books #974/#975/#977/#990/#991. Фоллоу-ап: документация runtime-контракта +sched-тасок (file-managed перевод slovo сделан 12:50Z, коммит 887bbae). diff --git a/.wiki/index.md b/.wiki/index.md index 69770fd..407c73c 100644 --- a/.wiki/index.md +++ b/.wiki/index.md @@ -21,6 +21,7 @@ Catalog of all wiki pages. One line per page, organized by type. Updated on ever - [windows-recovery-host](entities/windows-recovery-host.md) — Windows Recovery Host (рабочий PC пользователя) ## Concepts +- [sched-ozon-creds-stub-contract](concepts/sched-ozon-creds-stub-contract.md) — контракт кредов Ozon slovo/bookva: мисматч-пары (client_id ↔ чужой ключ) — НАМЕРЕННЫЕ заглушки (анти-утечка после tenant-split), матрица 4 sellers, безопасность через break-on-error (2a38fb5), verify по SHA2, НЕ «чинить» - [omniroute-combo-deepseek-web-tuning](concepts/omniroute-combo-deepseek-web-tuning.md) — настройка web-комбо под агента: system_message убивает скилы pi, tool_filter_regex режет тулы, search-режим ломает tool-calling, 503 chat_admission_busy, эмуляция `` работает, план кастомного провайдера, qwen-web baxia-WAF стена - [forgetmeai-free-web-chat-proxies](concepts/forgetmeai-free-web-chat-proxies.md) — семейство бесплатных web-chat прокси ForgetMeAI (DeepSeek/Qwen/GLM/Kimi): паттерн «обход капчи через реальную браузерную сессию», PoW-солвер DeepSeek, браузерный путь через baxia-WAF (fetch в page.evaluate), CloakBrowser, классификаторы капчи; карта «что берём в lwp» - [sched-admin-client-openapi](concepts/sched-admin-client-openapi.md) — F&F раунды 2026-08-18: Python-клиент одной командой из спеки (openapi-generator 7.24.0); r1 0.1.2 — 24/24+smoke 19/19, находки F-1..F-5 (8 операций на raw-обходе); r2 0.2.0/0.3.5 — все 5 закрыты, raw_ops удалён, 11/11 typed-only, вердикт «claim подтверждён полностью» diff --git a/.wiki/log.md b/.wiki/log.md index a1b1545..cfdd2ee 100644 --- a/.wiki/log.md +++ b/.wiki/log.md @@ -11,6 +11,7 @@ ## [2026-08-12] implement | NEW concepts/keenetic-rci-api.md — разобрана автоматизация KeeneticOS 5.1.3 (RCI: GET /rci/show/*, POST /rci/ массив parse-команд). Через API добавлены DNS-записи git.kreknin.site/kreknin.site → 192.168.1.43 (решение сломанного hairpin). Проверено с LAN: всё 200. Правила порт-форвардинга в 5.x лежат в ip.static (to-host=MAC). ## [2026-08-12] implement | UPDATE entities/kreknin-synology.md — Gitea 1.27.1 + postgres 16 на kreknin (для Алексея), traefik починен (restart policy), LE-серт git.kreknin.site, проброс 80/443→8000/4443 на Keenetic. KeeneticOS Viva API закрыт — правила в GUI. NAT loopback сломан → нужен DNS-override git.kreknin.site→192.168.1.43. Пароли: pass kreknin/keenetic + pass kreknin/gitea. # Wiki op-log +## [2026-08-23] ingest | NEW concepts/sched-ozon-creds-stub-contract.md — контракт кредов Ozon slovo/bookva: мисматч-пары в обеих БД — намеренные заглушки (анти-утечка после tenant-split). Урок: .admin «починил» заглушку (slovo seller 1 ← bookva-ключ) → откат 12:07Z по подтверждению владельца; зеркальная заглушка bookva seller 2 (12:15Z). Безопасность: break-on-error 2a38fb5 задеплоен (фейл-фаст без спина). verify по SHA2 (d6227b = slovo-ключ, f700f3 = bookva-ключ). НЕ чинить. Связано: инцидент 2026-08-23, перевод slovo → file-managed (887bbae). ## [2026-08-14] ingest | NEW concepts/snolla-smtp-mail-delivery-2026-08.md — postmortem SMTP-инцидента 12–14.08: 525 SMTP disabled (Яндекс 360, доменка) → переезд на e-16513832@yandex.ru (app-password); 554 SPAM на 2+ получателях от холодного ящика → @snolla/mailer@0.9.0 per-recipient (forms-api 0.2.0, web 0.44.0); 550 from not owned → mailSettings.from во всех production.json + шаблон pilorama98checkoutconfirm. Монитор SMTP на VDS (cron 08:00, ntfy) + parity-чек Portainer env. Рецепт деплоя тиража (порядок, гочи: ad-hoc контейнер vs Portainer, regex-парсинг image, yarn up -R data). Append-only log of wiki operations (ingests, promotions, lints, migrations).