diff --git a/toolbox/s3_backup_transfer.ps1 b/toolbox/s3_backup_transfer.ps1 new file mode 100644 index 0000000..23be9fc --- /dev/null +++ b/toolbox/s3_backup_transfer.ps1 @@ -0,0 +1,77 @@ +<# +.SYNOPSIS + Skrypt do bezpiecznego przenoszenia backupów SQL na S3 przy użyciu rclone. +.DESCRIPTION + Używa operacji 'rclone move', aby najpierw bezpiecznie skopiować pliki na S3, + zweryfikować je, a następnie usunąć z lokalnego dysku serwera. + W przypadku błędu raportuje zdarzenie do Windows Event Log. +#> + +$ErrorActionPreference = "Stop" + +# ======================================================== +# KONFIGURACJA +# ======================================================== +$RcloneExePath = "C:\ProgramData\chocolatey\bin\rclone.exe" # Zmień na właściwą ścieżkę do rclone.exe +$SourceDir = "C:\SQLBackups" # Katalog główny z backupami baz danych +$S3Destination = "s3-backup-remote:nazwa-twojego-bucketa/SQLBackups/$(env:COMPUTERNAME)" +$LogDir = "C:\DBAdmin\logs" +$LogFile = Join-Path $LogDir "rclone_backup_$(Get-Date -Format 'yyyyMMdd_HHmmss').log" + +# Upewnij się, że katalog logów istnieje +if (-not (Test-Path $LogDir)) { + New-Item -Path $LogDir -ItemType Directory -Force | Out-Null +} + +# ======================================================== +# URUCHOMIENIE TRANSFERU +# ======================================================== +Write-Host "Rozpoczynam proces bezpiecznego przenoszenia backupów z $SourceDir do $S3Destination..." + +# Parametry zapewniające niezawodność: +# move - Przenosi (kopiuje, weryfikuje, kasuje oryginał) +# --checksum - Bezwzględnie weryfikuje sumy kontrolne po skopiowaniu +# --retries 5 - Przy błędzie sieci ponawia do 5 razy +# --retries-sleep 15s - Oczekiwanie między powtórzeniami +# --delete-empty-src-dirs - Usuwa foldery, z których opróżniono wszystkie backupy +$RcloneArgs = @( + "move", $SourceDir, $S3Destination, + "--checksum", + "--retries", "5", + "--retries-sleep", "15s", + "--delete-empty-src-dirs", + "--log-file=$LogFile", + "--log-level=INFO" +) + +# Uruchomienie rclone +& $RcloneExePath $RcloneArgs + +$RcloneExitCode = $LASTEXITCODE + +# ======================================================== +# WERYFIKACJA I ALERTOWANIE +# ======================================================== + +# Rejestracja źródła w EventLog, jeśli nie istnieje (wymaga praw admina przy pierwszym uruchomieniu) +$EventSource = "SQLBackupToS3" +if (-not [System.Diagnostics.EventLog]::SourceExists($EventSource)) { + try { + New-EventLog -LogName Application -Source $EventSource + } catch { + Write-Warning "Nie udało się utworzyć źródła zdarzeń. Prawdopodobnie brak uprawnień administratora." + } +} + +if ($RcloneExitCode -eq 0) { + $successMsg = "Pomyślnie przeniesiono backupy SQL na S3. Log: $LogFile" + Write-Host $successMsg -ForegroundColor Green + try { Write-EventLog -LogName Application -Source $EventSource -EntryType Information -EventId 1000 -Message $successMsg } catch {} +} else { + $errorMsg = "BŁĄD KRYTYCZNY: Nie udało się przenieść wszystkich backupów SQL na S3. Kod wyjścia rclone: $RcloneExitCode. Szczegóły sprawdź w logu: $LogFile" + Write-Host $errorMsg -ForegroundColor Red + try { Write-EventLog -LogName Application -Source $EventSource -EntryType Error -EventId 1001 -Message $errorMsg } catch {} + + # [Opcjonalnie] Tutaj możesz dodać skrypt wysyłający maila lub webhook (Teams/Slack): + # Invoke-RestMethod -Uri "WEBHOOK_URL" -Method Post -Body (@{text=$errorMsg} | ConvertTo-Json) +}