#!/usr/bin/env bash set -euo pipefail # ===== 本地调试启动脚本:后端 reload + 前端热更新 ===== ROOT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$ROOT_DIR" if [ -f "$ROOT_DIR/.env" ]; then set -a # 调试模式复用 Docker 部署的环境变量,尤其是 JWT 和敏感字段加密密钥。 # shellcheck disable=SC1091 source "$ROOT_DIR/.env" set +a fi BACKEND_HOST="${BACKEND_HOST:-0.0.0.0}" BACKEND_PORT="${BACKEND_PORT:-8800}" FRONTEND_HOST="${FRONTEND_HOST:-0.0.0.0}" FRONTEND_PORT="${FRONTEND_PORT:-5174}" LOG_LEVEL="${LOG_LEVEL:-DEBUG}" BACKEND_PID="" FRONTEND_PID="" cleanup() { trap - EXIT INT TERM if [ -n "$FRONTEND_PID" ] && kill -0 "$FRONTEND_PID" 2>/dev/null; then kill "$FRONTEND_PID" 2>/dev/null || true fi if [ -n "$BACKEND_PID" ] && kill -0 "$BACKEND_PID" 2>/dev/null; then kill "$BACKEND_PID" 2>/dev/null || true fi } require_cmd() { if ! command -v "$1" >/dev/null 2>&1; then echo "缺少命令: $1" exit 1 fi } require_cmd uv require_cmd npm mkdir -p data logs echo "" echo "==============================" echo " 本地调试模式" echo "==============================" echo " 后端: http://${BACKEND_HOST}:${BACKEND_PORT}" echo " 前端: http://localhost:${FRONTEND_PORT}" echo " API 代理: http://127.0.0.1:${BACKEND_PORT}" echo " 退出: Ctrl+C" echo "==============================" echo "" trap cleanup EXIT INT TERM LOG_LEVEL="$LOG_LEVEL" \ uv run uvicorn web.backend.main:app \ --host "$BACKEND_HOST" \ --port "$BACKEND_PORT" \ --reload \ --reload-dir core \ --reload-dir utils \ --reload-dir web/backend & BACKEND_PID=$! ( cd web/frontend VITE_BACKEND_TARGET="http://127.0.0.1:${BACKEND_PORT}" \ npm run dev -- --host "$FRONTEND_HOST" --port "$FRONTEND_PORT" ) & FRONTEND_PID=$! while true; do if ! kill -0 "$BACKEND_PID" 2>/dev/null; then wait "$BACKEND_PID" exit $? fi if ! kill -0 "$FRONTEND_PID" 2>/dev/null; then wait "$FRONTEND_PID" exit $? fi sleep 1 done