300 lines
10 KiB
Bash
300 lines
10 KiB
Bash
#!/usr/bin/env bash
|
||
|
||
set -euo pipefail
|
||
|
||
# 永远从脚本所在目录运行(避免在别的目录执行导致 requirements/.env/venv 路径错误)
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
cd "$SCRIPT_DIR"
|
||
|
||
# 函数:加载 .env 文件中的变量
|
||
load_env_file() {
|
||
local env_file=".env"
|
||
if [ -f "$env_file" ]; then
|
||
while IFS='=' read -r key value; do
|
||
# 跳过注释和空行
|
||
[[ "$key" =~ ^#.*$ ]] && continue
|
||
[[ -z "$key" ]] && continue
|
||
|
||
# 移除值两端的引号(如果有)
|
||
value=$(echo "$value" | sed 's/^["'\'']//' | sed 's/["'\'']$//')
|
||
|
||
# 导出变量
|
||
export "$key=$value"
|
||
done < "$env_file"
|
||
fi
|
||
}
|
||
|
||
echo "🔧 X-Request 框架环境设置"
|
||
echo "=========================="
|
||
|
||
# 检查当前操作系统
|
||
# 首先检查是否是Windows环境
|
||
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" || "$OSTYPE" == "win32" ]]; then
|
||
OS_TYPE="Windows"
|
||
PYTHON_CMD="python"
|
||
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
||
OS_TYPE="Linux"
|
||
PYTHON_CMD="python3"
|
||
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
||
OS_TYPE="macOS"
|
||
PYTHON_CMD="python3"
|
||
else
|
||
# 使用uname作为后备检测
|
||
OS_TYPE="$(uname -s)"
|
||
if [[ "$OS_TYPE" == *"Windows"* || "$OS_TYPE" == "MSYS"* || "$OS_TYPE" == "MINGW"* ]]; then
|
||
OS_TYPE="Windows"
|
||
PYTHON_CMD="python"
|
||
else
|
||
PYTHON_CMD="python3"
|
||
fi
|
||
fi
|
||
|
||
# 额外检查是否在Windows PowerShell或CMD中运行
|
||
if [[ "$SHELL" == *"powershell"* || "$SHELL" == *"cmd.exe"* ]]; then
|
||
OS_TYPE="Windows"
|
||
PYTHON_CMD="python"
|
||
fi
|
||
|
||
# 检查是否存在python.exe文件(Windows特有)
|
||
if [[ -f "$(which python.exe 2>/dev/null)" ]]; then
|
||
OS_TYPE="Windows"
|
||
PYTHON_CMD="python.exe"
|
||
fi
|
||
|
||
echo "📋 检测到操作系统: $OS_TYPE"
|
||
echo "📋 使用Python命令: $PYTHON_CMD"
|
||
|
||
# 检查Python版本
|
||
echo "📋 检查Python版本..."
|
||
python_version=$($PYTHON_CMD --version 2>&1 | grep -Po '(?<=Python )\d+\.\d+')
|
||
if [ -z "$python_version" ]; then
|
||
python_version=$($PYTHON_CMD --version 2>&1 | awk '{print $2}' | cut -d'.' -f1,2)
|
||
fi
|
||
|
||
echo "✅ 发现Python: $python_version"
|
||
|
||
# 简单的版本比较(不需要bc命令)
|
||
major_version=$(echo $python_version | cut -d'.' -f1)
|
||
minor_version=$(echo $python_version | cut -d'.' -f2)
|
||
|
||
if [ "$major_version" -lt 3 ] || ([ "$major_version" -eq 3 ] && [ "$minor_version" -lt 8 ]); then
|
||
echo "❌ 需要 Python 3.8 或更高版本,当前版本: $python_version"
|
||
exit 1
|
||
fi
|
||
|
||
echo "✅ Python版本检查通过"
|
||
|
||
# 检查虚拟环境是否存在且完整
|
||
VENV_COMPLETE=false
|
||
if [ -d "xrequest" ]; then
|
||
# 检查激活脚本是否存在
|
||
if [ -f "xrequest/Scripts/activate" ] || [ -f "xrequest/bin/activate" ]; then
|
||
echo "✅ 虚拟环境已存在且完整"
|
||
VENV_COMPLETE=true
|
||
else
|
||
echo "⚠️ 虚拟环境存在但不完整,删除并重新创建..."
|
||
rm -rf xrequest
|
||
fi
|
||
fi
|
||
|
||
# 如果虚拟环境不存在或不完整,创建新的虚拟环境
|
||
if [ "$VENV_COMPLETE" = false ]; then
|
||
echo "📦 创建虚拟环境..."
|
||
|
||
# 根据操作系统类型选择不同的虚拟环境创建方式
|
||
if [ "$OS_TYPE" = "Windows" ]; then
|
||
# 在Windows上使用python -m venv
|
||
$PYTHON_CMD -m venv xrequest
|
||
|
||
if [ $? -eq 0 ]; then
|
||
# 检查虚拟环境是否创建成功
|
||
if [ -f "xrequest/Scripts/activate" ]; then
|
||
echo "✅ 虚拟环境创建完成"
|
||
else
|
||
echo "⚠️ 虚拟环境创建可能失败,尝试使用pip创建..."
|
||
# 如果venv创建失败,尝试使用pip安装virtualenv并创建虚拟环境
|
||
$PYTHON_CMD -m pip install --user virtualenv
|
||
$PYTHON_CMD -m virtualenv xrequest
|
||
if [ $? -eq 0 ]; then
|
||
if [ -f "xrequest/Scripts/activate" ]; then
|
||
echo "✅ 虚拟环境创建完成(使用virtualenv)"
|
||
else
|
||
echo "❌ 虚拟环境创建失败,请手动创建虚拟环境"
|
||
echo " 手动创建方法:"
|
||
echo " 1. 安装virtualenv:pip install virtualenv"
|
||
echo " 2. 创建虚拟环境:virtualenv xrequest"
|
||
echo " 3. 激活虚拟环境:xrequest/Scripts/activate"
|
||
echo " 4. 安装依赖:pip install -r requirements.txt"
|
||
fi
|
||
else
|
||
echo "❌ 虚拟环境创建失败,请手动创建虚拟环境"
|
||
echo " 手动创建方法:"
|
||
echo " 1. 安装virtualenv:pip install virtualenv"
|
||
echo " 2. 创建虚拟环境:virtualenv xrequest"
|
||
echo " 3. 激活虚拟环境:xrequest/Scripts/activate"
|
||
echo " 4. 安装依赖:pip install -r requirements.txt"
|
||
fi
|
||
fi
|
||
else
|
||
echo "❌ 虚拟环境创建失败,请手动创建虚拟环境"
|
||
echo " 手动创建方法:"
|
||
echo " 1. 安装virtualenv:pip install virtualenv"
|
||
echo " 2. 创建虚拟环境:virtualenv xrequest"
|
||
echo " 3. 激活虚拟环境:xrequest/Scripts/activate"
|
||
echo " 4. 安装依赖:pip install -r requirements.txt"
|
||
fi
|
||
else
|
||
# 在Linux/Mac上使用python3 -m venv
|
||
$PYTHON_CMD -m venv xrequest
|
||
|
||
if [ $? -eq 0 ]; then
|
||
# 检查虚拟环境是否创建成功
|
||
if [ -f "xrequest/bin/activate" ]; then
|
||
echo "✅ 虚拟环境创建完成"
|
||
else
|
||
echo "⚠️ 虚拟环境创建可能失败,尝试使用pip创建..."
|
||
# 如果venv创建失败,尝试使用pip安装virtualenv并创建虚拟环境
|
||
$PYTHON_CMD -m pip install --user virtualenv
|
||
$PYTHON_CMD -m virtualenv xrequest
|
||
if [ $? -eq 0 ]; then
|
||
if [ -f "xrequest/bin/activate" ]; then
|
||
echo "✅ 虚拟环境创建完成(使用virtualenv)"
|
||
else
|
||
echo "❌ 虚拟环境创建失败,请手动创建虚拟环境"
|
||
echo " 手动创建方法:"
|
||
echo " 1. 安装virtualenv:pip install virtualenv"
|
||
echo " 2. 创建虚拟环境:virtualenv xrequest"
|
||
echo " 3. 激活虚拟环境:source xrequest/bin/activate"
|
||
echo " 4. 安装依赖:pip install -r requirements.txt"
|
||
fi
|
||
else
|
||
echo "❌ 虚拟环境创建失败,请手动创建虚拟环境"
|
||
echo " 手动创建方法:"
|
||
echo " 1. 安装virtualenv:pip install virtualenv"
|
||
echo " 2. 创建虚拟环境:virtualenv xrequest"
|
||
echo " 3. 激活虚拟环境:source xrequest/bin/activate"
|
||
echo " 4. 安装依赖:pip install -r requirements.txt"
|
||
fi
|
||
fi
|
||
else
|
||
echo "❌ 虚拟环境创建失败,请手动创建虚拟环境"
|
||
echo " 在Linux上,您可能需要先安装python3-venv包:"
|
||
echo " sudo apt install python3.12-venv" # 针对Ubuntu/Debian系统
|
||
echo " 或者:"
|
||
echo " 1. 安装virtualenv:pip install virtualenv"
|
||
echo " 2. 创建虚拟环境:virtualenv xrequest"
|
||
echo " 3. 激活虚拟环境:source xrequest/bin/activate"
|
||
echo " 4. 安装依赖:pip install -r requirements.txt"
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
# 确定激活脚本路径
|
||
# 检查是否存在 Windows 风格的激活脚本
|
||
if [ -f "xrequest/Scripts/activate" ]; then
|
||
ACTIVATE_SCRIPT="xrequest/Scripts/activate"
|
||
echo "📋 使用 Windows 风格的激活脚本: $ACTIVATE_SCRIPT"
|
||
elif [ -f "xrequest/bin/activate" ]; then
|
||
ACTIVATE_SCRIPT="xrequest/bin/activate"
|
||
echo "📋 使用 Linux/Mac 风格的激活脚本: $ACTIVATE_SCRIPT"
|
||
else
|
||
ACTIVATE_SCRIPT=""
|
||
echo "⚠️ 未找到激活脚本"
|
||
fi
|
||
|
||
# 安装依赖(强制使用虚拟环境里的 python -m pip;不要因为 curl 检测失败而跳过安装)
|
||
echo "📦 安装依赖包..."
|
||
|
||
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,无法安装依赖。请先确保虚拟环境创建成功。"
|
||
exit 1
|
||
fi
|
||
|
||
echo "📋 使用虚拟环境 Python: $VENV_PY"
|
||
|
||
echo " 📦 升级 pip/setuptools/wheel..."
|
||
$VENV_PY -m pip install --upgrade pip setuptools wheel
|
||
|
||
echo " 📚 使用 requirements.txt 安装所有依赖..."
|
||
$VENV_PY -m pip install -r requirements.txt
|
||
|
||
echo " 🔎 校验关键依赖..."
|
||
$VENV_PY -c "import uvicorn, fastapi; print('OK: uvicorn/fastapi installed')"
|
||
|
||
echo "✅ 依赖安装完成!"
|
||
|
||
# 加载 .env 文件中的变量
|
||
echo "📄 加载环境配置..."
|
||
load_env_file
|
||
|
||
# 创建日志目录(使用 .env 中的 LOGS_DIR 配置)
|
||
echo "📁 创建日志目录..."
|
||
mkdir -p "${LOGS_DIR:-logs}"
|
||
|
||
# 检查是否存在.env文件,如果不存在则创建
|
||
if [ ! -f ".env" ]; then
|
||
echo "📄 创建环境配置文件..."
|
||
if [ -f ".env.example" ]; then
|
||
cp .env.example .env
|
||
echo "✅ 已从 .env.example 创建 .env 文件,可根据需要修改配置"
|
||
else
|
||
# 如果没有示例文件,创建一个基本的.env文件
|
||
cat > .env << EOF
|
||
# 应用配置
|
||
APP_NAME="X-Request API Framework"
|
||
APP_VERSION="1.0.0"
|
||
DEBUG=false
|
||
|
||
# 服务器配置
|
||
HOST="0.0.0.0"
|
||
PORT=1111
|
||
WORKERS=1
|
||
|
||
# 日志配置
|
||
LOG_LEVEL="INFO"
|
||
LOG_FILE="logs/app.log"
|
||
LOG_FORMAT="json"
|
||
LOG_TO_CONSOLE=false
|
||
|
||
# 高级日志配置
|
||
ADVANCED_LOGGING=true
|
||
LOGS_DIR="logs"
|
||
MAX_LOG_DAYS=30
|
||
ENABLE_LOG_CLEANUP=true
|
||
ROUTE_BASED_LOGGING=true
|
||
|
||
# 性能配置
|
||
MAX_REQUESTS=1000
|
||
MAX_CONNECTIONS=1000
|
||
REQUEST_TIMEOUT=30
|
||
|
||
# CORS配置
|
||
CORS_ORIGINS=["*"]
|
||
CORS_METHODS=["*"]
|
||
CORS_HEADERS=["*"]
|
||
EOF
|
||
echo "✅ 已创建基本的 .env 文件,可根据需要修改配置"
|
||
fi
|
||
fi
|
||
|
||
echo ""
|
||
echo "🎉 环境设置完成!"
|
||
echo ""
|
||
echo "🚀 启动方法:"
|
||
echo " ./start.sh"
|
||
echo " 或者:"
|
||
echo " source xrequest/bin/activate && python main.py"
|
||
echo ""
|
||
echo "📚 API文档地址:"
|
||
echo " http://localhost:${PORT:-3000}/docs"
|
||
echo "🏥 健康检查:"
|
||
echo " http://localhost:${PORT:-3000}/health"
|
||
echo ""
|
||
echo "" |