#!/usr/bin/env bash # ============================================================ # pccs build.sh — 一键部署脚本 # 在部署节点 (pccs@pccs.opencomputing.cn) 上直接运行: # cd /d/pccs/repos/pccs && bash build.sh # # 前提: # 1. /d 已作为 NFS 共享盘挂载 # 2. MariaDB 已安装, 数据库 pccs 已创建, 用户 test/test123 已授权 # 3. 部署节点已安装 git, python3.10+, pip # ============================================================ set -e SERVER_PATH="${SERVER_PATH:-/d/pccs}" REPOS_DIR="${SERVER_PATH}/repos" VENV_DIR="${SERVER_PATH}/venv" CONF_DIR="${SERVER_PATH}/conf" LOG_DIR="${SERVER_PATH}/logs" RUN_DIR="${SERVER_PATH}/run" APP_PORT="${APP_PORT:-9180}" # --------------- 模块列表 --------------- # 共享底层库 (pip install) SHARED_LIBS=( apppublic sqlor ahserver appbase rbac ) # pccs 业务模块 (pip install) PCCS_MODULES=( pcpool pcc storage_mgr image_mgr ) # 前端 bricks (需要构建) BRICKS_DIR="${REPOS_DIR}/bricks" # --------------- 颜色输出 --------------- red() { echo -e "\033[31m$1\033[0m"; } green() { echo -e "\033[32m$1\033[0m"; } blue() { echo -e "\033[34m$1\033[0m"; } echo "==========================================" blue "PCCS 算力中心集群系统 — 一键部署" echo "==========================================" echo "部署路径: ${SERVER_PATH}" echo "监听端口: ${APP_PORT}" echo "" # ============================================================ # Phase 0: 创建目录结构 # ============================================================ blue "[Phase 0] 创建目录结构..." mkdir -p "${REPOS_DIR}" "${VENV_DIR}" "${CONF_DIR}" "${LOG_DIR}" "${RUN_DIR}" green " 目录结构已创建" # ============================================================ # Phase 1: 安装系统依赖 # ============================================================ blue "[Phase 1] 安装系统依赖..." sudo apt-get update -qq sudo apt-get install -y -qq python3-venv python3-pip python3-dev build-essential nfs-common green " 系统依赖已安装" # ============================================================ # Phase 2: Clone/Pull 所有仓库 (HTTPS, 只读) # ============================================================ blue "[Phase 2] Clone/Pull 代码仓库..." GIT_BASE="https://git.opencomputing.cn/yumoqing" ALL_REPOS=("${SHARED_LIBS[@]}" "${PCCS_MODULES[@]}" "bricks" "pccs") for repo in "${ALL_REPOS[@]}"; do if [ -d "${REPOS_DIR}/${repo}/.git" ]; then echo " [pull] ${repo}..." (cd "${REPOS_DIR}/${repo}" && git pull origin main 2>/dev/null) || true else echo " [clone] ${repo}..." git clone "${GIT_BASE}/${repo}.git" "${REPOS_DIR}/${repo}" 2>/dev/null || { red " 警告: ${repo} clone 失败, 跳过" } fi done green " 代码仓库已同步" # ============================================================ # Phase 3: 创建 Python 虚拟环境 # ============================================================ blue "[Phase 3] 创建 Python 虚拟环境..." python3 -m venv "${VENV_DIR}" --clear PIP="${VENV_DIR}/bin/pip" PYTHON="${VENV_DIR}/bin/python" # 升级 pip "${PIP}" install --upgrade pip setuptools wheel -q green " 虚拟环境已创建: ${VENV_DIR}" # ============================================================ # Phase 4: 安装共享底层库 (develop 模式) # ============================================================ blue "[Phase 4] 安装共享底层库..." for lib in "${SHARED_LIBS[@]}"; do lib_path="${REPOS_DIR}/${lib}" if [ -f "${lib_path}/setup.py" ] || [ -f "${lib_path}/setup.cfg" ] || [ -f "${lib_path}/pyproject.toml" ]; then echo " [install] ${lib}..." "${PIP}" install -e "${lib_path}" -q 2>&1 | tail -1 else echo " [skip] ${lib} — 无 setup" fi done green " 共享底层库已安装" # ============================================================ # Phase 5: 安装 pccs 业务模块 (develop 模式) # ============================================================ blue "[Phase 5] 安装 pccs 业务模块..." for mod in "${PCCS_MODULES[@]}"; do mod_path="${REPOS_DIR}/${mod}" if [ -f "${mod_path}/setup.json" ] || [ -f "${mod_path}/setup.py" ] || [ -f "${mod_path}/setup.cfg" ]; then echo " [install] ${mod}..." "${PIP}" install -e "${mod_path}" -q 2>&1 | tail -1 else echo " [skip] ${mod} — 无 setup" fi done green " pccs 业务模块已安装" # ============================================================ # Phase 6: 构建 Bricks 前端 # ============================================================ blue "[Phase 6] 构建 Bricks 前端..." if [ -f "${BRICKS_DIR}/build.sh" ]; then echo " 构建 bricks.js..." (cd "${BRICKS_DIR}" && npm install --silent 2>/dev/null && bash build.sh 2>&1 | tail -3) || { red " 警告: bricks 构建失败, 前端可能不可用" } fi green " Bricks 前端已构建" # ============================================================ # Phase 7: 创建配置文件 # ============================================================ blue "[Phase 7] 创建配置..." cat > "${CONF_DIR}/config.json" < "${RUN_DIR}/start.sh" <&1 | tee -a "\${LOG_DIR}/pccs.log" STARTEOF chmod +x "${RUN_DIR}/start.sh" green " 启动脚本: ${RUN_DIR}/start.sh" # ============================================================ # Phase 11: 停止旧进程, 启动应用 # ============================================================ blue "[Phase 11] 启动应用..." # 停止旧进程 pkill -f "ahserver.*${APP_PORT}" 2>/dev/null || true sleep 1 # 后台启动 nohup bash "${RUN_DIR}/start.sh" > "${LOG_DIR}/nohup.log" 2>&1 & sleep 3 # 健康检查 if curl -s -o /dev/null -w "%{http_code}" "http://127.0.0.1:${APP_PORT}/" 2>/dev/null | grep -q '200\|302\|404'; then green " pccs 应用已启动: http://127.0.0.1:${APP_PORT}" else red " 警告: 应用可能未正常启动, 检查日志: tail -f ${LOG_DIR}/pccs.log" fi # ============================================================ # 完成 # ============================================================ echo "" green "==========================================" green " pccs 部署完成!" green " 访问地址: http://$(hostname -I | awk '{print $1}'):${APP_PORT}" green " 日志文件: ${LOG_DIR}/pccs.log" green " 启动命令: bash ${RUN_DIR}/start.sh" green " 停止命令: pkill -f 'ahserver.*${APP_PORT}'" green "=========================================="