docs(wiki): ingest sched-ozon-creds-stub-contract (anti-leak stubs, incident 2026-08-23)

This commit is contained in:
2026-08-23 15:52:28 +03:00
parent 59ff1e8780
commit ebf3831c08
3 changed files with 70 additions and 0 deletions

View File

@@ -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).

View File

@@ -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 пользователя) - [windows-recovery-host](entities/windows-recovery-host.md) — Windows Recovery Host (рабочий PC пользователя)
## Concepts ## 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, эмуляция `<tool>` работает, план кастомного провайдера, qwen-web baxia-WAF стена - [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, эмуляция `<tool>` работает, план кастомного провайдера, 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» - [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 подтверждён полностью» - [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 подтверждён полностью»

View File

@@ -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 | 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. ## [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 # 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-инцидента 1214.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). ## [2026-08-14] ingest | NEW concepts/snolla-smtp-mail-delivery-2026-08.md — postmortem SMTP-инцидента 1214.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). Append-only log of wiki operations (ingests, promotions, lints, migrations).