diff --git a/.env.example b/.env.example index 3b8c533..de6d2af 100644 --- a/.env.example +++ b/.env.example @@ -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= diff --git a/README.md b/README.md index 57ad5aa..0a82310 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/dev.sh b/dev.sh index 823e3c0..04596e0 100755 --- a/dev.sh +++ b/dev.sh @@ -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