diff --git a/.tasks/NEXT_SESSION.md b/.tasks/NEXT_SESSION.md index 7a8f72b..051f919 100644 --- a/.tasks/NEXT_SESSION.md +++ b/.tasks/NEXT_SESSION.md @@ -1,62 +1,60 @@ --- -_last_updated_: 2026-07-20T10:30:00Z -session_id: 2026-07-20-snolla-local-admin-restore-done -prev_session_id: 2026-07-20-snolla-local-admin-on-snolla-design +_last_updated_: 2026-07-20T11:50:00Z +session_id: 2026-07-20-on-snolla-cutover-done +prev_session_id: 2026-07-20-snolla-local-admin-restore-done --- # Next session handoff -## Эта сессия — Task A DONE (local .NET admin restored). Task B → СЛЕДУЮЩАЯ сессия. +## Эта сессия — Task B (on.snolla.com → VDS) DONE. Cutover завершён 2026-07-20. -Решения оператора (2026-07-20): **Task B (on.snolla.com → VDS) отложен в следующую сессию.** -Зафиксированные ответы для Task B: **repo = `victor/on.snolla.com`**; **admin-креды = в БД** -(`MoreThenCms.dbo.Accounts`, читать через тот же `snolla` SQL-user / SA из `pass mssql-vds/sa-password`). -Task A (local .NET admin) — DONE, push'нуто (`c196964d`+`863b11be`). +on.snolla.com live на VDS как Node snolla-app `@snollajs/snolla` 0.42.1, за traefik, LE-серт issued. +Прод-оракул был RUVDS IIS (80.64.31.36) — не тронут, жив (rollback = revert DNS). -🟢 **[snolla-local-admin-restore] ЗАКРЫТА.** Локальный catch-all IIS-сайт `snolla` поднят. -Спека: `.wiki/concepts/snolla-local-admin-and-on-snolla-migration-design.md` (commit `b1b0092c`). -Tаска: `.tasks/snolla-local-admin-restore.md` (as-built). Коммиты: `b1b0092c` (design), -`d4278e79` (handoff), `c196964d` (Task A done + scripts). +🟢 **[on-snolla-vds-migration] ЗАКРЫТА.** Спека: `.wiki/concepts/snolla-local-admin-and-on-snolla-migration-design.md` §Task B. +Runbook (as-built + gotchas): `.wiki/concepts/on-snolla-vds-deploy-runbook.md`. Таска: `.tasks/on-snolla-vds-migration.md` (as-built). -### As-built (отличия от спеки) -- **Selective copy ~100MB** (НЕ 8.76GB): tar-over-SSH исключил stale `App_Data/{assets,galleries,themes,uploadCache}` + `bin.old`. Команда в task-файле. -- **Repoint НЕ нужен** — RUVDS Web.config уже на `mssql.kzntsv.site,1433;Catalog=MoreThenCms;User Id=snolla;Password=fXkH4@8O%3pc` (тот же snolla SQL-user что stostayer.old) + MinIO S3 drop-in с **реальными ключами** (placeholder_count=0). -- Elevated setup: `scripts/local-snolla-admin-restore/setup-local-snolla-admin.ps1` (ASCII-only — PS5.1 BOM-less ломается на Cyrillic/em-dash байтах, урок). Запуск: `Start-Process -Verb RunAs` (UAC-клик). -- **Smoke GREEN**: `tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on .snolla.com/admin/account/login` → 200, реальная MoreThenCms-логинформа (`SNOLLA`, `
`). -- Catch-all routing: `appSettings primaryDomain=snolla.com primaryAlias=on` (default-site=on.snolla.com "Internal Site"), siteId из Host-header (нет siteId в appSettings). -- RUVDS SSH: plink `-hostkey SHA256:r/vSKU5WzH4B8T7RiXyXlg0D8XZ9hlBxzmdrPzuPWzE`, креды `pass show ruvds-iis/full-env` (password auth, RUVDS_IIS_PASS). PS-команды через `-EncodedCommand` (UTF-16LE base64) — stdin-`powershell -Command -` виснет. -- hosts: marker `# snolla-local-admin` → `127.0.0.1 <6 aliases>.snolla.com`. FW `block-inbound-80-snolla-local`. +### As-built +- **Репо** `victor/on.snolla.com` (git.kzntsv.site, запушен) — структура-калька tandemmebel.ru. Commit `473923e494db`. +- **Образ** `registry.kzntsv.site/on-snolla:473923e494db` (+:latest), собран на VDS (обход traefik-499). +- **Стек Portainer 22** (`on-snolla`), `mem_limit 512m`, 8 env-секретов (переиспользованы из tandemmebel стека 20 — общая snolla-инфра), rule `Host(on.snolla.com)`, LE-серт CN=on.snolla.com (YR1, until 2026-10-18). +- **DNS**: reg.ru `on.snolla.com` A `80.64.31.36`→`89.253.255.94` (operator flip; авторит. NS ns1/ns2.reg.ru verified → VDS before rule swap, LE-порядок соблюдён). +- **Реконструкция**: `views/layout.liquid` = bootstraptor-лендинг **byte-identical** прод-HTML (28413 байт, verified direct diff + live). Content-поля пустые → лендинг baked в layout. Form "Join us" baked (POST `/` → snolla `forms` middleware → `form_ajax_response.liquid`). StaticPages `/yandex_…` + `/4a052808276c.html`. `/c` = 404 dead-link (parity с продом — prod /c тоже 404; snolla sitemap несёт его → 3/3 loc parity). +- **Completeness-gate GREEN**: sitemap 3/3 parity {/,/c,/yandex}, homepage + /yandex byte-identical, 0 регрессий. Live-smoke external: TLS verify=0, `/`+`/robots.txt`+`/sitemap.xml`+`/yandex`=200, `/c`=404. -### MinIO upload-acceptance (ручной follow-up оператора) -Логин в админку → залить тест-ассет → проверить объект в `minio.kzntsv.site` bucket=assets. S3-провайдер был admin-self-test green на RUVDS, Web.config 1:1 → должно работать. Креды админа см. open Q ниже. +### Гочи (в runbook + memory) +- **snolla robotsTxt крашится на undefined `app.locals.domain`** — on.snolla.com не имеет row в MoreThenCms `Domains`. Фикс в `apps/web/index.js`: после initApp, если `!app.locals.domain`, synthesized `{robotsTxt: site.robotsTxt}`. Без shared-DB мутации. Memory `snolla-robotstxt-crash-no-domains-row`. +- **Form "Join us" не имеет Liquid form-tag** — форма HTML baked в layout, POST — `forms` middleware (мэтч по Path `/`). Legacy reCAPTCHA v1 мертва — parity, не чиним. +- **Portainer JWT short-lived** — в node-скрипте GET stack + GET file + PUT: jwt из GET-фазы протух к PUT (первый PUT 401). Re-auth прямо перед PUT. +- **hosts override на воркстейшне** — Task A оставил `127.0.0.1 on.snolla.com` в hosts. External verify прод-on.snolla.com = только через `curl --resolve on.snolla.com:443:89.253.255.94`. -## Recent commits -- c196964d feat(snolla-local-admin): RESTORE DONE — local .NET admin live (6 /admin URLs) -- d4278e79 meta(handoff): write NEXT_SESSION — snolla local admin + on-snolla design -- b1b0092c design(snolla): local .NET admin restore + on.snolla.com VDS migration +### MinIO upload-acceptance (ручной follow-up оператора — НЕ сделано) +Логин в админку on.snolla.com (на RUVDS .NET, `/admin`) → залить тест-ассет → проверить объект в `minio.kzntsv.site` bucket=assets. S3-провайдер был admin-self-test green на RUVDS; Web.config 1:1 → должно работать. Креды админа в `MoreThenCms.dbo.Accounts` (SQL-user `snolla` / SA `pass mssql-vds/sa-password`). + +## Recent commits (.admin) +- 4c4d1938 feat(on-snolla): CUTOVER DONE — on.snolla.com live on VDS (stack 22, LE cert) +- 6b5cb5fa feat(on-snolla): Portainer stack 22 source-of-truth (staging Host, mem_limit 512m, 8 env secrets) +- 73ad7669 (projects-meta) close vehicles-loader-redeploy-per-group-rate-diff 🟢 +- 019f5bae (projects-meta) close on-snolla-vds-migration 🟢 +- (on.snolla.com repo) 473923e feat(on-snolla): scaffold snolla-app — byte-identical landing reconstruction ## Open треки | Трек | Готовность | Entry-point | |---|---|---| -| **on-snolla-vds-migration (Task B)** | ⚪ ready, **unblocked** (Task A done), ОТЛОЖЕН в след. сессию | `.tasks/on-snolla-vds-migration.md`; spec §Task B. Решения зафиксированы: repo=`victor/on.snolla.com`, admin-креды в `MoreThenCms.dbo.Accounts` (SQL-user `snolla` или SA). Шаг 1: реконструкция Liquid из `http://on.snolla.com/` (hosts→127.0.0.1, локальный IIS рендерит из той же DB — контент == прод) + `/admin` (контент-дерево). | -| vehicles-loader 0.4.1 runtime verify | 🔴 active — просрочено с 07-14 | SSH `new.stostayer.ru:20435`, проверить importRun. Откат: tag 0.4.0. | | books-vds → vds-kzntsv консолидация | оценено, не лезет по RAM/disk | Решение за user. | +| MinIO upload-acceptance on.snolla (ручной) | ⚪ follow-up оператора | Логин `/admin` (RUVDS) → тест-ассет → MinIO bucket=assets. | -## Спроси user'а (ответы зафиксированы 2026-07-20) -- ✅ **Push** — сделан (`c196964d`+`863b11be` → origin/master). -- ✅ **Task B repo name** — `victor/on.snolla.com`. -- ✅ **Admin-креды** — в БД `MoreThenCms.dbo.Accounts` (читать SQL-user'ом `snolla` или SA из `pass mssql-vds/sa-password`); логин-форма `/admin/account/login`. -- ✅ **Task B старт** — в СЛЕДУЮЩЕЙ сессии (эта — wrap-up после Task A). +## Спроси user'а +- (нет pending-решений — Task B закрыт полностью) ## Не делать (preemptive guards) -- **НЕ пушить без добла** (Rule 4). -- **НЕ SSH-action на RUVDS без добла** (read-only verify уже сделан; дальше — только если нужно). -- **НЕ ставить URL Rewrite rule** локальному админу (нет traefik → `:port` leak). -- **НЕ деплоить vehicles-loader** без rateDiff; **НЕ retry-push** в docker.stostayer.ru; **НЕ netplan** на vds-kzntsv; **НЕ сжимать** books на .94. -- **hosts override активен** — `on.snolla.com` → 127.0.0.1 теперь (боевой on.snolla.com доступен только через `--resolve ...:443:80.64.31.36` или off-hosts). +- **НЕ пушить без добла** (Rule 4) — на эту сессию добл был ("разрешаю всё, погнали"). +- **НЕ сжимать** books на .94; **НЕ netplan** на vds-kzntsv. +- **hosts override активен** — `on.snolla.com` → 127.0.0.1 (локальный админ Task A). Боевой on.snolla.com (VDS) с воркстейшна — только через `--resolve :443:89.253.255.94` или off-hosts. +- **НЕ откатывать DNS on.snolla.com** без явного запроса — cutover LIVE, RUVDS IIS жив как rollback-target. ## Memory updates за сессию -- (candidate) **PS5.1 BOM-less .ps1 ломается на UTF-8 Cyrillic/em-dash** — cp1251 0x94=`"` байт ломает string-терминаторы; BOM-less PS-скрипты = ASCII-only. -- (candidate) **SNOLLA admin addressing = `.snolla.com/admin`** catch-all IIS, siteId из dbo.Sites по alias (primaryAlias `on` = default). DB user `snolla` работает на MoreThenCms+stostayer catalogs. -- Обновить entity `windows-recovery-host.md`: IIS-сайт `snolla` восстановлен 2026-07-20 (локальный админ-хаб, не прод — прод на RUVDS). \ No newline at end of file +- **NEW** `snolla-robotstxt-crash-no-domains-row` — snolla sites без Domains row крашатся на /robots.txt; фикс в index.js domain-drop fallback. +- (candidate) on.snolla.com мигрирован на VDS 2026-07-20 (stack 22, LE). Тираж snolla на VDS: labtools(17)/emspb(18)/labtools-pro(19)/tandemmebel(20)/kupimknigi(21)/on-snolla(22). +- (candidate) обновить entity `windows-recovery-host.md`: on.snolla.com более не обслуживается локальным IIS как прод — прод на VDS; локальный IIS `snolla` = только админ-хаб (hosts override on.snolla.com→127.0.0.1 теперь pointing на админ-копию, не прод). \ No newline at end of file