fix(dev): 修复演示会话导致的登录回跳并默认输出运行日志
ci / 质量门禁 (push) Canceled after 0s

背景:
- dev.sh 会把仓库根 .env 的变量全部导出给子进程,其中
  VITE_PUBLIC_DEMO_SESSION=true 被 Vite 读取后启用演示会话:登录写入
  假 token,进入 /users 后真实接口 401、刷新失败即清会话回登录页;
- 后台启动后终端看不到运行日志,不利于排查。

改动:
- dev.sh 不再向子进程导出 VITE_*,前端环境仍由 Vite 自己管理;
- .env.example 的 VITE_PUBLIC_DEMO_SESSION 默认改为 false(本地
  .env / .env.local 同步);
- ./dev.sh 默认启动后前台跟随日志(Ctrl+C 停止全部),新增
  -d/--detach 后台模式;非交互环境仍默认后台;
- README 同步脚本用法。

影响面:
- 仅开发脚本与示例环境;生产与 CI 不涉及;演示会话仍可通过显式
  VITE_PUBLIC_DEMO_SESSION=true 开启。

回滚方式:
- 回滚本提交即恢复后台启动与 VITE_* 透传行为。

验证证据:
- 浏览器登录会真实请求 POST /api/v1/auth/login,错误账号返回
  「账号或密码不正确」;
- 真实账号登录后停留在 /users 并加载 9 条成员,不再回跳登录页;
- ./dev.sh -f 持续输出 api/web/worker 日志,SIGTERM 后服务与端口
  全部释放;
- bash -n dev.sh 与 pnpm format:check 通过。
This commit is contained in:
Stev_Wang committed 2026-11-03 09:45:09 +08:00
1 parent 4f8f7c587d
commit 2c8dd5040f
3 files changed
+23 -6

No files matched your search

+1 -1
View File
@@ -45,7 +45,7 @@ WORKER_CONCURRENCY=2
# ---------- 前端(只能暴露 VITE_PUBLIC_* 前缀,ENV-07) ----------
VITE_PUBLIC_API_BASE_URL=http://127.0.0.1:3000/api/v1
# A0 登录壳没有接后端鉴权,置 true 时登录页写入本地演示会话以便查看布局;A1 接入真实登录后删除。
VITE_PUBLIC_DEMO_SESSION=true
VITE_PUBLIC_DEMO_SESSION=false
# ---------- 可观测 ----------
OTEL_EXPORTER_OTLP_ENDPOINT=
+3 -2
View File
@@ -79,10 +79,11 @@ pnpm db:seed # 幂等写入 system_configs 基线
pnpm dev # 并行启动 api(3000) / web(5173) / worker
```
也可以使用一键脚本(后台启动、自动检测并释放端口、带健康检查):
也可以使用一键脚本(自动检测并释放端口、带健康检查,启动后默认跟随日志):
```bash
./dev.sh # 启动 api + web + worker
./dev.sh # 启动 api + web + worker,并前台跟随日志(Ctrl+C 停止全部)
./dev.sh start -d # 后台启动
./dev.sh status # 端口 / PID / 健康状态
./dev.sh logs [api|web|worker] # 跟踪日志(默认全部)
./dev.sh stop # 停止并释放 3000 / 5173
+19 -3
View File
@@ -49,7 +49,8 @@ WORKER_FILTER="@lingxi/worker"
# shellcheck disable=SC2034
COMMAND="start"
SERVICES=("api" "web" "worker")
FOLLOW=0
# auto:终端下启动后直接跟随日志;非交互(脚本/CI)默认后台
FOLLOW="auto"
AUTO_KILL=1
# ---------- 输出 ----------
@@ -71,8 +72,9 @@ usage() {
灵犀 · 开发机服务启动脚本(不启动 DB / Redis 容器)
用法:
./dev.sh 启动(默认 api + web + worker)
./dev.sh 启动服务并前台跟随运行日志(Ctrl+C 停止全部)
./dev.sh start 同上
./dev.sh start -d 后台启动,立即返回
./dev.sh stop 停止全部服务并释放端口
./dev.sh restart 重启
./dev.sh status 查看端口、PID 与健康状态
@@ -83,7 +85,8 @@ usage() {
--api-only 只启动 api
--web-only 只启动 web
--no-worker 不启动 worker
--follow, -f 启动后前台跟踪日志,Ctrl+C 停止全部
-d, --detach 后台启动,不跟随日志
-f, --follow 强制前台跟随日志(默认在终端下开启)
--no-kill 端口占用时不自动结束,直接报错退出
-h, --help 显示帮助
@@ -130,6 +133,8 @@ parse_args() {
;;
--follow|-f)
FOLLOW=1; shift ;;
-d|--detach)
FOLLOW=0; shift ;;
--no-kill)
AUTO_KILL=0; shift ;;
-h|--help)
@@ -301,6 +306,8 @@ load_env_files() {
value="${value%\"}"
value="${value#\'}"
value="${value%\'}"
# VITE_* 交给前端自己的 envDir 处理,避免覆盖 Vite 的构建/运行配置
case "$key" in VITE_*) continue ;; esac
# shell 里已有的变量优先,不覆盖
if [[ -z "${!key:-}" ]]; then
export "$key=$value"
@@ -490,12 +497,18 @@ start_services() {
local files=()
for service in "${SERVICES[@]}"; do files+=("$(svc_log "$service")"); done
sleep 0.3
printf '\n'
dim "以下为运行日志,按 Ctrl+C 停止全部服务"
printf '\n'
# 后台 tail + wait:前台 tail 会阻塞信号 trap,导致 Ctrl+C 不生效
tail -n 20 -F "${files[@]}" &
TAIL_PID=$!
trap cleanup_follow INT TERM
wait "$TAIL_PID" || true
stop_services
else
printf '\n'
dim "后台运行中:./dev.sh logs 查看日志,./dev.sh stop 停止服务"
fi
}
@@ -568,6 +581,9 @@ clean_state() {
# ---------- 主流程 ----------
parse_args "$@"
if [[ "$FOLLOW" == "auto" ]]; then
if [[ -t 1 ]]; then FOLLOW=1; else FOLLOW=0; fi
fi
load_env_files
resolve_ports