4b35736f73
P0 (5): crypto/rand session ID, TTS fallback可达性, goroutine defer recover, adminAuth前缀修正 P1 (5): 普通用户密码验证, context传递, priority clamp, 超时重试, 自主思考速率限制 P2 (4): Briefing AI降级, 前端消息类型渲染, Docker Compose补全, PWA 192图标 P3 (5): goroutine错误处理, .gitignore完善, reminder created_at, voice Dockerfile, Go版本更新
111 lines
3.3 KiB
Bash
111 lines
3.3 KiB
Bash
#!/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
|