install-native.sh 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #!/usr/bin/env bash
  2. # ============================================================
  3. # LambdaAgentPaaS — Mac/Linux Native 安装(无 Docker)
  4. #
  5. # 用法:
  6. # ./deploy/install-native.sh # 安装到 venv
  7. # ./deploy/install-native.sh --start # 安装后直接启动
  8. #
  9. # 要求: Python 3.10+, Node.js 18+
  10. # ============================================================
  11. set -euo pipefail
  12. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  13. PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
  14. VENV_DIR="${PROJECT_DIR}/.venv"
  15. DATA_DIR="${HOME}/.agentpaas/data"
  16. ENV_FILE="${HOME}/.agentpaas/.env"
  17. RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
  18. BLUE='\033[0;34m'; BOLD='\033[1m'; NC='\033[0m'
  19. info() { echo -e "${BLUE}ℹ ${NC}$*"; }
  20. success() { echo -e "${GREEN}✅ $*${NC}"; }
  21. warn() { echo -e "${YELLOW}⚠️ $*${NC}"; }
  22. error() { echo -e "${RED}❌ $*${NC}" >&2; exit 1; }
  23. START_AFTER=""
  24. for arg in "$@"; do [[ "$arg" == "--start" ]] && START_AFTER=1; done
  25. echo -e "\n${BOLD}LambdaAgentPaaS Native 安装${NC}\n"
  26. # ── 检查 Python ──────────────────────────────────────────────
  27. PY=""
  28. for candidate in python3.12 python3.11 python3.10 python3 python; do
  29. if command -v "$candidate" &>/dev/null; then
  30. ver=$("$candidate" -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')" 2>/dev/null || true)
  31. major=$(echo "$ver" | cut -d. -f1)
  32. minor=$(echo "$ver" | cut -d. -f2)
  33. if (( major > 3 )) || (( major == 3 && minor >= 10 )); then
  34. PY="$candidate"; break
  35. fi
  36. fi
  37. done
  38. [[ -z "$PY" ]] && error "需要 Python 3.10+。请从 https://www.python.org/ 安装后重试。"
  39. info "使用 Python: $($PY --version)"
  40. # ── 检查 Node.js ─────────────────────────────────────────────
  41. if ! command -v node &>/dev/null; then
  42. error "需要 Node.js 18+。请从 https://nodejs.org/ 安装后重试。"
  43. fi
  44. NODE_VER=$(node -e "process.stdout.write(process.version.replace('v',''))" 2>/dev/null)
  45. NODE_MAJOR=$(echo "$NODE_VER" | cut -d. -f1)
  46. (( NODE_MAJOR < 18 )) && error "需要 Node.js 18+(当前: v${NODE_VER})"
  47. info "使用 Node.js: v${NODE_VER}"
  48. # ── 创建虚拟环境 ─────────────────────────────────────────────
  49. if [[ ! -d "$VENV_DIR" ]]; then
  50. info "创建 Python 虚拟环境..."
  51. "$PY" -m venv "$VENV_DIR"
  52. fi
  53. VENV_PY="${VENV_DIR}/bin/python"
  54. VENV_PIP="${VENV_DIR}/bin/pip"
  55. # ── 安装 Python 依赖 ─────────────────────────────────────────
  56. info "安装 Python 依赖(首次约 2-3 分钟)..."
  57. cd "$PROJECT_DIR"
  58. # 国内网络可取消注释以下行加速
  59. # PIP_OPTS="-i https://pypi.tuna.tsinghua.edu.cn/simple"
  60. PIP_OPTS=""
  61. $VENV_PIP install --upgrade pip $PIP_OPTS -q
  62. $VENV_PIP install -e "lambdagent[all]" $PIP_OPTS -q
  63. $VENV_PIP install -e "agentpaas[all]" $PIP_OPTS -q
  64. $VENV_PIP install pymupdf $PIP_OPTS -q
  65. success "Python 依赖安装完成"
  66. # ── 构建前端 ─────────────────────────────────────────────────
  67. info "安装前端依赖..."
  68. cd "${PROJECT_DIR}/webui"
  69. npm ci --prefer-offline --loglevel=error
  70. info "构建前端..."
  71. npm run build
  72. success "前端构建完成 → webui-dist/"
  73. cd "$PROJECT_DIR"
  74. # ── 初始化数据目录 ────────────────────────────────────────────
  75. mkdir -p "${DATA_DIR}/instances" "${DATA_DIR}/knowledge_bases" "${DATA_DIR}/logs"
  76. chmod 700 "${HOME}/.agentpaas" 2>/dev/null || true
  77. # ── 初始化配置文件 ────────────────────────────────────────────
  78. if [[ ! -f "$ENV_FILE" ]]; then
  79. cp "${PROJECT_DIR}/.env.template" "$ENV_FILE"
  80. MASTER_KEY=$($VENV_PY -c "import secrets; print(secrets.token_hex(32))")
  81. sed -i.bak "s|^AGENTPAAS_DATA_DIR=.*|AGENTPAAS_DATA_DIR=${DATA_DIR}|" "$ENV_FILE"
  82. sed -i.bak "s|^AGENTPAAS_MASTER_KEY=.*|AGENTPAAS_MASTER_KEY=${MASTER_KEY}|" "$ENV_FILE"
  83. rm -f "${ENV_FILE}.bak"
  84. success "配置文件已创建: $ENV_FILE"
  85. warn "请编辑 ${ENV_FILE} 填写至少一个 LLM API Key"
  86. fi
  87. # ── 创建启动脚本 ─────────────────────────────────────────────
  88. LAUNCHER="${HOME}/.agentpaas/run.sh"
  89. cat > "$LAUNCHER" << LAUNCHER_SCRIPT
  90. #!/usr/bin/env bash
  91. # LambdaAgentPaaS 启动器(由 install-native.sh 生成)
  92. set -a
  93. source "${ENV_FILE}"
  94. set +a
  95. export AGENTPAAS_DATA_DIR="${DATA_DIR}"
  96. cd "${PROJECT_DIR}"
  97. exec "${VENV_PY}" -m agentpaas serve --host 0.0.0.0 --port "\${AGENTPAAS_PORT:-8000}"
  98. LAUNCHER_SCRIPT
  99. chmod +x "$LAUNCHER"
  100. # ── macOS LaunchAgent(可选自动启动)────────────────────────
  101. if [[ "$OSTYPE" == "darwin"* ]]; then
  102. PLIST_DIR="${HOME}/Library/LaunchAgents"
  103. PLIST_FILE="${PLIST_DIR}/com.lambdagentpaas.plist"
  104. mkdir -p "$PLIST_DIR"
  105. cat > "$PLIST_FILE" << PLIST
  106. <?xml version="1.0" encoding="UTF-8"?>
  107. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  108. "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  109. <plist version="1.0">
  110. <dict>
  111. <key>Label</key>
  112. <string>com.lambdagentpaas</string>
  113. <key>ProgramArguments</key>
  114. <array>
  115. <string>${LAUNCHER}</string>
  116. </array>
  117. <key>RunAtLoad</key>
  118. <false/>
  119. <key>StandardOutPath</key>
  120. <string>${DATA_DIR}/logs/agentpaas.log</string>
  121. <key>StandardErrorPath</key>
  122. <string>${DATA_DIR}/logs/agentpaas.err.log</string>
  123. <key>EnvironmentVariables</key>
  124. <dict>
  125. <key>AGENTPAAS_DATA_DIR</key>
  126. <string>${DATA_DIR}</string>
  127. </dict>
  128. </dict>
  129. </plist>
  130. PLIST
  131. success "macOS LaunchAgent 已创建: $PLIST_FILE"
  132. info "开机自启: launchctl load $PLIST_FILE"
  133. fi
  134. # ── 打印完成信息 ─────────────────────────────────────────────
  135. echo ""
  136. echo -e "${GREEN}╔══════════════════════════════════════════════╗${NC}"
  137. echo -e "${GREEN}║ ✅ LambdaAgentPaaS 安装完成! ║${NC}"
  138. echo -e "${GREEN}╠══════════════════════════════════════════════╣${NC}"
  139. echo -e "${GREEN}║ 启动命令: ~/.agentpaas/run.sh ║${NC}"
  140. echo -e "${GREEN}║ 配置文件: ${ENV_FILE}${NC}"
  141. echo -e "${GREEN}║ 数据目录: ${DATA_DIR}${NC}"
  142. echo -e "${GREEN}╚══════════════════════════════════════════════╝${NC}"
  143. echo ""
  144. if [[ -n "$START_AFTER" ]]; then
  145. info "正在启动服务..."
  146. exec "$LAUNCHER"
  147. fi