удаление test-контура (дополнение)
This commit is contained in:
+17
-88
@@ -1,6 +1,5 @@
|
||||
# Forbidden Stars backups from the PC. Talks to the `backup` container of the prod on the Pi
|
||||
# over SSH, or (with -Target test) to the local test clone (docker-compose.test.yml).
|
||||
# Step-by-step guide: deploy/backup/README.md
|
||||
# over SSH. Step-by-step guide: deploy/backup/README.md
|
||||
#
|
||||
# .\scripts\fs-backup.ps1 status backup state on the Pi
|
||||
# .\scripts\fs-backup.ps1 list [-Repo vps] snapshot history
|
||||
@@ -8,9 +7,6 @@
|
||||
# .\scripts\fs-backup.ps1 verify check data integrity in the repositories
|
||||
# .\scripts\fs-backup.ps1 pull [-Snapshot <id>] [-Repo vps]
|
||||
# download a snapshot to backups\ (sha256 checked)
|
||||
# .\scripts\fs-backup.ps1 restore-test -File backups\fs_....tar
|
||||
# practice restore into the local test clone
|
||||
# add -Target test to run status/list/now/verify/pull against the local test clone
|
||||
#
|
||||
# Settings come from the root .env (an environment variable with the same name wins):
|
||||
# BACKUP_PI_SSH how to reach the Pi over SSH, e.g. pi@192.168.1.10 (or a Host alias)
|
||||
@@ -19,15 +15,12 @@
|
||||
# Keep this file ASCII-only: Windows PowerShell 5.1 breaks on non-ASCII without a BOM.
|
||||
param(
|
||||
[Parameter(Position = 0)]
|
||||
[ValidateSet("status", "list", "now", "verify", "pull", "restore-test", "help")]
|
||||
[ValidateSet("status", "list", "now", "verify", "pull", "help")]
|
||||
[string]$Command = "help",
|
||||
[string]$Snapshot = "latest",
|
||||
[ValidateSet("local", "vps")]
|
||||
[string]$Repo = "local",
|
||||
[string]$Tag = "",
|
||||
[string]$File = "",
|
||||
[ValidateSet("pi", "test")]
|
||||
[string]$Target = "pi"
|
||||
[string]$Tag = ""
|
||||
)
|
||||
$ErrorActionPreference = "Stop"
|
||||
# Native tools (ssh, scp, docker) write progress and warnings to stderr. Under "Stop" with a
|
||||
@@ -35,7 +28,6 @@ $ErrorActionPreference = "Stop"
|
||||
# run under "Continue" and success is judged by $LASTEXITCODE only.
|
||||
$root = Split-Path -Parent $PSScriptRoot
|
||||
$envFile = Join-Path $root ".env"
|
||||
$testCompose = Join-Path $root "docker-compose.test.yml"
|
||||
|
||||
# Read a key: environment variable first, then the root .env (last assignment wins).
|
||||
function Get-Setting([string]$name, [string]$default) {
|
||||
@@ -56,7 +48,7 @@ function Fail([string]$msg) {
|
||||
}
|
||||
|
||||
function Show-Help {
|
||||
Get-Content $PSCommandPath -TotalCount 19 | ForEach-Object { $_ -replace '^# ?', '' }
|
||||
Get-Content $PSCommandPath -TotalCount 15 | ForEach-Object { $_ -replace '^# ?', '' }
|
||||
}
|
||||
|
||||
$piSsh = Get-Setting "BACKUP_PI_SSH" ""
|
||||
@@ -77,29 +69,9 @@ function Invoke-Scp([string]$from, [string]$to) {
|
||||
& scp -o ConnectTimeout=15 $from $to
|
||||
}
|
||||
|
||||
function Invoke-TestCompose([string[]]$composeArgs) {
|
||||
$ErrorActionPreference = "Continue"
|
||||
& docker compose -f $testCompose @composeArgs
|
||||
}
|
||||
|
||||
# Make sure the backup container of the test clone is running (build it if needed).
|
||||
function Start-TestBackup {
|
||||
$id = (Invoke-TestCompose @("ps", "-q", "backup")) | Select-Object -First 1
|
||||
if (-not $id) {
|
||||
Write-Host "Starting the backup container of the test clone..." -ForegroundColor Cyan
|
||||
Invoke-TestCompose @("up", "-d", "--build", "backup") | Out-Host
|
||||
if ($LASTEXITCODE -ne 0) { Fail "Could not start the test clone backup container." }
|
||||
}
|
||||
}
|
||||
|
||||
# Run fs-backup with arguments on the chosen target; output goes to the console.
|
||||
# Run fs-backup with arguments on the Pi; output goes to the console.
|
||||
function Invoke-FsBackup([string[]]$fsArgs) {
|
||||
if ($Target -eq "test") {
|
||||
Start-TestBackup
|
||||
Invoke-TestCompose (@("exec", "-T", "backup", "fs-backup") + $fsArgs)
|
||||
} else {
|
||||
Invoke-Pi ("docker compose exec -T backup fs-backup " + ($fsArgs -join " "))
|
||||
}
|
||||
Invoke-Pi ("docker compose exec -T backup fs-backup " + ($fsArgs -join " "))
|
||||
}
|
||||
|
||||
function Assert-LastExit([string]$what) {
|
||||
@@ -126,31 +98,17 @@ function Invoke-Pull {
|
||||
Write-Host "Snapshot $id ($Repo) -> $local" -ForegroundColor Cyan
|
||||
|
||||
$partial = "$local.part"
|
||||
if ($Target -eq "test") {
|
||||
Start-TestBackup
|
||||
$tmp = "/tmp/fs-backup/export-$id.tar"
|
||||
$hashLine = Invoke-TestCompose @("exec", "-T", "backup", "sh", "-c",
|
||||
"fs-backup export $id --repo $Repo > $tmp && sha256sum $tmp") | Select-Object -Last 1
|
||||
Assert-LastExit "Export"
|
||||
try {
|
||||
Invoke-TestCompose @("cp", "backup:$tmp", $partial)
|
||||
Assert-LastExit "Copy from the container"
|
||||
} finally {
|
||||
Invoke-TestCompose @("exec", "-T", "backup", "rm", "-f", $tmp) | Out-Null
|
||||
}
|
||||
} else {
|
||||
# Export into a file in the Pi user's home (binary data never passes through
|
||||
# PowerShell pipes - they would corrupt it), then scp it and compare sha256.
|
||||
$remote = "fs-export-$id.tar"
|
||||
$hashLine = Invoke-Pi "docker compose exec -T backup fs-backup export $id --repo $Repo > ~/$remote && sha256sum ~/$remote" |
|
||||
Select-Object -Last 1
|
||||
Assert-LastExit "Export on the Pi"
|
||||
try {
|
||||
Invoke-Scp "${piSsh}:$remote" $partial
|
||||
Assert-LastExit "scp"
|
||||
} finally {
|
||||
Invoke-Pi "rm -f ~/$remote"
|
||||
}
|
||||
# Export into a file in the Pi user's home (binary data never passes through
|
||||
# PowerShell pipes - they would corrupt it), then scp it and compare sha256.
|
||||
$remote = "fs-export-$id.tar"
|
||||
$hashLine = Invoke-Pi "docker compose exec -T backup fs-backup export $id --repo $Repo > ~/$remote && sha256sum ~/$remote" |
|
||||
Select-Object -Last 1
|
||||
Assert-LastExit "Export on the Pi"
|
||||
try {
|
||||
Invoke-Scp "${piSsh}:$remote" $partial
|
||||
Assert-LastExit "scp"
|
||||
} finally {
|
||||
Invoke-Pi "rm -f ~/$remote"
|
||||
}
|
||||
|
||||
$expected = ("$hashLine".Trim() -split "\s+")[0].ToLower()
|
||||
@@ -172,34 +130,6 @@ function Invoke-Pull {
|
||||
Write-Host "OK: $local ($sizeMb MB, $files files, sha256 verified)" -ForegroundColor Green
|
||||
}
|
||||
|
||||
# -------------------------------------------------------------------- restore-test
|
||||
function Invoke-RestoreTest {
|
||||
if (-not $File) { Fail "Specify the archive: -File backups\fs_....tar" }
|
||||
if (-not (Test-Path $File -PathType Leaf)) { Fail "File not found: $File" }
|
||||
$full = (Resolve-Path $File).Path
|
||||
$inContainer = "/import/restore-test.archive" # tar or tar.gz: fs-backup detects the format itself
|
||||
|
||||
Write-Host "Practice restore of $full into the LOCAL TEST CLONE (prod is not touched)." -ForegroundColor Cyan
|
||||
Start-TestBackup
|
||||
Invoke-TestCompose @("stop", "app")
|
||||
Assert-LastExit "Stopping the test app"
|
||||
Invoke-TestCompose @("cp", $full, "backup:$inContainer")
|
||||
Assert-LastExit "Copy into the container"
|
||||
try {
|
||||
Invoke-TestCompose @("exec", "-T", "backup", "fs-backup", "import", $inContainer, "--yes")
|
||||
$importExit = $LASTEXITCODE
|
||||
} finally {
|
||||
Invoke-TestCompose @("exec", "-T", "backup", "rm", "-f", $inContainer) | Out-Null
|
||||
}
|
||||
if ($importExit -ne 0) { Fail "Import failed (exit code $importExit). The test clone data was not changed." }
|
||||
|
||||
Invoke-TestCompose @("up", "-d", "app")
|
||||
Assert-LastExit "Starting the test app"
|
||||
Write-Host "Done. The test clone now runs on the restored data." -ForegroundColor Green
|
||||
Write-Host " See it on https://forbidden-stars.ru: docker compose -f docker-compose.test.yml up -d (or .\run.ps1 with APP_ENV=test)"
|
||||
Write-Host " Logs: docker compose -f docker-compose.test.yml logs -f app"
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------------------- main
|
||||
$prevEncoding = $null
|
||||
try {
|
||||
@@ -218,7 +148,6 @@ try {
|
||||
}
|
||||
"verify" { Invoke-FsBackup @("verify"); Assert-LastExit "verify" }
|
||||
"pull" { Invoke-Pull }
|
||||
"restore-test" { Invoke-RestoreTest }
|
||||
default { Show-Help }
|
||||
}
|
||||
} finally {
|
||||
|
||||
Reference in New Issue
Block a user