param( [int]$KeepCount = 10 ) $ProjectRoot = Split-Path -Parent $MyInvocation.MyCommand.Path $BackupRoot = Join-Path $ProjectRoot "backups" $DateStamp = Get-Date -Format "yyyyMMdd_HHmmss" $BackupDir = Join-Path $BackupRoot $DateStamp # Files to backup $DbFile = Join-Path (Join-Path $ProjectRoot "instance") "kpi_dashboard.db" $UploadsDir = Join-Path $ProjectRoot "uploads" Write-Host "=== KPI Dashboard Backup ===" -ForegroundColor Cyan Write-Host "Source: $ProjectRoot" Write-Host "Target: $BackupDir" Write-Host "" # Create backup directory New-Item -ItemType Directory -Path $BackupDir -Force | Out-Null # 1. Backup database if (Test-Path $DbFile) { Copy-Item -Path $DbFile -Destination (Join-Path $BackupDir "kpi_dashboard.db") Write-Host "[OK] Database backed up" -ForegroundColor Green } else { Write-Host "[WARN] Database not found: $DbFile" -ForegroundColor Yellow } # 2. Backup uploads if (Test-Path $UploadsDir) { $uploadDest = Join-Path $BackupDir "uploads" Copy-Item -Path $UploadsDir -Destination $uploadDest -Recurse Write-Host "[OK] Uploads backed up" -ForegroundColor Green } else { Write-Host "[WARN] Uploads directory not found" -ForegroundColor Yellow } # 3. Backup config and env $EnvExample = Join-Path $ProjectRoot ".env.example" if (Test-Path $EnvExample) { Copy-Item -Path $EnvExample -Destination (Join-Path $BackupDir ".env.example") } # 4. Clean up old backups (keep last $KeepCount) $AllBackups = Get-ChildItem -Path $BackupRoot -Directory | Sort-Object Name -Descending if ($AllBackups.Count -gt $KeepCount) { $ToRemove = $AllBackups | Select-Object -Skip $KeepCount foreach ($Dir in $ToRemove) { Remove-Item -Path $Dir.FullName -Recurse -Force Write-Host "[CLEAN] Removed old backup: $($Dir.Name)" -ForegroundColor DarkYellow } } # Summary $BackupSize = "{0:N2}" -f ((Get-ChildItem -Path $BackupDir -Recurse | Measure-Object -Property Length -Sum).Sum / 1KB) Write-Host "" Write-Host "Backup complete: $BackupDir ($BackupSize KB)" -ForegroundColor Cyan Write-Host "Total backups: $(@(Get-ChildItem -Path $BackupRoot -Directory).Count)" -ForegroundColor Cyan