#!/usr/bin/env bash # 本地开发一键启动:console 服务 + admin 前端 # 用法:./dev.sh [--no-build] set -euo pipefail ROOT="$(cd "$(dirname "$0")" && pwd)" SERVICES_DIR="$ROOT/apps/services" CONSOLE_DIR="$SERVICES_DIR/services/console" ADMIN_DIR="$ROOT/apps/admin" BIN_DIR="$ROOT/.build" LOG_DIR="$ROOT/.logs" NO_BUILD=${1:-""} mkdir -p "$BIN_DIR" "$LOG_DIR" # ── 颜色输出 ───────────────────────────────────────────── green() { echo -e "\033[32m$*\033[0m"; } red() { echo -e "\033[31m$*\033[0m"; } blue() { echo -e "\033[34m$*\033[0m"; } # ── 清理子进程 ──────────────────────────────────────────── PIDS=() cleanup() { echo "" blue ">>> 停止所有服务..." for pid in "${PIDS[@]}"; do kill "$pid" 2>/dev/null || true done wait 2>/dev/null || true green ">>> 已停止" } trap cleanup EXIT INT TERM # ── 1. 检查依赖 ────────────────────────────────────────── blue ">>> 检查环境..." command -v go >/dev/null || { red "未找到 go,请先安装 Go"; exit 1; } command -v node >/dev/null || { red "未找到 node"; exit 1; } # ── 2. 编译 console 服务 ───────────────────────────────── if [[ "$NO_BUILD" != "--no-build" ]]; then blue ">>> 编译 console 服务..." (cd "$SERVICES_DIR" && go build -o "$BIN_DIR/console" "./services/console/") \ && green ">>> console 编译完成" \ || { red ">>> console 编译失败"; exit 1; } else [[ -f "$BIN_DIR/console" ]] || { red ">>> 找不到 $BIN_DIR/console,请先编译(去掉 --no-build)"; exit 1; } fi # ── 3. 启动 console 服务 ───────────────────────────────── blue ">>> 启动 console 服务(:8080)..." mkdir -p "$CONSOLE_DIR/log" "$CONSOLE_DIR/consoleweb" (cd "$CONSOLE_DIR" && "$BIN_DIR/console" -conf ./conf/console.yaml >> "$LOG_DIR/console.log" 2>&1) & CONSOLE_PID=$! PIDS+=($CONSOLE_PID) green ">>> console 已启动 PID=$CONSOLE_PID,日志:$LOG_DIR/console.log" # 等待 console 端口就绪(最多 15 秒) blue ">>> 等待 console 就绪..." for i in $(seq 1 15); do if nc -z 127.0.0.1 8080 2>/dev/null; then green ">>> console 端口就绪 (${i}s)" break fi sleep 1 if [[ $i -eq 15 ]]; then red ">>> console 15 秒内未就绪,检查日志:$LOG_DIR/console.log" tail -30 "$LOG_DIR/console.log" 2>/dev/null || true exit 1 fi done # ── 4. 启动 admin 前端 ─────────────────────────────────── blue ">>> 启动 admin 前端(:3000)..." (cd "$ADMIN_DIR" && pnpm dev >> "$LOG_DIR/admin.log" 2>&1) & ADMIN_PID=$! PIDS+=($ADMIN_PID) green ">>> admin 已启动 PID=$ADMIN_PID,日志:$LOG_DIR/admin.log" # ── 5. 汇总 ───────────────────────────────────────────── echo "" green "============================================" green " console API : http://localhost:8080" green " admin 前端 : http://localhost:3000" green " 账号/密码 : admin / 123456" green "============================================" echo "" blue "日志文件:" echo " console : $LOG_DIR/console.log" echo " admin : $LOG_DIR/admin.log" echo "" blue "按 Ctrl+C 停止所有服务" # 尾随输出(同时看两个日志) tail -f "$LOG_DIR/console.log" "$LOG_DIR/admin.log" & TAIL_PID=$! PIDS+=($TAIL_PID) # 如果任一子进程意外退出就报错 wait $CONSOLE_PID || { red ">>> console 意外退出"; exit 1; } wait $ADMIN_PID || { red ">>> admin 意外退出"; exit 1; }