diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index 380735e..e79543b 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -1,47 +1,34 @@ --- -_last_updated_: 2026-08-14T11:00:00Z -session_id: 2026-08-14-admin-stostayer-formsubmissions -prev_session_id: 2026-08-12-admin-kreknin-gitea +_last_updated_: 2026-08-16T15:00:00Z +session_id: 2026-08-16-pilonuxt-deploy-day --- # Next session handoff -## Recent commits (эта сессия, .admin) - -- `meta(tasks,wiki)`: stostayer-web 0.3.23 deploy — task done + runbook nuances (offline-build linux-bins, :9000 port, prod tag) -- `meta(wiki)`: runbook — offline-cache fixed by 5c583f8 (supportedArchitectures), yarn install replenished cache -- `meta(wiki)`: inbox-rename audit — .claude-inbox → .agents/inbox clean (op-log record) -- `meta(wiki)`: MSSQL FormSubmissions.Content varchar→nvarchar (₽ fix) — op-log -- `meta(wiki)`: FormSubmissions nvarchar coordination closed — op-log decision +## Recent commits (admin) +- `71a8a607` chore(ops): pilonuxt restart — content-api viewModel cache reset, volume_price renders +- `5b3a1b2f` chore(deploy): pilonuxt 64c2539 LIVE — admin-api 0.11.0 array-canon +- `3133c0e8` chore(deploy): pilonuxt 1128ddc LIVE — core 0.26.7 fixes new-products 500 +- `070431df` chore(deploy): pilonuxt f876e70 LIVE — remaining 3 catalog placeholders -> real photos +- `694a4a96`, `c860da3f`, `b9a626e6`, `ac647241`, `a21b0491` — см. git log ## Open треки - | Трек | Готовность | Entry-point | |---|---|---| -| VDS-копия БД `stostayer` (FormSubmissions.Content = varchar cp1251) | вопрос «нужна ли копия вообще» — к оператору; snolla не трогает | ALTER `... NVARCHAR(MAX) NULL` если решат оставить | -| stostayer legacy backport unicode-фикса в @snollajs 0.7.x | опция, не срочно; ALTER уже покрывает | референс коммит `065bb44` (snolla) | -| Бамп тиража `@snolla/data@0.15.1` (forms nvarchar в модели) | в релизную волну snolla, БД уже nvarchar — спешки нет | `yarn up -R @snolla/data@0.15.1` | -| Тестовые заявки stostayer #68485/#68486 (прод) | НЕ удалены — ждут подтверждения | DELETE по ID после решения | -| Kreknin md3 rebuild (из прошлой сессии) | шёл на 2026-08-10, вне этой сессии | см. kreknin-repair-md3-rebuild | +| pilonuxt prod (стек 16) — **образ `64c2539`** (admin-api 0.11.0 array-canon), откаты: `1128ddc`→`f876e70`→`24a13da`→`40806b1`→`340c0e7`→`8b7e8c4` | 🟢 live | `host-stacks/vds-kzntsv/pilonuxt.compose.yml` + `apps/web/.wiki/concepts/docker-deploy.md` (монорепа) | +| loader-new-products (монорепа) — закрыта прогером 🟢 | done | `.tasks/STATUS.md` монорепы | +| pilorama-yandex-business-renewal — ответ Анастасии **до 17.08** | 🔴 active | `.tasks/STATUS.md` монорепы | +| pilorama-seo-crawl-audit — GSC-замер через 2-4 нед | 🔴 active | `.tasks/STATUS.md` монорепы | ## Спроси user'а - -- VDS-копия `stostayer` нужна? (если да — ALTER; если нет — можно игнорить) -- Тестовые заявки #68485/#68486 на проде stostayer удалить? +- (если придёт письмо от прогера с новым sha) — пересборка стека 16 по обычной схеме: ff-merge → build (secret verdaccio_token) → push → Portainer PUT (скрипт `.tmp/redeploy-stack16.ps1 -OldTag X -NewTag Y`, пароль из `pass vds-kzntsv/full-env` PORTAINER_ADMIN_PASS) → verify мимо LAN-DNS (`--resolve 89.253.255.94`). +- Простые рестарты (без пересборки) — `.tmp/restart-stack16.ps1`. ## Не делать (preemptive guards) - -- НЕ делать warn-харднинг / backward-compat в forms-core — решение vitya «ничего не делать» (передано snolla, docs `forms-email-contract.md` остаются) -- НЕ трогать VDS-копию stostayer без решения оператора -- НЕ писать в `.claude-inbox` — канал = `/.agents/inbox/` (ренейм idea 13, аудит проведён 2026-08-14) -- НЕ долбить push в `docker.stostayer.ru` — один push без retry (бан egress 2026-07-21); 0.3.23 push прошёл штатно (слои already-exists) -- Portainer PUT: НЕ `Env:[]` — очищает секреты; всегда fetch + re-supply -- НЕ удалять заявки/данные без явного подтверждения +- НЕ деплоить/рестартить pilonuxt без письма от прогера или слова vitya. +- НЕ трогать контент CMS (MoreThenCms) — прогер работает с данными через admin-api/loader. +- НЕ писать в монорепу pilorama98.ru (`.tasks`/`.wiki`) без явного запроса — прогер ведёт свою сторону сам. ## Memory updates за сессию - -- `stostayer-web-deploy-runbook.md` — прод-тег 0.3.23, offline-гоча РЕШЕНА (supportedArchitectures `5c583f8` + сетевой yarn install один раз), Portainer API `base=http://:9000` (порт обязателен) -- `.wiki/log.md` — деплой 0.3.23, offline-фикс, inbox-rename audit, FormSubmissions (ALTER + координация) -- Инструмент MSSQL-запросов: `tedious` из `stostayer.new/packages/web/node_modules` (скрипты `.admin/.tmp/mssql-{exec,scan}.js`, gitignored) -- Тиража формы: у ВСЕХ snolla-сайтов есть FormSubmissions (pilorama98 2516, labtools 916 и т.д.) — MoreThenCms общая, Content уже nvarchar -- Клиентский stostayer MSSQL: `91.222.236.225:1433` открыт снаружи, креды `pass stostayer/client` (mssql_admin_*) +- NEW `concepts/pilonuxt-restart-vs-redeploy-2026-08-16.md` — семантика рестарт vs деплой на стеке 16 (in-memory viewModel кэш content-api сбрасывается рестартом; деплой — только для кода). +log.md +index.md. +- Монорепа (прогер): `lazy-data-not-found-404.md` (soft-404 fix), `admin-api-content-wire.md` (array-canon 0.11.0), `cms-edits-cache-restart.md`, `v-html-on-component-ssr.md`, `admin-api-content-edit.md` — заингестено его стороной, НЕ дублировать. diff --git a/.wiki/concepts/pilonuxt-restart-vs-redeploy-2026-08-16.md b/.wiki/concepts/pilonuxt-restart-vs-redeploy-2026-08-16.md new file mode 100644 index 0000000..0cd8608 --- /dev/null +++ b/.wiki/concepts/pilonuxt-restart-vs-redeploy-2026-08-16.md @@ -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`. diff --git a/.wiki/index.md b/.wiki/index.md index 2ba65a0..9b6aa09 100644 --- a/.wiki/index.md +++ b/.wiki/index.md @@ -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 diff --git a/.wiki/log.md b/.wiki/log.md index 58d2610..6e452ee 100644 --- a/.wiki/log.md +++ b/.wiki/log.md @@ -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.