Die JSON-Sicherung im Adminbereich eignet sich zum Umziehen. Zum Wiederherstellen einer kaputten Instanz braucht es dagegen einen echten Dump - Schema, Daten, Sequenzen, Indizes. backup.ps1 und backup.sh fuehren pg_dump im Container aus, es muss also nichts auf dem Rechner installiert sein. Benutzer und Datenbankname kommen aus der .env, damit sie nicht doppelt gepflegt werden. Der Dump entsteht mit --clean --if-exists und ist damit fuer sich allein einspielbar. restore.* fragt vor dem Ueberschreiben nach und laesst sich ueber -Database beziehungsweise NEBULA_DB_NAME auf eine andere Datenbank umlenken. Damit laesst sich eine Sicherung pruefen, ohne die echte anzufassen - eine Sicherung, die nie zurueckgespielt wurde, ist keine. /backups liegt im .gitignore: die Dateien enthalten alle Daten der Instanz. Geprueft am echten Bestand: Dump 30,9 KB mit allen neun Tabellen, Rueckspielung in eine Pruefdatenbank ergab dieselben Zahlen, das Original blieb unveraendert. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
65 lines
2.2 KiB
PowerShell
65 lines
2.2 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Byteweise Sicherung der Nebula-Datenbank mit pg_dump.
|
|
|
|
.DESCRIPTION
|
|
Ergaenzt den JSON-Export im Adminbereich um eine vollstaendige
|
|
Datenbanksicherung: Schema, Daten, Sequenzen, Indizes. Genau das, was
|
|
man zum Wiederherstellen einer kaputten Instanz braucht.
|
|
|
|
Laeuft die Datenbank im mitgelieferten Container, wird pg_dump dort
|
|
ausgefuehrt - auf dem Rechner selbst muss dann nichts installiert sein.
|
|
|
|
.PARAMETER OutDir
|
|
Zielverzeichnis. Vorgabe: .\backups
|
|
|
|
.PARAMETER Container
|
|
Name des Postgres-Containers. Vorgabe: nebula-db
|
|
|
|
.EXAMPLE
|
|
.\scripts\backup.ps1
|
|
.\scripts\backup.ps1 -OutDir D:\Sicherungen
|
|
#>
|
|
[CmdletBinding()]
|
|
param(
|
|
[string]$OutDir = (Join-Path $PSScriptRoot "..\backups"),
|
|
[string]$Container = "nebula-db"
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
# .env einlesen, damit Benutzer und Datenbankname nicht doppelt gepflegt werden.
|
|
$envFile = Join-Path $PSScriptRoot "..\.env"
|
|
$settings = @{ POSTGRES_USER = "nebula"; POSTGRES_DB = "nebula" }
|
|
if (Test-Path $envFile) {
|
|
foreach ($line in Get-Content $envFile) {
|
|
if ($line -match '^\s*([A-Z_]+)\s*=\s*"?([^"#]*)"?\s*$') {
|
|
$settings[$Matches[1]] = $Matches[2].Trim()
|
|
}
|
|
}
|
|
}
|
|
|
|
$user = $settings["POSTGRES_USER"]
|
|
$database = $settings["POSTGRES_DB"]
|
|
|
|
if (-not (Test-Path $OutDir)) { New-Item -ItemType Directory -Path $OutDir | Out-Null }
|
|
|
|
$stamp = Get-Date -Format "yyyy-MM-dd-HHmmss"
|
|
$target = Join-Path $OutDir "nebula-$stamp.sql"
|
|
|
|
$running = docker ps --filter "name=$Container" --format "{{.Names}}"
|
|
if ($running -notcontains $Container) {
|
|
Write-Error "Container '$Container' laeuft nicht. Zuerst 'docker compose up -d db' ausfuehren."
|
|
}
|
|
|
|
Write-Host "Sichere Datenbank '$database' aus Container '$Container'..."
|
|
|
|
# --clean --if-exists macht die Datei fuer sich allein einspielbar.
|
|
docker exec $Container pg_dump -U $user -d $database --clean --if-exists | Out-File -Encoding utf8 $target
|
|
|
|
if ($LASTEXITCODE -ne 0) { Write-Error "pg_dump ist fehlgeschlagen." }
|
|
|
|
$size = [math]::Round((Get-Item $target).Length / 1KB, 1)
|
|
Write-Host "Fertig: $target ($size KB)" -ForegroundColor Green
|
|
Write-Host "Wiederherstellen mit: .\scripts\restore.ps1 -File `"$target`""
|