#!/bin/bash # chongming 开发环境一键启动脚本 (远程执行版) # 用法: 上传到虚拟机 /tmp/ 后执行,会自动定位到项目根目录 # 项目路径: ~/workspace/chongming set -e GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color echo -e "${GREEN}==> 初始化 chongming 开发环境${NC}" # 1. 定位项目根目录 PROJECT_DIR=~/workspace/chongming if [ ! -d "$PROJECT_DIR" ]; then echo -e "${RED}错误:项目目录不存在: $PROJECT_DIR${NC}" echo -e "${YELLOW}请先在虚拟机中创建项目目录并拉取代码:${NC}" echo " mkdir -p ~/workspace && cd ~/workspace" echo " git clone <仓库地址> chongming" exit 1 fi cd "$PROJECT_DIR" echo -e "${GREEN}✔ 切换到项目目录: $(pwd)${NC}" # 确认 pyproject.toml 存在(防御性检查) if [ ! -f "pyproject.toml" ]; then echo -e "${RED}错误:项目目录中未找到 pyproject.toml:$(pwd)${NC}" exit 1 fi # 2. 加载 nvm(SSH 非交互式 shell 需要手动加载) export NVM_DIR="$HOME/.nvm" if [ -s "$NVM_DIR/nvm.sh" ]; then . "$NVM_DIR/nvm.sh" 2>/dev/null fi # 3. 检查 Node.js (版本要求 >=20.19) if ! command -v node &> /dev/null; then echo -e "${RED}错误:未找到 node,请安装 Node.js >= 20.19${NC}" echo "推荐使用 nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash" exit 1 fi NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1) if [ "$NODE_VERSION" -lt 20 ]; then echo -e "${RED}错误:Node.js 版本过低 (当前 $(node -v)),需要 >=20.19${NC}" exit 1 fi echo -e "${GREEN}✔ Node.js $(node -v)${NC}" # 4. 安装/检查 uv (项目推荐) # SSH 非交互式 shell 的 PATH 可能不含 ~/.local/bin,手动添加 export PATH="$HOME/.local/bin:$PATH" if ! command -v uv &> /dev/null; then echo -e "${YELLOW}未找到 uv,正在自动安装...${NC}" curl -LsSf https://astral.sh/uv/install.sh | sh export PATH="$HOME/.local/bin:$PATH" if ! command -v uv &> /dev/null; then echo -e "${RED}uv 安装失败,请手动安装:https://docs.astral.sh/uv/${NC}" exit 1 fi echo -e "${GREEN}uv 安装成功${NC}" fi # 5. 安装后端依赖 echo -e "${GREEN}==> 安装后端依赖 (uv sync)${NC}" cd ~/workspace/chongming uv sync # 6. 安装前端依赖 echo -e "${GREEN}==> 安装前端依赖 (npm install)${NC}" cd ~/workspace/chongming/src/chongming-web npm install cd ../.. # 7. 启动后端服务(后台运行,使用 nohup 防止 SSH 断开后被 SIGHUP 杀死) echo -e "${GREEN}==> 启动后端服务 (uv run serve)${NC}" mkdir -p ~/workspace/chongming/logs nohup uv run serve > ~/workspace/chongming/logs/backend.log 2>&1 & BACKEND_PID=$! # 等待后端完全启动(健康检查) echo "等待后端服务就绪(约3秒)..." sleep 10 # 可选:检查端口8000是否监听 if ! ss -tln | grep -q ':8000'; then echo -e "${YELLOW}警告:后端可能尚未完全启动,请稍后手动检查${NC}" fi # 8. 生成前端 API 客户端(需要后端运行) echo -e "${GREEN}==> 生成前端 API 客户端 (npm run openapi)${NC}" cd src/chongming-web npm run openapi || echo -e "${YELLOW}注意:生成 openapi 失败,请确认后端已运行在 http://localhost:8000${NC}" cd ../.. # 9. 启动前端开发服务器(后台运行,使用 nohup 防止 SSH 断开后被 SIGHUP 杀死) echo -e "${GREEN}==> 启动前端开发服务器 (npm run dev)${NC}" cd src/chongming-web nohup npm run dev > ~/workspace/chongming/logs/frontend.log 2>&1 & FRONTEND_PID=$! cd ../.. echo -e "前端地址: ${GREEN}http://localhost:5173${NC}" echo -e "后端地址: ${GREEN}http://localhost:8000${NC}" echo -e "后端日志: ~/workspace/chongming/logs/backend.log" echo -e "前端日志: ~/workspace/chongming/logs/frontend.log" echo -e "后端 PID: $BACKEND_PID" echo -e "前端 PID: $FRONTEND_PID" # 记录 PID 到文件,方便后续停止服务 echo -e "$BACKEND_PID\n$FRONTEND_PID" > ~/workspace/chongming/.dev_pids echo -e "${GREEN}✅ 开发环境已全部启动,脚本将退出,服务在后台持续运行${NC}" echo -e "${YELLOW}要停止服务,请执行: kill \$(cat ~/workspace/chongming/.dev_pids)${NC}"