100 lines
3.0 KiB
Bash
100 lines
3.0 KiB
Bash
|
|
#!/usr/bin/env bash
|
|||
|
|
|
|||
|
|
set -euo pipefail
|
|||
|
|
|
|||
|
|
echo "🚀 启动 X-Request 高性能 FastAPI 框架"
|
|||
|
|
|
|||
|
|
# 永远从脚本所在目录运行(避免在别的目录执行导致找不到 venv / requirements / .env)
|
|||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|||
|
|
cd "$SCRIPT_DIR"
|
|||
|
|
|
|||
|
|
mkdir -p logs
|
|||
|
|
PID_FILE="logs/xrequest.pid"
|
|||
|
|
LOG_FILE="logs/xrequest.server.log"
|
|||
|
|
|
|||
|
|
# 检查虚拟环境是否存在
|
|||
|
|
if [ ! -d "xrequest" ]; then
|
|||
|
|
echo "❌ 虚拟环境不存在,请先运行:"
|
|||
|
|
echo " ./setup.sh"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 选择虚拟环境里的 Python(不要依赖 source activate,也不要回退系统 Python)
|
|||
|
|
VENV_PY=""
|
|||
|
|
if [ -f "xrequest/Scripts/python.exe" ]; then
|
|||
|
|
VENV_PY="xrequest/Scripts/python.exe"
|
|||
|
|
elif [ -f "xrequest/bin/python" ]; then
|
|||
|
|
VENV_PY="xrequest/bin/python"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if [ -z "$VENV_PY" ]; then
|
|||
|
|
echo "❌ 未找到虚拟环境 Python,可尝试重新创建虚拟环境:"
|
|||
|
|
echo " rm -rf xrequest && ./setup.sh"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "✅ 使用虚拟环境 Python: $VENV_PY"
|
|||
|
|
|
|||
|
|
# 检查 .env 文件是否存在
|
|||
|
|
if [ ! -f ".env" ]; then
|
|||
|
|
echo "❌ 环境配置文件 .env 不存在,请先运行:"
|
|||
|
|
echo " ./setup.sh"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 读取 .env 文件中的配置
|
|||
|
|
PORT="8000" # 默认端口
|
|||
|
|
HOST="0.0.0.0" # 默认主机
|
|||
|
|
|
|||
|
|
# 解析 .env 文件(简单解析 PORT 和 HOST)
|
|||
|
|
if [ -f ".env" ]; then
|
|||
|
|
# 使用 grep 和 sed 来提取 PORT 和 HOST(忽略注释)
|
|||
|
|
PORT=$(grep -v '^#' .env | grep '^PORT=' | head -1 | cut -d= -f2 | tr -d '"' || echo "8000")
|
|||
|
|
HOST=$(grep -v '^#' .env | grep '^HOST=' | head -1 | cut -d= -f2 | tr -d '"' || echo "0.0.0.0")
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "📋 使用配置: HOST=$HOST, PORT=$PORT"
|
|||
|
|
|
|||
|
|
# 快速校验关键依赖是否可导入(避免跑到一半才 ModuleNotFoundError)
|
|||
|
|
if ! "$VENV_PY" -c "import uvicorn" >/dev/null 2>&1; then
|
|||
|
|
echo "❌ 虚拟环境缺少 uvicorn(或未正确安装依赖)。请运行:"
|
|||
|
|
echo " ./setup.sh"
|
|||
|
|
echo " 或手动安装:$VENV_PY -m pip install -r requirements.txt"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if [ -f "$PID_FILE" ]; then
|
|||
|
|
OLD_PID="$(cat "$PID_FILE" 2>/dev/null || true)"
|
|||
|
|
if [ -n "$OLD_PID" ] && kill -0 "$OLD_PID" >/dev/null 2>&1; then
|
|||
|
|
echo "✅ X-Request 已在后台运行 (pid=$OLD_PID)"
|
|||
|
|
echo "📄 日志: $LOG_FILE"
|
|||
|
|
exit 0
|
|||
|
|
fi
|
|||
|
|
rm -f "$PID_FILE" || true
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "🎯 启动应用服务..."
|
|||
|
|
echo "📚 API文档地址: http://localhost:$PORT/docs"
|
|||
|
|
echo "🏥 健康检查: http://localhost:$PORT/health"
|
|||
|
|
echo "📊 应用信息: http://localhost:$PORT/info"
|
|||
|
|
echo "⏹️ 停止服务: ./stop.sh"
|
|||
|
|
echo "📄 日志: $LOG_FILE"
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
nohup "$VENV_PY" "main.py" >>"$LOG_FILE" 2>&1 &
|
|||
|
|
PID_NUM=$!
|
|||
|
|
echo $PID_NUM > "$PID_FILE"
|
|||
|
|
sleep 0.5 # 等待PID文件写入
|
|||
|
|
|
|||
|
|
if [ -f "$PID_FILE" ]; then
|
|||
|
|
SAVED_PID=$(cat "$PID_FILE")
|
|||
|
|
echo "✅ 已在后台启动 (pid=$SAVED_PID)"
|
|||
|
|
else
|
|||
|
|
echo "⚠️ 启动成功但PID文件创建失败,使用进程号: $PID_NUM"
|
|||
|
|
echo $PID_NUM > "$PID_FILE"
|
|||
|
|
echo "✅ 已在后台启动 (pid=$PID_NUM)"
|
|||
|
|
fi
|
|||
|
|
echo " 查看日志: tail -f $LOG_FILE"
|
|||
|
|
echo " 停止服务: ./stop.sh"
|
|||
|
|
|