mirror of
https://github.com/opsre/LiteOps.git
synced 2026-02-06 15:11:10 +08:00
270 lines
6.6 KiB
Bash
Executable File
270 lines
6.6 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# =============================================================================
|
||
# LiteOps 一键启动脚本
|
||
# =============================================================================
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[0;33m'
|
||
BLUE='\033[0;34m'
|
||
PURPLE='\033[0;35m'
|
||
CYAN='\033[0;36m'
|
||
NC='\033[0m' # 无颜色
|
||
|
||
# 打印带颜色的信息
|
||
print_info() {
|
||
echo -e "${BLUE}[INFO]${NC} $1"
|
||
}
|
||
|
||
print_success() {
|
||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||
}
|
||
|
||
print_warning() {
|
||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||
}
|
||
|
||
print_error() {
|
||
echo -e "${RED}[ERROR]${NC} $1"
|
||
}
|
||
|
||
print_step() {
|
||
echo -e "\n${PURPLE}=== $1 ===${NC}"
|
||
}
|
||
|
||
# 端口检查函数
|
||
check_port() {
|
||
local port=$1
|
||
local service_name=$2
|
||
|
||
if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1; then
|
||
print_error "端口 $port 已被占用!"
|
||
print_info "检查占用进程:"
|
||
|
||
# 显示占用进程的详细信息
|
||
local pid=$(lsof -Pi :$port -sTCP:LISTEN -t 2>/dev/null | head -1)
|
||
if [ ! -z "$pid" ]; then
|
||
local process_info=$(ps -p $pid -o pid,ppid,cmd --no-headers 2>/dev/null)
|
||
if [ ! -z "$process_info" ]; then
|
||
echo -e " ${CYAN}PID${NC}: $pid"
|
||
echo -e " ${CYAN}进程${NC}: $process_info"
|
||
fi
|
||
fi
|
||
|
||
print_warning "解决方案:"
|
||
echo -e " 1. 停止占用端口的进程: ${CYAN}kill $pid${NC}"
|
||
echo -e " 2. 或使用强制停止: ${CYAN}kill -9 $pid${NC}"
|
||
echo -e " 3. 或查看所有占用进程: ${CYAN}lsof -i :$port${NC}"
|
||
echo ""
|
||
return 1
|
||
else
|
||
print_info "端口 $port ($service_name) 可用"
|
||
return 0
|
||
fi
|
||
}
|
||
|
||
# 全局变量
|
||
BACKEND_PID=""
|
||
FRONTEND_PID=""
|
||
BACKEND_PORT=8900
|
||
FRONTEND_PORT=8000
|
||
|
||
# 清理函数
|
||
cleanup() {
|
||
print_step "正在清理进程..."
|
||
|
||
if [ ! -z "$BACKEND_PID" ]; then
|
||
print_info "停止后端服务 (PID: $BACKEND_PID)"
|
||
kill $BACKEND_PID 2>/dev/null || true
|
||
wait $BACKEND_PID 2>/dev/null || true
|
||
fi
|
||
|
||
if [ ! -z "$FRONTEND_PID" ]; then
|
||
print_info "停止前端服务 (PID: $FRONTEND_PID)"
|
||
kill $FRONTEND_PID 2>/dev/null || true
|
||
wait $FRONTEND_PID 2>/dev/null || true
|
||
fi
|
||
|
||
# 清理可能残留的端口占用进程
|
||
if command -v lsof &> /dev/null; then
|
||
print_info "清理端口占用..."
|
||
lsof -ti:$BACKEND_PORT | xargs kill -9 2>/dev/null || true
|
||
lsof -ti:$FRONTEND_PORT | xargs kill -9 2>/dev/null || true
|
||
else
|
||
print_info "跳过端口清理(lsof命令不可用)"
|
||
fi
|
||
|
||
print_success "清理完成"
|
||
exit 0
|
||
}
|
||
|
||
# 注册信号处理
|
||
trap cleanup SIGTERM SIGINT
|
||
|
||
# 检查环境
|
||
print_step "检查环境"
|
||
|
||
# 检查Python
|
||
if ! command -v python3 &> /dev/null; then
|
||
print_error "Python3 未安装或不在PATH中"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查Node.js和npm
|
||
if ! command -v node &> /dev/null; then
|
||
print_error "Node.js 未安装或不在PATH中"
|
||
exit 1
|
||
fi
|
||
|
||
if ! command -v npm &> /dev/null; then
|
||
print_error "npm 未安装或不在PATH中"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查项目结构
|
||
if [ ! -d "backend" ]; then
|
||
print_error "backend 目录不存在,请确保在项目根目录运行此脚本"
|
||
exit 1
|
||
fi
|
||
|
||
if [ ! -d "web" ]; then
|
||
print_error "web 目录不存在,请确保在项目根目录运行此脚本"
|
||
exit 1
|
||
fi
|
||
|
||
print_success "环境检查通过"
|
||
|
||
# 检查端口占用
|
||
print_step "检查端口占用"
|
||
|
||
# 检查是否有lsof命令
|
||
if ! command -v lsof &> /dev/null; then
|
||
print_warning "未检测到lsof命令,跳过端口检查"
|
||
print_info "如需端口检查功能,请安装lsof:"
|
||
echo -e " ${CYAN}macOS${NC}: brew install lsof"
|
||
echo -e " ${CYAN}Ubuntu/Debian${NC}: sudo apt-get install lsof"
|
||
echo -e " ${CYAN}CentOS/RHEL${NC}: sudo yum install lsof"
|
||
else
|
||
if ! check_port $BACKEND_PORT "后端服务"; then
|
||
exit 1
|
||
fi
|
||
|
||
if ! check_port $FRONTEND_PORT "前端服务"; then
|
||
exit 1
|
||
fi
|
||
|
||
print_success "端口检查通过"
|
||
fi
|
||
|
||
# 检查后端依赖
|
||
print_step "检查后端依赖"
|
||
if [ ! -f "backend/requirements.txt" ]; then
|
||
print_error "backend/requirements.txt 不存在"
|
||
exit 1
|
||
fi
|
||
|
||
cd backend
|
||
if ! python3 -c "import uvicorn, django" &> /dev/null; then
|
||
print_warning "后端依赖未完整安装,开始安装..."
|
||
pip3 install -r requirements.txt
|
||
if [ $? -ne 0 ]; then
|
||
print_error "后端依赖安装失败"
|
||
exit 1
|
||
fi
|
||
print_success "后端依赖安装完成"
|
||
else
|
||
print_success "后端依赖已安装"
|
||
fi
|
||
cd ..
|
||
|
||
# 检查前端依赖
|
||
print_step "检查前端依赖"
|
||
cd web
|
||
if [ ! -d "node_modules" ]; then
|
||
print_warning "前端依赖未安装,开始安装..."
|
||
npm install
|
||
if [ $? -ne 0 ]; then
|
||
print_error "前端依赖安装失败"
|
||
exit 1
|
||
fi
|
||
print_success "前端依赖安装完成"
|
||
else
|
||
print_success "前端依赖已安装"
|
||
fi
|
||
cd ..
|
||
|
||
# 启动后端服务
|
||
print_step "启动后端服务"
|
||
cd backend
|
||
print_info "启动后端服务在端口$BACKEND_PORT..."
|
||
python3 -m uvicorn backend.asgi:application --host 0.0.0.0 --port $BACKEND_PORT &
|
||
BACKEND_PID=$!
|
||
cd ..
|
||
|
||
# 等待后端启动
|
||
print_info "等待后端服务启动..."
|
||
sleep 3
|
||
|
||
# 检查后端是否启动成功
|
||
if kill -0 $BACKEND_PID 2>/dev/null; then
|
||
print_success "后端服务启动成功 (PID: $BACKEND_PID)"
|
||
else
|
||
print_error "后端服务启动失败"
|
||
exit 1
|
||
fi
|
||
|
||
# 启动前端服务
|
||
print_step "启动前端服务"
|
||
cd web
|
||
print_info "启动前端开发服务器在端口$FRONTEND_PORT..."
|
||
npm run dev &
|
||
FRONTEND_PID=$!
|
||
cd ..
|
||
|
||
# 等待前端启动
|
||
print_info "等待前端服务启动..."
|
||
sleep 3
|
||
|
||
# 检查前端是否启动成功
|
||
if kill -0 $FRONTEND_PID 2>/dev/null; then
|
||
print_success "前端服务启动成功 (PID: $FRONTEND_PID)"
|
||
else
|
||
print_error "前端服务启动失败"
|
||
cleanup
|
||
exit 1
|
||
fi
|
||
|
||
# 启动完成
|
||
print_step "启动完成"
|
||
print_success "LiteOps 开发环境已成功启动!"
|
||
echo ""
|
||
print_info "访问地址:"
|
||
echo -e " ${CYAN}前端界面${NC}: http://localhost:$FRONTEND_PORT"
|
||
echo -e " ${CYAN}后端API${NC}: http://localhost:$BACKEND_PORT"
|
||
echo ""
|
||
print_info "默认登录信息:"
|
||
echo -e " ${CYAN}用户名${NC}: admin"
|
||
echo -e " ${CYAN}密码${NC}: admin123"
|
||
echo ""
|
||
print_warning "按 Ctrl+C 停止所有服务"
|
||
|
||
# 等待信号
|
||
while true; do
|
||
# 检查进程是否还在运行
|
||
if ! kill -0 $BACKEND_PID 2>/dev/null; then
|
||
print_error "后端服务意外停止"
|
||
cleanup
|
||
exit 1
|
||
fi
|
||
|
||
if ! kill -0 $FRONTEND_PID 2>/dev/null; then
|
||
print_error "前端服务意外停止"
|
||
cleanup
|
||
exit 1
|
||
fi
|
||
|
||
sleep 5
|
||
done
|