diff --git a/VERSION b/VERSION index 0f1a7dfc..9b1bb851 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.37.0 +0.37.1 diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 521a1c03..eb3dcfcb 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -8,6 +8,19 @@ This project follows the repository versioning rule: - `improvement` -> `+0.0.1`(bugfix + 小功能混合) - `bugfix` -> `+0.0.1` +## [0.37.1] — 2026-04-23 + +### ✨ Highlights +- `planet.sh` 后端重启链路修复 `uvicorn --reload` 残留 worker 场景,`restart` 现在能真正替换旧实例 + +### 🔧 Improvements +- 收口后端清理逻辑,统一按 `uvicorn` 进程、端口占用进程和进程组执行清理,减少 reload 场景漏杀分支 + +### 🐛 Fixes +- 修复部分机器执行 `./planet.sh restart --allow-lan` 后后端仍停留旧实例,导致 `/api/v1/visualization/geo/compute-centers` 返回 `404` 的问题 + +--- + ## [0.35.1] — 2026-04-22 ## [0.37.0] — 2026-04-23 diff --git a/docs/version-history.md b/docs/version-history.md index d0af32d6..b43c098a 100644 --- a/docs/version-history.md +++ b/docs/version-history.md @@ -16,12 +16,13 @@ ## Current Version - `main` 当前主线历史推导到:`0.16.5` -- `dev` 当前开发分支历史推导到:`0.37.0` +- `dev` 当前开发分支历史推导到:`0.37.1` ## Timeline | Version | Type | Branch | Commit | Summary | | --- | --- | --- | --- | --- | +| `0.37.1` | bugfix | `dev` | `pending` | 修复 `planet.sh` 在 `uvicorn --reload` 场景下未清理旧 worker 的问题,避免后端重启后仍停留旧实例并导致算力中心聚合接口 404 | | `0.37.0` | feature | `dev` | `pending` | Earth 连线系统从巡航语义中完全解耦为通用 callout connector,统一桌面/移动端对象级锚点、临界区锚点滑动与稳定巡航展示链路 | | `0.36.0` | feature | `dev` | `pending` | Earth 新增统一算力中心图层与估算位置展示,继续收口拖拽交互,并补充 AI Provider 指纹与 WSL 局域网访问支撑 | | `0.35.1` | bugfix | `dev` | `pending` | 收口 Earth 桌面 HUD 与移动端抽屉的统一统计绑定机制,修复态势统计在图层切换后的同步遗漏 | diff --git a/frontend/package.json b/frontend/package.json index 460ae7b2..643cfcc0 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "planet-frontend", - "version": "0.37.0", + "version": "0.37.1", "private": true, "packageManager": "bun@1", "dependencies": { diff --git a/planet.sh b/planet.sh index e6e3a8ff..1b481e8e 100755 --- a/planet.sh +++ b/planet.sh @@ -1025,7 +1025,14 @@ start_postgres_service() { # Backend lifecycle helpers cleanup_backend_processes() { - pkill -f "uvicorn" 2>/dev/null || true + local backend_port="${1:-$DEFAULT_BACKEND_PORT}" + terminate_backend_processes TERM "$backend_port" + + if ! wait_for_port_release "$backend_port"; then + terminate_backend_processes KILL "$backend_port" + + wait_for_port_release "$backend_port" || true + fi } start_backend_with_retry() { @@ -1033,7 +1040,7 @@ start_backend_with_retry() { local retry=1 while [ "$retry" -le "$BACKEND_MAX_RETRIES" ]; do - cleanup_backend_processes + cleanup_backend_processes "$backend_port" cd "$SCRIPT_DIR/backend" PYTHONPATH="$SCRIPT_DIR/backend" nohup uv run --project "$SCRIPT_DIR" python -m uvicorn app.main:app --host 0.0.0.0 --port "$backend_port" --reload > /tmp/planet_backend.log 2>&1 & BACKEND_PID=$! @@ -1242,6 +1249,39 @@ collect_port_pids() { return 1 } +terminate_process_group() { + local signal="$1" + local pid="$2" + local pgid="" + + [ -n "$pid" ] || return 0 + kill -0 "$pid" 2>/dev/null || return 0 + + pgid="$(ps -o pgid= -p "$pid" 2>/dev/null | tr -d '[:space:]')" + [ -n "$pgid" ] || return 0 + + kill "-${signal}" -- "-${pgid}" 2>/dev/null || true +} + +terminate_backend_processes() { + local signal="$1" + local backend_port="$2" + local pids="" + local pid="" + + pids="$(pgrep -f "uvicorn" 2>/dev/null || true)" + for pid in $pids; do + terminate_process_group "$signal" "$pid" + terminate_process_tree "$signal" "$pid" + done + + pids="$(collect_port_pids "$backend_port" || true)" + for pid in $pids; do + terminate_process_group "$signal" "$pid" + terminate_process_tree "$signal" "$pid" + done +} + terminate_process_tree() { local signal="$1" local pid="$2" @@ -1521,8 +1561,8 @@ stop_container_if_running() { } stop_backend_service() { - if pgrep -f "uvicorn" >/dev/null 2>&1; then - cleanup_backend_processes + if pgrep -f "uvicorn" >/dev/null 2>&1 || ! can_bind_port "$DEFAULT_BACKEND_PORT"; then + cleanup_backend_processes "$DEFAULT_BACKEND_PORT" log_halt "后端服务已停止" fi } diff --git a/pyproject.toml b/pyproject.toml index 1a009659..9d626dba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "planet" -version = "0.37.0" +version = "0.37.1" description = "智能星球计划 - 态势感知系统" requires-python = ">=3.14" dependencies = [ diff --git a/uv.lock b/uv.lock index 9d02b2c7..98c35a5b 100644 --- a/uv.lock +++ b/uv.lock @@ -475,7 +475,7 @@ wheels = [ [[package]] name = "planet" -version = "0.37.0" +version = "0.37.1" source = { virtual = "." } dependencies = [ { name = "aiofiles" },