--- 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`.