Постмортем инцидента 2026-07-24: 404/500 на body_repair_service (stostayer.ru) = двойной корень. (1) код-баг snolla: viewModels/index.js `import markdown from 'markdown-it'; markdown();` — инстанс выброшен, markdown.render undefined, краш на markdown-поле-шаблонах (латентный ~3 мес с коммита 1e3f897 2026-04-21). (2) упаковка exact-pin-staleness: @snollajs/content-api@0.8.0 `workspace:*` запёк @snollajs/snolla:0.7.4 exact → фиксовая 0.7.7 легла top-level, content-api юзал nested баговую 0.7.4. yarn resolutions/patch не форсят exact-pin опубликованного пакета — решено публикацией @snollajs/content-api@0.8.2 (^0.7.7). Деплой stostayer-web:0.3.22 через pscp SSH:20435 + sudo docker load + Portainer PUT pullImage:false (без push в docker.stostayer.ru:443, бана нет). 4 URL → 200 публично. Pre-build чек yarn.lock single-snolla ловит класс. Cleanup workspace-caret-interpackage-deps — за vitya+snolla. Co-Authored-By: Claude <noreply@anthropic.com>
48 lines
6.9 KiB
Markdown
48 lines
6.9 KiB
Markdown
---
|
||
_last_updated_: 2026-07-24T11:15:00Z
|
||
session_id: 2026-07-24-stostayer-markdown-render-fix
|
||
prev_session_id: 2026-07-21-stostayer-web-0320-deploy
|
||
---
|
||
|
||
# Next session handoff
|
||
|
||
## Эта сессия — починка 404/500 на body_repair_service (stostayer.ru). ЗАВЕРШЁН ✅
|
||
|
||
stostayer.new сообщил: страницы `/kuzovnoj-malyarnij-remont/{zamena-elementov,rihtovka-kuzova,remont-bamperov,pokraska}` отдают 404. Корень оказался **двойной**, чинено координированно с snolla + stostayer.new.
|
||
|
||
### Что сделано
|
||
- **Корень 1 (код, snolla):** `@snollajs/snolla` `lib/viewModels/index.js:7-8` — `import markdown from 'markdown-it'; markdown();` (инстанс выброшен) → `markdown.render` undefined → краш `fillViewModel` на markdown-поле-шаблонах. Латентный ~3 мес (с коммита `1e3f897` 2026-04-21). snolla починила → `@snollajs/snolla@0.7.7` (0.7.x legacy-line) + `@snollajs/core@0.26.1` (master + TDD).
|
||
- **Корень 2 (упаковка, exact-pin-staleness):** `@snollajs/content-api@0.8.0` декларил `@snollajs/snolla: workspace:*` → при publish yarn запёк exact `0.7.4` → фиксовая 0.7.7 легла top-level, content-api юзал свою **nested баговую 0.7.4**. Первый деплой 0.3.21 не починил (регрессии нет). yarn `resolutions`/patch НЕ спасают (не форсят exact-pin опубликованного пакета — stostayer.new эмпирически проверил). Решено публикацией **`@snollajs/content-api@0.8.2`** с `^0.7.7` (snolla), stostayer.new забампил `^0.8.2` (`ace20a1`) → одна snolla 0.7.7.
|
||
- **Деплой 0.3.22:** собрал локально offline, транспорт **без push в `docker.stostayer.ru:443`** (бан-гочи) — `docker save|gzip` → `pscp` SSH:20435 → `sudo docker load` → Portainer PUT стека 16 `pullImage:false`. Verify: 4 URL → **200** публично через Angie/TLS, в логах нет `markdown.render`.
|
||
- **Wiki:** NEW `concepts/stostayer-markdown-render-404-incident-2026-07.md` (постмортем), index.md + log.md обновлены.
|
||
- **Memory:** NEW `stostayer-deploy-image-via-pscp-load-avoid-443-push.md` (pscp+load+pullImage:false техника + pre-build чек yarn.lock single-snolla).
|
||
|
||
### ОСТАЁТСЯ (vitya решает сам со snolla — НЕ поднимать admin-сессии)
|
||
- **Cleanup `workspace-caret-interpackage-deps`** (snolla-таска: `workspace:*`→`workspace:^` по монорепо, чтоб класс exact-pin-staleness не повторялся). Scope-вопрос snolla: covers ли 0.7.x legacy-line content-api или только master + перенос peerDep-паттерна (master 0.12.0) на 0.7.x. **vitya сказал «я порешаю это со snolla»** — не админ-scope, не подхватывать.
|
||
- Multi-tenant находка (факультатив): на shared MoreThenCms-БД kupimknigi нашлись 2 чужих siteId (`919219B3`, `5A826EB9`, шаблоны `article_markdown`/`test` с markdown-полем) — если на snolla 0.7.x, тоже крашились; фикс закроет при их пересборке. Mapping siteId→сайт — за vitya (site-реестр).
|
||
|
||
## Recent commits (этот репо, .admin)
|
||
- (этот коммит) `wiki(stostayer): ingest markdown-render-404 incident postmortem + NEXT_SESSION`
|
||
- `23b1a47c` wiki(stostayer): ingest stostayer-admin-minio-config
|
||
- `95168e30` meta(handoff): NEXT_SESSION — RUVDS DECOMM 2026-07-21
|
||
|
||
## Open треки (из STATUS.md, не этой сессии)
|
||
| Трек | Готовность | Entry-point |
|
||
|---|---|---|
|
||
| tandemmebel-web-vds-deploy | 🔵 blocked — оператор нашёл НОВЫЙ визуальный дефект на sharp-staging (стек 20, https://tandemmebel.vds.kzntsv.site), специфику не назвал, «чиним в новой сессии». Cutover HELD | `.tasks/STATUS.md` §tandemmebel; sharp-staging жив на стеке 20 |
|
||
| on-snolla-vds-migration | 🟢 blocked by snolla-local-admin-restore — on.snolla.com (siteId B9ECDB50…) RUVDS IIS → VDS Node snolla-app 0.42.1, реконструкция шаблонов | `.wiki/concepts/snolla-local-admin-and-on-snolla-migration-design.md` §Task B |
|
||
| snolla-local-admin-restore | ⚪ ready — восстановить локальный .NET-админ (catch-all IIS `snolla`) копированием `C:\sites\snolla\` с RUVDS; `<alias>.snolla.com/admin` через hosts-override | design doc §Task A |
|
||
| books-task-runner-registry-auth-cred | 🔵 blocked — cred в config-volume, но рабочий образ (88f2bee) содержит СТАРЫЙ registryGc; тега master-a3734d5 в реестре нет → CI не собрал v2-DELETE rewrite. In-app dryRun ждёт build+deploy | `.tasks/STATUS.md` §books-task-runner |
|
||
|
||
## Спроси user'а
|
||
- (нет новых ask-items — инцидент закрыт; cleanup vitya берёт на себя со snolla)
|
||
|
||
## Не делать (preemptive guards)
|
||
- **НЕ лезть в прод-БД stostayer** (MSSQL `stostayer`/MariaDB) — vitya явно остановил при попытке SQL-запроса в начале сессии. Диагностика через логи контейнера + исходники node_modules, не через DB-запросы. SQL-свопы по чужим прод-БД — только если vitya дал go на read-доступ конкретному агенту.
|
||
- **НЕ пушить образы в `docker.stostayer.ru:443`** с нашего VPN-egress — единичный large-push тоже банит VPN-IP (см. [[stostayer-push-ban-single-large-push]]). Транспорт образа через pscp SSH:20435 + docker load + `pullImage:false` (отработано, бана нет).
|
||
- **НЕ подхватывать cleanup `workspace-caret-interpackage-deps`** — vitya решает со snolla сам.
|
||
- **НЕ встраивать JSON-payload в double-quoted `bash -c`** при Portainer PUT — кавычки payload ломают аргумент → 500. Писать payload в файл (`jq > /tmp/p.json`), `curl -d @/tmp/p.json`.
|
||
- Pre-build чек перед деплоем snolla-фиксов: `grep -E "^\"@snollajs/snolla@npm:" yarn.lock` → ОДНА версия; в образе `docker run --rm --entrypoint sh <img> -c 'find /usr/src/app -path "*@snollajs/snolla/package.json"'` → одна копия. Без этого деплой «успешно» не починит (exact-pin-staleness).
|
||
|
||
## Memory updates за сессию
|
||
- NEW `stostayer-deploy-image-via-pscp-load-avoid-443-push.md` — pscp+load+pullImage:false техника (без :443 push) + pre-build single-snolla чек. |