#!/bin/bash # ======================================== # Cyrene DevTools 启动脚本 # 自动处理端口冲突、依赖安装和服务管理 # ======================================== set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" DEVTOOLS_DIR="$SCRIPT_DIR/devtools" PORT="${DEVTOOLS_PORT:-9090}" LOG_DIR="$SCRIPT_DIR/logs" LOG_FILE="$LOG_DIR/sh.log" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' # No Color echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${CYAN} 🛠️ Cyrene DevTools${NC}" echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" # 切换到 devtools 目录 cd "$DEVTOOLS_DIR" # 确保 Node.js 可用 if ! command -v node &> /dev/null; then if [ -x /usr/local/node/bin/node ]; then export PATH="/usr/local/node/bin:$PATH" else echo -e "${RED}❌ 未找到 Node.js,请先安装 Node.js${NC}" exit 1 fi fi echo -e "${YELLOW}Node.js:${NC} $(node --version)" echo -e "${YELLOW}npm:${NC} $(npm --version)" # 加载 backend/.env 环境变量 ENV_FILE="$SCRIPT_DIR/backend/.env" if [ -f "$ENV_FILE" ]; then echo -e "${GREEN}✅ 加载环境变量: $ENV_FILE${NC}" set -a # shellcheck disable=SC1090 source "$ENV_FILE" set +a else echo -e "${YELLOW}⚠ 未找到 .env 文件,使用默认值${NC}" fi # 检查并释放端口 if ss -tlnp 2>/dev/null | grep -q ":$PORT "; then echo -e "${YELLOW}⚠ 端口 $PORT 已被占用,正在释放...${NC}" fuser -k "$PORT/tcp" 2>/dev/null || true sleep 1 echo -e "${GREEN}✅ 端口 $PORT 已释放${NC}" fi # 安装依赖 (如有需要) if [ ! -d "node_modules" ] || [ ! -f "node_modules/.package-lock.json" ]; then echo -e "${YELLOW}📦 安装依赖...${NC}" npm install --silent fi # 确保日志目录存在 mkdir -p "$LOG_DIR" echo "" echo -e "${GREEN}🚀 启动 DevTools 服务器 (端口: $PORT)...${NC}" echo -e "${CYAN} Web 控制台: http://localhost:$PORT${NC}" echo -e "${CYAN} API: http://localhost:$PORT/api/health${NC}" echo -e "${CYAN} WebSocket: ws://localhost:$PORT/ws${NC}" echo "" echo -e "${YELLOW}⏳ 正在后台启动所有服务...${NC}" # 后台启动 DevTools,日志写入 ./logs/sh.log nohup node src/index.js > "$LOG_FILE" 2>&1 & DEVTOOLS_PID=$! # 健康检查(最多等待 30 秒) MAX_WAIT=30 WAITED=0 while [ $WAITED -lt $MAX_WAIT ]; do HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:$PORT/api/health" 2>/dev/null || true) if [ "$HTTP_CODE" = "200" ]; then echo "" echo -e "${GREEN}✅ 所有服务启动完成!${NC}" echo -e "${CYAN} PID: ${DEVTOOLS_PID}${NC}" echo -e "${CYAN} 日志文件: ${LOG_FILE}${NC}" echo "" exit 0 fi sleep 1 WAITED=$((WAITED + 1)) done # 超时处理 if kill -0 "$DEVTOOLS_PID" 2>/dev/null; then echo "" echo -e "${YELLOW}⚠ 服务可能仍在启动中(已等待 ${MAX_WAIT} 秒)${NC}" echo -e "${CYAN} PID: ${DEVTOOLS_PID}${NC}" echo -e "${CYAN} 日志文件: ${LOG_FILE}${NC}" echo -e "${YELLOW} 请稍后检查 http://localhost:$PORT/api/health${NC}" else echo "" echo -e "${RED}❌ 服务启动失败,请检查日志: ${LOG_FILE}${NC}" exit 1 fi