#!/bin/bash # ============================================================================= # 后端 API 服务部署脚本 # 用法:在项目根目录 mom-system-2026/ 下执行 bash deploy/deploy-backend.sh # ============================================================================= set -e # ── 配置 ───────────────────────────────────────────────────────────────────── SERVER_USER="root" SERVER_HOST="118.31.75.148" SERVER_PORT=22 REMOTE_DIR="/www/wwwroot/javaapi" JAR_NAME="ktg-admin.jar" BACKUP_DIR="${REMOTE_DIR}/backup" KEEP_BACKUPS=5 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" BACKEND_DIR="${PROJECT_ROOT}/mom-backend" LOCAL_JAR="${BACKEND_DIR}/ktg-admin/target/${JAR_NAME}" SSH="ssh -p ${SERVER_PORT} ${SERVER_USER}@${SERVER_HOST}" SCP="scp -P ${SERVER_PORT}" # ── 工具函数 ────────────────────────────────────────────────────────────────── log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"; } info() { log "INFO $*"; } ok() { log "OK $*"; } err() { log "ERROR $*" >&2; exit 1; } # ── 步骤 1:本地 Maven 构建 ──────────────────────────────────────────────────── info "Step 1/5 — Maven build (skip tests)" cd "${BACKEND_DIR}" mvn clean package -DskipTests -q [ -f "${LOCAL_JAR}" ] || err "构建产物不存在: ${LOCAL_JAR}" ok "Build OK → ${LOCAL_JAR}" # ── 步骤 2:远程备份旧 jar ────────────────────────────────────────────────────── info "Step 2/5 — Backup old jar on remote server" TIMESTAMP=$(date '+%Y%m%d_%H%M%S') $SSH bash -s << EOF set -e mkdir -p "${BACKUP_DIR}" if [ -f "${REMOTE_DIR}/${JAR_NAME}" ]; then cp "${REMOTE_DIR}/${JAR_NAME}" "${BACKUP_DIR}/${JAR_NAME%.jar}_${TIMESTAMP}.jar" echo " Backed up → ${BACKUP_DIR}/${JAR_NAME%.jar}_${TIMESTAMP}.jar" else echo " No existing jar to backup (first deploy)" fi # 只保留最近 ${KEEP_BACKUPS} 个备份 cd "${BACKUP_DIR}" ls -t | tail -n +$((${KEEP_BACKUPS} + 1)) | xargs -r rm -f echo " Backup dir now contains: \$(ls | wc -l) file(s)" EOF ok "Backup OK" # ── 步骤 3:停止旧进程 ───────────────────────────────────────────────────────── info "Step 3/5 — Stop running ${JAR_NAME} process" $SSH bash -s << 'EOF' PID=$(pgrep -f "ktg-admin.jar" || true) if [ -n "$PID" ]; then kill "$PID" sleep 3 echo " Stopped PID $PID" else echo " No running process found (safe)" fi EOF ok "Stop OK" # ── 步骤 4:上传新 jar ───────────────────────────────────────────────────────── info "Step 4/5 — Upload new jar to remote" $SCP "${LOCAL_JAR}" "${SERVER_USER}@${SERVER_HOST}:${REMOTE_DIR}/${JAR_NAME}" ok "Upload OK" # ── 步骤 5:启动新进程 ───────────────────────────────────────────────────────── info "Step 5/5 — Start new ${JAR_NAME}" $SSH bash -s << EOF set -e cd "${REMOTE_DIR}" nohup java -Xms128m -Xmx256m -jar ${JAR_NAME} > mes.log 2>&1 & sleep 2 PID=\$(pgrep -f "${JAR_NAME}" || true) if [ -n "\$PID" ]; then echo " Started PID \$PID" else echo " WARNING: process may not have started, check mes.log" fi EOF ok "Start OK" info "============================================" info "后端部署完成!访问日志:tail -f ${REMOTE_DIR}/mes.log" info "============================================"