#!/bin/bash # 生产环境启动脚本 - app.py (Flask + SocketIO) # 使用 Gunicorn + geventwebsocket 支持高并发 set -e # 颜色输出 GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color echo -e "${GREEN}============================================${NC}" echo -e "${GREEN}🚀 启动 VF React 生产服务器${NC}" echo -e "${GREEN}============================================${NC}" # 切换到脚本所在目录 cd "$(dirname "$0")" # 检查 Python 环境 if ! command -v python3 &> /dev/null; then echo -e "${RED}❌ Python3 未安装${NC}" exit 1 fi # 检查 gunicorn if ! command -v gunicorn &> /dev/null; then echo -e "${YELLOW}⚠️ Gunicorn 未安装,正在安装...${NC}" pip install gunicorn fi # 检查必要的依赖 echo -e "${GREEN}📦 检查依赖...${NC}" python3 -c "import gevent; import geventwebsocket" 2>/dev/null || { echo -e "${RED}❌ 缺少 gevent 或 geventwebsocket${NC}" echo "运行: pip install gevent gevent-websocket" exit 1 } # 检查 Redis echo -e "${GREEN}🔍 检查 Redis 连接...${NC}" python3 -c "import redis; r=redis.Redis(); r.ping()" 2>/dev/null || { echo -e "${YELLOW}⚠️ Redis 连接失败,请确保 Redis 正在运行${NC}" } # 停止旧进程(如果存在) if [ -f /tmp/gunicorn_app.pid ]; then OLD_PID=$(cat /tmp/gunicorn_app.pid) if kill -0 $OLD_PID 2>/dev/null; then echo -e "${YELLOW}🛑 停止旧进程 (PID: $OLD_PID)...${NC}" kill -TERM $OLD_PID sleep 2 fi fi # 启动服务器 echo -e "${GREEN}🚀 启动 Gunicorn + Flask-SocketIO...${NC}" echo -e "${GREEN} 配置: gunicorn_app_config.py${NC}" echo -e "${GREEN} 端口: 5001${NC}" echo -e "${GREEN} Worker: GeventWebSocketWorker${NC}" # 使用 gunicorn 启动(支持 WebSocket 的高并发模式) exec gunicorn -c gunicorn_app_config.py app:app