#!/bin/bash echo "========================================" echo " AI小红书项目 - 启动所有服务(生产环境)" echo "========================================" echo # 检查Go环境 if ! command -v go &> /dev/null; then echo "[错误] 未检测到Go环境,请先安装Go" exit 1 fi # 检查Python环境 if ! command -v python3 &> /dev/null; then echo "[错误] 未检测到Python环境,请先安装Python3" exit 1 fi # 关闭已运行的服务 echo "[准备] 检查并关闭已运行的服务..." # 从 PID 文件读取并关闭服务 if [ -f "logs/go_backend_prod.pid" ]; then OLD_GO_PID=$(cat logs/go_backend_prod.pid) if kill -0 $OLD_GO_PID 2>/dev/null; then echo "[信息] 关闭旧的Go服务 (PID: $OLD_GO_PID)" kill -9 $OLD_GO_PID 2>/dev/null sleep 1 fi rm -f logs/go_backend_prod.pid fi if [ -f "logs/python_backend_prod.pid" ]; then OLD_PYTHON_PID=$(cat logs/python_backend_prod.pid) if kill -0 $OLD_PYTHON_PID 2>/dev/null; then echo "[信息] 关闭旧的Python服务 (PID: $OLD_PYTHON_PID)" kill -9 $OLD_PYTHON_PID 2>/dev/null sleep 1 fi rm -f logs/python_backend_prod.pid fi # 强制清理:查找并杀掉所有相关的Go进程 echo "[检查] 查找并清理残留的Go服务进程..." GO_PIDS=$(ps aux | grep "[g]o run main.go" | awk '{print $2}') if [ ! -z "$GO_PIDS" ]; then echo "[清理] 发现残留Go进程: $GO_PIDS" echo $GO_PIDS | xargs kill -9 2>/dev/null sleep 1 fi # 强制清理:查找并杀掉所有相关的Python进程(只杀backend目录下的main.py) echo "[检查] 查找并清理残留的Python服务进程..." PYTHON_PIDS=$(ps aux | grep "[p]ython.*main.py" | grep backend | awk '{print $2}') if [ ! -z "$PYTHON_PIDS" ]; then echo "[清理] 发现残留Python进程: $PYTHON_PIDS" echo $PYTHON_PIDS | xargs kill -9 2>/dev/null sleep 1 fi # 检查并清理端口占用(8070端口 - Go服务) echo "[检查] 检查端口8070占用情况..." PORT_8070_PID=$(lsof -ti:8070 2>/dev/null) if [ ! -z "$PORT_8070_PID" ]; then echo "[清理] 端口8070被占用 (PID: $PORT_8070_PID),正在清理..." kill -9 $PORT_8070_PID 2>/dev/null sleep 1 fi # 检查并清理端口占用(8020端口 - Python服务) echo "[检查] 检查端口8020占用情况..." PORT_8020_PID=$(lsof -ti:8020 2>/dev/null) if [ ! -z "$PORT_8020_PID" ]; then echo "[清理] 端口8020被占用 (PID: $PORT_8020_PID),正在清理..." kill -9 $PORT_8020_PID 2>/dev/null sleep 1 fi echo "[完成] 已关闭旧服务并清理端口占用" echo # 检查Python虚拟环境 if [ ! -d "backend/venv" ]; then echo "[警告] Python虚拟环境不存在,正在创建..." cd backend python3 -m venv venv source venv/bin/activate echo "[信息] 正在安装Python依赖..." pip install -r requirements.txt cd .. echo "[成功] Python虚拟环境创建完成" echo fi # 创建日志目录 mkdir -p logs # 启动Go后端服务 echo "[1/2] 正在启动Go后端服务(生产环境)..." cd go_backend go mod tidy nohup go run main.go -env=prod > ../logs/go_backend_prod.log 2>&1 & GO_PID=$! echo "[Go服务] PID: $GO_PID" cd .. # 等待2秒 sleep 2 # 启动Python服务 echo "[2/2] 正在启动Python服务(生产环境)..." cd backend source venv/bin/activate export ENV=prod # 检查是否安装了Xvfb if command -v xvfb-run &> /dev/null; then echo "[Xvfb] 检测到Xvfb,Python服务将使用虚拟显示运行(避免无头模式被检测)" nohup xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" python main.py > ../logs/python_backend_prod.log 2>&1 & PYTHON_PID=$! echo "[Python服务] PID: $PYTHON_PID (使用Xvfb虚拟显示)" else echo "[警告] 未检测到Xvfb,Python服务将使用无头模式(可能触发验证)" echo "[提示] 安装Xvfb: sudo apt-get install -y xvfb" nohup python main.py > ../logs/python_backend_prod.log 2>&1 & PYTHON_PID=$! echo "[Python服务] PID: $PYTHON_PID (无头模式)" fi cd .. echo echo "========================================" echo " 所有服务启动完成!(生产环境)" echo "========================================" echo echo "[Go服务] PID: $GO_PID | 端口: 8070 (生产环境)" echo "[Python服务] PID: $PYTHON_PID | 端口: 8020 (生产环境)" echo echo "日志文件:" echo " Go服务: logs/go_backend_prod.log" echo " Python服务: logs/python_backend_prod.log" echo echo "停止服务命令:" echo " kill $GO_PID $PYTHON_PID" echo echo "查看日志:" echo " tail -f logs/go_backend_prod.log" echo " tail -f logs/python_backend_prod.log" echo echo "注意:使用 config.prod.yaml 生产配置" echo # 保存PID到文件,方便后续停止 echo $GO_PID > logs/go_backend_prod.pid echo $PYTHON_PID > logs/python_backend_prod.pid echo "PID已保存到 logs/*_prod.pid 文件" echo