159 lines
4.6 KiB
Bash
Executable File
159 lines
4.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# Planet 一键启动脚本
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
cd "$SCRIPT_DIR"
|
|
|
|
echo "🚀 启动智能星球计划..."
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# 检查 Docker 服务
|
|
if ! command -v docker &> /dev/null; then
|
|
echo -e "${RED}❌ Docker 未安装,请先安装 Docker${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
if ! docker info &> /dev/null; then
|
|
echo -e "${RED}❌ Docker 服务未运行,请先启动 Docker${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# 检查并安装 uv
|
|
if ! command -v uv &> /dev/null; then
|
|
echo -e "${YELLOW}📦 安装 uv...${NC}"
|
|
curl -Ls https://astral.sh/uv | sh
|
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
fi
|
|
|
|
# 检查 npm
|
|
if ! command -v npm &> /dev/null; then
|
|
echo -e "${RED}❌ npm 未安装,请先安装 Node.js${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# 启动基础设施 (PostgreSQL + Redis)
|
|
echo -e "${BLUE}🗄️ 启动数据库...${NC}"
|
|
# 检查 docker compose vs docker-compose
|
|
if command -v docker-compose &> /dev/null; then
|
|
docker-compose up -d postgres redis || true
|
|
else
|
|
docker compose up -d postgres redis || true
|
|
fi
|
|
|
|
# 等待数据库就绪
|
|
echo -e "${YELLOW}⏳ 等待数据库就绪...${NC}"
|
|
sleep 5
|
|
|
|
# 检查数据库是否就绪
|
|
MAX_RETRIES=10
|
|
RETRY_COUNT=0
|
|
# 检查 docker compose vs docker-compose
|
|
if command -v docker-compose &> /dev/null; then
|
|
while ! docker exec planet_postgres pg_isready -U postgres &> /dev/null; do
|
|
RETRY_COUNT=$((RETRY_COUNT + 1))
|
|
if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
|
|
echo -e "${RED}❌ 数据库启动超时${NC}"
|
|
exit 1
|
|
fi
|
|
echo -e "${YELLOW} 等待数据库... ($RETRY_COUNT/$MAX_RETRIES)${NC}"
|
|
sleep 2
|
|
done
|
|
else
|
|
while ! docker exec planet_postgres pg_isready -U postgres &> /dev/null; do
|
|
RETRY_COUNT=$((RETRY_COUNT + 1))
|
|
if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
|
|
echo -e "${RED}❌ 数据库启动超时${NC}"
|
|
exit 1
|
|
fi
|
|
echo -e "${YELLOW} 等待数据库... ($RETRY_COUNT/$MAX_RETRIES)${NC}"
|
|
sleep 2
|
|
done
|
|
fi
|
|
echo -e "${GREEN}✅ 数据库已就绪${NC}"
|
|
|
|
# 同步 Python 依赖
|
|
echo -e "${BLUE}🐍 同步 Python 依赖...${NC}"
|
|
uv sync
|
|
|
|
# 初始化数据库
|
|
echo -e "${BLUE}🗃️ 初始化数据库...${NC}"
|
|
PYTHONPATH="$SCRIPT_DIR/backend" python "$SCRIPT_DIR/backend/scripts/init_admin.py" > /dev/null 2>&1 || true
|
|
|
|
# 设置环境变量
|
|
export PYTHONPATH="$SCRIPT_DIR/backend"
|
|
|
|
# 启动后端服务
|
|
echo -e "${BLUE}🔧 启动后端服务...${NC}"
|
|
|
|
# 检查端口 8000 是否被占用
|
|
if lsof -i :8000 > /dev/null 2>&1 || netstat -tlnp 2>/dev/null | grep -q ":8000" || ss -tlnp 2>/dev/null | grep -q ":8000"; then
|
|
echo -e "${RED}❌ 端口 8000 已被占用,请先停止占用端口的进程${NC}"
|
|
echo " 使用命令: ./kill_port.sh 8000 或 lsof -i :8000 查看"
|
|
exit 1
|
|
fi
|
|
|
|
cd "$SCRIPT_DIR/backend"
|
|
PYTHONPATH="$SCRIPT_DIR/backend" nohup python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 > /tmp/planet_backend.log 2>&1 &
|
|
BACKEND_PID=$!
|
|
cd "$SCRIPT_DIR"
|
|
echo " 后端 PID: $BACKEND_PID"
|
|
|
|
# 等待后端启动
|
|
echo -e "${YELLOW}⏳ 等待后端服务启动...${NC}"
|
|
sleep 5
|
|
|
|
# 检查后端是否正常运行
|
|
if ! curl -s http://localhost:8000/health > /dev/null 2>&1; then
|
|
echo -e "${RED}❌ 后端服务启动失败,查看日志: tail /tmp/planet_backend.log${NC}"
|
|
tail -20 /tmp/planet_backend.log
|
|
exit 1
|
|
fi
|
|
echo -e "${GREEN}✅ 后端服务已启动${NC}"
|
|
|
|
# 检查并安装前端依赖
|
|
if [ ! -d "frontend/node_modules" ]; then
|
|
echo -e "${YELLOW}📦 安装前端依赖...${NC}"
|
|
cd frontend
|
|
npm install
|
|
cd ..
|
|
fi
|
|
|
|
# 启动前端服务
|
|
echo -e "${BLUE}🌐 启动前端服务...${NC}"
|
|
cd frontend
|
|
npm run dev > /tmp/planet_frontend.log 2>&1 &
|
|
FRONTEND_PID=$!
|
|
echo " 前端 PID: $FRONTEND_PID"
|
|
|
|
cd ..
|
|
|
|
echo ""
|
|
echo -e "${GREEN}========================================${NC}"
|
|
echo -e "${GREEN}✅ 智能星球计划启动完成!${NC}"
|
|
echo -e "${GREEN}========================================${NC}"
|
|
echo ""
|
|
echo -e "${BLUE}🌐 访问地址:${NC}"
|
|
echo " 后端: http://localhost:8000"
|
|
echo " API文档: http://localhost:8000/docs"
|
|
echo " 前端: http://localhost:3000"
|
|
echo ""
|
|
echo -e "${BLUE}📝 服务进程:${NC}"
|
|
echo " 后端 PID: $BACKEND_PID"
|
|
echo " 前端 PID: $FRONTEND_PID"
|
|
echo ""
|
|
echo -e "${BLUE}📝 日志查看:${NC}"
|
|
echo " tail -f /tmp/planet_backend.log"
|
|
echo " tail -f /tmp/planet_frontend.log"
|
|
echo ""
|
|
echo -e "${BLUE}🛑 停止服务:${NC}"
|
|
echo " pkill -f 'uvicorn' # 停止后端"
|
|
echo " pkill -f 'vite' # 停止前端"
|