docs(wiki): session close — handoff + ingest pilonuxt restart-vs-redeploy (stack 16 deploy day)

This commit is contained in:
2026-08-16 13:41:34 +03:00
parent 71a8a60719
commit cb701214a2
4 changed files with 87 additions and 32 deletions

View File

@@ -0,0 +1,66 @@
---
title: "pilonuxt: рестарт vs пересборка (in-memory viewModel кэш content-api)"
type: concept
tags: [pilonuxt, deploy, ops, cache, content-api, portainer]
sources: []
related: [concepts/admin-api-embed-pilonuxt.md, concepts/namespace-consolidation-snolla.md]
updated: 2026-08-16
---
# pilonuxt (стек 16): рестарт vs пересборка
Инцидент 2026-08-16 зафиксировал две разные операции на стеке 16 (pilonuxt), которые
нельзя путать:
| Операция | Когда нужна | Как делается | Что сбрасывает |
|---|---|---|---|
| **Рестарт контейнера** | Контент/цены в БД изменились, код тот же | Portainer: `POST /api/endpoints/1/docker/containers/pilonuxt/restart` (скрипт `.tmp/restart-stack16.ps1`) | **In-memory viewModel кэш content-api** — свежие данные из MoreThenCms подтягиваются без пересборки |
| **Пересборка (deploy)** | Изменился код (монорепа, новый git-sha) | build (secret `verdaccio_token`) → push → Portainer PUT стек 16 (`.tmp/redeploy-stack16.ps1 -OldTag X -NewTag Y`) | Код + всё вышеперечисленное |
## Симптом «данные в БД есть, на фронте нет» → рестарт
2026-08-16: после перезаливки `volume_price` (loader `38c26c7` + admin-api 0.11.0) часть
карточек не показывала «Цена за м³» — в MoreThenCms поле было (`voulme_price: 38000`,
массив, DateUpdated свежий), а Nuxt-data отдавала `volume_price: null`. Диагноз прогера
(подтверждён): **content-api держит viewModel в памяти контейнера** — рестарт сбрасывает,
пересборка не нужна. После рестарта цена появилась, категории целы.
**Правило:** при расхождении «БД свежая ↔ фронт старый» первым шагом рестарт, не деплой.
Деплой только когда реально изменился код (новый sha в монорепе).
## Анти-симптом: 500 на странице — рестарт НЕ поможет
Рестарт бесполезен при серверном краше view model. 2026-08-16: 10 новых товаров →
`/catalog/skandinavskaya-doska` + `/catalog/imitaciya-brusa` отдавали HTTP 200 с 500 внутри
(NuxtError, `Request failed with status code 500`). Логи:
```
TypeError: Cannot read properties of undefined (reading 'name')
at @snolla/core viewModels/index.js:419 (_.find(x => x.name))
```
Root cause: admin-api при create писал `Products.Content` плоским объектом, core читал
только массив `[{name,value}]`. Фикс — на стороне snolla (core 0.26.7 normalize + admin-api
0.11.0 array-canon), потребовал пересборки (`1128ddc``64c2539`), рестарт не помог бы.
**Правило:** 500 в логах со стеком `@snolla/core`/lodash `_.find` — это код/данные, не кэш.
Рестарт не лечит; искать фикс в монорепе/у snolla, пересобирать.
## Порядок диагностики (итерации 09:05Z → 14:40Z)
1. Новинки не видны + цены нет → прогер просит рестарт (кэш). Рестарт → цены появились ✅
(но 500 на категориях остался — это другой класс).
2. 500 на категориях новинок → логи показали краш core → root cause у snolla (Content
object vs array) → фикс core 0.26.7 → пересборка `1128ddc` → 6+6 товаров 200 ✅.
3. Затем array-canon канонизация (admin-api 0.11.0, миграция БД) → пересборка `64c2539` ✅.
## Инвентарь образов (откат-цепочка, 2026-08-16)
- `64c2539` — текущий (admin-api 0.11.0 array-canon)
- `1128ddc` — core 0.26.7 (фикс 500)
- `f876e70` — заглушки каталога → фото (3 шт.)
- `24a13da` — «Брус антисептированный» фото
- `40806b1` — services-[slug] настоящий SSR 404
- `340c0e7` — выпил «Строительство каркасных домов»
- `8b7e8c4` — до дня деплоев (SMTP-фикс)
Source-of-truth compose: `host-stacks/vds-kzntsv/pilonuxt.compose.yml` (всегда актуализировать
после PUT). Деплой-ранбук: монорепа `apps/web/.wiki/concepts/docker-deploy.md`.

