#!/usr/bin/env bash set -euo pipefail # ═══════════════════════════════════════════ # 姜十三论坛 开发环境启动脚本 (Linux/macOS) # ═══════════════════════════════════════════ ROOT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$ROOT_DIR" echo "══════════════════════════════════════════" echo " 姜十三论坛 开发环境启动脚本" echo "══════════════════════════════════════════" echo "" # ---- 1. 启动 PostgreSQL ---- echo "[1/3] 启动数据库 (Docker Compose)..." if ! command -v docker &>/dev/null; then echo "✗ 未检测到 docker,请先安装 Docker" exit 1 fi docker compose up -d postgres echo "√ 数据库已启动" echo "" # ---- 2. 检查后端配置 ---- echo "[2/3] 检查后端配置..." if [ ! -f "backend/app.ini" ]; then cp "backend/app.ini.example" "backend/app.ini" echo " 已从模板创建 backend/app.ini,请按需修改配置" fi mkdir -p backend/data # 启动后端(后台) echo " 启动后端 (端口 3001, cwd=backend, data=backend/data)..." cd "$ROOT_DIR/backend" go run ./cmd/jiang13 & BACKEND_PID=$! cd "$ROOT_DIR" echo "√ 后端已启动 (PID: $BACKEND_PID)" echo "" # ---- 3. 检查前端配置 ---- echo "[3/3] 检查前端配置..." if [ ! -f "frontend/.env.local" ]; then cp "frontend/.env.example" "frontend/.env.local" echo " 已从模板创建 frontend/.env.local" fi # 检查 node_modules if [ ! -d "frontend/node_modules" ]; then echo " 首次运行,安装前端依赖..." cd "$ROOT_DIR/frontend" npm install cd "$ROOT_DIR" fi # 启动前端(后台) echo " 启动前端 (端口 3000)..." cd "$ROOT_DIR/frontend" npm run dev & FRONTEND_PID=$! cd "$ROOT_DIR" echo "√ 前端已启动 (PID: $FRONTEND_PID)" echo "" echo "══════════════════════════════════════════" echo " 全部启动完成!" echo "" echo " 前端: http://localhost:3000" echo " 后端: http://localhost:3001" echo " 数据目录: $ROOT_DIR/backend/data" echo " 数据库: localhost:5432" echo "" echo " 后端 PID: $BACKEND_PID" echo " 前端 PID: $FRONTEND_PID" echo " 停止服务: ./stop.sh (或 Ctrl+C 本脚本)" echo " 停库: docker compose down" echo "══════════════════════════════════════════" # 捕获 Ctrl+C,清理子进程 cleanup() { echo "" echo "正在停止服务..." kill $BACKEND_PID 2>/dev/null || true kill $FRONTEND_PID 2>/dev/null || true docker compose down 2>/dev/null || true echo "已停止" } trap cleanup EXIT INT TERM # 保持脚本运行 wait