152 lines
4.2 KiB
Bash
152 lines
4.2 KiB
Bash
#!/bin/bash
|
|
|
|
# Paper Burner X - 启动脚本
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
BACKEND_PORT=3456
|
|
FRONTEND_PORT=5173
|
|
PID_DIR="$PROJECT_DIR/.pids"
|
|
|
|
echo -e "${BLUE}"
|
|
echo "======================================"
|
|
echo " Paper Burner X - 启动脚本"
|
|
echo "======================================"
|
|
echo -e "${NC}"
|
|
|
|
# 创建 PID 和日志目录
|
|
mkdir -p "$PID_DIR"
|
|
mkdir -p "$PROJECT_DIR/logs"
|
|
|
|
# 函数:根据端口查找并杀死进程
|
|
kill_port() {
|
|
local port=$1
|
|
local pids=$(lsof -t -i:$port 2>/dev/null)
|
|
if [ -n "$pids" ]; then
|
|
echo -e "${YELLOW}→ 发现端口 $port 被占用,正在终止进程...${NC}"
|
|
for pid in $pids; do
|
|
kill -9 $pid 2>/dev/null && echo -e " ${GREEN}已终止进程 $pid${NC}"
|
|
done
|
|
sleep 1
|
|
fi
|
|
}
|
|
|
|
# 函数:根据 PID 文件杀死进程
|
|
kill_pid_file() {
|
|
local pid_file=$1
|
|
local service_name=$2
|
|
if [ -f "$pid_file" ]; then
|
|
local pid=$(cat "$pid_file")
|
|
if [ -n "$pid" ] && kill -0 $pid 2>/dev/null; then
|
|
echo -e "${YELLOW}→ 终止 $service_name (PID: $pid)...${NC}"
|
|
kill -9 $pid 2>/dev/null
|
|
echo -e " ${GREEN}已终止${NC}"
|
|
fi
|
|
rm -f "$pid_file"
|
|
fi
|
|
}
|
|
|
|
# 1. 清除之前的进程
|
|
echo -e "${YELLOW}[1/3] 清除之前的进程...${NC}"
|
|
|
|
# 通过 PID 文件清理
|
|
kill_pid_file "$PID_DIR/backend.pid" "后端服务"
|
|
kill_pid_file "$PID_DIR/frontend.pid" "前端服务"
|
|
|
|
# 通过端口清理(确保彻底)
|
|
kill_port $BACKEND_PORT
|
|
kill_port $FRONTEND_PORT
|
|
|
|
echo -e "${GREEN}✓ 进程清理完成${NC}"
|
|
echo ""
|
|
|
|
# 2. 启动后端
|
|
echo -e "${YELLOW}[2/3] 启动后端服务 (端口 $BACKEND_PORT)...${NC}"
|
|
cd "$PROJECT_DIR/local-proxy"
|
|
|
|
# 检查 node_modules
|
|
if [ ! -d "node_modules" ]; then
|
|
echo -e "${YELLOW}→ 安装后端依赖...${NC}"
|
|
npm install
|
|
fi
|
|
|
|
# 后台启动后端(输出同时显示在控制台和日志文件)
|
|
npm start 2>&1 | tee "$PROJECT_DIR/logs/backend.log" &
|
|
BACKEND_PID=$!
|
|
echo $BACKEND_PID > "$PID_DIR/backend.pid"
|
|
echo -e "${GREEN}✓ 后端已启动 (PID: $BACKEND_PID)${NC}"
|
|
echo -e " 日志: $PROJECT_DIR/logs/backend.log"
|
|
echo ""
|
|
|
|
# 3. 启动前端
|
|
echo -e "${YELLOW}[3/3] 启动前端服务 (Vite 开发服务器, 端口 $FRONTEND_PORT)...${NC}"
|
|
cd "$PROJECT_DIR"
|
|
|
|
# 检查 node_modules
|
|
if [ ! -d "node_modules" ]; then
|
|
echo -e "${YELLOW}→ 安装前端依赖...${NC}"
|
|
npm install
|
|
fi
|
|
|
|
# 后台启动 Vite 开发服务器
|
|
npm run dev:fe 2>&1 | tee "$PROJECT_DIR/logs/frontend.log" &
|
|
FRONTEND_PID=$!
|
|
echo $FRONTEND_PID > "$PID_DIR/frontend.pid"
|
|
echo -e "${GREEN}✓ 前端已启动 (PID: $FRONTEND_PID)${NC}"
|
|
echo -e " 日志: $PROJECT_DIR/logs/frontend.log"
|
|
echo ""
|
|
|
|
# 等待服务启动
|
|
sleep 2
|
|
|
|
# 检查服务状态
|
|
echo -e "${YELLOW}→ 检查服务状态...${NC}"
|
|
|
|
BACKEND_OK=false
|
|
FRONTEND_OK=false
|
|
|
|
# 检查后端
|
|
if curl -s "http://localhost:$BACKEND_PORT/api/health" > /dev/null 2>&1; then
|
|
BACKEND_OK=true
|
|
echo -e " ${GREEN}✓ 后端服务正常${NC}"
|
|
else
|
|
echo -e " ${RED}✗ 后端服务启动中...${NC}"
|
|
fi
|
|
|
|
# 检查前端
|
|
if curl -s "http://localhost:$FRONTEND_PORT" > /dev/null 2>&1; then
|
|
FRONTEND_OK=true
|
|
echo -e " ${GREEN}✓ 前端服务正常${NC}"
|
|
else
|
|
echo -e " ${RED}✗ 前端服务启动中...${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${GREEN}"
|
|
echo "======================================"
|
|
echo " 启动完成!"
|
|
echo "======================================"
|
|
echo -e "${NC}"
|
|
echo ""
|
|
echo -e "${BLUE}访问地址:${NC}"
|
|
echo -e " 前端: ${GREEN}http://localhost:$FRONTEND_PORT?mode=backend&token=your_token${NC}"
|
|
echo -e " 后端: ${GREEN}http://localhost:$BACKEND_PORT${NC}"
|
|
echo -e " 健康检查: ${GREEN}http://localhost:$BACKEND_PORT/api/health${NC}"
|
|
echo ""
|
|
echo -e "${BLUE}说明:${NC}"
|
|
echo -e " Vite 代理已配置,/api/* 自动转发到后端"
|
|
echo -e " 添加 ${YELLOW}?mode=backend${NC} 参数启用后端模式"
|
|
echo ""
|
|
echo -e "${BLUE}日志文件:${NC}"
|
|
echo -e " 后端: $PROJECT_DIR/logs/backend.log"
|
|
echo -e " 前端: $PROJECT_DIR/logs/frontend.log"
|
|
echo ""
|
|
echo -e "${BLUE}停止服务:${NC}"
|
|
echo -e " 运行: ${YELLOW}./stop.sh${NC} 或手动终止进程"
|
|
echo "" |