| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- #!/usr/bin/env bash
- # =============================================================================
- # FranklinWH Toolbox - 一键构建 & 部署脚本(前端 + 后端)
- # =============================================================================
- # 作用:
- # 1. 构建前端(pnpm build)并同步到静态目录
- # 2. 构建后端主程序 fwh-toolbox-server 与 fwh-mcp-server,安装 systemd 服务
- #
- # 目录约定(与线上服务器保持一致,可用环境变量覆盖):
- # DEPLOY_ROOT /var/www/fwh-toolbox
- # ├── fwh-toolbox/ 前端静态文件(构建产物 dist/*)
- # └── server/ 后端二进制 + config.env + cert/
- #
- # 用法:
- # ./deploy.sh all # 前端 + 后端(默认)
- # ./deploy.sh frontend # 仅前端
- # ./deploy.sh backend # 仅后端
- #
- # 前置条件:
- # - 已安装 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}"
- 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 <<EOF
- [Unit]
- Description=${APP_NAME} service
- After=network.target postgresql.service mongod.service redis-server.service minio.service
- [Service]
- ExecStart=${SERVER_DIR}/${APP_NAME}
- Restart=always
- User=${RUN_USER}
- WorkingDirectory=${SERVER_DIR}
- CPUQuota=200%
- MemoryLimit=2G
- [Install]
- WantedBy=multi-user.target
- EOF
- sudo systemctl daemon-reload
- sudo systemctl enable "${APP_NAME}"
- ok "systemd 服务已创建并设为开机自启"
- fi
- }
- deploy_backend() {
- build_backend
- sudo mkdir -p "${SERVER_DIR}"
- info "安装二进制到 ${SERVER_DIR} ..."
- sudo mv "${SERVICE_DIR}/${APP_NAME}" "${SERVER_DIR}/${APP_NAME}"
- sudo mv "${SERVICE_DIR}/${MCP_NAME}" "${SERVER_DIR}/${MCP_NAME}"
- sudo chmod +x "${SERVER_DIR}/${APP_NAME}" "${SERVER_DIR}/${MCP_NAME}"
- if [[ ! -f "${SERVER_DIR}/config.env" ]]; then
- info "未发现 ${SERVER_DIR}/config.env,从示例模板复制(请务必修改其中的密钥)"
- sudo cp "${CONFIG_EXAMPLE}" "${SERVER_DIR}/config.env"
- fi
- install_service
- if systemctl is-active --quiet "${APP_NAME}"; then
- info "重启 ${APP_NAME} ..."
- sudo systemctl restart "${APP_NAME}"
- else
- info "启动 ${APP_NAME} ..."
- sudo systemctl start "${APP_NAME}"
- fi
- sudo systemctl status "${APP_NAME}" --no-pager || true
- ok "后端部署完成"
- }
- main() {
- local target="${1:-all}"
- case "${target}" in
- frontend) deploy_frontend ;;
- backend) deploy_backend ;;
- all) deploy_frontend; deploy_backend ;;
- *) echo "用法: $0 [all|frontend|backend]"; exit 1 ;;
- esac
- echo "===== 部署结束 ====="
- }
- main "$@"
|