redeploy.sh 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #!/bin/bash
  2. # ============================================
  3. # 灵越智报 - 服务器端重新部署脚本
  4. # 在服务器上直接运行,用于更新后重启应用
  5. # ============================================
  6. set -e
  7. # 颜色定义
  8. RED='\033[0;31m'
  9. GREEN='\033[0;32m'
  10. YELLOW='\033[1;33m'
  11. BLUE='\033[0;34m'
  12. NC='\033[0m'
  13. # ========== 配置 ==========
  14. PROJECT_DIR="/mnt/win_home/lingyue-zhibao"
  15. MAVEN_REPO="/mnt/win_home/.m2/repository"
  16. LOG_FILE="/var/log/lingyue.log"
  17. JAR_NAME="lingyue-starter.jar"
  18. JAR_PATH="${PROJECT_DIR}/backend/lingyue-starter/target/${JAR_NAME}"
  19. APP_PORT=5232
  20. # JVM 参数
  21. JVM_OPTS="-Xms1g -Xmx2g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError"
  22. # ===========================
  23. log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
  24. log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
  25. log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
  26. # 停止应用
  27. stop_app() {
  28. log_info "停止应用..."
  29. pkill -f "${JAR_NAME}" 2>/dev/null || true
  30. sleep 2
  31. if pgrep -f "${JAR_NAME}" > /dev/null 2>&1; then
  32. log_warn "强制终止..."
  33. pkill -9 -f "${JAR_NAME}" 2>/dev/null || true
  34. sleep 1
  35. fi
  36. log_info "应用已停止"
  37. }
  38. # 编译
  39. build() {
  40. log_info "编译项目..."
  41. cd ${PROJECT_DIR}/backend
  42. rm -rf lingyue-starter/target 2>/dev/null || true
  43. mvn clean package -DskipTests -q -Dmaven.repo.local=${MAVEN_REPO}
  44. log_info "编译完成"
  45. }
  46. # 启动应用(前台)
  47. start_foreground() {
  48. log_info "启动应用(前台模式)..."
  49. cd ${PROJECT_DIR}/backend
  50. echo ""
  51. echo -e "${GREEN}================================================${NC}"
  52. echo -e "${GREEN} 灵越智报 2.0${NC}"
  53. echo -e "${GREEN} 访问地址: http://localhost:${APP_PORT}${NC}"
  54. echo -e "${GREEN} 按 Ctrl+C 停止${NC}"
  55. echo -e "${GREEN}================================================${NC}"
  56. echo ""
  57. java ${JVM_OPTS} -jar ${JAR_PATH}
  58. }
  59. # 启动应用(后台)
  60. start_background() {
  61. log_info "启动应用(后台模式)..."
  62. cd ${PROJECT_DIR}/backend
  63. nohup java ${JVM_OPTS} -jar ${JAR_PATH} > ${LOG_FILE} 2>&1 &
  64. sleep 5
  65. if pgrep -f "${JAR_NAME}" > /dev/null 2>&1; then
  66. local pid=$(pgrep -f "${JAR_NAME}")
  67. log_info "应用启动成功 (PID: $pid)"
  68. log_info "访问地址: http://localhost:${APP_PORT}"
  69. log_info "日志文件: ${LOG_FILE}"
  70. else
  71. log_error "启动失败,查看日志: tail -100 ${LOG_FILE}"
  72. exit 1
  73. fi
  74. }
  75. # 查看状态
  76. status() {
  77. if pgrep -f "${JAR_NAME}" > /dev/null 2>&1; then
  78. local pid=$(pgrep -f "${JAR_NAME}")
  79. log_info "应用运行中 (PID: $pid)"
  80. log_info "端口: ${APP_PORT}"
  81. # 健康检查
  82. local health=$(curl -s http://localhost:${APP_PORT}/actuator/health 2>/dev/null || echo "")
  83. if [ -n "$health" ]; then
  84. echo "$health"
  85. fi
  86. else
  87. log_warn "应用未运行"
  88. fi
  89. }
  90. # 查看日志
  91. logs() {
  92. if [ -f ${LOG_FILE} ]; then
  93. tail -${1:-100} ${LOG_FILE}
  94. else
  95. log_warn "日志文件不存在"
  96. fi
  97. }
  98. # 实时日志
  99. tail_logs() {
  100. if [ -f ${LOG_FILE} ]; then
  101. tail -f ${LOG_FILE}
  102. else
  103. log_warn "日志文件不存在"
  104. fi
  105. }
  106. # 显示帮助
  107. show_help() {
  108. cat <<EOF
  109. 灵越智报 - 服务器端重新部署脚本
  110. 用法: ./redeploy.sh [命令]
  111. 命令:
  112. (无参数) 重新编译并前台启动
  113. -d 重新编译并后台启动
  114. start 仅启动(不编译),前台模式
  115. start -d 仅启动(不编译),后台模式
  116. stop 停止应用
  117. restart 重启应用(不重新编译)
  118. status 查看状态
  119. logs [n] 查看最近 n 行日志(默认100)
  120. tail 实时查看日志
  121. build 仅编译(不启动)
  122. help 显示帮助
  123. 示例:
  124. ./redeploy.sh # 重新编译并前台启动
  125. ./redeploy.sh -d # 重新编译并后台启动
  126. ./redeploy.sh restart # 快速重启
  127. ./redeploy.sh logs 200 # 查看最近200行日志
  128. EOF
  129. }
  130. # 主函数
  131. main() {
  132. case "${1:-}" in
  133. "")
  134. stop_app
  135. build
  136. start_foreground
  137. ;;
  138. -d|--daemon)
  139. stop_app
  140. build
  141. start_background
  142. ;;
  143. start)
  144. stop_app
  145. if [ "${2:-}" = "-d" ]; then
  146. start_background
  147. else
  148. start_foreground
  149. fi
  150. ;;
  151. stop)
  152. stop_app
  153. ;;
  154. restart)
  155. stop_app
  156. if [ "${2:-}" = "-d" ]; then
  157. start_background
  158. else
  159. start_foreground
  160. fi
  161. ;;
  162. status)
  163. status
  164. ;;
  165. logs)
  166. logs ${2:-100}
  167. ;;
  168. tail)
  169. tail_logs
  170. ;;
  171. build)
  172. build
  173. ;;
  174. help|--help|-h)
  175. show_help
  176. ;;
  177. *)
  178. log_error "未知命令: $1"
  179. show_help
  180. exit 1
  181. ;;
  182. esac
  183. }
  184. main "$@"