65 lines
1.7 KiB
Bash
65 lines
1.7 KiB
Bash
#!/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}"
|
||
|
||
|