diff --git a/.tasks/decommission-windows-recovery-host.md b/.tasks/decommission-windows-recovery-host.md index 7c14297..f5869d3 100644 --- a/.tasks/decommission-windows-recovery-host.md +++ b/.tasks/decommission-windows-recovery-host.md @@ -19,11 +19,14 @@ ### Verify-факт (2026-06-08) БД `stostayer` НА VDS ЕСТЬ (все 5 уехали: MoreThenCms/StayerCalculator/StayerPrice/stostayer/TireService), логин `snolla` существует, но его user в `stostayer` **orphaned** → прямой репойнт даёт `Login failed`. Фикс = `ALTER USER snolla WITH LOGIN=snolla` (в скрипте, шаг F1). +- [x] **local traefik** — ✅ снесён 2026-06-08 (user-решение): контейнер + том `traefik_traefik_letsencrypt` (acme.json больше не нужен — RUVDS на своём win-acme) + `diskstation/traefik`. После него `diskstation/` = только `mssql`. Скрипт E обновлён (traefik-шаги убраны). + +### Keep (user-решение 2026-06-08) +- **lightrag-* + postgres** контейнеры — оставить (used). +- **VM `mutable-dev-environment`** (3ГБ) — оставить. + ### Follow-up - **vhdx compact** (вернуть ~176ГБ docker-reclaim на C:): `wsl --shutdown` + `Optimize-VHD ...docker_data.vhdx`. Гасит markitdown-MCP/lightrag — делать вне активной agent-сессии. -- **mutable-dev-environment VM** (3ГБ) — leftover dev, не в scope ответов. Снести? — спросить. -- **local traefik** — после E больше ничего не обслуживает (stostayer :8090/:8091 — direct, не через traefik). Кандидат на полный снос. Низкий приоритет (~0ГБ). -- **lightrag-* + postgres контейнеры** — статус не подтверждён (локальный MCP vs leftover). Спросить user. ## Keep - IIS `stostayer` (:8090, БД внешняя www.stostayer.ru) + `stostayer.old` (:8091, после репойнта на VDS). diff --git a/scripts/decommission-windows-recovery-host/finish-elevated.ps1 b/scripts/decommission-windows-recovery-host/finish-elevated.ps1 index 4aacc1f..5b5a00f 100644 --- a/scripts/decommission-windows-recovery-host/finish-elevated.ps1 +++ b/scripts/decommission-windows-recovery-host/finish-elevated.ps1 @@ -1,24 +1,24 @@ <# - finish-elevated.ps1 — финал декоммишена windows-recovery-host. - ЗАПУСКАТЬ В ELEVATED PowerShell (Run as Administrator). - Требует: рабочий `pass` (gpg-agent) для VDS sa-пароля. + finish-elevated.ps1 - final decommission of windows-recovery-host. + RUN IN AN ELEVATED PowerShell (Run as Administrator). + Requires working `pass` (gpg-agent) for the VDS sa password. - Что делает (с safety-гейтом): - F1. Чинит orphaned-user `snolla` в БД `stostayer` на mssql.kzntsv.site. - F2. Репойнтит stostayer.old web.config localhost -> mssql.kzntsv.site (+ backup). - F3. Рестартит пул stostayer.old, smoke :8091. Если 5xx -> STOP, MSSQL не трогаем. - E. Сносит IIS-сайт snolla + C:\sites\snolla + dead traefik CMS-routes. - M. Сносит локальный MSSQL (docker) + volume + data dir (~30 ГБ). - Идемпотентно, можно прогонять повторно. + Steps (with a safety gate): + F1. Fix orphaned user `snolla` in DB `stostayer` on mssql.kzntsv.site. + F2. Repoint stostayer.old web.config localhost -> mssql.kzntsv.site (+backup). + F3. Restart stostayer.old pool, smoke :8091. If 5xx -> STOP, do NOT touch MSSQL. + E. Remove IIS site snolla + C:\sites\snolla. + M. Remove local MSSQL (docker) + volume + data dir (~30 GB). + Idempotent - safe to re-run. ASCII-only on purpose (PS 5.1 codepage safety). #> $ErrorActionPreference = 'Stop' if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)) { - Write-Error "Нужен elevated shell (Run as Administrator)."; return + Write-Error "Need an elevated shell (Run as Administrator)."; return } Import-Module WebAdministration # ---------- F1: orphan fix on VDS ---------- -Write-Host "`n=== F1. orphan-fix snolla@stostayer на VDS ===" -ForegroundColor Cyan +Write-Host "`n=== F1. orphan-fix snolla@stostayer on VDS ===" -ForegroundColor Cyan $sa = (& bash -lc "pass show mssql-vds/sa-password" 2>$null | Select-Object -First 1) if (-not $sa) { $sa = Read-Host "VDS sa password (pass show mssql-vds/sa-password)" } $saConn = "Data Source=mssql.kzntsv.site,1433;Initial Catalog=master;User ID=sa;Password=$sa;TrustServerCertificate=True;Encrypt=True" @@ -54,7 +54,7 @@ $new = ($node.connectionString -replace '(?i)Data Source=localhost(,1433)?','Dat if ($new -notmatch 'TrustServerCertificate') { $new = $new.TrimEnd(';') + ';TrustServerCertificate=True' } $node.connectionString = $new $xml.Save($wcPath) -Write-Host " web.config -> mssql.kzntsv.site (backup рядом)" -ForegroundColor Green +Write-Host " web.config -> mssql.kzntsv.site (backup alongside)" -ForegroundColor Green # ---------- F3: restart pool + smoke ---------- Write-Host "`n=== F3. restart pool stostayer.old + smoke :8091 ===" -ForegroundColor Cyan @@ -62,38 +62,34 @@ Restart-WebAppPool -Name 'stostayer.old' Start-Sleep -Seconds 5 $code = try { (Invoke-WebRequest "http://localhost:8091/" -UseBasicParsing -TimeoutSec 30).StatusCode } catch { $_.Exception.Response.StatusCode.value__ } Write-Host " :8091 -> HTTP $code" -if ($code -ge 500 -or -not $code) { - Write-Error "stostayer.old отдаёт $code — репойнт НЕ удался. MSSQL НЕ трогаю. Откат: вернуть web.config.bak-pre-vds-*." +if ((-not $code) -or ($code -ge 500)) { + Write-Error "stostayer.old returned '$code' - repoint FAILED. Leaving MSSQL untouched. Rollback: restore web.config.bak-pre-vds-*." return } -Write-Host " stostayer.old жив на VDS-БД" -ForegroundColor Green +Write-Host " stostayer.old is alive on the VDS DB" -ForegroundColor Green # ---------- E: snolla source IIS teardown ---------- -Write-Host "`n=== E. снос IIS-сайта snolla + контента ===" -ForegroundColor Cyan +Write-Host "`n=== E. remove IIS site snolla + content ===" -ForegroundColor Cyan if (Get-Website -Name snolla -ErrorAction SilentlyContinue) { Stop-Website -Name snolla -ErrorAction SilentlyContinue Remove-Website -Name snolla - Write-Host " IIS site snolla удалён" + Write-Host " IIS site snolla removed" } -if (Get-WebAppPoolState -Name snolla -ErrorAction SilentlyContinue) { Remove-WebAppPool -Name snolla; Write-Host " app pool snolla удалён" } -# dead traefik CMS routes -$cust = "C:\Users\vitya\projects\docker\diskstation\traefik\data\custom" -$dead = @("snolla.yml","kupimknigi.yml","emspb.yml","pilorama98.yml","labtools.yml","labtoolspro.yml","maljarka.yml","tandemmebel.yml","rimiz.yml","disk.yml","dsm.yml","minio.yml","imgproxy.yml","elasticsearch.yml") -foreach ($f in $dead) { $p = Join-Path $cust $f; if (Test-Path $p) { Remove-Item $p -Force; Write-Host " traefik route removed: $f" } } -docker restart traefik | Out-Null -# delete content (site остановлен -> локи сняты) -if (Test-Path "C:\sites\snolla") { Remove-Item "C:\sites\snolla" -Recurse -Force; Write-Host " C:\sites\snolla удалён (8.66 ГБ)" -ForegroundColor Green } +if (Get-WebAppPoolState -Name snolla -ErrorAction SilentlyContinue) { Remove-WebAppPool -Name snolla; Write-Host " app pool snolla removed" } +# (local traefik already removed 2026-06-08 - no CMS routes to clean) +if (Test-Path "C:\sites\snolla") { Remove-Item "C:\sites\snolla" -Recurse -Force; Write-Host " C:\sites\snolla removed (8.66 GB)" -ForegroundColor Green } # ---------- M: local MSSQL teardown ---------- -Write-Host "`n=== M. снос локального MSSQL ===" -ForegroundColor Cyan +Write-Host "`n=== M. remove local MSSQL ===" -ForegroundColor Cyan docker stop mssql 2>$null | Out-Null docker rm mssql 2>$null | Out-Null docker volume rm mssql_mssql_data 2>$null | Out-Null $mssqlDir = "C:\Users\vitya\projects\docker\diskstation\mssql" -if (Test-Path $mssqlDir) { Remove-Item $mssqlDir -Recurse -Force; Write-Host " diskstation/mssql удалён (~28 ГБ)" -ForegroundColor Green } +if (Test-Path $mssqlDir) { Remove-Item $mssqlDir -Recurse -Force; Write-Host " diskstation/mssql removed (~28 GB)" -ForegroundColor Green } Write-Host "`n=== DONE. Free C: ===" -ForegroundColor Cyan Get-PSDrive C | ForEach-Object { "Free={0:N0}GB" -f ($_.Free/1GB) } -Write-Host "`nОтдельно (когда удобно) — компактировать docker WSL vhdx, чтобы вернуть ~176 ГБ на C::" -Write-Host ' wsl --shutdown; Optimize-VHD -Path "$env:LOCALAPPDATA\Docker\wsl\disk\docker_data.vhdx" -Mode Full' -Write-Host ' (путь vhdx уточни: Get-ChildItem $env:LOCALAPPDATA\Docker\wsl -Recurse -Filter *.vhdx)' +Write-Host "`nSeparately (when convenient) - compact the docker WSL vhdx to return ~176 GB to C::" +Write-Host ' wsl --shutdown' +Write-Host ' Get-ChildItem $env:LOCALAPPDATA\Docker\wsl -Recurse -Filter *.vhdx # find the path' +Write-Host ' Optimize-VHD -Path -Mode Full # needs Hyper-V module; else diskpart compact vdisk'