View File

@@ -27,6 +27,7 @@ Catalog of all wiki pages. One line per page, organized by type. Updated on ever
- [admin-api-embed-pilonuxt](concepts/admin-api-embed-pilonuxt.md) — admin-api embedded in pilonuxt /admin/api, stack 25 retired (2026-08-05)
- [pilonuxt-restart-vs-redeploy-2026-08-16](concepts/pilonuxt-restart-vs-redeploy-2026-08-16.md) — стек 16: рестарт (in-memory viewModel кэш content-api) vs пересборка (код); инцидент 500 на новинках (Content object vs array → core 0.26.7/admin-api 0.11.0); откат-цепочка образов 2026-08-16
- [namespace-consolidation-snolla](concepts/namespace-consolidation-snolla.md) — @snollajs@snolla, 8 sites bumped, 17 packages (2026-08-04/05)
- [admin-infra-project](concepts/admin-infra-project.md) — design + migration plan для OpeItcLoc03/admin (canonical)
- [backup-inventory-2026-06](concepts/backup-inventory-2026-06.md) — карта всех машин × что реально бэкапится (с доказательством); дыры по приоритету (kreknin SPOF, nl-vds x-ui.db, bookva-*, openwrt) — триггер: MSSQL 3-нед gap

View File

@@ -1,3 +1,4 @@
## [2026-08-16] ingest | concepts/pilonuxt-restart-vs-redeploy-2026-08-16.md — день деплоев стека 16 (7 операций): рестарт vs пересборка разведены как отдельные операции. Рестарт сбрасывает in-memory viewModel кэш content-api (цена за м³ подтянулась после рестарта без пересборки); пересборка — только для кода. Анти-симптом: 500 на категориях с логом `@snolla/core viewModels/index.js:419 _.find(x=>x.name)` = код/данные (Content object vs array, admin-api create), рестарт не лечит — фикс snolla core 0.26.7 + admin-api 0.11.0 array-canon (1128ddc → 64c2539). Откат-цепочка образов 64c2539→…→8b7e8c4. +index.md. Монорепа-сторона заингестена прогером (lazy-data-not-found-404, admin-api-content-wire array-canon, cms-edits-cache-restart, v-html-on-component-ssr, admin-api-content-edit).
## [2026-08-14] decision | FormSubmissions.Content ₽→«?» — координация закрыта. ALTER на клиентской stostayer сделан (.admin); snolla опубликовала `@snolla/data@0.15.1` (STRING→TEXT=NVARCHAR(MAX), тесты 7/7); скан живых БД VDS: MoreThenCms+Staging уже nvarchar (ALTER не нужен), VDS-stostayer varchar — не прод, не трогаем (роль — к оператору); legacy stostayer.web на @snollajs 0.7.x — фикс не едет, ALTER покрывает (backport опция `065bb44`); формы есть у всех сайтов тиража (pilorama98 2516/labtools 916 — вопреки гипотезе snolla). Бонус: email-контракт задокументирован snolla (forms-email-contract.md), warn при пустом `to` — ждёт решения vitya. Таска snolla [formsubmissions-content-nvarchar] закрыта.
## [2026-08-14] implement | MSSQL stayer_site: ALTER FormSubmissions.Content varchar(max) cp1251 → NVARCHAR(MAX) (запрос их прогера: ₽→«?» в письмах с калькулятора). Verify до/после (nvarchar max). Live-тест не гонял, тестовые заявки #68485/#68486 не удалял (ждут подтверждения). Соединение: tedious из packages/web node_modules, MSSQL 91.222.236.225:1433 открыт снаружи.
## [2026-08-14] lint | inbox-rename cascade audit (idea 13): rg по живых инструкциях .admin — единственный хит log.md (op-log история, ок); stostayer.new — только маркеры «устаревший путь»; ack-письма в .agents/inbox подтверждены (.read); pi-расширение inbox-monitor (деплой+source of truth) на .agents/inbox, .claude-inbox не упоминается. Подтверждение оператору отправлено в .workshop/.agents/inbox.