- FastAPI backend with SQLModel, Alembic migrations, AgentScope agents - Next.js 15 frontend with React 19, Tailwind, Zustand, React Flow - Multi-provider AI system (DashScope, Kling, MiniMax, Volcengine, OpenAI, etc.) - All HTTP clients migrated from sync requests to async httpx - Admin-managed API keys via environment variables - SSRF vulnerability fixed in ensure_url()
119 lines
3.8 KiB
Bash
119 lines
3.8 KiB
Bash
#!/bin/bash
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
echo -e "${BLUE}"
|
|
echo "╔════════════════════════════════════════════════════════════╗"
|
|
echo "║ Pixel Backend 启动脚本 ║"
|
|
echo "╚════════════════════════════════════════════════════════════╝"
|
|
echo -e "${NC}"
|
|
echo ""
|
|
|
|
# 检查是否在 backend 目录
|
|
if [[ ! -f "pyproject.toml" ]]; then
|
|
echo -e "${RED}❌ 错误: 请在 backend 目录下运行此脚本${NC}"
|
|
echo " cd backend && ./start.sh"
|
|
exit 1
|
|
fi
|
|
|
|
# 检查 uv 是否安装
|
|
if ! command -v uv &> /dev/null; then
|
|
echo -e "${RED}❌ uv 未安装${NC}"
|
|
echo " 请运行: pip install uv"
|
|
exit 1
|
|
fi
|
|
|
|
# 检查虚拟环境
|
|
if [ ! -d ".venv" ]; then
|
|
echo -e "${YELLOW}⚠️ 虚拟环境不存在,正在创建...${NC}"
|
|
uv sync
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}❌ 虚拟环境创建失败${NC}"
|
|
exit 1
|
|
fi
|
|
echo -e "${GREEN}✅ 虚拟环境创建成功${NC}"
|
|
echo ""
|
|
fi
|
|
|
|
# 检查关键依赖
|
|
echo "🔍 检查依赖..."
|
|
MISSING_DEPS=false
|
|
|
|
if ! uv run python -c "import prometheus_client" 2>/dev/null; then
|
|
echo -e "${RED}❌ prometheus_client 缺失${NC}"
|
|
MISSING_DEPS=true
|
|
fi
|
|
|
|
if ! uv run python -c "import fastapi" 2>/dev/null; then
|
|
echo -e "${RED}❌ fastapi 缺失${NC}"
|
|
MISSING_DEPS=true
|
|
fi
|
|
|
|
if ! uv run python -c "import agentscope" 2>/dev/null; then
|
|
echo -e "${RED}❌ agentscope 缺失${NC}"
|
|
MISSING_DEPS=true
|
|
fi
|
|
|
|
if [ "$MISSING_DEPS" = true ]; then
|
|
echo ""
|
|
echo -e "${YELLOW}⚠️ 检测到缺失依赖,正在同步...${NC}"
|
|
uv sync
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}❌ 依赖同步失败${NC}"
|
|
echo " 请运行: ./fix_dependencies.sh"
|
|
exit 1
|
|
fi
|
|
echo -e "${GREEN}✅ 依赖同步成功${NC}"
|
|
fi
|
|
|
|
echo -e "${GREEN}✅ 所有依赖已就绪${NC}"
|
|
echo ""
|
|
|
|
# 检查环境变量
|
|
if [ ! -f "src/.env" ] && [ ! -f ".env" ]; then
|
|
echo -e "${YELLOW}⚠️ 环境变量文件不存在${NC}"
|
|
echo " 建议创建 src/.env 并配置 API 密钥"
|
|
echo ""
|
|
fi
|
|
|
|
# 检查端口占用
|
|
if lsof -i :8000 &> /dev/null; then
|
|
echo -e "${YELLOW}⚠️ 端口 8000 已被占用${NC}"
|
|
echo " 占用进程:"
|
|
lsof -i :8000 | tail -n +2 | awk '{print " PID: "$2", Command: "$1}'
|
|
echo ""
|
|
read -p "是否终止占用进程? (y/N): " -n 1 -r
|
|
echo ""
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
PID=$(lsof -ti :8000)
|
|
kill -9 $PID
|
|
echo -e "${GREEN}✅ 已终止进程 $PID${NC}"
|
|
echo ""
|
|
else
|
|
echo " 使用其他端口启动: uv run uvicorn src.main:app --reload --port 8001"
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
# 启动服务
|
|
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
echo -e "${GREEN}🚀 启动 Pixel Backend...${NC}"
|
|
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
echo ""
|
|
echo " 服务地址: http://127.0.0.1:8000"
|
|
echo " API 文档: http://127.0.0.1:8000/docs"
|
|
echo " 健康检查: http://127.0.0.1:8000/health"
|
|
echo ""
|
|
echo " 按 Ctrl+C 停止服务"
|
|
echo ""
|
|
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
echo ""
|
|
|
|
# 启动服务
|
|
uv run uvicorn src.main:app --reload --port 8000
|