forked from wangbo/easyai
fix(deploy): 修复组件版本解析和安装升级验收流程
This commit is contained in:
@@ -114,22 +114,6 @@ if [ -n "${UPDATE_RELEASE_VERSION:-}" ] && ! [[ "$UPDATE_RELEASE_VERSION" =~ ^[0
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 配套服务可独立更新;固定版本不得改变未选中服务的环境。
|
||||
for option in UPDATE_GATEWAY_VERSION UPDATE_UPDATER_VERSION; do
|
||||
value="${!option:-}"
|
||||
[ -n "$value" ] || continue
|
||||
if ! [[ "$value" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]{8}(\.[0-9]+)?$ ]]; then
|
||||
echo "❌ $option 格式不正确;尚未修改配置或容器" >&2
|
||||
exit 1
|
||||
fi
|
||||
service=ws-gateway
|
||||
[ "$option" != UPDATE_UPDATER_VERSION ] || service=easyai-updater
|
||||
if ! [[ " ${UPDATE_SERVICES:-} " == *" $service "* ]]; then
|
||||
echo "❌ $option 要求在 UPDATE_SERVICES 中指定 $service;尚未修改配置或容器" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# 拉取整个仓库更新
|
||||
if [ "$SKIP_REPO_UPDATE" = false ]; then
|
||||
echo ""
|
||||
@@ -137,11 +121,12 @@ if [ "$SKIP_REPO_UPDATE" = false ]; then
|
||||
echo "📥 拉取仓库最新代码"
|
||||
echo "==========================="
|
||||
|
||||
if [ ! -d .git ]; then
|
||||
echo "❌ 当前目录不是 Git 仓库,无法执行 git pull"
|
||||
echo " 请使用 git clone 克隆项目后即可使用 update.sh 更新"
|
||||
echo " 克隆命令: git clone https://git.51easyai.com/wangbo/easyai && cd easyai"
|
||||
exit 1
|
||||
if [ "$(git rev-parse --show-toplevel 2>/dev/null || true)" != "$SCRIPT_DIR" ]; then
|
||||
if [ "${UPDATE_ADOPT_LEGACY_CONFIG:-0}" != 1 ] || [ "$SOURCE_DIR" = "$SCRIPT_DIR" ]; then
|
||||
echo '❌ 旧部署包尚未接入 Git。请使用 README 中的原目录迁移入口;不要删除或改名现有数据目录。' >&2
|
||||
exit 1
|
||||
fi
|
||||
python3 "$SOURCE_DIR/scripts/adopt-deployment-directory.py" "$SCRIPT_DIR" "$SOURCE_DIR"
|
||||
fi
|
||||
|
||||
before_revision="$(git rev-parse HEAD)"
|
||||
@@ -189,7 +174,11 @@ fi
|
||||
# shellcheck source=scripts/init-security-env.sh
|
||||
. ./scripts/init-security-env.sh
|
||||
. ./scripts/init-application-version-env.sh
|
||||
if [ -z "$(read_env_value .env SYSTEM_UPDATE_MODE)" ] && docker inspect easyai-server >/dev/null 2>&1 && ! docker inspect easyai-updater >/dev/null 2>&1; then
|
||||
export EASYAI_UPDATE_MODE_HINT=legacy_watchtower
|
||||
fi
|
||||
plan_application_versions .env
|
||||
python3 ./scripts/backup-deployment-config.py
|
||||
if [ -z "$(read_env_value .env SYSTEM_UPDATE_MODE)" ] && docker inspect easyai-server >/dev/null 2>&1 && ! docker inspect easyai-updater >/dev/null 2>&1; then
|
||||
write_env_value .env SYSTEM_UPDATE_MODE legacy_watchtower
|
||||
fi
|
||||
@@ -206,6 +195,7 @@ init_security_env .env upgrade
|
||||
bash ./scripts/init-infrastructure-update-env.sh "$SCRIPT_DIR"
|
||||
|
||||
apply_application_versions .env
|
||||
init_deployment_release_source .env
|
||||
|
||||
# 在更新镜像和重建服务前迁移并校验后端公开 API 地址。
|
||||
# shellcheck source=scripts/init-public-api-base-url.sh
|
||||
@@ -272,52 +262,11 @@ $DOCKER_COMPOSE_CMD version
|
||||
|
||||
echo "🎉 Docker 和 Docker Compose 已就绪!"
|
||||
|
||||
# Installation and update share image/public-access and health checks.
|
||||
. ./scripts/deployment-runtime.sh
|
||||
init_deployment_docker_config .env
|
||||
wait_for_core_services() {
|
||||
local timeout_seconds="${UPDATE_HEALTH_TIMEOUT_SECONDS:-300}"
|
||||
local deadline=$((SECONDS + timeout_seconds))
|
||||
local services=(easyai-server ws-gateway easyai-web)
|
||||
if [ "${#UPDATE_SERVICE_LIST[@]}" -gt 0 ]; then
|
||||
services=("${UPDATE_SERVICE_LIST[@]}")
|
||||
elif printf '%s\n' "$AVAILABLE_SERVICES" | grep -qx 'model-conversion-worker'; then
|
||||
services+=(model-conversion-worker)
|
||||
fi
|
||||
local service container_id state running health all_ready
|
||||
|
||||
if ! [[ "$timeout_seconds" =~ ^[1-9][0-9]*$ ]]; then
|
||||
echo "❌ UPDATE_HEALTH_TIMEOUT_SECONDS 必须是正整数,当前为: $timeout_seconds"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "⏳ 正在等待核心服务恢复可用(最长 ${timeout_seconds} 秒)..."
|
||||
while (( SECONDS < deadline )); do
|
||||
all_ready=true
|
||||
for service in "${services[@]}"; do
|
||||
container_id="$(sudo $DOCKER_COMPOSE_CMD ps -q "$service" 2>/dev/null || true)"
|
||||
if [ -z "$container_id" ]; then
|
||||
all_ready=false
|
||||
continue
|
||||
fi
|
||||
|
||||
state="$(sudo docker inspect --format '{{.State.Running}}|{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}' "$container_id" 2>/dev/null || true)"
|
||||
running="${state%%|*}"
|
||||
health="${state#*|}"
|
||||
if [ "$running" != "true" ] || { [ "$health" != "none" ] && [ "$health" != "healthy" ]; }; then
|
||||
all_ready=false
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$all_ready" = true ]; then
|
||||
echo "✅ 核心服务已恢复可用"
|
||||
return 0
|
||||
fi
|
||||
sleep 5
|
||||
done
|
||||
|
||||
echo "❌ 更新后核心服务未在 ${timeout_seconds} 秒内恢复可用"
|
||||
echo " 当前状态:"
|
||||
sudo $DOCKER_COMPOSE_CMD ps "${services[@]}" || true
|
||||
echo " 请运行 '$DOCKER_COMPOSE_CMD logs --tail=100 ${services[*]}' 查看原因"
|
||||
return 1
|
||||
wait_for_deployment_services "$DOCKER_COMPOSE_CMD" "${UPDATE_HEALTH_TIMEOUT_SECONDS:-600}" "${UPDATE_SERVICE_LIST[@]}"
|
||||
}
|
||||
|
||||
# 必须在拉取/重建前确认服务名称,防止拼写错误扩大更新范围。
|
||||
@@ -333,7 +282,9 @@ if [ -n "${UPDATE_SERVICES:-}" ]; then
|
||||
done
|
||||
fi
|
||||
|
||||
check_deployment_storage "$DOCKER_COMPOSE_CMD" "${UPDATE_SERVICE_LIST[@]}"
|
||||
verify_application_version_images .env "$DOCKER_COMPOSE_CMD"
|
||||
verify_deployment_images "$DOCKER_COMPOSE_CMD" "${UPDATE_SERVICE_LIST[@]}"
|
||||
|
||||
# 只检查本次会重建的 Redis;--no-deps 更新其他服务不会修改其旧数据位置。
|
||||
if [ "${#UPDATE_SERVICE_LIST[@]}" -eq 0 ] || printf '%s\n' "${UPDATE_SERVICE_LIST[@]}" | grep -qx 'redis'; then
|
||||
@@ -348,6 +299,7 @@ if ! sudo $DOCKER_COMPOSE_CMD pull "${UPDATE_SERVICE_LIST[@]}"; then
|
||||
echo " 请检查网络、镜像仓库权限和服务器磁盘空间后重试"
|
||||
exit 1
|
||||
fi
|
||||
verify_pulled_release "$DOCKER_COMPOSE_CMD" "${UPDATE_SERVICE_LIST[@]}"
|
||||
UP_ARGUMENTS=(-d)
|
||||
if [ "${#UPDATE_SERVICE_LIST[@]}" -gt 0 ]; then
|
||||
UP_ARGUMENTS+=(--no-deps "${UPDATE_SERVICE_LIST[@]}")
|
||||
|
||||
Reference in New Issue
Block a user