#!/bin/bash # FastAPI 应用启动脚本 (使用 uv 包管理) set -e echo "========================================" echo "启动 FastAPI 时间序列分析系统 v2.0" echo "========================================" echo "" # 检查 uv if ! command -v /home/syy/.local/bin/uv &> /dev/null; then echo "错误: 未找到 uv" exit 1 fi echo "✓ uv 已安装" echo "" # 检查虚拟环境,如果不存在则创建 if [ ! -d ".venv" ]; then echo "创建虚拟环境..." /home/syy/.local/bin/uv venv --python 3.10 fi # 激活虚拟环境 echo "激活虚拟环境..." source .venv/bin/activate # 加载 .env(不覆盖已存在的环境变量) if [ -f ".env" ]; then echo "加载 .env..." while IFS=$'\t' read -r key quoted_value; do [ -z "$key" ] && continue # 仅允许合法的环境变量名 if [[ ! "$key" =~ ^[A-Za-z_][A-Za-z0-9_]*$ ]]; then continue fi # 已在环境中显式设置的变量优先 if [ -z "${!key+x}" ]; then eval "export ${key}=${quoted_value}" fi done < <(python - <<'PY' import os import shlex try: from dotenv import dotenv_values except Exception: dotenv_values = None if dotenv_values is None: raise SystemExit(0) values = dotenv_values('.env') for k, v in values.items(): if k is None or v is None: continue # 输出:KEYshell_quoted_value print(f"{k}\t{shlex.quote(str(v))}") PY ) echo "✓ .env 加载完成" echo "" fi # 检查并安装依赖 echo "检查依赖..." python -c "import fastapi; import uvicorn; import pandas; import numpy" 2>/dev/null || { echo "安装依赖..." /home/syy/.local/bin/uv pip install \ 'fastapi>=0.104.1' \ 'uvicorn[standard]>=0.24.0' \ 'python-multipart>=0.0.6' \ 'python-dotenv>=1.0.0' \ 'pandas>=2.2.2' \ 'numpy>=1.26.4' \ 'scipy>=1.13.0' \ 'scikit-learn>=1.3.0' \ 'statsmodels>=0.14.0' \ 'matplotlib>=3.7.2' \ 'seaborn>=0.12.2' \ 'openai>=1.3.0' \ 'gradio_client>=0.9.0' \ 'requests>=2.31.0' \ 'psutil>=5.9.5' } echo "✓ 依赖检查完成" echo "" # 创建必要的目录 mkdir -p uploads logs temp resource/fonts # 设置环境变量(如果没有设置) export ENV=${ENV:-"development"} export DEBUG=${DEBUG:-"False"} export HOST=${HOST:-"0.0.0.0"} export PORT=${PORT:-"60201"} export LOG_LEVEL=${LOG_LEVEL:-"INFO"} echo "环境配置:" echo " ENV=$ENV" echo " DEBUG=$DEBUG" echo " HOST=$HOST" echo " PORT=$PORT" echo " LOG_LEVEL=$LOG_LEVEL" echo "" # 启动应用 echo "启动应用..." echo "" echo "==================================" echo "✓ 访问地址: http://localhost:$PORT" echo "✓ API 文档: http://localhost:$PORT/docs" echo "✓ ReDoc: http://localhost:$PORT/redoc" echo "==================================" echo "" echo "按 Ctrl+C 停止应用" echo "" # 使用 uvicorn 运行 python -m uvicorn app.main:app \ --host $HOST \ --port $PORT \ --log-level $(echo $LOG_LEVEL | tr '[:upper:]' '[:lower:]')