forge-start.sh 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. #!/bin/bash
  2. #author: forge-admin
  3. #file: forge-start.sh
  4. #comment: Forge Admin 服务管理脚本
  5. #history:
  6. # 2026-09-11 创建,支持 forge-admin / forge-flow / forge-app / forge-report 四个服务
  7. ## ==================== 配置区 ====================
  8. # 服务名
  9. SERVICE_NAME=(
  10. forge-admin-server
  11. forge-flow-server
  12. forge-app-server
  13. forge-report-server
  14. )
  15. # 服务启动包所在的目录
  16. SERVICE_PATH=(
  17. /mnt/project/forge-admin
  18. /mnt/project/forge-admin
  19. /mnt/project/forge-admin
  20. /mnt/project/forge-admin
  21. )
  22. # 服务启动包
  23. SERVICE_PACKAGE=(
  24. forge-admin-server.jar
  25. forge-flow-server.jar
  26. forge-app-server.jar
  27. forge-report-server.jar
  28. )
  29. # 服务端口
  30. SERVICE_PORT=(
  31. 8580
  32. 8081
  33. 8583
  34. 8582
  35. )
  36. # JVM 内存配置(根据服务器内存调整)
  37. # forge-admin: 主服务,分配最多内存
  38. # forge-flow: 流程引擎,中等内存
  39. # forge-app / forge-report: 可选服务,较小内存
  40. JVM_OPTS_ADMIN="-Xms256m -Xmx384m"
  41. JVM_OPTS_FLOW="-Xms128m -Xmx256m"
  42. JVM_OPTS_APP="-Xms128m -Xmx256m"
  43. JVM_OPTS_REPORT="-Xms128m -Xmx256m"
  44. # 公共 JVM 参数(MySQL 3306、Redis 无密码、Flyway 关闭)
  45. COMMON_JVM_OPTS="
  46. -Dspring.profiles.active=prod
  47. -Dspring.flyway.enabled=false
  48. -Dspring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/forge_admin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
  49. -Dspring.datasource.dynamic.datasource.master.username=root
  50. -Dspring.datasource.dynamic.datasource.master.password=root
  51. -Dspring.data.redis.host=localhost
  52. -Dspring.data.redis.port=6379
  53. -Dspring.data.redis.redisson.config=singleServerConfig:
  54. address: \"redis://localhost:6379\"
  55. database: 0
  56. connectTimeout: 10000
  57. timeout: 3000
  58. retryAttempts: 3
  59. retryInterval: 1500
  60. connectionPoolSize: 64
  61. connectionMinimumIdleSize: 10
  62. threads: 16
  63. nettyThreads: 32
  64. -Dhotel.alipay.app-id=9021000166699753
  65. -Dhotel.alipay.private-key=MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCe+dBsO8duk5JtE5hjFGpjPyIu2j9hEYTO+moxcvX/yzEDdICtOL3CVkIl/j8zL8/dys7NgIvI9irFwnFMlLipTEI1xClFNEU7LHzYqkBDv0+6ra/5n0eLgZXrYH5zR87IMeinOFrSJsN+eMolBrKmdo/N+J5pqB6HyhhY5GNizDAePfiYDpkOHpRf8ea+wRWv8W8l7ZwecKluiE+6lEnDu2fsWFVg6DUAx8iznVZp6lpLpnGXG/KBpRZf2BNrPjHET9uZzX0WONRwahaXWHXIMEBhl+I81lC9a7B0FXAkjtYCG05rEwCD2MVVEQuFGi1mWpUr0g4rzV7+WKNAtbllAgMBAAECggEBAIPvo9APlKXqh11LI+8mpFyVqtLjgjIXDfeQz80WMZ8GjTjm2VvpeWLtn5xUczMR/Rt/Ez5t7pTr5/eUNd9ulgq7JT/l+rJafRJtC3ftY8RV4990AlXSoNfgxgFAZfFaqPxwnzsYhBdg4GH38RvlgSKxxwsTyLS7OAtN6ALuGKWGrAaLAcKM36G3b8uR+NXHZYKipzjr+MnYTSPCeNMzWuNEuWoWcemslgQ43q4YgzDF2uU5K9O/iv4Nilchz4tKfXU0KYML2LtdnFWUsLIjTYbV8/GN9MXCcHWelLs+scsmIffBmLUBgUjuU9iXC0rnQCj+rhvC2aR504WIs0Qqg4kCgYEA3i16kLecE+AgOHYdh6N0QUEjsWlQ08P77RgmLwPbOyFtFRm51RNZmv0gWNtTL9OeTsU7gEd509O7GOeM2IQafjCW1Hb1G3FekITQStu9XNc5YHRylgO9HDSOVB1BkOFXnVagpGdoeRv3d68Kc4j40qAvI6wppnrJmtFZ7IX8Bc8CgYEAty1Jhx9J8nyEFH0MXtgf08YTTrweCAIdWHgpJ5F93Vxf+uMwA9ZQXtZVVAEviGC6ti1gC9fn763/CW5os1fnT3TgZElP0iX51IZaktCgTf69HodF+G9S6xcbbBa5c/V4UeE0Ouw+jgV7jwCKrzVOKGa9u7jUtS/AR+4XzAcuzosCgYBp7Wj4QnIpj7wM71OY7bdpvTLVTQ76SAB+w/rAg6gsgv1NCBzvl/Aq0vBvLPJ2ZQCfMa3ytSFCezpC33Lpb+Jps6TV23l1AhJB+PCOIEIiV4LFl/9hwpqRLgWF2QT/nFB3dWvVtm+6/jh4WX40I2Pul+yhp12cQAKKy7GB8Ud9RQKBgCxQoXw2Hp6ybwXB5u8/HBwQzHT838sSL+VKVLKE6U1XXsUEl4YmIBWBhu0myEgXFrSiL51N44fBsXSnqF7TAlvfq7W3Yr81fsZipqDkJhQYb8pl8ZCT5hyH35N7v+wE09IDSK6EnvGe8/B5shOHMtxlVruGkLcw0TTVrh4nErTXAoGBAK+q7n7GxvdZZJzXNr6RiAaQOHofykoCtCi77FoIRL7ysQpKMCxSgVbvZNvEG7SYNtcyqjJkpbI6CflIcwk2+E9CWmFMWrw35FND9gT5aSG5h04aYH5BPGfs8SrWPL8Ukq1CA0eiRyTF6+2p8OnhVPNsRxS3DjeLJDcuXj9NXEAN
  66. -Dhotel.alipay.alipay-public-key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhkUUNj/3YJGBsADPkkkRpDqmy0ak7XW1HTO/LNRE+/C2di7jEH3f4lRKfgFfuDpRiQZzEcj7HuN6WkbsFavhXXS0LCVy6+ZI1UWCUrwqQjFaYtzgDXP9lsilOrSalbV+pLpTEjPTFK+d4QRXKV6kHlycarbLaKRsMI+LpRkmHpLFupYPw1df3WAcXL1uIgDoCFN/banw9tq22/1R8yLMFDO5JJl61h2VkCyOIrJgE6ivy93O+wUrTvoOlBAfekXkkLgH+OZ6MIJM+/GKDcA2nXBb/fUdeKuoos2Flb/linL3oLAiiEJxdug+OF0GSBPUs4+FLrBUHUftmnsPfKhNaQIDAQAB
  67. -Dhotel.alipay.gateway-url=https://openapi-sandbox.dl.alipaydev.com/gateway.do
  68. -Dhotel.alipay.sandbox=true
  69. -Dhotel.alipay.notify-url=http://localhost:8580/hotel/open/pay/notify
  70. -Dhotel.qr.base-url=http://101.133.130.202
  71. -Dhotel.qr.path=/r/
  72. -Dhotel.pay.mock-enabled=true
  73. "
  74. # 各服务专属 JVM 参数
  75. EXTRA_JVM_OPTS=(
  76. "${JVM_OPTS_ADMIN} -Dforge.flow.client.url=http://127.0.0.1:8081 ${COMMON_JVM_OPTS}"
  77. "${JVM_OPTS_FLOW} ${COMMON_JVM_OPTS}"
  78. "${JVM_OPTS_APP} ${COMMON_JVM_OPTS}"
  79. "${JVM_OPTS_REPORT} ${COMMON_JVM_OPTS}"
  80. )
  81. # 日志目录
  82. LOG_DIR=/var/log/forge
  83. ## ==================== 函数区 ====================
  84. # 脚本提示信息
  85. tips(){
  86. echo "-------------------------------------"
  87. echo ""
  88. echo "Version:1.0"
  89. echo "Author:forge-admin"
  90. echo "Comment:Forge Admin 服务管理脚本"
  91. echo ""
  92. echo " 命令举例:sh forge-start.sh -start"
  93. echo " 启动参数:"
  94. echo " -status - 查看所有服务运行状态"
  95. echo " -start - 启动所有服务"
  96. echo " -stop - 停止所有服务"
  97. echo " -restart - 重启所有服务"
  98. echo " -admin - 重启主后台服务 (port 8580)"
  99. echo " -flow - 重启流程引擎服务 (port 8081)"
  100. echo " -app - 重启 App 接口服务 (port 8583)"
  101. echo " -report - 重启大屏报表服务 (port 8582)"
  102. echo ""
  103. echo "-------------------------------------"
  104. }
  105. # 初始化日志目录
  106. init_log_dir(){
  107. if [ ! -d "$LOG_DIR" ]; then
  108. mkdir -p "$LOG_DIR"
  109. fi
  110. }
  111. # 查看状态
  112. status(){
  113. echo ""
  114. echo "--------- 查看状态 开始执行 ... -----------"
  115. for((i=0;i<${#SERVICE_NAME[@]};i++))
  116. do
  117. num=$((i+1))
  118. service_name=${SERVICE_NAME[i]}
  119. service_port=${SERVICE_PORT[i]}
  120. service_pid=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')
  121. if [ -z "$service_pid" ]; then
  122. echo "--- 服务$num: 【$service_name】(port:$service_port) 未运行!!!"
  123. else
  124. echo "--- 服务$num: 【$service_name】(port:$service_port) PID:$service_pid 运行中..."
  125. fi
  126. done
  127. echo "--------- 查看状态 执行完毕 !!! -----------"
  128. echo ""
  129. }
  130. # 启动单个服务
  131. start_service(){
  132. local idx=$1
  133. local service_name=${SERVICE_NAME[idx]}
  134. local service_path=${SERVICE_PATH[idx]}
  135. local service_package=${SERVICE_PACKAGE[idx]}
  136. local extra_opts=${EXTRA_JVM_OPTS[idx]}
  137. cd "$service_path" || return
  138. # 创建日志目录
  139. init_log_dir
  140. TODAY=$(date +%Y-%m-%d)
  141. LOG_NAME="log-${service_name}-${TODAY}.txt"
  142. FULL_LOG_NAME="${LOG_DIR}/${LOG_NAME}"
  143. # 检查进程是否已存在
  144. service_pid=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')
  145. if [ -n "$service_pid" ]; then
  146. echo "--- $service_name 进程已存在 (PID:$service_pid),无需启动"
  147. return
  148. fi
  149. echo "--- $service_name 开始启动 ..."
  150. echo "--- 服务目录:$service_path"
  151. echo "--- 启动包: $service_package"
  152. # 确保 JAVA_HOME 生效
  153. source /etc/profile 2>/dev/null
  154. nohup java $extra_opts -jar "$service_package" > "$FULL_LOG_NAME" 2>&1 &
  155. # 等待进程启动
  156. sleep 3
  157. service_pid_new=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')
  158. if [ -n "$service_pid_new" ]; then
  159. echo "--- $service_name 启动成功!PID:$service_pid_new"
  160. echo "--- 日志文件:$FULL_LOG_NAME"
  161. else
  162. echo "--- $service_name 启动失败!请查看日志:$FULL_LOG_NAME"
  163. tail -20 "$FULL_LOG_NAME"
  164. fi
  165. }
  166. # 一键启动
  167. start(){
  168. echo ""
  169. echo "--------- 启动程序 开始执行 ... -----------"
  170. for((i=0;i<${#SERVICE_NAME[@]};i++))
  171. do
  172. start_service $i
  173. sleep 2
  174. done
  175. echo "--------- 启动程序 执行完毕 !!! -----------"
  176. echo ""
  177. }
  178. # 停止单个服务
  179. stop_service(){
  180. local idx=$1
  181. local service_name=${SERVICE_NAME[idx]}
  182. service_pid=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')
  183. if [ -z "$service_pid" ]; then
  184. echo "--- $service_name 进程不存在,无需停止"
  185. else
  186. kill -9 "$service_pid"
  187. echo "--- $service_name (PID:$service_pid) 已停止"
  188. fi
  189. }
  190. # 一键停止
  191. stop(){
  192. echo ""
  193. echo "--------- 停止程序 开始执行 ... -----------"
  194. for((i=0;i<${#SERVICE_NAME[@]};i++))
  195. do
  196. stop_service $i
  197. sleep 1
  198. done
  199. echo "--------- 停止程序 执行完毕 !!! -----------"
  200. echo ""
  201. }
  202. # 一键重启
  203. restart(){
  204. echo ""
  205. echo "--------- 重启 开始执行 ... -----------"
  206. stop
  207. sleep 3
  208. start
  209. sleep 1
  210. status
  211. echo "--------- 重启 执行完毕 !!! -----------"
  212. echo ""
  213. }
  214. # 重启单个服务
  215. reservice(){
  216. local idx=$1
  217. echo "--- 重启 ${SERVICE_NAME[idx]} ..."
  218. stop_service $idx
  219. sleep 2
  220. start_service $idx
  221. }
  222. ## ==================== 入口 ====================
  223. case "$1" in
  224. "-status")
  225. status
  226. ;;
  227. "-start")
  228. start
  229. ;;
  230. "-stop")
  231. stop
  232. ;;
  233. "-restart")
  234. restart
  235. ;;
  236. "-admin")
  237. reservice 0
  238. ;;
  239. "-flow")
  240. reservice 1
  241. ;;
  242. "-app")
  243. reservice 2
  244. ;;
  245. "-report")
  246. reservice 3
  247. ;;
  248. *)
  249. tips
  250. ;;
  251. esac
  252. exit 0