From 8e3e5b435322221b9ec0a3af62073b2a3e329e46 Mon Sep 17 00:00:00 2001 From: vitya Date: Sun, 5 Jul 2026 12:16:15 +0300 Subject: [PATCH] =?UTF-8?q?wiki(snolla-0.42.1):=20=D1=80=D0=B5=D1=86=D0=B5?= =?UTF-8?q?=D0=BF=D1=82=20live-prod=20in-place=20bump=20+=20=D1=81=D0=B5?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B2=203=20=D1=80=D1=83=D0=BD?= =?UTF-8?q?=D0=B1=D1=83=D0=BA=D0=B0=20+=20index/log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Закрыт пропуск: тираж 0.42.1 не был зафиксирован в вике (таски emspb/labtools.pro просили using-wiki). - NEW concepts/snolla-live-prod-inplace-image-bump.md — переиспользуемый рецепт (build на VDS → throwaway-staging-acceptance С VDS → env-preserving Portainer PUT put-stack.js → live-smoke), встроен put-stack.js, гочи. - UPDATE 3 рунбука секцией «0.42.1 in-place bump» (labtools.ru/emspb/labtools.pro) с образами/acceptance/rollback. - FIX orphan: все 3 deploy-рунбука добавлены в index.md (не были каталогизированы). - log.md: decision-запись. Co-Authored-By: Claude Opus 4.8 (1M context) --- .wiki/concepts/emspb-vds-deploy-runbook.md | 14 +- .wiki/concepts/labtools-vds-deploy-runbook.md | 14 +- .../labtools.pro-vds-deploy-runbook.md | 14 +- .../snolla-live-prod-inplace-image-bump.md | 121 ++++++++++++++++++ .wiki/index.md | 4 + .wiki/log.md | 2 + 6 files changed, 163 insertions(+), 6 deletions(-) create mode 100644 .wiki/concepts/snolla-live-prod-inplace-image-bump.md diff --git a/.wiki/concepts/emspb-vds-deploy-runbook.md b/.wiki/concepts/emspb-vds-deploy-runbook.md index 9bffa10..296ef00 100644 --- a/.wiki/concepts/emspb-vds-deploy-runbook.md +++ b/.wiki/concepts/emspb-vds-deploy-runbook.md @@ -2,8 +2,8 @@ title: emspb.ru snolla-app — VDS deploy runbook (stack / traefik / env / cutover / rollback) type: concept tags: [emspb, snolla, vds, deploy, docker, portainer, traefik, runbook, migration] -related: [[../entities/vds-kzntsv]], [[../entities/ruvds-iis-host]], [[portainer-stack-management-vds]], [[minio-imgproxy-on-vds]], [[labtools-vds-deploy-runbook]] -updated: 2026-07-02 +related: [[../entities/vds-kzntsv]], [[../entities/ruvds-iis-host]], [[portainer-stack-management-vds]], [[minio-imgproxy-on-vds]], [[labtools-vds-deploy-runbook]], [[snolla-live-prod-inplace-image-bump]] +updated: 2026-07-05 --- # emspb.ru → VDS deploy runbook @@ -88,3 +88,13 @@ curl -ksS -X POST "https://portainer.vds.kzntsv.site/api/stacks/create/standalon ## Rollback - **DNS:** вернуть A-записи `emspb.ru`/`www` → `80.64.31.36` (RUVDS IIS живой, нетронут). Откат = смена DNS. - **Стек:** Portainer → stack `emspb` (Id 18) → remove (или откат тега образа). Образ в registry остаётся. + +## 0.42.1 in-place bump — ✅ ВЫПОЛНЕН 2026-07-05 +Тираж snolla 0.42.1. emspb.ru обновлён на живом стеке 18 **in-place** (домен уже на VDS, DNS не трогали). +Рецепт — [[snolla-live-prod-inplace-image-bump]]. Оператор дал отмашку на боевой apply. +- **Образ:** `registry.kzntsv.site/emspb:95a5c42` (snolla 0.28.4→**0.42.1**, digest `d6299cf…`). Собран на VDS. +- **Acceptance С VDS (throwaway-staging из env стека 18):** **29 sitemap-роутов все 200** (0 non-2xx/3xx), content-not-lost 29/29 (0 потерь). Sitemap НЕ реструктурировался (29==29, в отличие от каталожного labtools.ru). +- **TLS:** серт — SAN покрывает `emspb.ru`/`www.emspb.ru`/`emspb.vds.kzntsv.site`, CN косметически = staging-хост (curl validates `sslverify=0`). Это тот самый серт с cutover 07-02 (см. выше: «Cert перевыпустится на 2 боевых SAN при renewal») — swap его не тронул. При renewal можно пере-выпустить с CN=emspb.ru, опционально. +- **Swap:** Portainer PUT стека 18 (env 8/8 сохранён) → healthy → live-smoke GREEN, sitemap 29 вживую. +- **Rollback:** тег `emspb:b6e361a` (0.28.4, в registry) / стек 18 PUT назад / DNS→RUVDS. +- Compose обновлён на `95a5c42`. Таска `[emspb-deploy-snolla-0-42-1]` 🟢. Notify=victor/emspb.ru. diff --git a/.wiki/concepts/labtools-vds-deploy-runbook.md b/.wiki/concepts/labtools-vds-deploy-runbook.md index 02a70d5..dfac14a 100644 --- a/.wiki/concepts/labtools-vds-deploy-runbook.md +++ b/.wiki/concepts/labtools-vds-deploy-runbook.md @@ -2,8 +2,8 @@ title: labtools.ru snolla-app — VDS deploy runbook (stack / traefik / env / cutover / rollback) type: concept tags: [labtools, snolla, vds, deploy, docker, portainer, traefik, runbook, migration] -related: [[../entities/vds-kzntsv]], [[../entities/ruvds-iis-host]], [[portainer-stack-management-vds]], [[minio-imgproxy-on-vds]] -updated: 2026-07-01 +related: [[../entities/vds-kzntsv]], [[../entities/ruvds-iis-host]], [[portainer-stack-management-vds]], [[minio-imgproxy-on-vds]], [[snolla-live-prod-inplace-image-bump]] +updated: 2026-07-05 --- # labtools.ru → VDS deploy runbook @@ -69,3 +69,13 @@ PORT — не переопределять (образ дефолтит 5000; EX - **DNS:** вернуть A-записи `labtools.ru`/`www` → `80.64.31.36` (RUVDS IIS живой, нетронут). Откат = смена DNS. - **Стек:** Portainer → stack `labtools` → remove (или откат тега образа). Образ в registry остаётся. - RUVDS IIS labtools **не выводить из эксплуатации** до явного решения оператора (директива 2026-07-01). + +## 0.42.1 in-place bump — ✅ ВЫПОЛНЕН 2026-07-05 +Тираж snolla 0.42.1. labtools.ru обновлён на живом стеке 17 **in-place** (домен уже на VDS, DNS не трогали). +Рецепт — [[snolla-live-prod-inplace-image-bump]] (общий для labtools.ru/emspb/labtools.pro). Оператор дал отмашку на боевой apply. +- **Образ:** `registry.kzntsv.site/labtools:566d41c` (snolla 0.28.2→**0.42.1**, digest `ea0649a…`). Собран на VDS. +- **Acceptance С VDS (throwaway-staging из env стека 17):** новый sitemap = **38 page-locs** (7 pages+1 static+6 sections+24 продукта) — 37×200 + 1×301(`/products/laboratory-ball-mills`→`/lshm-750`, идентично проду). content-not-lost 11/11 (0 потерь). **Order-фикс 0.42.1** (liquid 0.10.2): presses = `plg-20,plg-12,plg-25,pgr-10` == прод. +- **Находка:** старый 0.28.2 sitemap был дефицитным (sections=1, catalog=2 продукта) — 0.42.1 отдаёт полную корректную структуру. Ещё: sitemap листит 301-секцию как `` (прод идентичен, engine-intended; heads-up прогу→снолле). +- **Swap:** Portainer PUT стека 17 (env 8/8 сохранён, pullImage=true) → healthy → live-smoke GREEN, TLS CN=labtools.ru не тронут (без LE-churn). +- **Rollback:** тег `labtools:43e28ba` (0.28.2, в registry) / стек 17 PUT назад / DNS→RUVDS. +- Compose обновлён на `566d41c`. Таска `[labtools-ru-deploy-snolla-0-42-1]` 🟢. Notify=victor/labtools.ru. diff --git a/.wiki/concepts/labtools.pro-vds-deploy-runbook.md b/.wiki/concepts/labtools.pro-vds-deploy-runbook.md index 3ffc223..05856a5 100644 --- a/.wiki/concepts/labtools.pro-vds-deploy-runbook.md +++ b/.wiki/concepts/labtools.pro-vds-deploy-runbook.md @@ -2,8 +2,8 @@ title: labtools.pro snolla-app — VDS deploy runbook (stack / traefik / env / cutover / rollback) type: concept tags: [labtools-pro, labtools, snolla, vds, deploy, docker, portainer, traefik, runbook, migration, catalog] -related: [[../entities/vds-kzntsv]], [[../entities/ruvds-iis-host]], [[portainer-stack-management-vds]], [[minio-imgproxy-on-vds]], [[emspb-vds-deploy-runbook]], [[labtools-vds-deploy-runbook]] -updated: 2026-07-02 +related: [[../entities/vds-kzntsv]], [[../entities/ruvds-iis-host]], [[portainer-stack-management-vds]], [[minio-imgproxy-on-vds]], [[emspb-vds-deploy-runbook]], [[labtools-vds-deploy-runbook]], [[snolla-live-prod-inplace-image-bump]] +updated: 2026-07-05 --- # labtools.pro → VDS deploy runbook @@ -76,3 +76,13 @@ curl -ksS -X POST "$BASE/api/stacks/create/standalone/string?endpointId=1" -H "X - **DNS:** вернуть A-записи `labtools.pro`/`www` → `80.64.31.36` (RUVDS IIS живой, нетронут). Откат = смена DNS. - **Стек:** Portainer → stack `labtools-pro` (Id 19) → remove (или откат тега образа). Образ в registry остаётся. - RUVDS IIS labtools.pro **не выводить** до явного решения оператора (директива 2026-07-01). (Ср.: emspb.ru биндинги на RUVDS сняты 2026-07-02 после подтверждённого cutover — см. [[../entities/ruvds-iis-host]].) + +## 0.42.1 in-place bump — ✅ ВЫПОЛНЕН 2026-07-05 +Тираж snolla 0.42.1. labtools.pro обновлён на живом стеке 19 **in-place** (домен уже на VDS, DNS не трогали). +Рецепт — [[snolla-live-prod-inplace-image-bump]]. Оператор дал отмашку на боевой apply. +- **Образ:** `registry.kzntsv.site/labtools-pro:0610432` (snolla 0.28.7→**0.42.1**, digest `3d543fc…`). Собран на VDS. +- **Acceptance С VDS (throwaway-staging из env стека 19):** **25 sitemap page-locs все 200** (+robots+sitemap.xml = 27 прогерских), content-not-lost 25/25 (0 потерь). +- **Order-парити ВСЕ 3 секции MATCH == прод** (фикс liquid 0.10.2): presses=`plg-20,plg-12`, milling=`milling-jars,grinding-media`, press-forms=**12** изделий (round-xrf…round-collapsible). NB: первичный ручной счёт дал 13 (задвоил тайл), прог-сверка = 12, парити не задет. +- **Swap:** Portainer PUT стека 19 (env 8/8 сохранён) → healthy → live-smoke GREEN (nav+presses+press-forms 200, order вживую), TLS CN=labtools.pro не тронут. +- **Rollback:** тег `labtools-pro:7bd9fae` (0.28.7, в registry) / стек 19 PUT назад / DNS→RUVDS. +- Compose обновлён на `0610432`. Таска `[labtools-pro-deploy-snolla-0-42-1]` 🟢. Notify=victor/labtools.pro. diff --git a/.wiki/concepts/snolla-live-prod-inplace-image-bump.md b/.wiki/concepts/snolla-live-prod-inplace-image-bump.md new file mode 100644 index 0000000..00920c9 --- /dev/null +++ b/.wiki/concepts/snolla-live-prod-inplace-image-bump.md @@ -0,0 +1,121 @@ +--- +title: snolla live-prod in-place image bump — рецепт (build → staging-acceptance → env-preserving PUT → live-smoke) +type: concept +tags: [snolla, vds, deploy, docker, portainer, runbook, recipe, in-place, image-bump, acceptance] +related: [[../entities/vds-kzntsv]], [[portainer-stack-management-vds]], [[labtools-vds-deploy-runbook]], [[labtools.pro-vds-deploy-runbook]], [[emspb-vds-deploy-runbook]] +updated: 2026-07-05 +--- + +# snolla live-prod in-place image bump + +Переиспользуемый рецепт для случая: сайт УЖЕ боевой на [[../entities/vds-kzntsv]] в docker-стеке за traefik +(cutover сделан ранее), надо **обновить движок/образ на живом стеке in-place** — без staging-first, без DNS-флипа. +Отработан 2026-07-05 на тираже snolla 0.42.1: labtools.ru (стек 17), emspb.ru (18), labtools.pro (19). +Класс риска = **needs-human** (боевой контейнер): боевой swap тега подтверждает оператор ПЕРЕД apply. + +Отличие от per-site cutover-рунбуков (те про ПЕРВЫЙ вынос на VDS + DNS-флип): здесь домен уже на VDS, +меняется только тег образа на существующем стеке. rollback = предыдущий тег (в registry) / стек PUT назад. + +## Инвариант: acceptance на НОВОМ образе ДО подмены (не наследовать dev-GREEN) +Прог даёт dev-верификацию с воркстейшна, но там **LAN-DNS перехватывает прод-домены** (см. memory +`workstation-lan-dns-serves-local-cms-copy`) → его «vs бой» не вполне боевой. **Перепрогонять гейты С VDS** +против живого прода-оракула, на throwaway-контейнере из нового образа, ДО касания живого стека. + +## Шаги + +### 1. Build на VDS (обход traefik-499 при пуше больших слоёв) +```bash +git -C ~/projects/ archive --format=tar \ + | ssh vitya@89.253.255.94 'rm -rf ~/build/ && mkdir -p ~/build/ && tar -x -C ~/build/' +# guard: config/default.json ABSENT в архиве (.dockerignore); пин snolla в apps/web/package.json = целевой +TOKEN=$(pass show vds-kzntsv/full-env | sed -n 's/^VERDACCIO_CI_TOKEN=//p') +ssh vitya@89.253.255.94 "cd ~/build/ && VERDACCIO_TOKEN='$TOKEN' docker build -f deploy/Dockerfile \ + --build-arg VERDACCIO_TOKEN -t registry.kzntsv.site/: -t registry.kzntsv.site/:latest . \ + && docker push registry.kzntsv.site/: && docker push registry.kzntsv.site/:latest" +``` +⚠️ Имя образа = имя стека (labtools.ru→`labtools`, labtools.pro→`labtools-pro` — НЕ коллизить!). + +### 2. Throwaway-staging из env ЖИВОГО стека (не трогает прод) +Новый образ рендерит только с runtime-env (DB/S3/imgproxy/smtp). Копируем env живого контейнера: +```bash +ssh vitya@89.253.255.94 'set -e + docker inspect --format "{{range .Config.Env}}{{println .}}{{end}}" \ + | grep -vE "^(HOSTNAME|PATH|NODE_VERSION|YARN_VERSION|HOME)=" > ~/build//.staging.env + docker run -d --name -staging --env-file ~/build//.staging.env \ + -p 127.0.0.1:50NN:5000 registry.kzntsv.site/: + # health: poll curl -H "Host: " http://127.0.0.1:50NN/robots.txt → 200' +``` + +### 3. Completeness-gate С VDS (sitemap — ИНДЕКС, разворачивать!) +`/sitemap.xml` у snolla = **sitemapindex** (ссылки на под-sitemap'ы), НЕ список страниц. Разворачивать: +```bash +expand(){ base="$1"; shift; hdr=("$@") + for su in $(curl -s "${hdr[@]}" "$base/sitemap.xml" | grep -oE "[^<]+" | sed "s|||"); do + su="${su#https://}"; su="${su#https://www.}"; su="${su#$base}" + curl -s "${hdr[@]}" "$base$su" | grep -oE "[^<]+" | sed "s|||; s|https://[^/]*||" + done | sort -u; } +``` +Два чека: (1) **self-consistency** — все page-locs нового sitemap → 200 на новом образе; (2) **content-not-lost** — +каждая реальная страница прода-оракула → 200/3xx на новом. GREEN = 0 регрессий в 404/5xx. +- Каталожные сайты — плюс **order-парити** секций (`{% order by list_priority %}`), новый == прод. +- Benign: `` секции-с-одним-изделием отдаёт 301→изделие (прод идентичен) — не дефект. +- **0.42.x реструктурирует sitemap** (per-category product-sitemaps `sitemap-catalog--products-1.xml`); + старые 0.28.x sitemap'ы бывали дефицитными (labtools.ru: sections 1→6, products 2→24). Сверять page-locs, не имена под-sitemap'ов. + +### 4. Боевой swap — Portainer PUT с сохранением env (operator-gated) +НЕ через PS Invoke-RestMethod (корраптит кириллицу в compose — см. [[portainer-stack-management-vds]]). +Node-скрипт: GET stack-file → заменить тег → PUT с Env массивом (name+value) живого стека. Полный скрипт ниже (§ put-stack.js). +```bash +export PK=$(pass show vds-kzntsv/full-env | sed -n 's/^PORTAINER_API_KEY=//p') +export PU=$(pass show vds-kzntsv/full-env | sed -n 's/^PORTAINER_URL=//p') +curl -sk -H "X-API-Key: $PK" "$PU/api/stacks/" -o /tmp/st.json # Env с values +META=/tmp/st.json node put-stack.js +``` +`prune:false, pullImage:true`. После PUT — poll `docker inspect --format {{.Config.Image}}`+`{{.State.Health.Status}}` +до ``+`healthy`. + +### 5. Live-smoke боевого домена + cleanup +`curl -L https://www./…` ключевые страницы 200; order вживую; sitemap page-locs; TLS-серт (CN не должен +дёрнуться — in-place swap серт не трогает). `docker rm -f -staging`. + +### 6. Закрытие +Compose source-of-truth (`admin/host-stacks/vds-kzntsv/.compose.yml`) — обновить тег + коммент rollback. +Борд-таска 🟢, отчёт прогу (Notify=сам сайт, минуя workshop), rollback-тег остаётся в registry. + +## put-stack.js (env-preserving Portainer stack PUT) +```js +// args: ; env: PK (api key), PU (url), META (/tmp/stNN.json) +const https = require('https'), fs = require('fs'); +const [stackId, endpointId, oldTag, newTag] = process.argv.slice(2); +const K = process.env.PK, U = process.env.PU; +const meta = JSON.parse(fs.readFileSync(process.env.META, 'utf8')); // Env with values +const base = new URL(U); +function req(method, path, bodyObj) { + return new Promise((res, rej) => { + const body = bodyObj ? Buffer.from(JSON.stringify(bodyObj), 'utf8') : null; + const r = https.request({ hostname: base.hostname, port: 443, path, method, + headers: { 'X-API-Key': K, 'Content-Type': 'application/json', + ...(body ? { 'Content-Length': body.length } : {}) }, rejectUnauthorized: false }, + resp => { let d = []; resp.on('data', c => d.push(c)); + resp.on('end', () => res({ status: resp.statusCode, body: Buffer.concat(d).toString('utf8') })); }); + r.on('error', rej); if (body) r.write(body); r.end(); + }); +} +(async () => { + const compose = JSON.parse((await req('GET', `/api/stacks/${stackId}/file`)).body).StackFileContent; + if (!compose.includes(oldTag)) { console.error('OLD TAG NOT FOUND:', oldTag); process.exit(2); } + const env = (meta.Env || []).map(e => ({ name: e.name, value: e.value })); + const put = await req('PUT', `/api/stacks/${stackId}?endpointId=${endpointId}`, + { stackFileContent: compose.split(oldTag).join(newTag), env, prune: false, pullImage: true }); + console.log('PUT', put.status, put.status >= 300 ? put.body.slice(0, 500) : 'OK'); +})(); +``` + +## Гочи +- **Не гнать два тяжёлых docker build разом** на VDS — последовательно (CPU/диск/слои). +- **MSYS на Windows** ломает `~`-пути при `export MSYS_NO_PATHCONV=1` и корраптит `git show rev:path` (двоеточие) — + для `git show` ставить `MSYS_NO_PATHCONV=1`, но тогда `git -C ~/...` пути ломаются; не смешивать в одном шелле. +- **Токен** передавать через локальную переменную в двойных кавычках ssh-строки (`'$TOKEN'`) — значение раскрывается + локально, в транскрипт попадает литерал `$TOKEN`. +- **build-secret** (VERDACCIO_TOKEN печётся в ARG/ENV build-стадии) — известный follow-up на всех snolla-Dockerfile; + НЕ блокер (runtime-стадия отдельная, токена в финальном образе нет). Фикс = docker build-secret mount, на стороне прога. diff --git a/.wiki/index.md b/.wiki/index.md index fc592f0..c8f55f1 100644 --- a/.wiki/index.md +++ b/.wiki/index.md @@ -29,10 +29,13 @@ Catalog of all wiki pages. One line per page, organized by type. Updated on ever - [compose-bcrypt-escape-trap](concepts/compose-bcrypt-escape-trap.md) — Docker Compose ест `$` в bcrypt hashes - [db-tls-self-signed-via-traefik-raw-tcp](concepts/db-tls-self-signed-via-traefik-raw-tcp.md) — DB TLS через traefik raw TCP с self-signed certs - [docker-host-loopback-detect](concepts/docker-host-loopback-detect.md) — Docker host-loopback detection — как доказать что host.docker.internal не петля +- [emspb-vds-deploy-runbook](concepts/emspb-vds-deploy-runbook.md) — emspb.ru snolla-app на VDS (стек 18): сборка/env/cutover 07-02 + **0.42.1 in-place bump 07-05** (образ `emspb:95a5c42`) - [es-destructive-delete-incident-2026-05-26](concepts/es-destructive-delete-incident-2026-05-26.md) — ES indices wiped on canonical — **true root cause (2026-05-29): ransom-бот через открытый `0.0.0.0:9200` мимо traefik, free-ES без auth**; гипотеза operator-error опровергнута. Fix = убрать публикацию host-порта (Control #3) + restore. Exposure-audit: mongo/mariadb/minio тоже exposed (credentialed) - [future-resilient-architecture-goals](concepts/future-resilient-architecture-goals.md) — fault-tolerance roadmap placeholder (расширяется через `[resilience-roadmap-design]`) - [hyper-backup-structure-and-recovery](concepts/hyper-backup-structure-and-recovery.md) — Hyper Backup — структура репо и стратегия восстановления - [iis-migration-2026-05-19-postmortem](concepts/iis-migration-2026-05-19-postmortem.md) — post-mortem миграции CMS на нативный IIS, 2026-05-19 +- [labtools-vds-deploy-runbook](concepts/labtools-vds-deploy-runbook.md) — labtools.ru snolla-app на VDS (стек 17): сборка/env/cutover 07-02 (Yandex DNS!) + **0.42.1 in-place bump 07-05** (образ `labtools:566d41c`, order-фикс + sitemap починен) +- [labtools.pro-vds-deploy-runbook](concepts/labtools.pro-vds-deploy-runbook.md) — labtools.pro snolla-каталог на VDS (стек 19): сборка/env/cutover 07-02 + **0.42.1 in-place bump 07-05** (образ `labtools-pro:0610432`, order-парити 3 секции) - [minio-imgproxy-on-vds](concepts/minio-imgproxy-on-vds.md) — MinIO+imgproxy stack на VDS, миграция с upgrade 2020→2025 + DNS swap pending - [morethencms-null-settingsdata-https-502](concepts/morethencms-null-settingsdata-https-502.md) — MoreThenCms тенант с `Sites.SettingsData=NULL` → 502 только на HTTPS (нет `httpSecure` → KeyNotFound); fix = UPDATE + recycle. maljarka 2026-06-08 - [snolla-admin-appdata-acl-500-after-scp-migration](concepts/snolla-admin-appdata-acl-500-after-scp-migration.md) — админский delete/upload ассета → 500: app pool имел на `App_Data` только RX после scp-миграции → `File.Delete` UnauthorizedAccessException. Fix = icacls Modify. + split-brain: админка пишет Local, боевой app читает MinIO @@ -42,6 +45,7 @@ Catalog of all wiki pages. One line per page, organized by type. Updated on ever - [portainer-2.21-admin-password-regression](concepts/portainer-2.21-admin-password-regression.md) — Portainer 2.21 `--admin-password` regression + min 12-char policy - [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 - [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 банится хостером) - [proxy-debugging-test-the-real-client](concepts/proxy-debugging-test-the-real-client.md) — анти-паттерн: свои curl/standalone-тесты «работают», а боевой клиент пользователя нет; источник истины — реальный клиент - [reality-pq-mldsa65-dest-incompatibility](concepts/reality-pq-mldsa65-dest-incompatibility.md) — REALITY+ML-DSA-65 (PQ) не работает с не-PQ dest (Akamai/intel шлёт HRR); fix = PQ-совместимый dest или выключить PQ; **caveat: снятие PQ ≠ рабочий Reality у GUI-клиентов** diff --git a/.wiki/log.md b/.wiki/log.md index f62c535..38f7333 100644 --- a/.wiki/log.md +++ b/.wiki/log.md @@ -96,3 +96,5 @@ Append-only log of wiki operations (ingests, promotions, lints, migrations). ## [2026-06-12] migrate | galleries pilorama98 → S3. NEW concepts/galleries-storage-class-local-not-s3.md (root: storageClient `galleries` = Local disk class, never in S3; snolla ждёт s3://galleries// → 404). Путь A: bucket `galleries` создан, 301 файл (77 MiB) с RUVDS IIS залиты verbatim, imgproxy 200 verified с books-vds. UPDATE concepts/minio-imgproxy-on-vds.md (stale-баннер: pipeline на books-vds с 08.06, не windows-host). Task migrate-gallery-originals-to-s3 🟢. ## [2026-06-27] refactor | books-vds: документирован публичный bookva-db endpoint :33306 (+ slovo/bookva DB-exposure, mongo/ES internal) в § Доступ; закрыт wiki-drift по порту + +## [2026-07-05] decision | тираж snolla 0.42.1 (live-prod in-place bumps). NEW concepts/snolla-live-prod-inplace-image-bump.md (переиспользуемый рецепт build→staging-acceptance-С-VDS→env-preserving Portainer PUT `put-stack.js`→live-smoke). UPDATE 3 рунбука секцией «0.42.1 in-place bump»: labtools-vds-deploy-runbook (стек 17, `labtools:566d41c`), emspb-vds-deploy-runbook (18, `emspb:95a5c42`), labtools.pro-vds-deploy-runbook (19, `labtools-pro:0610432`). FIX orphan: все 3 рунбука добавлены в index.md (не были каталогизированы). Tasks `[labtools-ru|emspb|labtools-pro-deploy-snolla-0-42-1]` 🟢.