Files
admin/scripts/decommission-windows-recovery-host/finish-elevated.ps1
vitya e6e2479970 task(decommission): clean up windows-recovery-host post-Synology, phases A-D
Audited the local recovery host: services migrated to VDS, content left
behind. Reclaimed phases (non-elevated, done):
- docker image+builder prune: images 118->7.1GB, cache 65->0GB (~176GB
  logical; physical reclaim pending WSL vhdx compact)
- removed redundant local CMS-backend containers (minio/imgproxy/es)
- removed 21 empty husk stacks + leftover data dirs
- deleted snolla-recovery VBox VM (95GB) + C:\nas-recovery (~150GB)
- deleted C:\sites snolla archives + identity-manager
=> C: free 62GB -> 214GB

Elevated finale (E+F) scripted in finish-elevated.ps1 for the user to run:
stostayer.old repoint to mssql.kzntsv.site (with VDS orphaned-user fix),
smoke-gated; then snolla IIS site + content + local MSSQL teardown (~38GB).
Keeps IIS stostayer + stostayer.old per user.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 15:15:12 +03:00

100 lines
6.1 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<#
finish-elevated.ps1 — финал декоммишена windows-recovery-host.
ЗАПУСКАТЬ В ELEVATED PowerShell (Run as Administrator).
Требует: рабочий `pass` (gpg-agent) для VDS sa-пароля.
Что делает (с 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 ГБ).
Идемпотентно, можно прогонять повторно.
#>
$ErrorActionPreference = 'Stop'
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)) {
Write-Error "Нужен 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
$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"
$cn = New-Object System.Data.SqlClient.SqlConnection $saConn; $cn.Open()
$c = $cn.CreateCommand()
$c.CommandText = @"
USE stostayer;
IF EXISTS (SELECT 1 FROM sys.database_principals WHERE name='snolla')
ALTER USER snolla WITH LOGIN = snolla;
ELSE BEGIN
CREATE USER snolla FOR LOGIN snolla;
ALTER ROLE db_owner ADD MEMBER snolla;
END
"@
[void]$c.ExecuteNonQuery(); $cn.Close()
Write-Host " orphan-fix applied" -ForegroundColor Green
# verify snolla can open stostayer
$wcPath = "C:\sites\stostayer.old\web.config"
$src = ([xml](Get-Content $wcPath)).configuration.connectionStrings.add.connectionString
$verify = ($src -replace '(?i)Data Source=localhost(,1433)?','Data Source=mssql.kzntsv.site,1433')
if ($verify -notmatch 'TrustServerCertificate') { $verify = $verify.TrimEnd(';') + ';TrustServerCertificate=True' }
$cn = New-Object System.Data.SqlClient.SqlConnection $verify; $cn.Open()
$c = $cn.CreateCommand(); $c.CommandText = "SELECT DB_NAME()"; $db = $c.ExecuteScalar(); $cn.Close()
Write-Host " verify snolla->VDS stostayer OK (db=$db)" -ForegroundColor Green
# ---------- F2: repoint web.config ----------
Write-Host "`n=== F2. repoint stostayer.old web.config ===" -ForegroundColor Cyan
Copy-Item $wcPath "$wcPath.bak-pre-vds-$(Get-Date -Format yyyyMMdd)" -Force
$xml = [xml](Get-Content $wcPath)
$node = $xml.configuration.connectionStrings.add | Where-Object { $_.name -eq 'MoreThenCmsEntities' }
$new = ($node.connectionString -replace '(?i)Data Source=localhost(,1433)?','Data Source=mssql.kzntsv.site,1433')
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
# ---------- F3: restart pool + smoke ----------
Write-Host "`n=== F3. restart pool stostayer.old + smoke :8091 ===" -ForegroundColor Cyan
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-*."
return
}
Write-Host " stostayer.old жив на VDS-БД" -ForegroundColor Green
# ---------- E: snolla source IIS teardown ----------
Write-Host "`n=== E. снос IIS-сайта snolla + контента ===" -ForegroundColor Cyan
if (Get-Website -Name snolla -ErrorAction SilentlyContinue) {
Stop-Website -Name snolla -ErrorAction SilentlyContinue
Remove-Website -Name snolla
Write-Host " IIS site snolla удалён"
}
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 }
# ---------- M: local MSSQL teardown ----------
Write-Host "`n=== M. снос локального 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 }
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)'