From 5f7d4fdc305f859c6bba4e837190cb141e923f57 Mon Sep 17 00:00:00 2001 From: vitya Date: Thu, 13 Aug 2026 11:57:47 +0300 Subject: [PATCH] =?UTF-8?q?meta(tasks,wiki):=20stostayer-web=200.3.23=20de?= =?UTF-8?q?ploy=20=E2=80=94=20task=20done=20+=20runbook=20nuances=20(offli?= =?UTF-8?q?ne-build=20linux-bins,=20:9000=20port,=20prod=20tag)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .tasks/STATUS.md | 1 + .tasks/stostayer-web-deploy-0-3-23.md | 28 +++++++++++++++++++ .../concepts/stostayer-web-deploy-runbook.md | 9 ++++-- .wiki/index.md | 2 +- .wiki/log.md | 1 + 5 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 .tasks/stostayer-web-deploy-0-3-23.md diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 372078d..a8fb920 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,4 +1,5 @@ # Admin Task Board +_Updated: 2026-08-13 — 🟢 **[stostayer-web-deploy-0-3-23] CLOSED.** Запрос их прогера (письмо в `.claude-inbox/2026-08-13T08-43-41Z-stostayer-new.md`): calculator-баннер про цены при покупке запчастей + фикс краша (snolla loadCity/loadSite) + стек-фикс легаси (vue/vuex/vue-router/mariadb явные deps, nmHoistingLimits). Образ `stostayer-web:0.3.23` (коммиты `e5f7bd6`+`7e51cbf`+`d49b4bb`) собран (нюанс: offline-build не прошёл — в `.yarn/cache` нет linux-бинарей esbuild/rollup, собрал с временным `VERDACCIO_TOKEN` ARG/ENV), запушен 1 попыткой (слои already-exists → бана нет), стек Portainer 16 передеплоен 0.3.22→0.3.23 (HTTP=200, env re-supply). Verify с хоста: Focus II → 200 + баннер «актуальны при приобретении запасных частей», регресс `/`+ремонтная → 200, Focus IV (exactPrices=0) → баннера нет + алерт «уточняйте у мастеров» (всё по письму). Контейнер Up, RestartCount=0, логи чистые. Откат: PUT на 0.3.22. Ранбук обновлён (прод-тег, build-нюансы, порт :9000 в Portainer API). Всё: `.tasks/stostayer-web-deploy-0-3-23.md` + `.wiki/concepts/stostayer-web-deploy-runbook.md`._ _Updated: 2026-08-10 — 🟡 **[kreknin-repair-md3-rebuild] ребилд идёт, бэкапы ВОЗВРАЩЕНЫ.** Утро: vitya на месте, кабели перетыкнуты (sdb WD-WX32D12L8HTE вернулся, SMART PASSED, все 3 HDD на 6 Gbps), md3 rebuild старт 07:57 (`mdadm --add /dev/md3 /dev/sdb3`), md0/md1 починены (системные разделы добавлены во все 4 диска — «зелёные» в DSM), win10 resolved (RuToken re-enum, кнопка «Игнорировать»). **~11:40 отключение электричества в деревне** → NAS лёг (роутер/WAN жив — на UPS). Возврат 16:20: md3 собрался деградированным `[_UU]`, **sdb3 сам не вернулся** (прогресс rebuild НЕ переживает power-loss — контрольной точки нет), повторён `mdadm --add /dev/md3 /dev/sdb3` → recovery с 0.0%, ETA ~4-5 дн (разгон 3→10-25МБ/с). md0/md1 все 4 диска `[UUUU]` (утр. ремонт пережил ребут), md2/VMM здоров. **Бэкапы возвращены 2026-08-10 18:00 по указанию vitya (ДО ребилда — ребилд фоновый):** cron раскомментирован (vds-kzntsv 05:00 + books-vds 06:00), ручные прогоны ПОДТВЕРЖДЕНЫ на kreknin (vds-kzntsv 2026-08-10 66G / books-vds 15G, latest→08-10, 7 снапшотов у обоих). Находка: books-vds не доезжал до kreknin с 08-05 (08-06..08-09 + 08-10 06:05 rsync падал — timed out/no route; другой триггер не найден); застрявший ES-снапшот `daily-2026-08-10` удалён. Осталось: дождаться ребилда md3 → `btrfs scrub /volume1` → monitor на ребилд активен. Всё: `.tasks/kreknin-repair-md3-rebuild.md` + `.wiki/entities/kreknin-synology.md`._ _Updated: 2026-08-04 — 🔵 **[coord-loader-admin-api-client] координатор.** Я (admin) назначен координатором таски pilorama98 `loader-migrate-to-admin-api-client` (перевод `apps/loader` с прямого DB на `@snolla/admin-api-client` от snolla). Письма-интро отправлены обоим (pilorama98 — report готовности, snolla — краткое описание клиента). Предпосылка S1: **ApiKeys DDL прогнана на обоих боевых SNOLLA** (vds `MoreThenCms` + stostayer `stostayer`) — таблица + индексы + FK, RC=0, verify зелёный. См. `coord-loader-admin-api-client.md`._ _Updated: 2026-08-03 (2) — 🟢 **[labtools.ru cylindrical] CLOSED.** Фикс core 0.26.5 (store-only content-page резолвер) НЕ чинил: labtools — catalog-модуль (store отсутствует), linked-item provider = legacy `LinkedCatalogProductsProvider`. Реализован полный диспетчер `viewModels/linkedItemResolver.js` (порт `ILinkedEntitiesProvider`): dispatch по provider-строке → catalog (CatalogsService.findProductById) / blog (findPostByGlobalId) / page (getPageById) / store (fallback). core 0.26.6 published (verdaccio), 263/263. labtools yarn.lock → 0.26.6 (d263e1c), стек 17 redeploy (env 8/8, pullImage), **LIVE GREEN**: cylindrical 0 empty href/src, 8 карточек гидратированы (round-xrf/vacuum-ir/…), остальные страницы 200. Таска snolla закрыта. Rollback = `0dc0b4e`._ diff --git a/.tasks/stostayer-web-deploy-0-3-23.md b/.tasks/stostayer-web-deploy-0-3-23.md new file mode 100644 index 0000000..55a4d33 --- /dev/null +++ b/.tasks/stostayer-web-deploy-0-3-23.md @@ -0,0 +1,28 @@ +# stostayer-web-deploy-0-3-23 + +**Status:** done 🟢 +**Branch:** master (victor/stostayer.new) +**Where I stopped:** ДЕПЛОЙ ЗАВЕРШЁН 2026-08-13. Образ `docker.stostayer.ru/stostayer-web:0.3.23` (коммиты `e5f7bd6`+`7e51cbf`+`d49b4bb`, master-tip) собран, запушен (1 попытка, слои mostly already-exists → egress мал, бана нет), стек Portainer 16 передеплоен (0.3.22→0.3.23, HTTP=200, env re-supplied `[]` — у стека env и так пуст). Контейнер Up, RestartCount=0, старт чистый (`Server listening :3000`). Verify с хоста: calculator Focus II → 200 + баннер «актуальны при приобретении запасных частей (материалов) в компании Стайер» (grep=1); регресс `/` и `/remont/to/auto/ford/focus/focus-ii-...` → 200; Focus IV (exactPrices=0) → баннера НЕТ, алерт «уточняйте у наших мастеров» (grep=1) — ровно по письму. Откат: PUT стека 16 на `0.3.22` (тег на хосте), RTO ~30-60с. + +## Goal + +Раскатать на прод www.stostayer.ru запрос их прогера (письмо `.claude-inbox/2026-08-13T08-43-41Z-stostayer-new.md`): calculator-баннер про цены при покупке запчастей + фикс краша (snolla loadCity/loadSite) + стек-фикс легаси сборки (явные vue/vuex/vue-router/mariadb deps, nmHoistingLimits). + +## Нюансы деплоя (важно для следующего раза) + +- **Offline-build (`enableNetwork: false`) НЕ прошёл**: в `.yarn/cache` нет linux-бинарей `@esbuild/linux-x64@0.21.5` и `@rollup/rollup-linux-x64-gnu@4.62.3` (кэш с Windows-хоста). Yarn падает `YN0041 Invalid authentication (as an anonymous user)` — verdaccio требует токен. +- **Фикс**: временно в build-копию `.yarnrc.yml` вернуть строку `npmAuthToken: "${VERDACCIO_TOKEN}"` (перед build удалить/вернуть), в `packages/web/Dockerfile` временно добавить `ARG VERDACCIO_TOKEN` + `ENV VERDACCIO_TOKEN=$VERDACCIO_TOKEN` перед `RUN yarn install`, собрать `docker build --build-arg VERDACCIO_TOKEN="$VERDACCIO_TOKEN"`. После build — `git checkout -- .yarnrc.yml packages/web/Dockerfile`. (Безопаснее: докинуть 2 зипа в cache.) +- **Portainer API с хоста**: `base=http://:9000` — порт обязателен (голый IP → curl на :80 → HTTP=000). IP портейнера: `docker inspect portainer --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'` → 172.18.0.2. +- Прод до этого деплоя был на **0.3.22** (не 0.3.20 как писал ранбук; вики отставала на 2 деплоя: 0.3.21/0.3.22 собраны 24.07). +- Деплой 0.3.22 (24.07) делался через pscp+`sudo docker load` (БЕЗ push в :443 — бан-риск). Мой push 0.3.23 прошёл штатно — слои переиспользовались. + +## Decisions log +- 2026-08-13: offline-build vs сеть — выбран сетевой путь с временным токеном (cache-пополнение linux-бинарей сложнее, чем ARG/ENV на раз). +- 2026-08-13: push в registry выполнен (в отличие от деплоя 0.3.22 через pscp+load) — 1 попытка, слои already-exists, бан-риска нет. + +## Completed steps +- [x] Письмо прогера прочитано (инбокс, доставка pi-расширением inbox-monitor). +- [x] Build 0.3.23 (master e5f7bd6), restore .yarnrc.yml/Dockerfile. +- [x] Push 0.3.23 → docker.stostayer.ru (1 попытка, digest sha256:c6650744e198...). +- [x] Redeploy Portainer stack 16 (PUT, pullImage:true, env re-supply). +- [x] Verify: баннер Focus II, регресс `/`+ремонтная, Focus IV без баннера; логи чистые. diff --git a/.wiki/concepts/stostayer-web-deploy-runbook.md b/.wiki/concepts/stostayer-web-deploy-runbook.md index 24abab7..fbf8237 100644 --- a/.wiki/concepts/stostayer-web-deploy-runbook.md +++ b/.wiki/concepts/stostayer-web-deploy-runbook.md @@ -20,7 +20,7 @@ updated: 2026-06-17 | Reverse-proxy | **Angie** (форк nginx) на `:443`, навешивает **Basic-auth** на сервисные сабдомены | | Registry | `docker.stostayer.ru` (BA те же, что Angie BA) — образы `stostayer-web:` | | Стек | Portainer **`stostayer-web` Id 16, EndpointId 3**, compose в Portainer-volume `/data/compose/16/docker-compose.yml` | -| Прод-тег (2026-06-17) | `0.3.18`. На хосте лежат старые теги `0.3.6…0.3.18` под откат | +| Прод-тег (2026-08-13) | `0.3.23`. На хосте лежат старые теги под откат (`0.3.22` и ранее) | | Образ | `packages/web/Dockerfile`: `node:16` → `yarn install` → `yarn build` (nuxt build) → `CMD yarn start`. pm2/`ecosystem.config.js` в проде НЕ используется | ## Канал деплоя (build здесь → registry → Portainer) @@ -38,6 +38,7 @@ docker build -f packages/web/Dockerfile -t docker.stostayer.ru/stostayer-web:' victor@91.222.236.225 "bash -s" <<'EOF' -base=http://172.18.0.2:9000 # docker inspect portainer → его IP в сети bridge +base=http://172.18.0.2:9000 # docker inspect portainer → IP в bridge; ПОРТ :9000 обязателен (голый IP → curl на :80 → HTTP=000) JWT=$(curl -s $base/api/auth -H 'Content-Type: application/json' \ -d '{"username":"victor","password":""}' | jq -r .jwt) FILE=$(curl -s -H "Authorization: Bearer $JWT" $base/api/stacks/16/file | jq -r .StackFileContent) @@ -113,6 +114,10 @@ grep -c "" /tmp/v.html > Образ `0.3.19` (краш-лупный) лежит в `docker.stostayer.ru` — **НЕ деплоить**. Оставлен в registry по решению vitya (2026-06-17), не удаляем. +## ✅ Деплой 0.3.23 (2026-08-13) + +Запрос их прогера (письмо `.claude-inbox/2026-08-13T08-43-41Z-stostayer-new.md`): calculator-баннер про цены при покупке запчастей в компании Стайер (exactPrices>0) + фикс краша (snolla `loadCity`/`loadSite` в asyncData) + стек-фикс легаси (явные vue/vuex/vue-router/mariadb deps, `nmHoistingLimits: workspaces`). Коммиты `e5f7bd6`+`7e51cbf`+`d49b4bb` (master-tip). Собран (см. гоча offline выше), запушен **1 попыткой** (слои mostly already-exists → egress мал, бана нет), стек 16 передеплоен 0.3.22→0.3.23 (`pullImage:true`, env re-supply — у стека env пуст). Verify зелёный: Focus II → 200 + баннер, регресс `/`+ремонтная 200, Focus IV (exactPrices=0) без баннера + алерт «уточняйте у мастеров». Прод до этого был на **0.3.22** (0.3.21/0.3.22 собраны 24.07; деплой 0.3.22 шёл через pscp+`sudo docker load` без push в :443). + ## Связи - [[portainer-stack-management-vds]] — родственный паттерн (наш VDS), оттуда PowerShell-кодировочные гочи и redeploy-рецепт. diff --git a/.wiki/index.md b/.wiki/index.md index f001d6a..d00348d 100644 --- a/.wiki/index.md +++ b/.wiki/index.md @@ -56,7 +56,7 @@ Catalog of all wiki pages. One line per page, organized by type. Updated on ever - [portainer-stack-management-books-vds](concepts/portainer-stack-management-books-vds.md) — Portainer-managed stacks на books VDS — pattern application + migration log 2026-05-25 - [portainer-stack-management-vds](concepts/portainer-stack-management-vds.md) — Portainer-managed stacks на VDS — canonical pattern + migration script + stack-redeploy recipe (новый тег) + gotchas (вкл. PS 5.1 ISO-8859-1 коррапт кириллицы при API round-trip) - [snolla-live-prod-inplace-image-bump](concepts/snolla-live-prod-inplace-image-bump.md) — переиспользуемый рецепт обновления образа на ЖИВОМ snolla-стеке VDS in-place (build→throwaway-staging-acceptance С VDS→env-preserving Portainer PUT→live-smoke); вкл. `put-stack.js`; отработан на тираже 0.42.1 (4 сайта: labtools/emspb/labtools.pro 2026-07-05 + tandemmebel 2026-07-12) -- [stostayer-web-deploy-runbook](concepts/stostayer-web-deploy-runbook.md) — деплой легаси web (`www.stostayer.ru`) на прод клиента: build→registry→Portainer-стек 16 через container-IP API с хоста; **БЛОКЕР: легаси не пересобрать с master (ESM-стена: top-level await @stostayer/data на build, ERR_REQUIRE_ESM @snollajs/snolla в рантайме)**; гоча — один push без retry (VPN-IP банится хостером) +- [stostayer-web-deploy-runbook](concepts/stostayer-web-deploy-runbook.md) — деплой легаси web (`www.stostayer.ru`) на прод клиента: build→registry→Portainer-стек 16 через container-IP API с хоста; **деплой 0.3.23 (2026-08-13): calculator-баннер + стек-фикс**; гочи — один push без retry (VPN-IP банится хостером), offline-build не всегда проходит (linux-бинари esbuild/rollup не в cache → временный VERDACCIO_TOKEN ARG/ENV), Portainer API base=http://IP:9000 (порт обязателен) - [stostayer-admin-minio-config](concepts/stostayer-admin-minio-config.md) — локальная .NET-админка stostayer (:8090) на stostayer MinIO: креды НЕ в pass (в stostayer.new config), endpoint `minio-api.stostayer.ru` (minio.stostayer.ru — не API-порт), region `us-west-1` (не local); fix 2026-07-22 — 3 замены в Web.config, админка=прод единое хранилище - [stostayer-markdown-render-404-incident-2026-07](concepts/stostayer-markdown-render-404-incident-2026-07.md) — постмортем 2026-07-24: 404/500 на body_repair_service = двойной корень (snolla `markdown();` без присвоения + exact-pin-staleness — content-api `workspace:*` запёк `@snollajs/snolla: 0.7.4`, фиксовая 0.7.7 легла top-level, content-api юзал nested баговую). Фикс snolla 0.7.7/core 0.26.1 + content-api 0.8.2 `^0.7.7`; деплой 0.3.22 через pscp+load (без :443 push). Pre-build чек yarn.lock на single-snolla ловит класс. Cleanup `workspace-caret-interpackage-deps` (vitya scope) - [proxy-debugging-test-the-real-client](concepts/proxy-debugging-test-the-real-client.md) — анти-паттерн: свои curl/standalone-тесты «работают», а боевой клиент пользователя нет; источник истины — реальный клиент diff --git a/.wiki/log.md b/.wiki/log.md index 4e09c0f..a675180 100644 --- a/.wiki/log.md +++ b/.wiki/log.md @@ -1,3 +1,4 @@ +## [2026-08-13] ingest | UPDATE concepts/stostayer-web-deploy-runbook.md — деплой stostayer-web:0.3.23 на прод www.stostayer.ru (запрос их прогера, письмо inbox). Нюансы зафиксированы: (1) offline-build НЕ проходит — в `.yarn/cache` нет linux-бинарей `@esbuild/linux-x64`/`@rollup/rollup-linux-x64-gnu` → обход через временный `ARG/ENV VERDACCIO_TOKEN` + `--build-arg` (после — revert); (2) Portainer API с хоста — `base=http://:9000` (порт обязателен); (3) прод-тег в таблице актуализирован 0.3.18→0.3.23; (4) блок деплоя 0.3.23. Task [stostayer-web-deploy-0-3-23] 🟢. ## [2026-08-12] implement | UPDATE entities/kreknin-synology.md — автосинк LE-серта: acme-nginx-sync.sh (cron 15 мин) ротирует серт git.kreknin.site из traefik acme.json в nginx DSM автоматически. ## [2026-08-12] implement | UPDATE entities/kreknin-synology.md — LE-серт git.kreknin.site (из traefik acme.json) подложен в nginx DSM reverse proxy. Из LAN: валидный LE + Gitea, без DSM-пароля (root SSH). ## [2026-08-12] implement | UPDATE entities/kreknin-synology.md — reverse proxy git.kreknin.site:443 → traefik:4443 на DSM nginx (server.ReverseProxy.conf w3conf + reload). Из LAN git.kreknin.site → Gitea (DNS-override + proxy), снаружи LE-серт. Осталось: LE-серт в DSM для git.kreknin.site (из LAN, без предупреждения).