#!/usr/bin/env bash set -e cd "$(dirname "$0")" # 加载本地 .env(如果存在),便于在开发环境下配置 WECHAT_UPSTREAM_BASE_URL 等 if [ -f ".env" ]; then set -o allexport # shellcheck disable=SC1091 . ./.env set +o allexport fi FRONTEND_PORT=${FRONTEND_PORT:-3000} BACKEND_PORT=${BACKEND_PORT:-8000} UPSTREAM_URL=${WECHAT_UPSTREAM_BASE_URL:-http://your-wechat-server-host:port} # 自动结束占用端口的进程(macOS / Linux 通用) kill_port() { local port=$1 local pids pids=$(lsof -ti :"${port}" 2>/dev/null || true) if [ -n "$pids" ]; then echo "Killing process(es) on port ${port}: ${pids}" echo "$pids" | xargs kill -9 2>/dev/null || true fi } echo "Checking ports ${FRONTEND_PORT} and ${BACKEND_PORT}..." kill_port "${FRONTEND_PORT}" kill_port "${BACKEND_PORT}" sleep 1 echo "Using ports: frontend=${FRONTEND_PORT}, backend=${BACKEND_PORT}" echo "WECHAT_UPSTREAM_BASE_URL=${UPSTREAM_URL}" echo "Ensuring Python venv and backend deps..." if [ ! -d ".venv" ]; then python3 -m venv .venv fi source .venv/bin/activate pip install -r backend/requirements.txt >/dev/null echo "Ensuring Node dependencies..." npm install >/dev/null echo "Starting FastAPI backend on :${BACKEND_PORT}..." WECHAT_UPSTREAM_BASE_URL="${UPSTREAM_URL}" uvicorn backend.main:app --host 0.0.0.0 --port "${BACKEND_PORT}" & BACKEND_PID=$! echo "Starting Node frontend dev server on :${FRONTEND_PORT}..." PORT="${FRONTEND_PORT}" BACKEND_PORT="${BACKEND_PORT}" npm run dev & FRONTEND_PID=$! trap 'echo "Stopping dev servers..."; kill ${BACKEND_PID} ${FRONTEND_PID} 2>/dev/null || true' INT TERM # On macOS /posix sh, wait -n is not available; wait on both instead. wait "${BACKEND_PID}" wait "${FRONTEND_PID}"