|
|
@@ -0,0 +1,209 @@
|
|
|
+#!/bin/bash
|
|
|
+
|
|
|
+# ============================================
|
|
|
+# 灵越智报 - 服务器端重新部署脚本
|
|
|
+# 在服务器上直接运行,用于更新后重启应用
|
|
|
+# ============================================
|
|
|
+
|
|
|
+set -e
|
|
|
+
|
|
|
+# 颜色定义
|
|
|
+RED='\033[0;31m'
|
|
|
+GREEN='\033[0;32m'
|
|
|
+YELLOW='\033[1;33m'
|
|
|
+BLUE='\033[0;34m'
|
|
|
+NC='\033[0m'
|
|
|
+
|
|
|
+# ========== 配置 ==========
|
|
|
+PROJECT_DIR="/mnt/win_home/lingyue-zhibao"
|
|
|
+MAVEN_REPO="/mnt/win_home/.m2/repository"
|
|
|
+LOG_FILE="/var/log/lingyue.log"
|
|
|
+JAR_NAME="lingyue-starter.jar"
|
|
|
+JAR_PATH="${PROJECT_DIR}/backend/lingyue-starter/target/${JAR_NAME}"
|
|
|
+APP_PORT=5232
|
|
|
+
|
|
|
+# JVM 参数
|
|
|
+JVM_OPTS="-Xms1g -Xmx2g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError"
|
|
|
+# ===========================
|
|
|
+
|
|
|
+log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
|
|
|
+log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
|
|
+log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
|
|
+
|
|
|
+# 停止应用
|
|
|
+stop_app() {
|
|
|
+ log_info "停止应用..."
|
|
|
+ pkill -f "${JAR_NAME}" 2>/dev/null || true
|
|
|
+ sleep 2
|
|
|
+
|
|
|
+ if pgrep -f "${JAR_NAME}" > /dev/null 2>&1; then
|
|
|
+ log_warn "强制终止..."
|
|
|
+ pkill -9 -f "${JAR_NAME}" 2>/dev/null || true
|
|
|
+ sleep 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ log_info "应用已停止"
|
|
|
+}
|
|
|
+
|
|
|
+# 编译
|
|
|
+build() {
|
|
|
+ log_info "编译项目..."
|
|
|
+ cd ${PROJECT_DIR}/backend
|
|
|
+ rm -rf lingyue-starter/target 2>/dev/null || true
|
|
|
+ mvn clean package -DskipTests -q -Dmaven.repo.local=${MAVEN_REPO}
|
|
|
+ log_info "编译完成"
|
|
|
+}
|
|
|
+
|
|
|
+# 启动应用(前台)
|
|
|
+start_foreground() {
|
|
|
+ log_info "启动应用(前台模式)..."
|
|
|
+ cd ${PROJECT_DIR}/backend
|
|
|
+ echo ""
|
|
|
+ echo -e "${GREEN}================================================${NC}"
|
|
|
+ echo -e "${GREEN} 灵越智报 2.0${NC}"
|
|
|
+ echo -e "${GREEN} 访问地址: http://localhost:${APP_PORT}${NC}"
|
|
|
+ echo -e "${GREEN} 按 Ctrl+C 停止${NC}"
|
|
|
+ echo -e "${GREEN}================================================${NC}"
|
|
|
+ echo ""
|
|
|
+ java ${JVM_OPTS} -jar ${JAR_PATH}
|
|
|
+}
|
|
|
+
|
|
|
+# 启动应用(后台)
|
|
|
+start_background() {
|
|
|
+ log_info "启动应用(后台模式)..."
|
|
|
+ cd ${PROJECT_DIR}/backend
|
|
|
+ nohup java ${JVM_OPTS} -jar ${JAR_PATH} > ${LOG_FILE} 2>&1 &
|
|
|
+
|
|
|
+ sleep 5
|
|
|
+
|
|
|
+ if pgrep -f "${JAR_NAME}" > /dev/null 2>&1; then
|
|
|
+ local pid=$(pgrep -f "${JAR_NAME}")
|
|
|
+ log_info "应用启动成功 (PID: $pid)"
|
|
|
+ log_info "访问地址: http://localhost:${APP_PORT}"
|
|
|
+ log_info "日志文件: ${LOG_FILE}"
|
|
|
+ else
|
|
|
+ log_error "启动失败,查看日志: tail -100 ${LOG_FILE}"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+# 查看状态
|
|
|
+status() {
|
|
|
+ if pgrep -f "${JAR_NAME}" > /dev/null 2>&1; then
|
|
|
+ local pid=$(pgrep -f "${JAR_NAME}")
|
|
|
+ log_info "应用运行中 (PID: $pid)"
|
|
|
+ log_info "端口: ${APP_PORT}"
|
|
|
+
|
|
|
+ # 健康检查
|
|
|
+ local health=$(curl -s http://localhost:${APP_PORT}/actuator/health 2>/dev/null || echo "")
|
|
|
+ if [ -n "$health" ]; then
|
|
|
+ echo "$health"
|
|
|
+ fi
|
|
|
+ else
|
|
|
+ log_warn "应用未运行"
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+# 查看日志
|
|
|
+logs() {
|
|
|
+ if [ -f ${LOG_FILE} ]; then
|
|
|
+ tail -${1:-100} ${LOG_FILE}
|
|
|
+ else
|
|
|
+ log_warn "日志文件不存在"
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+# 实时日志
|
|
|
+tail_logs() {
|
|
|
+ if [ -f ${LOG_FILE} ]; then
|
|
|
+ tail -f ${LOG_FILE}
|
|
|
+ else
|
|
|
+ log_warn "日志文件不存在"
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+# 显示帮助
|
|
|
+show_help() {
|
|
|
+ cat <<EOF
|
|
|
+灵越智报 - 服务器端重新部署脚本
|
|
|
+
|
|
|
+用法: ./redeploy.sh [命令]
|
|
|
+
|
|
|
+命令:
|
|
|
+ (无参数) 重新编译并前台启动
|
|
|
+ -d 重新编译并后台启动
|
|
|
+ start 仅启动(不编译),前台模式
|
|
|
+ start -d 仅启动(不编译),后台模式
|
|
|
+ stop 停止应用
|
|
|
+ restart 重启应用(不重新编译)
|
|
|
+ status 查看状态
|
|
|
+ logs [n] 查看最近 n 行日志(默认100)
|
|
|
+ tail 实时查看日志
|
|
|
+ build 仅编译(不启动)
|
|
|
+ help 显示帮助
|
|
|
+
|
|
|
+示例:
|
|
|
+ ./redeploy.sh # 重新编译并前台启动
|
|
|
+ ./redeploy.sh -d # 重新编译并后台启动
|
|
|
+ ./redeploy.sh restart # 快速重启
|
|
|
+ ./redeploy.sh logs 200 # 查看最近200行日志
|
|
|
+
|
|
|
+EOF
|
|
|
+}
|
|
|
+
|
|
|
+# 主函数
|
|
|
+main() {
|
|
|
+ case "${1:-}" in
|
|
|
+ "")
|
|
|
+ stop_app
|
|
|
+ build
|
|
|
+ start_foreground
|
|
|
+ ;;
|
|
|
+ -d|--daemon)
|
|
|
+ stop_app
|
|
|
+ build
|
|
|
+ start_background
|
|
|
+ ;;
|
|
|
+ start)
|
|
|
+ stop_app
|
|
|
+ if [ "${2:-}" = "-d" ]; then
|
|
|
+ start_background
|
|
|
+ else
|
|
|
+ start_foreground
|
|
|
+ fi
|
|
|
+ ;;
|
|
|
+ stop)
|
|
|
+ stop_app
|
|
|
+ ;;
|
|
|
+ restart)
|
|
|
+ stop_app
|
|
|
+ if [ "${2:-}" = "-d" ]; then
|
|
|
+ start_background
|
|
|
+ else
|
|
|
+ start_foreground
|
|
|
+ fi
|
|
|
+ ;;
|
|
|
+ status)
|
|
|
+ status
|
|
|
+ ;;
|
|
|
+ logs)
|
|
|
+ logs ${2:-100}
|
|
|
+ ;;
|
|
|
+ tail)
|
|
|
+ tail_logs
|
|
|
+ ;;
|
|
|
+ build)
|
|
|
+ build
|
|
|
+ ;;
|
|
|
+ help|--help|-h)
|
|
|
+ show_help
|
|
|
+ ;;
|
|
|
+ *)
|
|
|
+ log_error "未知命令: $1"
|
|
|
+ show_help
|
|
|
+ exit 1
|
|
|
+ ;;
|
|
|
+ esac
|
|
|
+}
|
|
|
+
|
|
|
+main "$@"
|