#!/usr/bin/env bash set -e cd "$(dirname "$0")" # ============================================ # Cyrene v2 — 一键启动脚本 # ============================================ # 自动加载 .env(如果存在) if [ -f .env ]; then set -a; source .env; set +a echo "[cyrene] 已加载 .env 配置" else echo "[cyrene] 未找到 .env,使用默认值。可复制 .env.example: cp .env.example .env" fi # 默认环境变量(可通过 .env 或命令行覆盖) export LLM_API_KEY="${LLM_API_KEY:-sk-test}" export JWT_SECRET="${JWT_SECRET:-cyrene-v2-dev-secret-key-32bytes!!}" export ADMIN_PASSWORD="${ADMIN_PASSWORD:-admin12345}" BACKEND_DIR="./backend" FRONTEND_DIR="./frontend/web" RED='\033[0;31m' GREEN='\033[0;32m' BLUE='\033[0;34m' NC='\033[0m' log() { echo -e "${GREEN}[cyrene]${NC} $1"; } warn() { echo -e "${RED}[cyrene]${NC} $1"; } # 清理函数 cleanup() { log "正在关闭服务..." kill $BACKEND_PID $FRONTEND_PID 2>/dev/null wait $BACKEND_PID $FRONTEND_PID 2>/dev/null log "已退出" } trap cleanup EXIT INT TERM # ---------- 后端 ---------- log "编译后端..." cd "$BACKEND_DIR" export PATH="/usr/lib/go-1.26/bin:$PATH" go build -o cyrene ./cmd/cyrene/ 2>&1 || { warn "后端编译失败"; exit 1; } log "启动后端 (http://localhost:8080)..." ./cyrene & BACKEND_PID=$! sleep 2 # 检查后端健康 if ! curl -s http://localhost:8080/api/v1/health > /dev/null 2>&1; then warn "后端启动失败,请检查日志" exit 1 fi log "后端启动成功 ✓" # ---------- 前端 ---------- cd "$OLDPWD/$FRONTEND_DIR" log "安装前端依赖..." npm install --registry=https://registry.npmmirror.com --silent 2>/dev/null || true log "启动前端 (http://localhost:5173)..." npx vite --host 0.0.0.0 & FRONTEND_PID=$! sleep 3 echo "" echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${BLUE} Cyrene v2 启动完成${NC}" echo -e "${BLUE} 前端: http://localhost:5173${NC}" echo -e "${BLUE} 后端: http://localhost:8080${NC}" echo -e "${BLUE} 账号: admin / ${ADMIN_PASSWORD}${NC}" echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo "" echo "按 Ctrl+C 停止所有服务" # 等待任意进程退出 wait -n $BACKEND_PID $FRONTEND_PID 2>/dev/null