fix(docker): keep current payload during dependency recovery

This commit is contained in:
jxxghp
2026-08-30 13:05:07 +08:00
parent b2b539626c
commit 48bf89c8ec
5 changed files with 151 additions and 7 deletions

View File

@@ -595,6 +595,15 @@ usermod -o -u "${PUID}" moviepilot
# 启动前优先确认主运行环境仍然健康,避免插件依赖污染导致服务直接起不来。
ensure_backend_runtime_dependencies
# 依赖阶段恢复会保留当前程序,待自愈成功后再清理旧代际备份和事务标记。
if [ "${UPDATE_RECOVERY_BLOCKED:-false}" = "true" ]; then
if finalize_update_transaction; then
INFO "→ 当前程序依赖已恢复,已清理保留当前程序的更新事务"
else
WARN "→ 当前程序依赖已恢复,但旧代际备份清理失败,将保留事务标记重试"
fi
fi
# 缓存路径解析必须晚于依赖自愈,确保有效性探针使用当前运行版本。
if ! resolve_browser_cache_dir; then
exit 1

View File

@@ -107,7 +107,7 @@ function pending_recovery_control_dir() {
state="$(pending_update_state 2>/dev/null || true)"
case "${state}" in
prepared|dependencies)
prepared)
[ -e "${UPDATE_PREVIOUS_APP}" ] || return 1
if source_bundle_is_trusted "${previous_control_dir}"; then
printf '%s\n' "${previous_control_dir}"
@@ -118,6 +118,11 @@ function pending_recovery_control_dir() {
fi
return 0
;;
dependencies|blocked)
# 依赖阶段可能已切换到包含新迁移的当前 /app;必须使用当前或镜像控制脚本,
# 让 update.sh 保留新代际,而不是先执行旧代控制脚本触发数据库不兼容回退。
return 1
;;
esac
return 1
}

View File

@@ -66,6 +66,7 @@ UV_OPTIONS=()
MOVIEPILOT_UPDATE_RESULT="noop"
UPDATE_RECOVERY_REQUIRED="false"
UPDATE_RECOVERY_COMPLETED="false"
UPDATE_RECOVERY_BLOCKED="false"
DEPENDENCY_SYNC_ATTEMPTED="false"
PACKAGE_ROUTE_READY="false"
@@ -268,10 +269,30 @@ function recover_pending_update() {
return 0
fi
WARN "→ 检测到未完成的容器更新事务,正在恢复旧版本"
if [ "${state}" = "dependencies" ]; then
DEPENDENCY_SYNC_ATTEMPTED="true"
if [ "${state}" = "dependencies" ] || [ "${state}" = "blocked" ]; then
if [ ! -e "${APP_DIR}" ] || [ ! -e "${PUBLIC_DIR}" ]; then
# 目录切换中断可能留下不完整的当前载荷;这种情况仍需恢复完整旧代际。
if [ ! -e "${UPDATE_PREVIOUS_APP}" ] || [ ! -e "${UPDATE_PREVIOUS_PUBLIC}" ]; then
ERROR "→ 当前与更新前载荷均不完整,无法安全恢复"
UPDATE_RECOVERY_REQUIRED="true"
return 1
fi
WARN "→ 当前更新载荷不完整,恢复更新前版本"
else
# 依赖阶段可能已经切换到包含新迁移的 /app;此时不能恢复旧代际,
# 否则数据库已经前进时会把旧程序交给未知的 Alembic revision。
WARN "→ 更新事务停留在依赖阶段,保留当前程序并等待启动前依赖自愈,不回退旧版本"
if [ "${state}" = "dependencies" ] && ! set_update_pending blocked; then
ERROR "→ 无法记录保留当前程序的更新恢复状态"
return 1
fi
UPDATE_RECOVERY_BLOCKED="true"
UPDATE_RECOVERY_COMPLETED="true"
return 0
fi
fi
WARN "→ 检测到未完成的容器更新事务,正在恢复旧版本"
rollback_update_transaction || return 1
UPDATE_RECOVERY_COMPLETED="true"
INFO "→ 未完成的容器更新事务已恢复"