feat(deploy): 支持更新脚本自动部署模型转换服务

This commit is contained in:
2026-10-03 02:17:47 +08:00
parent 4e4c4c9f23
commit be3ba8838a
11 changed files with 308 additions and 16 deletions
+29 -8
View File
@@ -56,6 +56,8 @@ if ($args -contains "-h" -or $args -contains "--help") {
Write-Host " UPDATE_SKIP_REPO_UPDATE=true|false"
Write-Host " true 等同 UPDATE_MODE=image"
Write-Host " false 等同 UPDATE_MODE=full"
Write-Host " UPDATE_SERVICES='easyai-server easyai-web model-conversion-worker'"
Write-Host " 仅拉取并重建指定服务,不重建其依赖;留空保持整组更新。"
Write-Host " UPDATE_NO_WAIT=1"
Write-Host " 结束或失败时不等待按 Enter"
Write-Host " UPDATE_HEALTH_TIMEOUT_SECONDS=秒数"
@@ -274,7 +276,6 @@ if (-not (Ensure-DockerRunning)) {
# 检测 docker compose
. (Join-Path $scriptDir "scripts\Assert-RedisPersistence.ps1")
Assert-RedisPersistence -ProjectRoot $scriptDir
$hasComposeV2 = $false
try { $null = docker compose version 2>&1; $hasComposeV2 = $true } catch { }
@@ -296,7 +297,13 @@ function Wait-CoreServices {
}
}
$services = @("easyai-server", "ws-gateway", "easyai-web")
$services = if ($updateServices.Count -gt 0) {
$updateServices
} elseif ($availableServices -contains "model-conversion-worker") {
@("easyai-server", "ws-gateway", "easyai-web", "model-conversion-worker")
} else {
@("easyai-server", "ws-gateway", "easyai-web")
}
$deadline = (Get-Date).AddSeconds($timeoutSeconds)
Write-Step "⏳ 正在等待核心服务恢复可用(最长 $timeoutSeconds 秒)..."
@@ -329,9 +336,9 @@ function Wait-CoreServices {
Write-Host "❌ 更新后核心服务未在 $timeoutSeconds 秒内恢复可用" -ForegroundColor Red
if ($hasComposeV2) {
docker compose ps easyai-server ws-gateway easyai-web
docker compose ps @services
} else {
docker-compose ps easyai-server ws-gateway easyai-web
docker-compose ps @services
}
Write-Err "请检查核心服务日志,确认失败原因后重试"
}
@@ -341,15 +348,29 @@ Write-Host ""
Write-Step "🚀 重新启动 EasyAI..."
Write-Step "📦 当前磁盘空间:"
Get-PSDrive -PSProvider FileSystem | Where-Object { $_.Root -eq ([System.IO.Path]::GetPathRoot($scriptDir)) } | Format-Table Name, Used, Free -AutoSize
$availableServices = if ($hasComposeV2) { @(& docker compose config --services) } else { @(& docker-compose config --services) }
if ($LASTEXITCODE -ne 0) { Write-Err "部署配置校验失败,尚未拉取或重建服务" }
$updateServices = @()
if (-not [string]::IsNullOrWhiteSpace($env:UPDATE_SERVICES)) {
$updateServices = @($env:UPDATE_SERVICES.Trim() -split '\s+')
foreach ($service in $updateServices) {
if ($availableServices -notcontains $service) { Write-Err "更新服务不存在: $service;尚未拉取或重建任何服务" }
}
}
$upArguments = @("up", "-d")
if ($updateServices.Count -gt 0) { $upArguments += @("--no-deps") + $updateServices }
if ($updateServices.Count -eq 0 -or $updateServices -contains "redis") {
Assert-RedisPersistence -ProjectRoot $scriptDir
}
if ($hasComposeV2) {
docker compose pull
docker compose pull @updateServices
if ($LASTEXITCODE -ne 0) { Write-Err "镜像拉取失败,请检查网络、镜像仓库权限和服务器磁盘空间后重试" }
docker compose up -d
docker compose @upArguments
if ($LASTEXITCODE -ne 0) { Write-Err "容器启动失败,EasyAI 未被标记为更新成功" }
} else {
docker-compose pull
docker-compose pull @updateServices
if ($LASTEXITCODE -ne 0) { Write-Err "镜像拉取失败,请检查网络、镜像仓库权限和服务器磁盘空间后重试" }
docker-compose up -d
docker-compose @upArguments
if ($LASTEXITCODE -ne 0) { Write-Err "容器启动失败,EasyAI 未被标记为更新成功" }
}