Compare commits
2 Commits
d4278e79f9
...
863b11be28
| Author | SHA1 | Date | |
|---|---|---|---|
| 863b11be28 | |||
| c196964d03 |
@@ -1,65 +1,57 @@
|
|||||||
---
|
---
|
||||||
_last_updated_: 2026-07-20T07:00:00Z
|
_last_updated_: 2026-07-20T10:15:00Z
|
||||||
session_id: 2026-07-20-snolla-local-admin-on-snolla-design
|
session_id: 2026-07-20-snolla-local-admin-restore-done
|
||||||
prev_session_id: 2026-07-13-tandemmebel-8df10ee-deploy
|
prev_session_id: 2026-07-20-snolla-local-admin-on-snolla-design
|
||||||
---
|
---
|
||||||
|
|
||||||
# Next session handoff
|
# Next session handoff
|
||||||
|
|
||||||
## Эта сессия — design: SNOLLA local admin restore + on.snolla.com → VDS
|
## Эта сессия — Task A DONE (local .NET admin restored)
|
||||||
|
|
||||||
Спека написана и закоммичена: `.wiki/concepts/snolla-local-admin-and-on-snolla-migration-design.md`
|
🟢 **[snolla-local-admin-restore] ЗАКРЫТА.** Локальный catch-all IIS-сайт `snolla` поднят.
|
||||||
(commit `b1b0092c`). Две таски заведены в `.tasks/` + board-entries в STATUS.md.
|
Спека: `.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).
|
||||||
|
|
||||||
**Task A — snolla-local-admin-restore** (⚪ ready):
|
### As-built (отличия от спеки)
|
||||||
Восстановить локальный catch-all IIS-сайт `snolla` (снесён 2026-06-08 при decommission
|
- **Selective copy ~100MB** (НЕ 8.76GB): tar-over-SSH исключил stale `App_Data/{assets,galleries,themes,uploadCache}` + `bin.old`. Команда в task-файле.
|
||||||
windows-recovery-host) копированием `C:\sites\snolla\` с RUVDS (текущий прод-админ с уже
|
- **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).
|
||||||
применённым MinIO drop-in). Conn → `mssql.kzntsv.site:1433` Catalog=MoreThenCms. Доступ
|
- 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-клик).
|
||||||
`<alias>.snolla.com/admin` через hosts-override, **один AppPool**, binding `*:80` + FW block
|
- **Smoke GREEN**: `tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on .snolla.com/admin/account/login` → 200, реальная MoreThenCms-логинформа (`<title>SNOLLA</title>`, `<form action="/admin/login">`).
|
||||||
inbound. Развилка адресации confirmed оператором (catch-all+hosts, не per-port).
|
- 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`.
|
||||||
|
|
||||||
**Task B — on-snolla-vds-migration** (⚪ ready, blocked by A):
|
### MinIO upload-acceptance (ручной follow-up оператора)
|
||||||
on.snolla.com (siteId `B9ECDB50-2B93-4CE5-B238-A9918B3F9CF7`, alias `on`, Title "Internal Site",
|
Логин в админку → залить тест-ассет → проверить объект в `minio.kzntsv.site` bucket=assets. S3-провайдер был admin-self-test green на RUVDS, Web.config 1:1 → должно работать. Креды админа см. open Q ниже.
|
||||||
culture `en`) с RUVDS IIS → VDS Node snolla-app 0.42.1. Исходников нет → реконструкция
|
|
||||||
Liquid-шаблонов из боевого `https://on.snolla.com/` + локального админа (Task A). По рецепту
|
|
||||||
`tandemmebel-vds-deploy-runbook` (cutover) + `snolla-live-prod-inplace-image-bump` (gate).
|
|
||||||
|
|
||||||
### Addresses + siteIds (из MoreThenCms DB, read-only tedious-проб, SA из `pass mssql-vds/sa-password`)
|
|
||||||
Скрипт `.tmp/dbprobe-sites.mjs` (gitignored). Адреса = `<Alias>.snolla.com/admin`:
|
|
||||||
- tandemmebel.snolla.com (tandemmebel.ru, 78080707-F6E0-4330-BA30-7922354C2CEF)
|
|
||||||
- labtools.snolla.com (labtools.ru, D375C419-D787-4FCC-8934-A3B9DC951006)
|
|
||||||
- labtoolspro.snolla.com (labtools.pro, 663F9410-A6CC-4651-9A5C-62844A313957)
|
|
||||||
- emspb.snolla.com (emspb.ru, 96EBC481-D26A-47BE-B660-13D49E7D0A61)
|
|
||||||
- kupimknigi.snolla.com (kupimknigi.spb.ru, E924A354-0377-4E1E-80C6-2EB0194AA55F)
|
|
||||||
- on.snolla.com (on.snolla.com, B9ECDB50-2B93-4CE5-B238-A9918B3F9CF7)
|
|
||||||
|
|
||||||
## Recent commits
|
## 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
|
- b1b0092c design(snolla): local .NET admin restore + on.snolla.com VDS migration
|
||||||
- a02c4b86 wiki: ingest de-vds-3xui source chronicle + gitignore .tmp/.tasks/.lock
|
|
||||||
- 543ded79 wiki: de-vds-3xui real RF-client confirmed
|
|
||||||
|
|
||||||
## Open треки
|
## Open треки
|
||||||
|
|
||||||
| Трек | Готовность | Entry-point |
|
| Трек | Готовность | Entry-point |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| snolla-local-admin-restore (Task A) | ⚪ ready — ждёт SSH RUVDS verify + DB-креды | `.tasks/snolla-local-admin-restore.md`; spec §Task A. Шаг 0: read-only SSH RUVDS (`pass show ruvds-iis/full-env`) — проверить C:\sites\snolla\ + MinIO drop-in в Web.config. |
|
| **on-snolla-vds-migration (Task B)** | ⚪ ready, **unblocked** (Task A done) | `.tasks/on-snolla-vds-migration.md`; spec §Task B. Шаг 1: реконструкция Liquid из боевого `on.snolla.com` + локального админа. Нужны: repo-name, admin-креды. |
|
||||||
| on-snolla-vds-migration (Task B) | ⚪ ready, blocked by A | `.tasks/on-snolla-vds-migration.md`; spec §Task B. |
|
| vehicles-loader 0.4.1 runtime verify | 🔴 active — просрочено с 07-14 | SSH `new.stostayer.ru:20435`, проверить importRun. Откат: tag 0.4.0. |
|
||||||
| vehicles-loader 0.4.1 runtime verify | 🔴 active — deployed, verify pending (просрочено с 07-14) | SSH `new.stostayer.ru:20435` (victor, `pass stostayer/client`), проверить importRun status=ok + counts. Откат: `docker tag .../vehicles-loader:0.4.0 vehicles-loader:latest`. |
|
| books-vds → vds-kzntsv консолидация | оценено, не лезет по RAM/disk | Решение за user. |
|
||||||
| books-vds → vds-kzntsv консолидация | оценено, НЕ хватает ресурсов | RAM/disk на .94 не лезет. Решение за user. |
|
|
||||||
|
|
||||||
## Спроси user'а
|
## Спроси user'а
|
||||||
- **Spec review** — `b1b0092c` / `.wiki/concepts/snolla-local-admin-and-on-snolla-migration-design.md`. Ок? После approve → writing-plans (план в `.tasks/<slug>.md` по дисциплине, не docs/superpowers/).
|
- **Push?** `c196964d` (Task A done) на origin/master? (Rule 4 — "пушни и продолжай" было разовое для design-коммита, не standing auto-push).
|
||||||
- **Task A first step:** дать добло на read-only SSH RUVDS (verify source + MinIO state)?
|
- **Task B repo name** — `victor/on-snolla`? `victor/on.snolla.com`?
|
||||||
- **Open Q из spec:** (1) имя репо для on.snolla.com (`victor/on-snolla`?); (2) MoreThenCms DB app-аккаунт + путь в `pass` (SA есть `mssql-vds/sa-password`, но админ юзает app-аккаунт — завести/найти?); (3) включать все ~60 сайтов в локальный админ или только тираж(5)+on.snolla.com.
|
- **Admin-креды** для локального админа (чтобыbrowse контент-дерево on.snolla.com через /admin) — есть в `pass`? Или в DB `MoreThenCms.dbo.Accounts`? (Логин-форма живёт на `/admin/account/login`.)
|
||||||
- **books-vds консолидация**: свежий VDS / апгрейд .94 / оставить на EOL CentOS .133?
|
- **Task B стартовать сейчас** или pause? (Реконструкция = итеративная dev-работа: Liquid-шаблоны из HTML + DB-контент, build на VDS, cutover.)
|
||||||
|
|
||||||
## Не делать (preemptive guards)
|
## Не делать (preemptive guards)
|
||||||
- **НЕ SSH-action на RUVDS без добла** — user уже раз отверг tool-call на RUVDS-SSH (хочет явное подтверждение); read-only verify — только после ок.
|
- **НЕ пушить без добла** (Rule 4).
|
||||||
- **НЕ деплоить vehicles-loader** из кода без rateDiff (`85ca936`). Verify `rateDiff.js`/`replaceGroup.js` в образе.
|
- **НЕ SSH-action на RUVDS без добла** (read-only verify уже сделан; дальше — только если нужно).
|
||||||
- **НЕ retry-push** в `docker.stostayer.ru` (бан VPN-IP, инцидент 2026-06-17).
|
- **НЕ ставить URL Rewrite rule** локальному админу (нет traefik → `:port` leak).
|
||||||
- **НЕ netplan** на vds-kzntsv; **НЕ сжимать** books на .94 (RAM/disk).
|
- **НЕ деплоить vehicles-loader** без rateDiff; **НЕ retry-push** в docker.stostayer.ru; **НЕ netplan** на vds-kzntsv; **НЕ сжимать** books на .94.
|
||||||
- **НЕ ставить URL Rewrite rule** локальному админу (нет traefik → `:port` leak, см. cms-server-port-leak-fix).
|
- **hosts override активен** — `on.snolla.com` → 127.0.0.1 теперь (боевой on.snolla.com доступен только через `--resolve ...:443:80.64.31.36` или off-hosts).
|
||||||
- **pull перед работой** — admin на master `b1b0092c` (local, не push'нуто — спросить перед push по Rule 4).
|
|
||||||
|
|
||||||
## Memory updates за сессию
|
## Memory updates за сессию
|
||||||
- (пока не сохранял — если design approved, возможно memory: «SNOLLA admin addressing = <alias>.snolla.com/admin catch-all IIS, siteId из dbo.Sites by alias»; и обновить windows-recovery-host entity — планируется восстановление snolla IIS-сайта локально)
|
- (candidate) **PS5.1 BOM-less .ps1 ломается на UTF-8 Cyrillic/em-dash** — cp1251 0x94=`"` байт ломает string-терминаторы; BOM-less PS-скрипты = ASCII-only.
|
||||||
|
- (candidate) **SNOLLA admin addressing = `<alias>.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).
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
# Admin Task Board
|
# Admin Task Board
|
||||||
|
_Updated: 2026-07-20 (2) — 🟢 **[snolla-local-admin-restore] CLOSED.** Локальный .NET-админ поднят: selective tar-copy `C:\sites\snolla\` ~100MB с RUVDS (исключил stale App_Data 8.76GB — assets/galleries/themes теперь в MinIO), Web.config уже → `mssql.kzntsv.site,1433` Catalog=MoreThenCms (user `snolla`) + 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-safe): AppPool `snolla` (.NET v4.0, AppPoolIdentity, recycle@200MB), IIS site `*:80` catch-all, ACL `IIS AppPool\snolla:(OI)(CI)(M)`, hosts-override `127.0.0.1 <6 aliases>.snolla.com`, FW block inbound 80. Smoke GREEN: `tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on .snolla.com/admin/account/login` → 200, реальная MoreThenCms-логинформа (`<title>SNOLLA</title>`, `<form action="/admin/login">`). **Unblocks [on-snolla-vds-migration]** (Task B — админ для контент-инспекции готов). МинIO upload-acceptance = ручной follow-up оператора. RUVDS SSH через plink `-hostkey SHA256:r/vSKU5WzH4B8T7RiXyXlg0D8XZ9hlBxzmdrPzuPWzE` (креды `pass show ruvds-iis/full-env`)._
|
||||||
_Updated: 2026-07-20 — ⚪ **заведены [snolla-local-admin-restore] + [on-snolla-vds-migration].** Design: `.wiki/concepts/snolla-local-admin-and-on-snolla-migration-design.md`. **Task A:** восстановить локальный .NET-админ (catch-all IIS `snolla`, снесён 2026-06-08 при decommission) копированием `C:\sites\snolla\` с RUVDS (текущий прод-админ с MinIO drop-in), conn→`mssql.kzntsv.site:1433` Catalog=MoreThenCms, доступ `<alias>.snolla.com/admin` через hosts-override (1 AppPool, 6 адресов: tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on). **Task B** (blocked by A): мигрировать посадочную on.snolla.com (siteId `B9ECDB50-2B93-4CE5-B238-A9918B3F9CF7`, alias `on`, «Internal Site», culture `en`) с RUVDS IIS на VDS как Node snolla-app 0.42.1, реконструируя Liquid-шаблоны из боевого сайта+админки (исходников нет). Addresses + siteIds извлечены из `MoreThenCms` DB read-only (tedious-проб, SA из `pass mssql-vds/sa-password`, скрипт в `.tmp/dbprobe-sites.mjs` gitignored). Развилка адресации confirmed оператором: catch-all `*:80` + hosts (не per-port)._
|
_Updated: 2026-07-20 — ⚪ **заведены [snolla-local-admin-restore] + [on-snolla-vds-migration].** Design: `.wiki/concepts/snolla-local-admin-and-on-snolla-migration-design.md`. **Task A:** восстановить локальный .NET-админ (catch-all IIS `snolla`, снесён 2026-06-08 при decommission) копированием `C:\sites\snolla\` с RUVDS (текущий прод-админ с MinIO drop-in), conn→`mssql.kzntsv.site:1433` Catalog=MoreThenCms, доступ `<alias>.snolla.com/admin` через hosts-override (1 AppPool, 6 адресов: tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on). **Task B** (blocked by A): мигрировать посадочную on.snolla.com (siteId `B9ECDB50-2B93-4CE5-B238-A9918B3F9CF7`, alias `on`, «Internal Site», culture `en`) с RUVDS IIS на VDS как Node snolla-app 0.42.1, реконструируя Liquid-шаблоны из боевого сайта+админки (исходников нет). Addresses + siteIds извлечены из `MoreThenCms` DB read-only (tedious-проб, SA из `pass mssql-vds/sa-password`, скрипт в `.tmp/dbprobe-sites.mjs` gitignored). Развилка адресации confirmed оператором: catch-all `*:80` + hosts (не per-port)._
|
||||||
_Updated: 2026-07-13 — 🟢 **[tandemmebel-web-vds-deploy] in-place template bump 8df10ee LIVE.** Ops-handoff от tandemmebel-сессии (inbox-запрос): убрать FB/Twitter/Google+ share-кнопки (extremist-icon compliance РФ), оставить ВК+Одноклассники. Коммит `8df10ee` в `victor/tandemmebel.ru` master (template-only, `apps/web/views/social_buttons.liquid`, 1 file 12 deletions, snolla pin 0.42.1 НЕ менялся). **Верификация перед сборкой поймала расхождение:** записка утверждала live=`ed96b18`/0.42.0, фактически на проде крутился `0cd9351`/0.42.1 (in-place bump 2026-07-12). gitea compare `0cd9351...8df10ee` = `total_commits:1` → фикс ровно один коммит поверх 0.42.1 (правильная база), yarn.lock идентичен → регрессии sitemap 184→172 нет. Собрал `tandemmebel:8df10ee` на VDS (чистый архив 8df10ee из gitea API, build-arg VERDACCIO_TOKEN=books-ci JWT, digest `sha256:30a7e5ab82f2bf371042f1b5fa0cd7ac5ceda71379d1da59e148dee8166bd560`, layer-cache hit, push OK). Throwaway-staging :5020 → completeness-gate GREEN: sitemap NEW==PROD **184=184 identical** (0 prod-only/new-only), self-consistency 183×200+1×404(/articles benign parity staging==prod), share-block staging vk+ok/fb-tw-gp=0 vs prod-before vk+ok+fb+tw+gp (доказательство — фикс убирает ровно лишнее). Swap стека 20 (Portainer JWT, PUT `/api/stacks/20?endpointId=1`, env 8/8 preserve, `prune:false`, `pullImage:true`), контейнер healthy ~8s. **Live-smoke С VDS GREEN:** robots/`/`/sitemap 200, /articles 404 parity, sitemap 184 locs, 4 share-block страницы (project-post ×2, /furniture/bedrooms, /furniture/kitchens/classic) все 200 → **vk+ok на месте, fb/tw/gp=0** (экстремистские иконы УБРАНЫ с прода), TLS-серт CN=tandemmebel.ru не дёрнут (in-place swap). `/galleries/` нет на 0.42.1 (sitemap-реструктуризация 0.42.x → gallery рендерится на project-post роуте). Rollback = PUT стека 20 назад на `0cd9351` (0.42.1, {% order %} fix, template-only чистый откат) / `ed96b18` (0.42.0, в registry, стёрт с VDS при disk-cleanup 2026-07-13) / `b02ca18` / revert DNS→80.64.31.36. Source-of-truth compose `host-stacks/vds-kzntsv/tandemmebel.compose.yml` актуализирован (8df10ee + LIVE-комменты + история bump'ов). Hygiene-заметка: Portainer stack 20 file несёт устаревшие STAGING-комменты на строках 16-17/53 (rule line 55 уже LIVE) — косметика, не трогал при деплое. Ответ отправлен в tandemmebel inbox._
|
_Updated: 2026-07-13 — 🟢 **[tandemmebel-web-vds-deploy] in-place template bump 8df10ee LIVE.** Ops-handoff от tandemmebel-сессии (inbox-запрос): убрать FB/Twitter/Google+ share-кнопки (extremist-icon compliance РФ), оставить ВК+Одноклассники. Коммит `8df10ee` в `victor/tandemmebel.ru` master (template-only, `apps/web/views/social_buttons.liquid`, 1 file 12 deletions, snolla pin 0.42.1 НЕ менялся). **Верификация перед сборкой поймала расхождение:** записка утверждала live=`ed96b18`/0.42.0, фактически на проде крутился `0cd9351`/0.42.1 (in-place bump 2026-07-12). gitea compare `0cd9351...8df10ee` = `total_commits:1` → фикс ровно один коммит поверх 0.42.1 (правильная база), yarn.lock идентичен → регрессии sitemap 184→172 нет. Собрал `tandemmebel:8df10ee` на VDS (чистый архив 8df10ee из gitea API, build-arg VERDACCIO_TOKEN=books-ci JWT, digest `sha256:30a7e5ab82f2bf371042f1b5fa0cd7ac5ceda71379d1da59e148dee8166bd560`, layer-cache hit, push OK). Throwaway-staging :5020 → completeness-gate GREEN: sitemap NEW==PROD **184=184 identical** (0 prod-only/new-only), self-consistency 183×200+1×404(/articles benign parity staging==prod), share-block staging vk+ok/fb-tw-gp=0 vs prod-before vk+ok+fb+tw+gp (доказательство — фикс убирает ровно лишнее). Swap стека 20 (Portainer JWT, PUT `/api/stacks/20?endpointId=1`, env 8/8 preserve, `prune:false`, `pullImage:true`), контейнер healthy ~8s. **Live-smoke С VDS GREEN:** robots/`/`/sitemap 200, /articles 404 parity, sitemap 184 locs, 4 share-block страницы (project-post ×2, /furniture/bedrooms, /furniture/kitchens/classic) все 200 → **vk+ok на месте, fb/tw/gp=0** (экстремистские иконы УБРАНЫ с прода), TLS-серт CN=tandemmebel.ru не дёрнут (in-place swap). `/galleries/` нет на 0.42.1 (sitemap-реструктуризация 0.42.x → gallery рендерится на project-post роуте). Rollback = PUT стека 20 назад на `0cd9351` (0.42.1, {% order %} fix, template-only чистый откат) / `ed96b18` (0.42.0, в registry, стёрт с VDS при disk-cleanup 2026-07-13) / `b02ca18` / revert DNS→80.64.31.36. Source-of-truth compose `host-stacks/vds-kzntsv/tandemmebel.compose.yml` актуализирован (8df10ee + LIVE-комменты + история bump'ов). Hygiene-заметка: Portainer stack 20 file несёт устаревшие STAGING-комменты на строках 16-17/53 (rule line 55 уже LIVE) — косметика, не трогал при деплое. Ответ отправлен в tandemmebel inbox._
|
||||||
_Updated: 2026-07-12 — 🟢 **[tandemmebel-web-vds-deploy] CUTOVER COMPLETE — LIVE на VDS.** Владелец флипанул DNS reg.ru `tandemmebel.ru`+`www`→89.253.255.94 (verify авторит. ns1/ns2.reg.ru = оба 89.253.255.94, не только резолвер). LE-порядок соблюдён: DNS first → traefik `Host()`-rule staging→боевой на стеке 20 (env 8/8 preserve, `prune:false`, `pullImage:false` — образ `ed96b18`/0.42.0 не менялся, без пересборки по решению оператора). LE-серт issued on first hit: CN=tandemmebel.ru, SAN оба, issuer YR2, until 2026-10-10. Live-smoke С VDS GREEN: `/`+`/projects`+3×gallery (office/bedrooms/kids)→200, `/articles`→404 (parity benign#3, так и на RUVDS), sitemap **184 page-locs** (было 172 — рост от blog-archive фичей 0.42.0, benign), self-consistency 30/30 sample (только /articles 404 = тот же parity), sharp media `image/webp 200 35KB`, robots из БД (ADR-0009). **Латентный прод-баг починен cutover'ом:** Gotham-Pro.css был 0B на RUVDS → теперь 200/4436B (шрифт заголовков живой). Rollback = revert DNS→80.64.31.36 (RUVDS IIS жив, не тронут) ИЛИ PUT стека 20 назад на `tandemmebel.vds.kzntsv.site`. Compose source-of-truth обновлён. Тираж snolla 0.42.x теперь **полностью живой** (5/5 стеков на VDS)._
|
_Updated: 2026-07-12 — 🟢 **[tandemmebel-web-vds-deploy] CUTOVER COMPLETE — LIVE на VDS.** Владелец флипанул DNS reg.ru `tandemmebel.ru`+`www`→89.253.255.94 (verify авторит. ns1/ns2.reg.ru = оба 89.253.255.94, не только резолвер). LE-порядок соблюдён: DNS first → traefik `Host()`-rule staging→боевой на стеке 20 (env 8/8 preserve, `prune:false`, `pullImage:false` — образ `ed96b18`/0.42.0 не менялся, без пересборки по решению оператора). LE-серт issued on first hit: CN=tandemmebel.ru, SAN оба, issuer YR2, until 2026-10-10. Live-smoke С VDS GREEN: `/`+`/projects`+3×gallery (office/bedrooms/kids)→200, `/articles`→404 (parity benign#3, так и на RUVDS), sitemap **184 page-locs** (было 172 — рост от blog-archive фичей 0.42.0, benign), self-consistency 30/30 sample (только /articles 404 = тот же parity), sharp media `image/webp 200 35KB`, robots из БД (ADR-0009). **Латентный прод-баг починен cutover'ом:** Gotham-Pro.css был 0B на RUVDS → теперь 200/4436B (шрифт заголовков живой). Rollback = revert DNS→80.64.31.36 (RUVDS IIS жив, не тронут) ИЛИ PUT стека 20 назад на `tandemmebel.vds.kzntsv.site`. Compose source-of-truth обновлён. Тираж snolla 0.42.x теперь **полностью живой** (5/5 стеков на VDS)._
|
||||||
@@ -51,7 +52,7 @@ _Updated: 2026-05-26 — заведена `bookva-tenant-cutover-prep` ⚪ (7-st
|
|||||||
|
|
||||||
_Updated: 2026-05-25 (`iis-migration-to-ruvds` 🟢 closed Phase 1 per user decision — 9/24 hostnames live на RUVDS, source IIS оставлен running. `migrate-elasticsearch-to-books-vds` 🟢 closed ранее сегодня. 16 IIS hostnames + LE renewal pipeline + decommission — descoped в Closure note, не отдельные tracker tasks.)_
|
_Updated: 2026-05-25 (`iis-migration-to-ruvds` 🟢 closed Phase 1 per user decision — 9/24 hostnames live на RUVDS, source IIS оставлен running. `migrate-elasticsearch-to-books-vds` 🟢 closed ранее сегодня. 16 IIS hostnames + LE renewal pipeline + decommission — descoped в Closure note, не отдельные tracker tasks.)_
|
||||||
|
|
||||||
## ⚪ [snolla-local-admin-restore] — восстановить локальный .NET-админ (catch-all IIS `snolla`) с RUVDS, `/admin` для тиража+on.snolla.com. Per-task: `snolla-local-admin-restore.md`. Design: `../.wiki/concepts/snolla-local-admin-and-on-snolla-migration-design.md` §Task A. ⚪ ready (ждёт SSH RUVDS verify + DB-креды). Blocks `on-snolla-vds-migration`.
|
## 🟢 [snolla-local-admin-restore] — closed 2026-07-20 — локальный .NET-админ (catch-all IIS `snolla`) поднят с RUVDS, `/admin` для тиража+on.snolla.com. Per-task: `snolla-local-admin-restore.md`. Selective tar-copy ~100MB (НЕ 8.76GB, исключил stale App_Data assets/galleries/themes). Web.config уже на mssql.kzntsv.site+MinIO (repoint не нужен, ключи реальные). Elevated setup: `scripts/local-snolla-admin-restore/setup-local-snolla-admin.ps1`. Smoke GREEN: 6 адресов `/admin/account/login` → 200 (tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on), реальная MoreThenCms-логинформа. unblocks `on-snolla-vds-migration`.
|
||||||
|
|
||||||
## ⚪ [on-snolla-vds-migration] — on.snolla.com (siteId B9ECDB50…) с RUVDS IIS → VDS Node snolla-app 0.42.1, реконструкция шаблонов из боевого+админки. Per-task: `on-snolla-vds-migration.md`. Design: `../.wiki/concepts/snolla-local-admin-and-on-snolla-migration-design.md` §Task B. ⚪ ready, blocked by `snolla-local-admin-restore`.
|
## ⚪ [on-snolla-vds-migration] — on.snolla.com (siteId B9ECDB50…) с RUVDS IIS → VDS Node snolla-app 0.42.1, реконструкция шаблонов из боевого+админки. Per-task: `on-snolla-vds-migration.md`. Design: `../.wiki/concepts/snolla-local-admin-and-on-snolla-migration-design.md` §Task B. ⚪ ready, blocked by `snolla-local-admin-restore`.
|
||||||
|
|
||||||
|
|||||||
@@ -11,24 +11,29 @@ Catch-all `*:80` + `hosts`-override → `127.0.0.1 <alias>.snolla.com`. Один
|
|||||||
- tandemmebel.snolla.com/labtools.snolla.com/labtoolspro.snolla.com/emspb.snolla.com/kupimknigi.snolla.com/on.snolla.com
|
- tandemmebel.snolla.com/labtools.snolla.com/labtoolspro.snolla.com/emspb.snolla.com/kupimknigi.snolla.com/on.snolla.com
|
||||||
|
|
||||||
## Plan / phases
|
## Plan / phases
|
||||||
- [ ] **0. Verify source (read-only SSH RUVDS)** — `pass show ruvds-iis/full-env`; проверить `C:\sites\snolla\` есть, `Web.config` несёт `FileStorage.S3`+`minio.kzntsv.site`, IIS site `snolla` жив. Если MinIO НЕ применён → fallback: build из MoreThenCms source + drop-in `MoreThenCms.FileStorage.S3/deploy/`.
|
- [x] **0. Verify source (read-only SSH RUVDS)** — plink `-hostkey` (fingerprint `SHA256:r/vSKU5WzH4B8T7RiXyXlg0D8XZ9hlBxzmdrPzuPWzE`, креды `pass show ruvds-iis/full-env`). `C:\sites\snolla\` есть, IIS site `snolla` Started, catch-all `*:80` + SNI `*.snolla.com`/real-domains. **Web.config уже → `mssql.kzntsv.site,1433;Catalog=MoreThenCms;User Id=snolla;Password=...` (тот же snolla SQL-user что stostayer.old).** MinIO drop-in применён: assets/galleries/images/scripts/stylesheets/watermarks → `FileStorage.S3.*`, endpoint `minio.kzntsv.site`, **ключи реальные** (placeholder_count=0, accessKey=20/secretKey=40). Кэши Local.
|
||||||
- [ ] **1. Копировать `C:\sites\snolla\`** RUVDS→локально (~8.66 GB, scp/rclone).
|
- [x] **1. Копировать `C:\sites\snolla\`** RUVDS→локально — **selective tar-over-SSH ~100MB** (НЕ 8.76GB): `bin`(53MB, вкл S3 DLLs)+`Admin`(6MB)+`Areas`+`Views`+`Web.config`+`App_Data/{maxMind,searchIndexes,contentCache}`, исключая stale `App_Data/{assets(215MB),galleries(5.5GB),themes(2.8GB),uploadCache(145MB)}` + `bin.old`. Команда: `plink ... "tar -C C:/sites/snolla -cf - --exclude=App_Data/assets --exclude=App_Data/galleries --exclude=App_Data/themes --exclude=App_Data/uploadCache --exclude=bin.old --exclude=App_Data/imageCache ." | tar -C /c/sites/snolla -xf -`.
|
||||||
- [ ] **2. Репойнт conn-string** → `mssql.kzntsv.site,1433;Catalog=MoreThenCms;TrustServerCertificate=True` (DB-креды из `pass`; уточнить app-аккаунт vs SA).
|
- [x] **2. Репойнт conn-string** — НЕ НУЖНО, RUVDS-Web.config уже на `mssql.kzntsv.site` (cutover 2026-05). DB-креды `snolla`/`fXkH4@8O%3pc` (plaintext в Web.config, тот же user работает для MoreThenCms+stostayer catalogs). Q2 закрыта.
|
||||||
- [ ] **3. MinIO-ключи** в `<fileStorageClients>` — `minio.kzntsv.site`, бакеты assets/galleries/themes, ключи из `pass show minio-vds/full-env` (если плейсхолдеры). Кэши оставить Local.
|
- [x] **3. MinIO-ключи** — уже реальные в скопированном Web.config (см. step 0). Pass-lookup не понадобился.
|
||||||
- [ ] **4. IIS-сайт `snolla`** — AppPool `snolla` (.NET v4.0 Integrated, AppPoolIdentity), binding `*:80` catch-all. ACL `IIS AppPool\snolla:(OI)(CI)(M)` на `C:\sites\snolla`.
|
- [x] **4. IIS-сайт `snolla`** — elevated `scripts/local-snolla-admin-restore/setup-local-snolla-admin.ps1` (ASCII-only, PS5.1 BOM-less-safe): AppPool `snolla` (.NET v4.0, AppPoolIdentity, recycling.memory 200MB), IIS site `*:80` catch-all, ACL `IIS AppPool\snolla:(OI)(CI)(M)`.
|
||||||
- [ ] **5. hosts-override** — `127.0.0.1 <6 aliases>.snolla.com` (elevation).
|
- [x] **5. hosts-override** — `127.0.0.1 tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on .snolla.com` в `hosts` (marker `# snolla-local-admin`, idempotent).
|
||||||
- [ ] **6. FW** — блок inbound 80 (локальный только). URL Rewrite rule НЕ ставить.
|
- [x] **6. FW** — `New-NetFirewallRule block-inbound-80-snolla-local` (Action Block, loopback не фильтруется → local-only). URL Rewrite rule НЕ ставил (скопированный inert).
|
||||||
- [ ] **7. Smoke** — `curl -H "Host: tandemmebel.snolla.com" http://127.0.0.1/admin/account/login` → 200; on.snolla.com同理; MinIO upload-цикл.
|
- [x] **7. Smoke** — `curl --noproxy '*' -H "Host: <alias>.snolla.com" http://127.0.0.1/admin/account/login` → **200 для всех 6** (tandemmebel/labtools/labtoolspro/emspb/kupimknigi/on). HTML = реальная MoreThenCms-логинформа (`<title>SNOLLA</title>`, `<form action="/admin/login">`). hosts + IIS listening confirmed.
|
||||||
|
|
||||||
## Status
|
## Status
|
||||||
⚪ ready (ждёт отмашки оператора на SSH RUVDS + креды). Branch: master.
|
🟢 DONE (2026-07-20). Branch: master. Local .NET-админ поднят, 6 адресов `/admin` живые.
|
||||||
|
|
||||||
|
## Verify-факт
|
||||||
|
- Catch-all routing: `appSettings` = `sitePath=C:\sites\snolla\`, `primaryDomain=snolla.com`, `primaryAlias=on` (default-site = on.snolla.com "Internal Site"); siteId резолвится из Host-header (нет siteId в appSettings, в отличие от per-site stostayer.old). `customErrors mode="Off"`.
|
||||||
|
- bin/ несёт `MoreThenCms.FileStorage.S3.dll` + `AWSSDK.Core.dll` + `AWSSDK.S3.dll` (drop-in).
|
||||||
|
|
||||||
## Depends on / blocks
|
## Depends on / blocks
|
||||||
- Блокирует: [[on-snolla-vds-migration]] (нужен админ для контент-инспекции on.snolla.com).
|
- Блокирует: [[on-snolla-vds-migration]] (нужен админ для контент-инспекции on.snolla.com).
|
||||||
|
|
||||||
## Open Q
|
## Open Q
|
||||||
- MoreThenCms DB app-аккаунт + путь в `pass` (SA есть `mssql-vds/sa-password`, но админ юзает app-аккаунт).
|
- ~~MoreThenCms DB app-аккаунт~~ — ЗАКРЫТА: `snolla` SQL-user уже в Web.config (plaintext), работает для MoreThenCms catalog.
|
||||||
- Включать все ~60 сайтов или только тираж(5)+on.snolla.com — catch-all даёт все, решает hosts-список.
|
- Включать все ~60 сайтов или только тираж(5)+on.snolla.com — пока 6 в hosts; catch-all даёт все, расширить = дописать `<alias>.snolla.com` в hosts.
|
||||||
|
- **MinIO upload-acceptance** (не автотест): оператор логинится в админку, заливает тест-ассет → проверяет объект в MinIO `minio.kzntsv.site` (bucket assets). S3-провайдер был admin-self-test green на RUVDS, Web.config скопирован 1:1 → должен работать.
|
||||||
|
|
||||||
## Rollback
|
## Rollback
|
||||||
Удалить IIS-сайт `snolla` + `C:\sites\snolla\` + откатать hosts. Прод-RUVDS не тронут.
|
Удалить IIS-сайт `snolla` + `C:\sites\snolla\` + откатать hosts (снести marker `# snolla-local-admin`). FW-block-rule можно оставить. Прод-RUVDS не тронут.
|
||||||
19
scripts/local-snolla-admin-restore/ruvds-verify.ps1
Normal file
19
scripts/local-snolla-admin-restore/ruvds-verify.ps1
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
$ErrorActionPreference='SilentlyContinue'
|
||||||
|
Write-Output "=== IIS sites ==="
|
||||||
|
Import-Module WebAdministration
|
||||||
|
Get-Website | ForEach-Object {
|
||||||
|
$b = (Get-WebBinding -Name $_.Name).bindingInformation -join ' ; '
|
||||||
|
"{0} | {1} | {2} | {3}" -f $_.Name, $_.State, $_.PhysicalPath, $b
|
||||||
|
}
|
||||||
|
Write-Output "=== C:\sites\snolla ==="
|
||||||
|
if (Test-Path 'C:\sites\snolla') {
|
||||||
|
$f = Get-ChildItem 'C:\sites\snolla' -File
|
||||||
|
"exists; top-files=" + $f.Count
|
||||||
|
$wc = 'C:\sites\snolla\Web.config'
|
||||||
|
if (Test-Path $wc) {
|
||||||
|
"Web.config size=" + (Get-Item $wc).Length
|
||||||
|
Write-Output "=== Web.config storageType / minio lines ==="
|
||||||
|
Select-String -Path $wc -Pattern 'storageType|minio\.kzntsv|FileStorage\.S3|Initial Catalog|Data Source' | ForEach-Object { $_.Line.Trim() }
|
||||||
|
} else { "Web.config MISSING" }
|
||||||
|
} else { "C:\sites\snolla MISSING" }
|
||||||
|
Write-Output "=== DONE ==="
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
# setup-local-snolla-admin.ps1 - restore local catch-all IIS site 'snolla' (admin for tirazh + on.snolla.com)
|
||||||
|
# RUN FROM elevated PowerShell: Set-ExecutionPolicy -Scope Process Bypass; & 'C:\Users\vitya\projects\.admin\scripts\local-snolla-admin-restore\setup-local-snolla-admin.ps1'
|
||||||
|
# Source: C:\sites\snolla\ already copied from RUVDS (selective ~100MB, Web.config -> mssql.kzntsv.site + MinIO S3).
|
||||||
|
|
||||||
|
$logPath = 'C:\Users\vitya\projects\.admin\.tmp\setup-log.txt'
|
||||||
|
Start-Transcript -Path $logPath -Force | Out-Null
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
try {
|
||||||
|
Import-Module WebAdministration
|
||||||
|
|
||||||
|
$siteName = 'snolla'
|
||||||
|
$poolName = 'snolla'
|
||||||
|
$physPath = 'C:\sites\snolla'
|
||||||
|
$aliases = @('tandemmebel.snolla.com','labtools.snolla.com','labtoolspro.snolla.com','emspb.snolla.com','kupimknigi.snolla.com','on.snolla.com')
|
||||||
|
|
||||||
|
Write-Host "== 1. AppPool $poolName =="
|
||||||
|
if (Test-Path "IIS:\AppPools\$poolName") {
|
||||||
|
Write-Host " exists, ensuring config"
|
||||||
|
} else {
|
||||||
|
New-WebAppPool -Name $poolName | Out-Null
|
||||||
|
}
|
||||||
|
Set-ItemProperty "IIS:\AppPools\$poolName" -Name managedRuntimeVersion -Value 'v4.0'
|
||||||
|
Set-ItemProperty "IIS:\AppPools\$poolName" -Name processModel.identityType -Value 'ApplicationPoolIdentity'
|
||||||
|
Set-ItemProperty "IIS:\AppPools\$poolName" -Name recycling.periodicRestart.memory -Value 200
|
||||||
|
|
||||||
|
Write-Host "== 2. IIS site $siteName (catch-all *:80) =="
|
||||||
|
if (Test-Path "IIS:\Sites\$siteName") {
|
||||||
|
Write-Host " exists - removing to recreate cleanly"
|
||||||
|
Remove-Website -Name $siteName
|
||||||
|
}
|
||||||
|
# catch-all HTTP on *:80 (no HostHeader = matches any Host header)
|
||||||
|
New-Website -Name $siteName -PhysicalPath $physPath -ApplicationPool $poolName -Port 80 -Force | Out-Null
|
||||||
|
Set-ItemProperty "IIS:\Sites\$siteName" -Name physicalPath -Value $physPath
|
||||||
|
|
||||||
|
Write-Host "== 3. ACL: IIS AppPool\$poolName (OI)(CI)(M) on $physPath =="
|
||||||
|
icacls $physPath /grant "IIS AppPool\${poolName}:(OI)(CI)(M)" /T /C | Out-Null
|
||||||
|
|
||||||
|
Write-Host "== 4. hosts-override (127.0.0.1 aliases) =="
|
||||||
|
$hostsFile = "$env:windir\System32\drivers\etc\hosts"
|
||||||
|
$hostsContent = Get-Content $hostsFile -Raw -ErrorAction SilentlyContinue
|
||||||
|
$marker = '# snolla-local-admin'
|
||||||
|
if ($hostsContent -notmatch [regex]::Escape($marker)) {
|
||||||
|
$line = "`r`n$marker`r`n127.0.0.1 $($aliases -join ' ')`r`n"
|
||||||
|
Add-Content -Path $hostsFile -Value $line -Encoding ASCII
|
||||||
|
Write-Host " added hosts entries"
|
||||||
|
} else {
|
||||||
|
Write-Host " hosts entries already present (marker found)"
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "== 5. FW: block inbound TCP 80 (local-only guard; loopback not filtered) =="
|
||||||
|
$fwName = 'block-inbound-80-snolla-local'
|
||||||
|
if (-not (Get-NetFirewallRule -DisplayName $fwName -ErrorAction SilentlyContinue)) {
|
||||||
|
New-NetFirewallRule -DisplayName $fwName -Direction Inbound -Protocol TCP -LocalPort 80 -Action Block -Profile Any | Out-Null
|
||||||
|
Write-Host " block rule added"
|
||||||
|
} else { Write-Host " block rule already present" }
|
||||||
|
|
||||||
|
Write-Host "== 6. Start =="
|
||||||
|
Start-WebAppPool $poolName
|
||||||
|
Start-Website $siteName
|
||||||
|
Start-Sleep -Seconds 3
|
||||||
|
Write-Host " pool state: $((Get-WebAppPoolState $poolName).Text)"
|
||||||
|
Write-Host " site state: $((Get-WebsiteState $siteName).Text)"
|
||||||
|
|
||||||
|
Write-Host "== 7. Smoke (curl --noproxy bypasses VPN-proxy localhost swallow) =="
|
||||||
|
foreach ($a in $aliases) {
|
||||||
|
$code = & curl.exe --noproxy '*' -s -o NUL -w "%{http_code}" -H "Host: $a" "http://127.0.0.1/admin/account/login" 2>$null
|
||||||
|
Write-Host " http://$a/admin/account/login -> $code"
|
||||||
|
}
|
||||||
|
Write-Host "== DONE - open http://tandemmebel.snolla.com/admin in browser =="
|
||||||
|
Write-Host "(if login form not 200 - check C:\Logs\snolla\log*.txt and eventvwr IIS)"
|
||||||
|
} catch {
|
||||||
|
Write-Host "FATAL: $_"
|
||||||
|
Write-Host $_.ScriptStackTrace
|
||||||
|
}
|
||||||
|
Stop-Transcript | Out-Null
|
||||||
Reference in New Issue
Block a user