start.sh 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. #!/bin/bash
  2. # ============================================
  3. # 灵越智报 2.0 - 本地启动脚本
  4. # ============================================
  5. set -e
  6. # 颜色定义
  7. RED='\033[0;31m'
  8. GREEN='\033[0;32m'
  9. YELLOW='\033[1;33m'
  10. BLUE='\033[0;34m'
  11. NC='\033[0m'
  12. # 项目路径
  13. PROJECT_DIR="/home/hws/workspace/GitLab/ay/lingyue-zhibao"
  14. BACKEND_DIR="${PROJECT_DIR}/backend"
  15. JAR_FILE="${BACKEND_DIR}/lingyue-starter/target/lingyue-starter.jar"
  16. APP_PROPS="${PROJECT_DIR}/backend/application.properties"
  17. log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
  18. log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
  19. log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
  20. log_title() { echo -e "${BLUE}=== $1 ===${NC}"; }
  21. # 检查服务状态
  22. check_service() {
  23. local service=$1
  24. if systemctl is-active --quiet "$service" 2>/dev/null; then
  25. echo "running"
  26. else
  27. echo "stopped"
  28. fi
  29. }
  30. # 启动服务
  31. start_service() {
  32. local service=$1
  33. local status=$(check_service "$service")
  34. if [ "$status" = "stopped" ]; then
  35. log_warn "$service 未运行,正在启动..."
  36. sudo systemctl start "$service"
  37. sleep 2
  38. fi
  39. log_info "$service ✓"
  40. }
  41. # 检查依赖服务
  42. check_dependencies() {
  43. log_title "检查依赖服务"
  44. start_service postgresql
  45. start_service redis
  46. start_service rabbitmq
  47. }
  48. # 检查 Ollama
  49. check_ollama() {
  50. log_title "检查 Ollama"
  51. if command -v ollama &> /dev/null; then
  52. if curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then
  53. log_info "Ollama 已运行 ✓"
  54. else
  55. log_warn "启动 Ollama..."
  56. nohup ollama serve > /tmp/ollama.log 2>&1 &
  57. sleep 3
  58. if curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then
  59. log_info "Ollama 启动成功 ✓"
  60. else
  61. log_warn "Ollama 启动失败(RAG 功能将不可用)"
  62. fi
  63. fi
  64. else
  65. log_warn "Ollama 未安装(RAG 功能将不可用)"
  66. fi
  67. }
  68. # 编译项目
  69. build_project() {
  70. log_title "编译项目"
  71. cd "$BACKEND_DIR"
  72. if [ ! -f "$JAR_FILE" ] || [ "$1" = "--rebuild" ]; then
  73. log_info "正在编译..."
  74. mvn clean package -DskipTests -q
  75. log_info "编译完成 ✓"
  76. else
  77. log_info "使用已编译的 JAR 文件"
  78. fi
  79. }
  80. # 从 application.properties 加载环境变量
  81. load_app_props() {
  82. if [ -f "$APP_PROPS" ]; then
  83. log_info "加载配置: $APP_PROPS"
  84. # 过滤注释行和空行,导出为环境变量
  85. while IFS='=' read -r key value; do
  86. # 跳过注释和空行
  87. [[ "$key" =~ ^[[:space:]]*# ]] && continue
  88. [[ -z "$key" ]] && continue
  89. # 去除首尾空格
  90. key=$(echo "$key" | xargs)
  91. value=$(echo "$value" | xargs)
  92. # 只导出大写字母开头的变量(环境变量风格,如 DB_HOST)
  93. if [[ "$key" =~ ^[A-Z] ]]; then
  94. export "$key=$value"
  95. fi
  96. done < "$APP_PROPS"
  97. else
  98. log_warn "未找到 application.properties,使用默认配置"
  99. fi
  100. }
  101. # 启动应用
  102. start_app() {
  103. log_title "启动灵越智报"
  104. cd "$BACKEND_DIR"
  105. # 检查是否已运行
  106. if pgrep -f "lingyue-starter.jar" > /dev/null; then
  107. log_warn "应用已在运行中"
  108. log_info "使用 './start.sh stop' 停止应用"
  109. return
  110. fi
  111. log_info "启动应用..."
  112. echo ""
  113. echo -e "${GREEN}================================================${NC}"
  114. echo -e "${GREEN} 灵越智报 2.0${NC}"
  115. echo -e "${GREEN} 访问地址: http://localhost:8001${NC}"
  116. echo -e "${GREEN} 按 Ctrl+C 停止应用${NC}"
  117. echo -e "${GREEN}================================================${NC}"
  118. echo ""
  119. java -Xms512m -Xmx1024m \
  120. -XX:+UseG1GC \
  121. -jar "$JAR_FILE"
  122. }
  123. # 后台启动
  124. start_background() {
  125. log_title "后台启动灵越智报"
  126. cd "$BACKEND_DIR"
  127. if pgrep -f "lingyue-starter.jar" > /dev/null; then
  128. log_warn "应用已在运行中"
  129. return
  130. fi
  131. nohup java -Xms512m -Xmx1024m -XX:+UseG1GC \
  132. -jar "$JAR_FILE" > /tmp/lingyue.log 2>&1 &
  133. sleep 5
  134. if pgrep -f "lingyue-starter.jar" > /dev/null; then
  135. log_info "应用启动成功 ✓"
  136. log_info "日志文件: /tmp/lingyue.log"
  137. log_info "访问地址: http://localhost:8001"
  138. else
  139. log_error "应用启动失败,请查看日志: /tmp/lingyue.log"
  140. fi
  141. }
  142. # 停止应用
  143. stop_app() {
  144. log_title "停止灵越智报"
  145. if pgrep -f "lingyue-starter.jar" > /dev/null; then
  146. pkill -f "lingyue-starter.jar"
  147. log_info "应用已停止 ✓"
  148. else
  149. log_warn "应用未在运行"
  150. fi
  151. }
  152. # 查看状态
  153. show_status() {
  154. log_title "服务状态"
  155. echo -e "PostgreSQL: $(check_service postgresql)"
  156. echo -e "Redis: $(check_service redis)"
  157. echo -e "RabbitMQ: $(check_service rabbitmq)"
  158. if command -v ollama &> /dev/null && curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then
  159. echo -e "Ollama: running"
  160. else
  161. echo -e "Ollama: stopped"
  162. fi
  163. if pgrep -f "lingyue-starter.jar" > /dev/null; then
  164. echo -e "灵越智报: running (http://localhost:8000)"
  165. else
  166. echo -e "灵越智报: stopped"
  167. fi
  168. }
  169. # 查看日志
  170. show_logs() {
  171. if [ -f /tmp/lingyue.log ]; then
  172. tail -f /tmp/lingyue.log
  173. else
  174. log_error "日志文件不存在"
  175. fi
  176. }
  177. # 初始化数据库
  178. init_db() {
  179. log_title "初始化数据库"
  180. cd "$PROJECT_DIR"
  181. log_info "执行数据库初始化 (database/init.sql)..."
  182. psql -U lingyue -d lingyue_zhibao -f database/init.sql
  183. log_info "数据库初始化完成 ✓"
  184. }
  185. # 初始化 RAG 表(已合并到 database/init.sql,执行完整 init 即可)
  186. init_rag() {
  187. log_title "初始化 RAG 表"
  188. log_info "RAG 表已包含在 database/init.sql 中,请执行: ./start.sh init-db"
  189. init_db
  190. }
  191. # 显示帮助
  192. show_help() {
  193. cat << EOF
  194. 灵越智报 2.0 - 本地启动脚本
  195. 用法: ./start.sh [命令]
  196. 命令:
  197. (无参数) 编译并前台启动应用
  198. -d, daemon 编译并后台启动应用
  199. stop 停止应用
  200. status 查看服务状态
  201. logs 查看应用日志
  202. build 仅编译项目
  203. init-db 初始化基础数据库表
  204. init-rag 初始化 RAG 向量表(需要 pgvector)
  205. help 显示此帮助信息
  206. 示例:
  207. ./start.sh # 前台启动
  208. ./start.sh -d # 后台启动
  209. ./start.sh stop # 停止应用
  210. ./start.sh status # 查看状态
  211. ./start.sh init-db # 初始化数据库
  212. EOF
  213. }
  214. # 主函数
  215. main() {
  216. case "${1:-}" in
  217. -d|daemon)
  218. load_app_props
  219. check_dependencies
  220. check_ollama
  221. build_project
  222. start_background
  223. ;;
  224. stop)
  225. stop_app
  226. ;;
  227. status)
  228. show_status
  229. ;;
  230. logs)
  231. show_logs
  232. ;;
  233. build|--rebuild)
  234. build_project --rebuild
  235. ;;
  236. init-db)
  237. init_db
  238. ;;
  239. init-rag)
  240. init_rag
  241. ;;
  242. help|--help|-h)
  243. show_help
  244. ;;
  245. "")
  246. load_app_props
  247. check_dependencies
  248. check_ollama
  249. build_project
  250. start_app
  251. ;;
  252. *)
  253. log_error "未知命令: $1"
  254. show_help
  255. exit 1
  256. ;;
  257. esac
  258. }
  259. main "$@"