#!/bin/bash # 编译前后端,使用 spring profile miao33 打包 miao-admin-2.2.jar, # 备份远程原有文件后通过 SSH 上传并重启(admin jar + admin 后台静态) # 一次性配置免密: ssh-copy-id -i ~/.ssh/id_ed25519_crmeb_deploy.pub root@8.152.170.46 # 或指定密钥: SSH_IDENTITY=~/.ssh/your_key ./shell/deploy-admin-miao33.sh # 使用: ./shell/deploy-admin-miao33.sh(在 backend 目录下) set -e SSH_IDENTITY="${SSH_IDENTITY:-$HOME/.ssh/id_ed25519_crmeb_deploy}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BACKEND_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" ROOT_DIR="$(cd "$BACKEND_DIR/.." && pwd)" FRONTEND_DIR="$ROOT_DIR/frontend" DEPLOY_CONF="$BACKEND_DIR/deploy.conf" # 解析 miao33 段配置(deploy.conf 中 miao33 段到 miao50 段之间的 KEY=value) get_conf() { sed -n '/^miao33:/,/^miao50:/p' "$DEPLOY_CONF" | grep -E "^${1}=" | tail -1 | cut -d= -f2- } SERVER_HOST=$(get_conf SERVER_HOST) SERVER_USER=$(get_conf SERVER_USER) SERVER_PORT=$(get_conf SERVER_PORT) REMOTE_DIR_JAR=$(get_conf REMOTE_DIR_JAR) REMOTE_DIR_ADMIN=$(get_conf REMOTE_DIR_ADMIN) ADMIN_JAR_NAME=$(get_conf ADMIN_JAR_NAME) ADMIN_LOCAL_PORT=$(get_conf ADMIN_LOCAL_PORT) [[ -z "$SERVER_HOST" ]] && SERVER_HOST=8.152.170.46 [[ -z "$REMOTE_DIR_JAR" ]] && REMOTE_DIR_JAR=/www/wwwroot/crmeb [[ -z "$REMOTE_DIR_ADMIN" ]] && REMOTE_DIR_ADMIN=/www/wwwroot/jfadmin.xiashengjun.com [[ -z "$ADMIN_JAR_NAME" ]] && ADMIN_JAR_NAME=miao-admin-2.2.jar [[ -z "$ADMIN_LOCAL_PORT" ]] && ADMIN_LOCAL_PORT=30032 [[ -z "$SERVER_USER" ]] && SERVER_USER=root [[ -z "$SERVER_PORT" ]] && SERVER_PORT=22 JAR_PATH="$BACKEND_DIR/crmeb-admin/target/$ADMIN_JAR_NAME" REMOTE_JAR="$REMOTE_DIR_JAR/$ADMIN_JAR_NAME" [[ -f "$SSH_IDENTITY" ]] && SSH_OPTS=(-o "IdentityFile=$SSH_IDENTITY") || SSH_OPTS=() SSH_CMD=(ssh "${SSH_OPTS[@]}" -o StrictHostKeyChecking=accept-new -p "$SERVER_PORT" "$SERVER_USER@$SERVER_HOST") SCP_CMD=(scp "${SSH_OPTS[@]}" -o StrictHostKeyChecking=accept-new -P "$SERVER_PORT") BACKUP_SUFFIX="backup_$(date +%Y%m%d_%H%M%S)" APP_YML="$BACKEND_DIR/crmeb-admin/src/main/resources/application.yml" echo "=== 1. 设置 spring.profiles.active=miao33 后编译后端 ===" cd "$BACKEND_DIR" # 打包前临时改为 miao33,编译后恢复(兼容 Linux/macOS) if [[ -f "$APP_YML" ]]; then cp -a "$APP_YML" "${APP_YML}.bak" sed 's/active: *miao[0-9]*/active: miao33/' "$APP_YML" > "${APP_YML}.new" && mv "${APP_YML}.new" "$APP_YML" trap 'cp -a "${APP_YML}.bak" "$APP_YML"; rm -f "${APP_YML}.bak"; trap - EXIT' EXIT fi mvn clean package -pl crmeb-admin -am -DskipTests -q echo "已生成: $JAR_PATH" [[ ! -f "$JAR_PATH" ]] && { echo "错误: jar 未生成"; exit 1; } # 恢复 application.yml if [[ -f "${APP_YML}.bak" ]]; then cp -a "${APP_YML}.bak" "$APP_YML"; rm -f "${APP_YML}.bak"; trap - EXIT; fi echo "" echo "=== 2. 检查前端 API 地址 (frontend/.env.production) ===" VUE_APP_BASE_API_EXPECTED=$(get_conf VUE_APP_BASE_API_EXPECTED) if [[ -n "$VUE_APP_BASE_API_EXPECTED" ]]; then ENV_FILE="$FRONTEND_DIR/.env.production" CURRENT_API=$(grep -E '^[[:space:]]*VUE_APP_BASE_API[[:space:]]*=' "$ENV_FILE" 2>/dev/null | head -1 | sed -E "s/^[^=]*=[[:space:]]*['\"]?([^'\"]*)['\"]?[[:space:]]*/\1/" | tr -d ' ') if [[ "$CURRENT_API" != "$VUE_APP_BASE_API_EXPECTED" ]]; then echo "错误: 打包前请确认 API 接口地址为本项目的。" echo " 当前 frontend/.env.production: VUE_APP_BASE_API = '$CURRENT_API'" echo " miao33 期望: VUE_APP_BASE_API = '$VUE_APP_BASE_API_EXPECTED'" echo "请修改 frontend/.env.production 后重新执行。" exit 1 fi echo "已确认 VUE_APP_BASE_API = '$CURRENT_API'" fi echo "" echo "=== 3. 编译前端 (admin 后台) ===" cd "$FRONTEND_DIR" export NODE_OPTIONS="${NODE_OPTIONS:-} --openssl-legacy-provider" npm run build:prod echo "已生成: $FRONTEND_DIR/dist" [[ ! -d "$FRONTEND_DIR/dist" ]] && { echo "错误: dist 未生成"; exit 1; } echo "" echo "=== 4. 远程备份原有文件 ===" "${SSH_CMD[@]}" "bash -s" << REMOTE_BACKUP set -e mkdir -p "$REMOTE_DIR_JAR/backups" if [ -f "$REMOTE_JAR" ]; then cp -a "$REMOTE_JAR" "$REMOTE_DIR_JAR/backups/${ADMIN_JAR_NAME}.${BACKUP_SUFFIX}" echo "已备份 jar: $REMOTE_DIR_JAR/backups/${ADMIN_JAR_NAME}.${BACKUP_SUFFIX}" fi if [ -d "$REMOTE_DIR_ADMIN" ] && [ "\$(ls -A $REMOTE_DIR_ADMIN 2>/dev/null)" ]; then BACKUP_TAR="$REMOTE_DIR_ADMIN/../jfadmin_${BACKUP_SUFFIX}.tar.gz" tar -czf "\$BACKUP_TAR" -C "$REMOTE_DIR_ADMIN" . echo "已备份后台静态: \$BACKUP_TAR" fi REMOTE_BACKUP echo "" echo "=== 5. 上传 $ADMIN_JAR_NAME 到 $REMOTE_DIR_JAR ===" "${SCP_CMD[@]}" "$JAR_PATH" "$SERVER_USER@$SERVER_HOST:$REMOTE_DIR_JAR/" echo "jar 上传完成." echo "" echo "=== 6. 上传 admin 后台静态 (dist) 到 $REMOTE_DIR_ADMIN ===" "${SSH_CMD[@]}" "mkdir -p $REMOTE_DIR_ADMIN && (rm -rf ${REMOTE_DIR_ADMIN}/* ${REMOTE_DIR_ADMIN}/.??* 2>/dev/null; true)" (cd "$FRONTEND_DIR/dist" && tar cf - .) | "${SSH_CMD[@]}" "mkdir -p $REMOTE_DIR_ADMIN && cd $REMOTE_DIR_ADMIN && tar xf -" echo "后台静态上传完成." echo "" echo "=== 7. 远程重启 admin 服务 (profile=miao33, port=$ADMIN_LOCAL_PORT) ===" "${SSH_CMD[@]}" "cd $REMOTE_DIR_JAR && \ (pkill -f $ADMIN_JAR_NAME || true) && \ sleep 2 && \ nohup java -jar $ADMIN_JAR_NAME --spring.profiles.active=miao33 --server.port=$ADMIN_LOCAL_PORT > admin.log 2>&1 & \ sleep 3 && \ (pgrep -f $ADMIN_JAR_NAME && echo 'Admin 进程已启动' || echo '请检查 admin.log 启动是否失败')" echo "" echo "=== miao33 部署完成 ==="