wangxi 1 week ago
parent
commit
10914d4132
3 changed files with 19 additions and 4 deletions
  1. 1 1
      README.md
  2. 16 1
      deploy.sh
  3. 2 2
      docs/deployment.md

+ 1 - 1
README.md

@@ -80,7 +80,7 @@ sh deploy.sh model       # 准备环境并检查/补下载模型,不更新业
 
 现有 `.env` 不覆盖;若缺失则从 `.env.example` 创建,完整部署会停止并提示填写真实配置,重新执行后继续。`setup`/`model` 可先完成环境和模型准备。Neo4j、Redis、DMS 和 DeepSeek 仍须提前配置可用,脚本不安装这些外部服务。
 
-此入口在当前终端前台运行服务,关闭终端会影响服务;替换代码后可运行 `sh deploy.sh restart`。需要常驻运行时交给服务器的进程管理器管理。日常更新和启动也统一使用此脚本。
+此入口完成准备和更新后,通过 `nohup` 在后台启动服务,退出终端后服务继续运行。日志追加到 `.runtime/service.log`,使用 `tail -f .runtime/service.log` 查看启动结果;替换代码后可运行 `sh deploy.sh restart`。脚本不提供崩溃自动拉起或开机自启。日常更新和启动也统一使用此脚本。
 
 详见 [服务器部署说明](docs/deployment.md),包含安装开关、模型源、镜像源、Windows 使用方式及失败恢复。
 

+ 16 - 1
deploy.sh

@@ -9,6 +9,7 @@ case "$ACTION" in
     echo 'Usage: sh deploy.sh [setup|model|templates|dms|start|restart] [--host HOST] [--port PORT]'
     echo 'setup: install environment and model only; model: ensure model is ready'
     echo 'templates/dms: prepare environment and model, update, then start; start: prepare and start'
+    echo 'Services start in the background; logs: .runtime/service.log'
     echo 'Environment: AUTO_INSTALL_UV=0 disables uv installation; DEPLOY_PYTHON overrides .python-version (default: 3.14.5)'
     exit 0 ;;
   setup|model|templates|dms|start|restart) ;;
@@ -70,6 +71,20 @@ case "$ACTION" in
       uv run --frozen --no-sync --python "$PYTHON_VERSION" python scripts/update_data.py --mode "$ACTION"
     fi
     if [ "$ACTION" = restart ]; then set -- --restart "$@"; fi
-    exec uv run --frozen --no-sync --python "$PYTHON_VERSION" python scripts/start_service.py "$@"
+    mkdir -p "$REPO_ROOT/.runtime"
+    SERVICE_LOG="$REPO_ROOT/.runtime/service.log"
+    nohup uv run --frozen --no-sync --python "$PYTHON_VERSION" python -u scripts/start_service.py "$@" >> "$SERVICE_LOG" 2>&1 < /dev/null &
+    service_pid=$!
+    sleep 2
+    if ! kill -0 "$service_pid" 2>/dev/null; then
+      service_status=0
+      wait "$service_pid" || service_status=$?
+      echo "Service exited during startup (status: $service_status). Check: $SERVICE_LOG" >&2
+      tail -n 30 "$SERVICE_LOG" >&2
+      exit 1
+    fi
+    echo "Service launched in background (launcher PID: $service_pid). Startup may still be in progress."
+    echo "Logs: $SERVICE_LOG"
+    echo "View startup status: tail -f \"$SERVICE_LOG\""
     ;;
 esac

+ 2 - 2
docs/deployment.md

@@ -32,7 +32,7 @@ sh deploy.sh templates
 | `sh deploy.sh start` | 准备环境和模型 → 启动已发布版本 |
 | `sh deploy.sh restart` | 准备完成后优雅停止本项目受管服务,加载新代码启动;不更新业务数据 |
 
-不传参数默认执行 templates。可追加 `--host 0.0.0.0 --port 8000` 覆盖监听配置(setup/model 不接受监听参数)。服务前台运行,Ctrl+C 停止;没有后台 PID 管理、自动杀进程或开机自启。替换代码后使用 `sh deploy.sh restart`;templates/dms 更新前仍需先停止旧实例。
+不传参数默认执行 templates。可追加 `--host 0.0.0.0 --port 8000` 覆盖监听配置(setup/model 不接受监听参数)。准备和数据更新在前台完成,随后通过 `nohup` 后台启动服务,退出终端后服务继续运行。日志追加到 `.runtime/service.log`,使用 `tail -f .runtime/service.log` 查看。脚本检查启动进程是否在最初 2 秒内退出;后台启动提示不代表服务已就绪,最终结果及访问地址以日志为准。没有崩溃自动拉起或开机自启。替换代码后使用 `sh deploy.sh restart`;templates/dms 更新前仍需先停止旧实例。
 
 ## .env 配置示例
 
@@ -107,4 +107,4 @@ sh deploy.sh restart --host 0.0.0.0 --port 8000
 
 服务持有 `.runtime/service.lock`,通过 `.runtime/service-control.json` 中的随机凭据连接本机控制通道;仅请求本项目服务退出,不按端口杀进程。超时或身份确认失败会报错,不强制结束进程或启动新实例。正常退出会清理控制信息。
 
-首次升级到此版本时,已运行的旧服务没有管理记录,需要在原终端按 Ctrl+C 停止一次;之后通过此入口启动的服务均可restart。若其他程序占用端口,仍需手动处理。服务继续前台运行;新实例启动失败时旧服务不会自动恢复。
+首次升级到此版本时,已运行的旧服务没有管理记录,需要在原终端按 Ctrl+C 停止一次;之后通过此入口启动的服务均可restart。若其他程序占用端口,仍需手动处理。重启过程在后台执行,可能需要等待旧服务退出,请查看 `.runtime/service.log` 确认结果;新实例启动失败时旧服务不会自动恢复。