- Sites.Alias+LoweredAlias on->internal (siteId B9ECDB50; PrimaryDomain on.snolla.com kept). - Web.config primaryAlias on->internal (catch-all default-site; without it the whole catch-all NRE-500s on every request — primaryAlias references the renamed alias). - hosts: on.snolla.com->internal.snolla.com under # snolla-local-admin marker. - setup-local-snolla-admin.ps1 aliases array updated. - runbook + NEXT_SESSION + memory updated. VDS prod on.snolla.com unaffected (snolla-app uses config.siteId, not alias) — verified byte-identical + smoke GREEN after rename. Incident: elevated hosts edit emptied hosts to 0B (Get-Content -Raw returned null in RunAs context) — restored from Windows default header + snolla-local-admin block. Memory snolla-catch-all-primaryalias-depends-on-alias. Co-Authored-By: Claude <noreply@anthropic.com>
67 lines
7.3 KiB
Markdown
67 lines
7.3 KiB
Markdown
---
|
||
_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 B (on.snolla.com → VDS) DONE. Cutover завершён 2026-07-20.
|
||
|
||
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).
|
||
|
||
🟢 **[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
|
||
- **Репо** `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.
|
||
|
||
### Гочи (в 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`.
|
||
|
||
### 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 |
|
||
|---|---|---|
|
||
| books-vds → vds-kzntsv консолидация | оценено, не лезет по RAM/disk | Решение за user. |
|
||
| MinIO upload-acceptance on.snolla (ручной) | ⚪ follow-up оператора | Логин `/admin` (RUVDS) → тест-ассет → MinIO bucket=assets. |
|
||
|
||
## Спроси user'а
|
||
- (нет pending-решений — Task B закрыт полностью)
|
||
|
||
## Не делать (preemptive guards)
|
||
- **НЕ пушить без добла** (Rule 4) — на эту сессию добл был ("разрешаю всё, погнали").
|
||
- **НЕ сжимать** books на .94; **НЕ netplan** на vds-kzntsv.
|
||
- **hosts override активен** — `internal.snolla.com` → 127.0.0.1 (локальный админ Task A; алиас `on` переименован в `internal` 2026-07-20). Боевой on.snolla.com (VDS) с воркстейшна — только через `--resolve :443:89.253.255.94` или off-hosts. **Публичного on.snolla.com/admin не существует** (никогда не было) — админка только локальная: `http://internal.snolla.com/admin`.
|
||
|
||
### Alias rename `on`→`internal` (2026-07-20, follow-up оператора)
|
||
- `Sites.Alias`+`LoweredAlias`: `on`→`internal` (siteId B9ECDB50, PrimaryDomain остался `on.snolla.com`).
|
||
- `C:\sites\snolla\Web.config` `primaryAlias`: `on`→`internal` (иначе catch-all NRE-500 на ВСЕХ запросах — primaryAlias ссылается на переименованный алиас).
|
||
- hosts: `on.snolla.com`→`internal.snolla.com` под маркером `# snolla-local-admin`.
|
||
- **Инцидент:** я обнулил hosts своей elevated-правкой (Get-Content -Raw в RunAs-контексте вернул пусто → Set-Content записал пусто). Восстановил: Windows default header + snolla-local-admin блок (с internal.snolla.com). LAN-DNS CMS-перехват через DNS-резолвер, не hosts → потерь нет. Урок в memory `snolla-catch-all-primaryalias-depends-on-alias`.
|
||
- VDS prod on.snolla.com НЕ затронут (snolla-app использует config.siteId, не alias) — byte-identical, smoke GREEN.
|
||
- **НЕ откатывать DNS on.snolla.com** без явного запроса — cutover LIVE, RUVDS IIS жив как rollback-target.
|
||
|
||
## Memory updates за сессию
|
||
- **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 на админ-копию, не прод). |