#!/usr/bin/env bash # ============================================================================= # FranklinWH Toolbox - 一键构建 & 部署脚本(前端 + 后端) # ============================================================================= # 作用: # 1. 构建前端(pnpm build)并同步到静态目录 # 2. 构建后端主程序 fwh-toolbox-server 与 fwh-mcp-server,安装 systemd 服务 # 3. 部署 Kiro CLI 配置(agents/settings/steering/skills)到 server/.kiro # # 目录约定(与线上服务器保持一致,可用环境变量覆盖): # DEPLOY_ROOT /var/www/fwh-toolbox # ├── fwh-toolbox/ 前端静态文件(构建产物 dist/*) # └── server/ 后端二进制 + config.env + cert/ + .kiro/(kiro-cli 配置) # # 用法: # ./deploy.sh all # 前端 + 后端 + Kiro 配置(默认) # ./deploy.sh frontend # 仅前端 # ./deploy.sh backend # 仅后端 # ./deploy.sh kiro # 仅 Kiro CLI 配置(含 skills 安装/拷贝) # # 前置条件: # - 已安装 Go、Node、pnpm(见 docs/DEPLOYMENT.md) # - service/config.env 已配置好(首次部署请从 config.env.example 复制) # ============================================================================= set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" DEPLOY_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" # deploy/ PROJECT_ROOT="$(cd "${DEPLOY_DIR}/.." && pwd)" # 仓库根目录 SERVICE_DIR="${PROJECT_ROOT}/service" # Go 后端目录 CONFIG_EXAMPLE="${DEPLOY_DIR}/config.env.example" # 配置模板 DEPLOY_ROOT="${DEPLOY_ROOT:-/var/www/fwh-toolbox}" FRONTEND_DIST_DIR="${DEPLOY_ROOT}/fwh-toolbox" SERVER_DIR="${DEPLOY_ROOT}/server" APP_NAME="fwh-toolbox-server" MCP_NAME="fwh-mcp-server" SERVICE_FILE="/etc/systemd/system/${APP_NAME}.service" RUN_USER="${RUN_USER:-jerry-remote}" # Kiro CLI 配置部署(AI 对话依赖):目标用户与 HOME 需与后端拉起 kiro-cli 时一致 KIRO_RUN_AS_USER="${KIRO_RUN_AS_USER:-${RUN_USER}}" KIRO_HOME="${KIRO_HOME:-${SERVER_DIR}}" info() { echo -e "\033[1;34m[INFO]\033[0m $*"; } ok() { echo -e "\033[1;32m[ OK ]\033[0m $*"; } # --------------------------------------------------------------------------- # 前端 # --------------------------------------------------------------------------- deploy_frontend() { info "构建前端 ..." cd "${PROJECT_ROOT}" pnpm install --frozen-lockfile pnpm build sudo mkdir -p "${FRONTEND_DIST_DIR}" info "同步静态文件到 ${FRONTEND_DIST_DIR} ..." sudo rm -rf "${FRONTEND_DIST_DIR:?}/"* sudo cp -rf ./dist/* "${FRONTEND_DIST_DIR}/" ok "前端部署完成" } # --------------------------------------------------------------------------- # 后端 # --------------------------------------------------------------------------- build_backend() { info "构建后端二进制 ..." cd "${SERVICE_DIR}" GOOS=linux GOARCH=amd64 go build -o "${APP_NAME}" ./ GOOS=linux GOARCH=amd64 go build -o "${MCP_NAME}" ./cmd/mcp/ ok "后端构建完成" } install_service() { if [[ ! -f "${SERVICE_FILE}" ]]; then info "创建 systemd 服务:${SERVICE_FILE}" sudo tee "${SERVICE_FILE}" > /dev/null <