flnxi-Wu/scripts/tools/export-and-download.ps1
WuYongJie d1c6efc79d
Some checks failed
CI Check / check (push) Has been cancelled
feat: NAS 部署与 Harbor 推送流程
2025-12-03 14:39:06 +08:00

136 lines
4.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.

# 完整的导出和下载脚本(Windows PowerShell)
# 使用方法:.\export-and-download.ps1
param(
[string]$ServerIP = "192.168.58.20",
[string]$ServerUser = "root",
[string]$DBHost = "192.168.58.20",
[string]$DBUser = "gongxiangpan",
[string]$DBPass = "gongxiangpan123",
[string]$DBName = "lobechat",
[string]$Container = "flnxi-material",
[string]$LocalDir = ".\backups"
)
Write-Host "=========================================="
Write-Host " PostgreSQL 一键导出下载工具"
Write-Host "=========================================="
Write-Host ""
# 创建本地备份目录
if (!(Test-Path $LocalDir)) {
New-Item -ItemType Directory -Path $LocalDir | Out-Null
Write-Host "✅ 创建本地目录: $LocalDir"
}
$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$RemoteFile = "/tmp/lobechat_backup_$Timestamp.sql"
$LocalFile = Join-Path $LocalDir "lobechat_backup_$Timestamp.sql"
Write-Host "[1/6] 检查容器状态..."
$CheckContainer = "ssh ${ServerUser}@${ServerIP} 'docker ps | grep $Container'"
$ContainerRunning = Invoke-Expression $CheckContainer 2>$null
if (!$ContainerRunning) {
Write-Host "❌ 容器未运行: $Container"
exit 1
}
Write-Host "✅ 容器运行中"
Write-Host ""
Write-Host "[2/6] 安装 PostgreSQL 客户端..."
$InstallCmd = "ssh ${ServerUser}@${ServerIP} 'docker exec -u root $Container apk add --no-cache postgresql-client 2>&1 | grep -q OK && echo SUCCESS || echo ALREADY'"
Invoke-Expression $InstallCmd | Out-Null
Write-Host "✅ 客户端就绪"
Write-Host ""
Write-Host "[3/6] 导出数据库..."
$ExportCmd = @"
ssh ${ServerUser}@${ServerIP} "docker exec -u root -e PGPASSWORD='$DBPass' $Container pg_dump -h $DBHost -U $DBUser -d $DBName > $RemoteFile && echo SUCCESS || echo FAILED"
"@
$ExportResult = Invoke-Expression $ExportCmd
if ($ExportResult -match "FAILED") {
Write-Host "❌ 导出失败"
exit 1
}
Write-Host "✅ 导出成功"
Write-Host ""
Write-Host "[4/6] 压缩文件..."
$CompressCmd = "ssh ${ServerUser}@${ServerIP} 'gzip $RemoteFile && echo SUCCESS'"
$CompressResult = Invoke-Expression $CompressCmd
if ($CompressResult -match "SUCCESS") {
$RemoteFile = "$RemoteFile.gz"
$LocalFile = "$LocalFile.gz"
Write-Host "✅ 压缩完成"
} else {
Write-Host "⚠️ 压缩跳过(可能已压缩)"
}
Write-Host ""
Write-Host "[5/6] 下载文件..."
Write-Host " 从: ${ServerUser}@${ServerIP}:${RemoteFile}"
Write-Host " 到: $LocalFile"
scp "${ServerUser}@${ServerIP}:${RemoteFile}" $LocalFile
if ($LASTEXITCODE -eq 0) {
Write-Host "✅ 下载成功"
} else {
Write-Host "❌ 下载失败"
exit 1
}
Write-Host ""
Write-Host "[6/6] 清理远程文件..."
$CleanCmd = "ssh ${ServerUser}@${ServerIP} 'rm -f $RemoteFile && echo CLEANED'"
Invoke-Expression $CleanCmd | Out-Null
Write-Host "✅ 远程文件已清理"
Write-Host ""
Write-Host "=========================================="
Write-Host " ✅ 全部完成!"
Write-Host "=========================================="
Write-Host ""
$LocalSize = (Get-Item $LocalFile).Length
$LocalSizeStr = "{0:N2} MB" -f ($LocalSize / 1MB)
Write-Host "📁 备份文件信息:"
Write-Host " 路径: $LocalFile"
Write-Host " 大小: $LocalSizeStr"
Write-Host " 时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
Write-Host ""
if ($LocalFile -match "\.gz$") {
Write-Host "📦 解压文件:"
Write-Host " 使用 7-Zip 或 WinRAR 解压"
Write-Host ""
}
Write-Host "📊 查看备份内容(解压后):"
Write-Host " Get-Content $($LocalFile -replace '\.gz$','') -Head 50"
Write-Host ""
Write-Host "🔄 恢复数据库:"
Write-Host " gunzip $LocalFile"
Write-Host " psql -h $DBHost -U $DBUser -d $DBName -f $($LocalFile -replace '\.gz$','')"
Write-Host ""
Write-Host "📋 所有备份文件:"
Get-ChildItem $LocalDir -Filter "lobechat_backup_*.sql*" |
Sort-Object LastWriteTime -Descending |
Select-Object -First 10 |
ForEach-Object {
$size = "{0:N2} MB" -f ($_.Length / 1MB)
$time = $_.LastWriteTime.ToString("yyyy-MM-dd HH:mm")
Write-Host " $($_.Name) ($size) - $time"
}
Write-Host ""