Files
ai_dianshang/deploy.ps1
2025-11-28 15:18:10 +08:00

306 lines
10 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
# 远程: Ubuntu Server (8.140.194.184)
# 创建时间: 2025-11-27
# ==========================================
param(
[switch]$SkipWeb,
[switch]$SkipAdmin,
[switch]$SkipServer
)
# 配置信息
$SSH_HOST = "8.140.194.184"
$SSH_USER = "root"
$SSH_PASSWORD = "7aK_H2yvokVuZ5HtL5Qrwl19m7L"
$SSH_PORT = 22
# 本地路径
$LOCAL_WEB = "web"
$LOCAL_ADMIN = "admin"
$LOCAL_SERVER = "server"
# 远程路径
$REMOTE_WEB = "/home/work/ai_vizee"
$REMOTE_ADMIN = "/home/work/ai_mis"
$REMOTE_SERVER = "/home/work/ai_dianshang"
# 临时文件夹
$TEMP_DIR = Join-Path $env:TEMP "dianshang_deploy"
if (Test-Path $TEMP_DIR) {
Remove-Item $TEMP_DIR -Recurse -Force
}
New-Item -ItemType Directory -Path $TEMP_DIR | Out-Null
Write-Host "========================================" -ForegroundColor Cyan
Write-Host " 电商系统一键部署工具" -ForegroundColor Cyan
Write-Host " 目标服务器: $SSH_HOST (Ubuntu)" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""
# 检查工具函数
function Test-Command {
param($Command)
try {
if (Get-Command $Command -ErrorAction Stop) {
return $true
}
} catch {
return $false
}
}
Write-Host "[检查] 检查必要工具..." -ForegroundColor Yellow
# 检查 SSH 工具 (优先使用 plink其次使用 ssh)
$USE_PLINK = $false
$USE_PSCP = $false
if (Test-Command "plink") {
Write-Host "[成功] 找到 PuTTY plink" -ForegroundColor Green
$USE_PLINK = $true
} elseif (Test-Command "ssh") {
Write-Host "[成功] 找到 OpenSSH" -ForegroundColor Green
$USE_PLINK = $false
} else {
Write-Host "[错误] 未找到 SSH 工具 (plink 或 ssh)" -ForegroundColor Red
Write-Host "请安装以下任一工具:" -ForegroundColor Yellow
Write-Host " 1. PuTTY (推荐): https://www.putty.org/" -ForegroundColor Yellow
Write-Host " 2. OpenSSH: 设置 -> 应用 -> 可选功能 -> OpenSSH 客户端" -ForegroundColor Yellow
exit 1
}
if (Test-Command "pscp") {
Write-Host "[成功] 找到 PuTTY pscp" -ForegroundColor Green
$USE_PSCP = $true
} elseif (Test-Command "scp") {
Write-Host "[成功] 找到 OpenSSH scp" -ForegroundColor Green
$USE_PSCP = $false
} else {
Write-Host "[错误] 未找到 SCP 工具 (pscp 或 scp)" -ForegroundColor Red
Write-Host "请安装以下任一工具:" -ForegroundColor Yellow
Write-Host " 1. PuTTY (推荐): https://www.putty.org/" -ForegroundColor Yellow
Write-Host " 2. OpenSSH: 设置 -> 应用 -> 可选功能 -> OpenSSH 客户端" -ForegroundColor Yellow
exit 1
}
Write-Host ""
# SSH 执行命令函数
function Invoke-SSHCommand {
param($Command)
Write-Host "[SSH] 执行命令: $Command" -ForegroundColor Cyan
if ($USE_PLINK) {
# 使用 PuTTY plink
echo y | plink -ssh -pw $SSH_PASSWORD ${SSH_USER}@${SSH_HOST} -P $SSH_PORT $Command 2>&1
} else {
# 使用 OpenSSH (需要配置 sshpass 或手动输入密码)
# 创建临时的 SSH 配置来避免主机密钥检查
$env:SSH_ASKPASS = ""
ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" -p $SSH_PORT ${SSH_USER}@${SSH_HOST} $Command 2>&1
}
if ($LASTEXITCODE -ne 0 -and $LASTEXITCODE -ne $null) {
Write-Host "[警告] SSH 命令返回码: $LASTEXITCODE" -ForegroundColor Yellow
}
}
# SCP 上传文件函数
function Copy-ToRemote {
param($LocalFile, $RemotePath)
Write-Host "[上传] $LocalFile" -ForegroundColor Cyan
Write-Host " -> ${SSH_HOST}:${RemotePath}" -ForegroundColor Cyan
if ($USE_PSCP) {
# 使用 PuTTY pscp
echo y | pscp -pw $SSH_PASSWORD -P $SSH_PORT $LocalFile ${SSH_USER}@${SSH_HOST}:${RemotePath} 2>&1
} else {
# 使用 OpenSSH scp
scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" -P $SSH_PORT $LocalFile ${SSH_USER}@${SSH_HOST}:${RemotePath} 2>&1
}
if ($LASTEXITCODE -ne 0 -and $LASTEXITCODE -ne $null) {
Write-Host "[错误] 文件上传失败 (退出码: $LASTEXITCODE)" -ForegroundColor Red
return $false
}
Write-Host "[成功] 文件上传完成" -ForegroundColor Green
return $true
}
# ==========================================
# 1. 部署 Web 项目
# ==========================================
if (-not $SkipWeb) {
Write-Host "========================================" -ForegroundColor Cyan
Write-Host " [1/3] 部署 Web 项目" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
if (-not (Test-Path $LOCAL_WEB)) {
Write-Host "[错误] 未找到 web 文件夹" -ForegroundColor Red
exit 1
}
# 压缩 web 文件夹
$webZip = Join-Path $TEMP_DIR "web.zip"
Write-Host "[压缩] 压缩 web 文件夹..." -ForegroundColor Yellow
# 使用 PowerShell 内置压缩
Compress-Archive -Path "$LOCAL_WEB\*" -DestinationPath $webZip -Force
if (-not (Test-Path $webZip)) {
Write-Host "[错误] web 压缩失败" -ForegroundColor Red
exit 1
}
$fileSize = [math]::Round((Get-Item $webZip).Length / 1MB, 2)
Write-Host "[成功] web 压缩完成 ($fileSize MB)" -ForegroundColor Green
# 上传到服务器
if (-not (Copy-ToRemote $webZip "/tmp/web.zip")) {
exit 1
}
# 解压并覆盖
Write-Host "[解压] 解压 web 到 $REMOTE_WEB..." -ForegroundColor Yellow
Invoke-SSHCommand "mkdir -p $REMOTE_WEB && cd $REMOTE_WEB && rm -rf * && unzip -o /tmp/web.zip && rm -f /tmp/web.zip"
Write-Host "[完成] Web 项目部署完成!" -ForegroundColor Green
Write-Host ""
} else {
Write-Host "[跳过] 跳过 Web 项目部署" -ForegroundColor Yellow
Write-Host ""
}
# ==========================================
# 2. 部署 Admin 项目
# ==========================================
if (-not $SkipAdmin) {
Write-Host "========================================" -ForegroundColor Cyan
Write-Host " [2/3] 部署 Admin 项目" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
if (-not (Test-Path $LOCAL_ADMIN)) {
Write-Host "[错误] 未找到 admin 文件夹" -ForegroundColor Red
exit 1
}
# 执行 npm build
Write-Host "[构建] 执行 npm run build:prod..." -ForegroundColor Yellow
Push-Location $LOCAL_ADMIN
# 检测 npm 命令
$npmCommand = "npm"
if (Test-Command "npm.cmd") {
$npmCommand = "npm.cmd"
}
& $npmCommand run build:prod
if ($LASTEXITCODE -ne 0) {
Write-Host "[错误] npm build 失败" -ForegroundColor Red
Pop-Location
exit 1
}
Pop-Location
Write-Host "[成功] Admin 构建完成" -ForegroundColor Green
# 检查 dist 文件夹
$distPath = Join-Path $LOCAL_ADMIN "dist"
if (-not (Test-Path $distPath)) {
Write-Host "[错误] 未找到 dist 文件夹" -ForegroundColor Red
exit 1
}
# 压缩 dist 文件夹
$adminZip = Join-Path $TEMP_DIR "admin.zip"
Write-Host "[压缩] 压缩 dist 文件夹..." -ForegroundColor Yellow
Compress-Archive -Path "$distPath\*" -DestinationPath $adminZip -Force
if (-not (Test-Path $adminZip)) {
Write-Host "[错误] dist 压缩失败" -ForegroundColor Red
exit 1
}
$fileSize = [math]::Round((Get-Item $adminZip).Length / 1MB, 2)
Write-Host "[成功] dist 压缩完成 ($fileSize MB)" -ForegroundColor Green
# 上传到服务器
if (-not (Copy-ToRemote $adminZip "/tmp/admin.zip")) {
exit 1
}
# 解压并覆盖
Write-Host "[解压] 解压 dist 到 $REMOTE_ADMIN..." -ForegroundColor Yellow
Invoke-SSHCommand "mkdir -p $REMOTE_ADMIN && cd $REMOTE_ADMIN && rm -rf * && unzip -o /tmp/admin.zip && rm -f /tmp/admin.zip"
Write-Host "[完成] Admin 项目部署完成!" -ForegroundColor Green
Write-Host ""
} else {
Write-Host "[跳过] 跳过 Admin 项目部署" -ForegroundColor Yellow
Write-Host ""
}
# ==========================================
# 3. 部署 Server 项目
# ==========================================
if (-not $SkipServer) {
Write-Host "========================================" -ForegroundColor Cyan
Write-Host " [3/3] 部署 Server 项目" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
if (-not (Test-Path $LOCAL_SERVER)) {
Write-Host "[错误] 未找到 server 文件夹" -ForegroundColor Red
exit 1
}
# 压缩 server 文件夹
$serverZip = Join-Path $TEMP_DIR "server.zip"
Write-Host "[压缩] 压缩 server 文件夹..." -ForegroundColor Yellow
Compress-Archive -Path "$LOCAL_SERVER\*" -DestinationPath $serverZip -Force
if (-not (Test-Path $serverZip)) {
Write-Host "[错误] server 压缩失败" -ForegroundColor Red
exit 1
}
$fileSize = [math]::Round((Get-Item $serverZip).Length / 1MB, 2)
Write-Host "[成功] server 压缩完成 ($fileSize MB)" -ForegroundColor Green
# 上传到服务器
if (-not (Copy-ToRemote $serverZip "/tmp/server.zip")) {
exit 1
}
# 解压并覆盖
Write-Host "[解压] 解压 server 到 $REMOTE_SERVER..." -ForegroundColor Yellow
Invoke-SSHCommand "mkdir -p $REMOTE_SERVER && cd $REMOTE_SERVER && rm -rf * && unzip -o /tmp/server.zip && rm -f /tmp/server.zip"
# 执行 run.sh
Write-Host "[启动] 执行 run.sh..." -ForegroundColor Yellow
Invoke-SSHCommand "cd $REMOTE_SERVER && chmod +x run.sh && ./run.sh"
Write-Host "[完成] Server 项目部署完成!" -ForegroundColor Green
Write-Host ""
} else {
Write-Host "[跳过] 跳过 Server 项目部署" -ForegroundColor Yellow
Write-Host ""
}
# 清理临时文件
Write-Host "[清理] 清理临时文件..." -ForegroundColor Yellow
Remove-Item $TEMP_DIR -Recurse -Force
Write-Host "========================================" -ForegroundColor Green
Write-Host " 🎉 部署完成!" -ForegroundColor Green
Write-Host "========================================" -ForegroundColor Green
Write-Host ""
Write-Host "服务访问地址:" -ForegroundColor Cyan
Write-Host " Web前端: http://$SSH_HOST" -ForegroundColor White
Write-Host " Admin后台: http://$SSH_HOST/admin" -ForegroundColor White
Write-Host " API服务: http://$SSH_HOST/api" -ForegroundColor White
Write-Host ""