From 285a2c0b651e83bd22a68e6b19f05f9204e894b1 Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 2 Sep 2026 03:56:20 +0000 Subject: [PATCH] release: sync public installer asset install.sh --- install.sh | 70 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 18 deletions(-) diff --git a/install.sh b/install.sh index bf5a3d3..df91759 100644 --- a/install.sh +++ b/install.sh @@ -669,6 +669,11 @@ PY if [[ -n $MENU_PROFILES ]]; then [[ ${XYMEDIA_INSTALL_CONFIRM:-} == INSTALL_XIAOYA ]] || { confirm=$(prompt_tty '安装小雅将创建并启动相关容器,输入 1 继续,其他内容取消: '); [[ $confirm == 1 ]] || die '已取消小雅安装'; } for profile in $MENU_PROFILES; do run_logged "${COMPOSE[@]}" --profile "$profile" --project-directory "$INSTALL_DIR" --env-file "$INSTALL_DIR/.env" -f "$INSTALL_DIR/compose.yaml" up -d || die "小雅 profile 启动失败:$profile"; done + if [[ $MENU_PROFILES == *xiaoya-control* ]]; then + controller_state=$(docker inspect --format '{{.State.Status}}' xymedia-controller 2>>"$INSTALL_LOG" || true) + [[ $controller_state == running ]] || die '本机小雅控制器未正常运行' + printf '本机小雅控制器已自动配置:xymedia-controller:19090;密钥已自动写入,不显示。\n' + fi fi progress '下载 bootstrap runtime' if ! run_logged "${COMPOSE[@]}" --project-directory "$INSTALL_DIR" --env-file "$INSTALL_DIR/.env" -f "$INSTALL_DIR/compose.yaml" "${COMPOSE_FUSE[@]}" pull app; then @@ -719,29 +724,58 @@ if [[ $PG_HOST == postgres ]]; then wait_for_postgres || die 'PostgreSQL 等待被中断,安装未完成' fi progress '初始化数据库结构' +printf '正在初始化数据库,请稍候...\n' +set +e if (( EXISTING_DB )); then export XYMEDIA_EXTERNAL_MIGRATION_CONFIRM=YES - if ! run_visible_logged "${COMPOSE[@]}" --profile migration --project-directory "$INSTALL_DIR" --env-file "$INSTALL_DIR/.env" -f "$INSTALL_DIR/compose.yaml" "${COMPOSE_FUSE[@]}" run --rm --name "xymedia-app-migrate-${INSTALL_NONCE}" --no-deps app-migrate migrate --config /app/config.yaml; then - die '已有数据库迁移失败' - fi + run_visible_logged "${COMPOSE[@]}" --profile migration --project-directory "$INSTALL_DIR" --env-file "$INSTALL_DIR/.env" -f "$INSTALL_DIR/compose.yaml" "${COMPOSE_FUSE[@]}" run --rm -T --no-deps app-migrate migrate --config /app/config.yaml + migration_rc=$? else - if ! run_visible_logged "${COMPOSE[@]}" --profile migration --project-directory "$INSTALL_DIR" --env-file "$INSTALL_DIR/.env" -f "$INSTALL_DIR/compose.yaml" "${COMPOSE_FUSE[@]}" run --rm --name "xymedia-app-migrate-${INSTALL_NONCE}" --no-deps app-migrate migrate --new --config /app/config.yaml; then - die '数据库初始化失败' - fi + run_visible_logged "${COMPOSE[@]}" --profile migration --project-directory "$INSTALL_DIR" --env-file "$INSTALL_DIR/.env" -f "$INSTALL_DIR/compose.yaml" "${COMPOSE_FUSE[@]}" run --rm -T --no-deps app-migrate migrate --new --config /app/config.yaml + migration_rc=$? fi +set -e +if (( migration_rc != 0 )); then + persist_installer_log + if (( EXISTING_DB )); then + die "已有数据库迁移失败(退出码:$migration_rc)" + fi + die "数据库初始化失败(退出码:$migration_rc)" +fi +printf '数据库初始化完成\n' progress '启动 XyMediaVault 服务' if ! run_logged "${COMPOSE[@]}" --project-directory "$INSTALL_DIR" --env-file "$INSTALL_DIR/.env" -f "$INSTALL_DIR/compose.yaml" "${COMPOSE_FUSE[@]}" up -d app; then die 'XyMediaVault 启动失败' fi -for elapsed in $(seq 0 118 2); do - if curl --fail --silent "http://127.0.0.1:$API_PORT/api/health" >/dev/null; then - cp "$INSTALL_LOG" "$INSTALL_DIR/install.log" 2>/dev/null || true - printf '\033[2K\r[%d/%d] 安装完成:XyMediaVault 已就绪\n' "$TOTAL_STEPS" "$TOTAL_STEPS" - printf '管理地址:http://127.0.0.1:%s\n安装日志:%s\n' "$API_PORT" "$INSTALL_LOG" - exit 0 - fi - printf '\033[2K\r[%d/%d] 等待 XyMediaVault 健康检查(%s 秒)' "$STEP" "$TOTAL_STEPS" "$elapsed" - sleep 2 -done -printf '\n' -die 'XyMediaVault 未在限定时间内通过健康检查' +wait_for_app_health() { + local started_at elapsed app_wait_interrupted=0 previous_int previous_term + started_at=$(date +%s) + previous_int=$(trap -p INT || true) + previous_term=$(trap -p TERM || true) + trap 'app_wait_interrupted=1' INT TERM + while :; do + if (( app_wait_interrupted )); then + printf '\n已收到中断信号,正在停止应用健康检查。\n' + printf '%s\n' 'XyMediaVault health wait interrupted by signal' >>"$INSTALL_LOG" + printf '\n--- XyMediaVault 容器日志 ---\n' >>"$INSTALL_LOG" + "${COMPOSE[@]}" --project-directory "$INSTALL_DIR" --env-file "$INSTALL_DIR/.env" -f "$INSTALL_DIR/compose.yaml" "${COMPOSE_FUSE[@]}" logs app >>"$INSTALL_LOG" 2>&1 || true + [[ -n $previous_int ]] && eval "$previous_int" || trap - INT + [[ -n $previous_term ]] && eval "$previous_term" || trap - TERM + return 130 + fi + elapsed=$(( $(date +%s) - started_at )) + if curl --fail --silent "http://127.0.0.1:$API_PORT/api/health" >/dev/null; then + [[ -n $previous_int ]] && eval "$previous_int" || trap - INT + [[ -n $previous_term ]] && eval "$previous_term" || trap - TERM + return 0 + fi + printf '\033[2K\r[%d/%d] 等待 XyMediaVault 健康检查(已用 %s 秒)' "$STEP" "$TOTAL_STEPS" "$elapsed" + printf 'XyMediaVault health status: elapsed=%s\n' "$elapsed" >>"$INSTALL_LOG" + sleep 2 + done +} +wait_for_app_health || die 'XyMediaVault 健康检查被中断,安装未完成' +cp "$INSTALL_LOG" "$INSTALL_DIR/install.log" 2>/dev/null || true +printf '\033[2K\r[%d/%d] 安装完成:XyMediaVault 已就绪\n' "$TOTAL_STEPS" "$TOTAL_STEPS" +printf '管理地址:http://127.0.0.1:%s\n安装日志:%s\n' "$API_PORT" "$INSTALL_LOG" +exit 0