#!/bin/bash # ============================================ # 灵越智报 2.0 - 本地启动脚本 # ============================================ set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 项目路径 PROJECT_DIR="/home/hws/workspace/GitLab/ay/lingyue-zhibao" BACKEND_DIR="${PROJECT_DIR}/backend" JAR_FILE="${BACKEND_DIR}/lingyue-starter/target/lingyue-starter.jar" log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } log_title() { echo -e "${BLUE}=== $1 ===${NC}"; } # 检查服务状态 check_service() { local service=$1 if systemctl is-active --quiet "$service" 2>/dev/null; then echo "running" else echo "stopped" fi } # 启动服务 start_service() { local service=$1 local status=$(check_service "$service") if [ "$status" = "stopped" ]; then log_warn "$service 未运行,正在启动..." sudo systemctl start "$service" sleep 2 fi log_info "$service ✓" } # 检查依赖服务 check_dependencies() { log_title "检查依赖服务" start_service postgresql start_service redis start_service rabbitmq } # 检查 Ollama check_ollama() { log_title "检查 Ollama" if command -v ollama &> /dev/null; then if curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then log_info "Ollama 已运行 ✓" else log_warn "启动 Ollama..." nohup ollama serve > /tmp/ollama.log 2>&1 & sleep 3 if curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then log_info "Ollama 启动成功 ✓" else log_warn "Ollama 启动失败(RAG 功能将不可用)" fi fi else log_warn "Ollama 未安装(RAG 功能将不可用)" fi } # 编译项目 build_project() { log_title "编译项目" cd "$BACKEND_DIR" if [ ! -f "$JAR_FILE" ] || [ "$1" = "--rebuild" ]; then log_info "正在编译..." mvn clean package -DskipTests -q log_info "编译完成 ✓" else log_info "使用已编译的 JAR 文件" fi } # 启动应用 start_app() { log_title "启动灵越智报" cd "$BACKEND_DIR" # 检查是否已运行 if pgrep -f "lingyue-starter.jar" > /dev/null; then log_warn "应用已在运行中" log_info "使用 './start.sh stop' 停止应用" return fi log_info "启动应用..." echo "" echo -e "${GREEN}================================================${NC}" echo -e "${GREEN} 灵越智报 2.0${NC}" echo -e "${GREEN} 访问地址: http://localhost:8000${NC}" echo -e "${GREEN} 按 Ctrl+C 停止应用${NC}" echo -e "${GREEN}================================================${NC}" echo "" java -Xms512m -Xmx1024m \ -XX:+UseG1GC \ -jar "$JAR_FILE" } # 后台启动 start_background() { log_title "后台启动灵越智报" cd "$BACKEND_DIR" if pgrep -f "lingyue-starter.jar" > /dev/null; then log_warn "应用已在运行中" return fi nohup java -Xms512m -Xmx1024m -XX:+UseG1GC \ -jar "$JAR_FILE" > /tmp/lingyue.log 2>&1 & sleep 5 if pgrep -f "lingyue-starter.jar" > /dev/null; then log_info "应用启动成功 ✓" log_info "日志文件: /tmp/lingyue.log" log_info "访问地址: http://localhost:8000" else log_error "应用启动失败,请查看日志: /tmp/lingyue.log" fi } # 停止应用 stop_app() { log_title "停止灵越智报" if pgrep -f "lingyue-starter.jar" > /dev/null; then pkill -f "lingyue-starter.jar" log_info "应用已停止 ✓" else log_warn "应用未在运行" fi } # 查看状态 show_status() { log_title "服务状态" echo -e "PostgreSQL: $(check_service postgresql)" echo -e "Redis: $(check_service redis)" echo -e "RabbitMQ: $(check_service rabbitmq)" if command -v ollama &> /dev/null && curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then echo -e "Ollama: running" else echo -e "Ollama: stopped" fi if pgrep -f "lingyue-starter.jar" > /dev/null; then echo -e "灵越智报: running (http://localhost:8000)" else echo -e "灵越智报: stopped" fi } # 查看日志 show_logs() { if [ -f /tmp/lingyue.log ]; then tail -f /tmp/lingyue.log else log_error "日志文件不存在" fi } # 初始化数据库 init_db() { log_title "初始化数据库" cd "$PROJECT_DIR" log_info "执行基础表初始化..." psql -U lingyue -d lingyue_zhibao -f backend/sql/init.sql if [ -f backend/sql/supplement_tables.sql ]; then log_info "执行补充表初始化..." psql -U lingyue -d lingyue_zhibao -f backend/sql/supplement_tables.sql fi log_info "数据库初始化完成 ✓" } # 初始化 RAG 表 init_rag() { log_title "初始化 RAG 表" cd "$PROJECT_DIR" # 检查 pgvector if psql -U lingyue -d lingyue_zhibao -c "CREATE EXTENSION IF NOT EXISTS vector;" 2>/dev/null; then log_info "pgvector 扩展已启用 ✓" psql -U lingyue -d lingyue_zhibao -f backend/sql/rag_tables.sql log_info "RAG 表初始化完成 ✓" else log_error "pgvector 未安装,请先安装: yay -S postgresql-pgvector" fi } # 显示帮助 show_help() { cat << EOF 灵越智报 2.0 - 本地启动脚本 用法: ./start.sh [命令] 命令: (无参数) 编译并前台启动应用 -d, daemon 编译并后台启动应用 stop 停止应用 status 查看服务状态 logs 查看应用日志 build 仅编译项目 init-db 初始化基础数据库表 init-rag 初始化 RAG 向量表(需要 pgvector) help 显示此帮助信息 示例: ./start.sh # 前台启动 ./start.sh -d # 后台启动 ./start.sh stop # 停止应用 ./start.sh status # 查看状态 ./start.sh init-db # 初始化数据库 EOF } # 主函数 main() { case "${1:-}" in -d|daemon) check_dependencies check_ollama build_project start_background ;; stop) stop_app ;; status) show_status ;; logs) show_logs ;; build|--rebuild) build_project --rebuild ;; init-db) init_db ;; init-rag) init_rag ;; help|--help|-h) show_help ;; "") check_dependencies check_ollama build_project start_app ;; *) log_error "未知命令: $1" show_help exit 1 ;; esac } main "$@"