Files
2026-05-10 10:56:52 +08:00

117 lines
4.1 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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}"