Parcourir la source

docs: 添加服务器部署指南和一键部署脚本

- 新增 DEPLOY_SERVER.md 服务器部署指南(Ubuntu 22.04 + RTX 4070 Ti)
- 新增 server-deploy.sh 一键部署脚本(install/update/start/stop)
- 新增 start.sh 本地开发启动脚本
- 新增 deploy.sh Docker 部署脚本
- 新增 docker-compose.yml 容器编排配置
- 新增 backend/Dockerfile 应用镜像构建
- 新增 backend/CONFIG_GUIDE.md 配置文件指南
- 更新进度报告(整体进度 50%)
何文松 il y a 1 mois
Parent
commit
cd168eb62c
8 fichiers modifiés avec 1829 ajouts et 11 suppressions
  1. 411 0
      DEPLOY_SERVER.md
  2. 326 0
      backend/CONFIG_GUIDE.md
  3. 24 0
      backend/Dockerfile
  4. 184 0
      deploy.sh
  5. 139 0
      docker-compose.yml
  6. 382 0
      server-deploy.sh
  7. 293 0
      start.sh
  8. 70 11
      进度报告.md

+ 411 - 0
DEPLOY_SERVER.md

@@ -0,0 +1,411 @@
+# 灵越智报 2.0 - 服务器部署指南
+
+> **部署环境**: Ubuntu 22.04 LTS  
+> **服务器**: lanaipc (RTX 4070 Ti Super 16GB)  
+> **更新日期**: 2026-01-17  
+> **项目路径**: `/mnt/win_home/lingyue-zhibao`
+
+---
+
+## 🖥️ 服务器环境
+
+```
+GPU:    NVIDIA GeForce RTX 4070 Ti Super (16GB)
+CUDA:   12.5
+Driver: 555.42.02
+OS:     Ubuntu 22.04.5 LTS
+Kernel: 5.15.0-164-generic
+```
+
+**已运行的服务(GPU 占用 ~15.7GB):**
+- dongshi-hanlp (308MB)
+- subtitle_venv (2.2GB)  
+- venv (1.8GB)
+- VLLM::EngineCore (11.3GB)
+
+---
+
+## 📋 环境要求
+
+### 需要安装
+
+| 组件 | 版本要求 | 安装命令 |
+|------|----------|----------|
+| Java 17 | OpenJDK 17+ | `apt install openjdk-17-jdk` |
+| Maven | 3.6+ | `apt install maven` |
+| PostgreSQL | 14+ | `apt install postgresql postgresql-contrib` |
+| Redis | 6+ | `apt install redis-server` |
+| RabbitMQ | 3.9+ | `apt install rabbitmq-server` |
+| pgvector | 0.5+ | 见下方步骤 |
+
+---
+
+## 🚀 完整部署步骤
+
+### 步骤 1:安装基础依赖
+
+```bash
+# 更新系统
+apt update && apt upgrade -y
+
+# 安装 Java 17
+apt install -y openjdk-17-jdk
+
+# 安装 Maven
+apt install -y maven
+
+# 验证安装
+java -version
+mvn -version
+```
+
+### 步骤 2:安装 PostgreSQL + pgvector
+
+```bash
+# 安装 PostgreSQL
+apt install -y postgresql postgresql-contrib
+
+# 安装 pgvector 依赖
+apt install -y postgresql-server-dev-all build-essential git
+
+# 编译安装 pgvector
+cd /tmp
+git clone https://github.com/pgvector/pgvector.git
+cd pgvector
+make
+make install
+
+# 启动 PostgreSQL
+systemctl enable postgresql
+systemctl start postgresql
+```
+
+### 步骤 3:创建数据库
+
+```bash
+# 切换到 postgres 用户
+sudo -u postgres psql
+
+# 在 psql 中执行
+CREATE USER lingyue WITH PASSWORD '123123';
+CREATE DATABASE lingyue_zhibao OWNER lingyue;
+GRANT ALL PRIVILEGES ON DATABASE lingyue_zhibao TO lingyue;
+\c lingyue_zhibao
+CREATE EXTENSION IF NOT EXISTS vector;
+CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
+\q
+```
+
+### 步骤 4:安装 Redis
+
+```bash
+apt install -y redis-server
+systemctl enable redis-server
+systemctl start redis-server
+
+# 验证
+redis-cli ping
+```
+
+### 步骤 5:安装 RabbitMQ
+
+```bash
+apt install -y rabbitmq-server
+systemctl enable rabbitmq-server
+systemctl start rabbitmq-server
+
+# 启用管理插件
+rabbitmq-plugins enable rabbitmq_management
+
+# 创建用户
+rabbitmqctl add_user admin admin123
+rabbitmqctl set_user_tags admin administrator
+rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
+```
+
+### 步骤 6:部署项目
+
+```bash
+# 创建项目目录
+mkdir -p /mnt/win_home/lingyue-zhibao
+cd /mnt/win_home/lingyue-zhibao
+
+# 克隆项目(或从本地复制)
+git clone <your-gitlab-repo-url> .
+
+# 初始化数据库表
+psql -U lingyue -d lingyue_zhibao -f backend/sql/init.sql
+psql -U lingyue -d lingyue_zhibao -f backend/sql/rag_tables.sql
+
+# 编译项目
+cd backend
+mvn clean package -DskipTests
+```
+
+### 步骤 7:配置应用
+
+编辑 `backend/lingyue-starter/src/main/resources/application.properties`:
+
+```properties
+# 数据库配置
+spring.datasource.druid.url=jdbc:postgresql://localhost:5432/lingyue_zhibao
+spring.datasource.druid.username=lingyue
+spring.datasource.druid.password=123123
+
+# Redis 配置
+spring.data.redis.host=localhost
+spring.data.redis.port=6379
+
+# RabbitMQ 配置
+spring.rabbitmq.host=localhost
+spring.rabbitmq.port=5672
+spring.rabbitmq.username=admin
+spring.rabbitmq.password=admin123
+
+# Ollama 配置(使用本地 vLLM 或远程服务)
+ollama.url=http://localhost:11434
+ollama.embedding.model=nomic-embed-text
+
+# DeepSeek API(可选,使用本地 vLLM 替代)
+# deepseek.api.url=http://localhost:8080/v1
+# deepseek.api.key=token-abc123
+```
+
+### 步骤 8:启动应用
+
+```bash
+cd /mnt/win_home/lingyue-zhibao/backend
+
+# 前台启动
+java -Xms1g -Xmx2g -jar lingyue-starter/target/lingyue-starter.jar
+
+# 或后台启动
+nohup java -Xms1g -Xmx2g -jar lingyue-starter/target/lingyue-starter.jar > /var/log/lingyue.log 2>&1 &
+```
+
+---
+
+## 🤖 配置 Embedding 服务
+
+### 方案 A:使用 Ollama(推荐,简单)
+
+```bash
+# 安装 Ollama
+curl -fsSL https://ollama.ai/install.sh | sh
+
+# 下载 Embedding 模型
+ollama pull nomic-embed-text
+
+# 启动服务
+nohup ollama serve > /var/log/ollama.log 2>&1 &
+```
+
+### 方案 B:使用现有的 vLLM(高效)
+
+如果你的 vLLM 已经在运行,可以配置兼容的 Embedding 服务:
+
+```properties
+# application.properties
+ollama.url=http://localhost:8080
+```
+
+### 方案 C:使用 HuggingFace TEI(专业)
+
+```bash
+# 使用 Docker(如果可用)
+docker run -d --gpus all -p 8081:80 \
+  ghcr.io/huggingface/text-embeddings-inference:latest \
+  --model-id BAAI/bge-base-zh-v1.5
+```
+
+---
+
+## 🔧 Systemd 服务配置
+
+创建 `/etc/systemd/system/lingyue.service`:
+
+```ini
+[Unit]
+Description=Lingyue Zhibao Application
+After=network.target postgresql.service redis.service rabbitmq-server.service
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=/mnt/win_home/lingyue-zhibao/backend
+ExecStart=/usr/bin/java -Xms1g -Xmx2g -jar lingyue-starter/target/lingyue-starter.jar
+Restart=always
+RestartSec=10
+
+Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
+
+[Install]
+WantedBy=multi-user.target
+```
+
+启用服务:
+
+```bash
+systemctl daemon-reload
+systemctl enable lingyue
+systemctl start lingyue
+
+# 查看状态
+systemctl status lingyue
+
+# 查看日志
+journalctl -u lingyue -f
+```
+
+---
+
+## 📡 API 接口一览
+
+### 认证接口
+
+| 方法 | 路径 | 功能 |
+|------|------|------|
+| POST | `/auth/register` | 用户注册 |
+| POST | `/auth/login` | 用户登录 |
+| POST | `/auth/logout` | 用户登出 |
+
+### 文件上传接口
+
+| 方法 | 路径 | 功能 |
+|------|------|------|
+| POST | `/api/v1/parse/upload` | 上传文件 |
+| GET | `/api/v1/parse/file/exists` | 检查文件是否存在 |
+
+### 解析接口
+
+| 方法 | 路径 | 功能 |
+|------|------|------|
+| POST | `/parse/start` | 启动解析任务 |
+| GET | `/parse/status/{documentId}` | 查询解析状态 |
+
+### RAG 接口
+
+| 方法 | 路径 | 功能 |
+|------|------|------|
+| POST | `/api/rag/index` | 索引文档 |
+| POST | `/api/rag/query` | RAG 问答 |
+| GET | `/api/rag/chunks/{documentId}` | 获取文档分块 |
+| DELETE | `/api/rag/index/{documentId}` | 删除索引 |
+
+---
+
+## 🧪 测试部署
+
+```bash
+# 1. 检查服务状态
+curl http://localhost:8000/actuator/health
+
+# 2. 用户注册
+curl -X POST http://localhost:8000/auth/register \
+  -H "Content-Type: application/json" \
+  -d '{"username":"admin","email":"admin@lingyue.com","password":"admin123"}'
+
+# 3. 用户登录
+curl -X POST http://localhost:8000/auth/login \
+  -H "Content-Type: application/json" \
+  -d '{"username":"admin","password":"admin123"}'
+
+# 4. 上传测试文件
+curl -X POST http://localhost:8000/api/v1/parse/upload \
+  -F "file=@test.pdf" \
+  -F "userId=admin"
+```
+
+---
+
+## 🌐 Nginx 反向代理(可选)
+
+```nginx
+# /etc/nginx/sites-available/lingyue
+server {
+    listen 80;
+    server_name your-domain.com;
+
+    location / {
+        proxy_pass http://localhost:8000;
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
+        
+        # WebSocket 支持
+        proxy_http_version 1.1;
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection "upgrade";
+    }
+
+    # 文件上传大小限制
+    client_max_body_size 100M;
+}
+```
+
+启用:
+
+```bash
+ln -s /etc/nginx/sites-available/lingyue /etc/nginx/sites-enabled/
+nginx -t && systemctl reload nginx
+```
+
+---
+
+## 📊 服务端口
+
+| 服务 | 端口 | 说明 |
+|------|------|------|
+| 灵越智报 | 8000 | 主应用 |
+| PostgreSQL | 5432 | 数据库 |
+| Redis | 6379 | 缓存 |
+| RabbitMQ | 5672 | 消息队列 |
+| RabbitMQ 管理 | 15672 | Web 管理界面 |
+| Ollama | 11434 | Embedding 服务 |
+| vLLM(现有) | - | LLM 推理服务 |
+
+---
+
+## 🔥 快速部署脚本
+
+在服务器上执行:
+
+```bash
+#!/bin/bash
+# deploy.sh
+
+set -e
+
+PROJECT_DIR="/mnt/win_home/lingyue-zhibao"
+
+echo "=== 检查服务状态 ==="
+systemctl is-active postgresql || systemctl start postgresql
+systemctl is-active redis-server || systemctl start redis-server
+systemctl is-active rabbitmq-server || systemctl start rabbitmq-server
+
+echo "=== 编译项目 ==="
+cd $PROJECT_DIR/backend
+mvn clean package -DskipTests -q
+
+echo "=== 停止旧进程 ==="
+pkill -f "lingyue-starter.jar" || true
+sleep 2
+
+echo "=== 启动应用 ==="
+nohup java -Xms1g -Xmx2g -jar lingyue-starter/target/lingyue-starter.jar > /var/log/lingyue.log 2>&1 &
+
+sleep 10
+
+echo "=== 检查应用状态 ==="
+curl -s http://localhost:8000/actuator/health || echo "启动中,请稍候..."
+
+echo "=== 部署完成 ==="
+echo "访问地址: http://$(hostname -I | awk '{print $1}'):8000"
+```
+
+---
+
+## 📝 更新日志
+
+- **2026-01-17**: 服务器部署版本,支持 Ubuntu 22.04 + RTX 4070 Ti

+ 326 - 0
backend/CONFIG_GUIDE.md

@@ -0,0 +1,326 @@
+# 配置文件指南
+
+## 配置文件说明
+
+项目统一使用 **`.properties`** 格式的配置文件,已删除所有 `.yml` 配置文件以避免混淆。
+
+## 配置文件结构
+
+### 1. 公共配置 (Common Module)
+
+位于 `common/src/main/resources/`
+
+#### `application-common.properties`
+公共的数据库、MyBatis Plus、日志配置,所有服务共享。
+
+```properties
+# 数据库连接池配置
+spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
+spring.datasource.druid.driver-class-name=org.postgresql.Driver
+spring.datasource.druid.url=jdbc:postgresql://localhost:5432/lingyue_zhibao
+spring.datasource.druid.username=${DB_USERNAME:postgres}
+spring.datasource.druid.password=${DB_PASSWORD:postgres}
+
+# MyBatis Plus配置
+mybatis-plus.mapper-locations=classpath*:mapper/**/*Mapper.xml
+mybatis-plus.configuration.map-underscore-to-camel-case=true
+mybatis-plus.global-config.db-config.id-type=assign_uuid
+
+# 日志配置
+logging.level.root=INFO
+logging.level.com.lingyue=DEBUG
+```
+
+#### `application-infra.properties`
+基础设施配置,包括 Nacos、RabbitMQ、Redis。
+
+```properties
+# Nacos服务发现
+spring.cloud.nacos.discovery.server-addr=${NACOS_SERVER_ADDR:localhost:8848}
+
+# RabbitMQ配置
+spring.rabbitmq.host=${RABBITMQ_HOST:localhost}
+spring.rabbitmq.port=${RABBITMQ_PORT:5672}
+
+# Redis配置
+spring.data.redis.host=${REDIS_HOST:localhost}
+spring.data.redis.port=${REDIS_PORT:6379}
+```
+
+### 2. 各服务配置
+
+每个微服务都有自己的 `application.properties`:
+
+```
+backend/
+├── auth-service/src/main/resources/
+│   └── application.properties          # Auth 服务特定配置
+├── document-service/src/main/resources/
+│   └── application.properties          # Document 服务特定配置
+├── parse-service/src/main/resources/
+│   └── application.properties          # Parse 服务特定配置
+├── ai-service/src/main/resources/
+│   └── application.properties          # AI 服务特定配置
+├── graph-service/src/main/resources/
+│   └── application.properties          # Graph 服务特定配置
+├── notification-service/src/main/resources/
+│   └── application.properties          # Notification 服务特定配置
+└── lingyue-starter/src/main/resources/
+    ├── application.properties          # 单体应用主配置
+    ├── application-dev.properties      # 开发环境配置
+    └── application-prod.properties     # 生产环境配置
+```
+
+### 3. 单体应用配置 (Lingyue Starter)
+
+这是最重要的配置文件,用于单体应用部署。
+
+#### `application.properties`
+主配置文件,包含所有基础配置。
+
+```properties
+# 引入公共配置
+spring.config.import=classpath:application-common.properties,classpath:application-infra.properties
+
+# 服务端口
+server.port=8000
+
+# 应用名称
+spring.application.name=lingyue-zhibao
+
+# 激活的环境
+spring.profiles.active=dev
+
+# 文件上传
+spring.servlet.multipart.max-file-size=20MB
+spring.servlet.multipart.max-request-size=100MB
+
+# JWT配置
+jwt.secret=${JWT_SECRET:lingyue-zhibao-secret-key-2024-please-change-in-production}
+jwt.expiration=604800000
+
+# SpringDoc API文档
+springdoc.swagger-ui.enabled=true
+springdoc.swagger-ui.path=/swagger-ui.html
+
+# PaddleOCR配置
+paddleocr.server-url=${PADDLEOCR_SERVER_URL:http://localhost:8866}
+
+# DeepSeek API配置
+deepseek.api-key=${DEEPSEEK_API_KEY:}
+```
+
+#### `application-dev.properties`
+开发环境配置,覆盖主配置。
+
+```properties
+# 开发环境日志级别
+logging.level.com.lingyue=DEBUG
+logging.level.org.springframework.web=DEBUG
+
+# 热部署
+spring.devtools.restart.enabled=true
+
+# SQL日志
+mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+```
+
+#### `application-prod.properties`
+生产环境配置,使用环境变量。
+
+```properties
+# 生产环境日志级别
+logging.level.com.lingyue=INFO
+logging.level.org.springframework.web=WARN
+
+# 数据库(使用环境变量)
+spring.datasource.druid.url=jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME}
+spring.datasource.druid.username=${DB_USERNAME}
+spring.datasource.druid.password=${DB_PASSWORD}
+
+# 禁用热部署
+spring.devtools.restart.enabled=false
+
+# 禁用API文档(可选)
+springdoc.api-docs.enabled=false
+springdoc.swagger-ui.enabled=false
+```
+
+## 配置优先级
+
+Spring Boot 配置加载优先级(从高到低):
+
+1. **命令行参数**: `java -jar app.jar --server.port=8080`
+2. **环境变量**: `export SERVER_PORT=8080`
+3. **application-{profile}.properties**: 如 `application-prod.properties`
+4. **application.properties**: 主配置文件
+5. **引入的配置文件**: `application-common.properties`, `application-infra.properties`
+
+## 环境变量配置
+
+### 开发环境
+
+```bash
+# 使用默认配置,无需设置环境变量
+java -jar lingyue-starter.jar
+```
+
+### 生产环境
+
+```bash
+# 方式一: 设置环境变量
+export SPRING_PROFILES_ACTIVE=prod
+export DB_HOST=db.example.com
+export DB_PORT=5432
+export DB_NAME=lingyue_zhibao
+export DB_USERNAME=lingyue
+export DB_PASSWORD=your-secure-password
+export REDIS_HOST=redis.example.com
+export REDIS_PASSWORD=your-redis-password
+export RABBITMQ_HOST=rabbitmq.example.com
+export RABBITMQ_USERNAME=admin
+export RABBITMQ_PASSWORD=your-rabbitmq-password
+export JWT_SECRET=your-very-long-random-secret-key-at-least-32-characters
+export DEEPSEEK_API_KEY=your-deepseek-api-key
+
+java -jar lingyue-starter.jar
+
+# 方式二: 使用 .env 文件配合 Docker
+# 见 .env.example 文件
+docker-compose up -d
+```
+
+### 常用环境变量列表
+
+| 环境变量 | 说明 | 默认值 | 必需 |
+|---------|------|--------|------|
+| `SPRING_PROFILES_ACTIVE` | 激活的配置文件 | dev | 否 |
+| `DB_HOST` | 数据库主机 | localhost | 生产环境必需 |
+| `DB_PORT` | 数据库端口 | 5432 | 否 |
+| `DB_NAME` | 数据库名称 | lingyue_zhibao | 否 |
+| `DB_USERNAME` | 数据库用户名 | postgres | 是 |
+| `DB_PASSWORD` | 数据库密码 | postgres | 是 |
+| `REDIS_HOST` | Redis主机 | localhost | 是 |
+| `REDIS_PORT` | Redis端口 | 6379 | 否 |
+| `REDIS_PASSWORD` | Redis密码 | (空) | 否 |
+| `RABBITMQ_HOST` | RabbitMQ主机 | localhost | 是 |
+| `RABBITMQ_PORT` | RabbitMQ端口 | 5672 | 否 |
+| `RABBITMQ_USERNAME` | RabbitMQ用户名 | guest | 是 |
+| `RABBITMQ_PASSWORD` | RabbitMQ密码 | guest | 是 |
+| `JWT_SECRET` | JWT密钥 | (默认值) | **强烈建议设置** |
+| `PADDLEOCR_SERVER_URL` | OCR服务地址 | http://localhost:8866 | 如需OCR功能 |
+| `DEEPSEEK_API_KEY` | DeepSeek API密钥 | (空) | 如需AI功能 |
+| `DEEPSEEK_API_URL` | DeepSeek API地址 | https://api.deepseek.com | 否 |
+
+## 配置验证
+
+### 1. 检查配置文件是否生效
+
+启动应用后,查看日志中的配置信息:
+
+```bash
+# 启动应用
+java -jar lingyue-starter.jar
+
+# 日志中会显示:
+# - 激活的配置文件: spring.profiles.active
+# - 数据源连接信息
+# - 服务端口
+```
+
+### 2. 访问配置端点(需要启用 Actuator)
+
+```bash
+# 查看所有配置
+curl http://localhost:8000/actuator/configprops
+
+# 查看环境变量
+curl http://localhost:8000/actuator/env
+```
+
+### 3. 验证数据库连接
+
+访问 Druid 监控页面:
+- URL: http://localhost:8000/druid/
+- 用户名: admin
+- 密码: admin123
+
+## 常见问题
+
+### 1. 配置文件不生效
+
+**问题**: 修改了配置文件,但应用没有使用新配置。
+
+**解决方案**:
+```bash
+# 清理编译缓存
+mvn clean
+
+# 重新编译
+mvn package -DskipTests
+
+# 重启应用
+```
+
+### 2. 环境变量不生效
+
+**问题**: 设置了环境变量,但应用仍使用默认值。
+
+**解决方案**:
+```bash
+# 检查环境变量是否正确设置
+echo $DB_USERNAME
+echo $JWT_SECRET
+
+# 使用 -D 参数传递配置
+java -jar lingyue-starter.jar -Dspring.datasource.druid.username=lingyue
+
+# 或使用 Spring Boot 的环境变量格式
+export SPRING_DATASOURCE_DRUID_USERNAME=lingyue
+```
+
+### 3. 数据库连接失败
+
+**问题**: 应用启动时报数据库连接错误。
+
+**解决方案**:
+```properties
+# 检查 application.properties 中的配置
+spring.datasource.druid.url=jdbc:postgresql://localhost:5432/lingyue_zhibao
+spring.datasource.druid.username=postgres
+spring.datasource.druid.password=postgres
+
+# 或设置环境变量
+export DB_USERNAME=postgres
+export DB_PASSWORD=postgres
+```
+
+### 4. JWT 密钥警告
+
+**问题**: 日志中提示使用默认 JWT 密钥不安全。
+
+**解决方案**:
+```bash
+# 生成随机密钥(Linux/Mac)
+openssl rand -base64 48
+
+# 设置环境变量
+export JWT_SECRET=your-generated-secret-key
+
+# 或在 application.properties 中直接设置
+jwt.secret=your-generated-secret-key
+```
+
+## 最佳实践
+
+1. **开发环境**: 使用 `application-dev.properties`,配置写在文件中
+2. **生产环境**: 使用 `application-prod.properties`,敏感配置用环境变量
+3. **Docker 部署**: 使用 `.env` 文件管理环境变量
+4. **敏感信息**: 永远不要把密码、密钥提交到 Git 仓库
+5. **配置分离**: 公共配置放在 `application-common.properties`,特定配置放在各服务配置文件
+
+## 配置文件变更历史
+
+- **2026-01-15**: 统一使用 `.properties` 格式,删除所有 `.yml` 文件
+- **2026-01-15**: 创建 `application-common.properties` 和 `application-infra.properties` 公共配置
+- **2026-01-15**: 为 `lingyue-starter` 创建 dev 和 prod 环境配置

+ 24 - 0
backend/Dockerfile

@@ -0,0 +1,24 @@
+# 使用 OpenJDK 17 作为基础镜像
+FROM openjdk:17-jdk-slim
+
+# 设置工作目录
+WORKDIR /app
+
+# 设置时区为中国上海
+ENV TZ=Asia/Shanghai
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+# 复制编译好的 jar 包
+COPY lingyue-starter/target/lingyue-starter.jar /app/app.jar
+
+# 创建数据目录
+RUN mkdir -p /tmp/lingyue-zhibao
+
+# 暴露端口
+EXPOSE 8000
+
+# JVM 参数配置
+ENV JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs"
+
+# 启动应用
+ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"]

+ 184 - 0
deploy.sh

@@ -0,0 +1,184 @@
+#!/bin/bash
+
+# 灵越智报部署脚本
+# 作者: lingyue
+# 版本: 2.0.0
+
+set -e
+
+# 颜色定义
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+NC='\033[0m' # No Color
+
+# 日志函数
+log_info() {
+    echo -e "${GREEN}[INFO]${NC} $1"
+}
+
+log_warn() {
+    echo -e "${YELLOW}[WARN]${NC} $1"
+}
+
+log_error() {
+    echo -e "${RED}[ERROR]${NC} $1"
+}
+
+# 检查依赖
+check_dependencies() {
+    log_info "检查依赖..."
+    
+    if ! command -v docker &> /dev/null; then
+        log_error "Docker 未安装,请先安装 Docker"
+        exit 1
+    fi
+    
+    if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
+        log_error "Docker Compose 未安装,请先安装 Docker Compose"
+        exit 1
+    fi
+    
+    log_info "依赖检查通过"
+}
+
+# 编译项目
+build_project() {
+    log_info "开始编译项目..."
+    cd backend
+    mvn clean package -DskipTests
+    if [ $? -ne 0 ]; then
+        log_error "项目编译失败"
+        exit 1
+    fi
+    cd ..
+    log_info "项目编译成功"
+}
+
+# 停止现有服务
+stop_services() {
+    log_info "停止现有服务..."
+    docker-compose down || docker compose down
+    log_info "服务已停止"
+}
+
+# 启动服务
+start_services() {
+    local with_ocr=$1
+    
+    log_info "启动服务..."
+    
+    if [ "$with_ocr" = "true" ]; then
+        log_info "启动包含 PaddleOCR 服务..."
+        docker-compose --profile with-ocr up -d || docker compose --profile with-ocr up -d
+    else
+        log_info "启动基础服务(不包含 OCR)..."
+        docker-compose up -d || docker compose up -d
+    fi
+    
+    if [ $? -ne 0 ]; then
+        log_error "服务启动失败"
+        exit 1
+    fi
+    
+    log_info "服务启动成功"
+}
+
+# 查看日志
+show_logs() {
+    log_info "查看应用日志..."
+    docker-compose logs -f lingyue-app || docker compose logs -f lingyue-app
+}
+
+# 检查服务状态
+check_status() {
+    log_info "检查服务状态..."
+    docker-compose ps || docker compose ps
+}
+
+# 显示帮助信息
+show_help() {
+    cat << EOF
+灵越智报部署脚本
+
+使用方法:
+    ./deploy.sh [选项]
+
+选项:
+    start           编译并启动所有服务(不包含 OCR)
+    start-with-ocr  编译并启动所有服务(包含 PaddleOCR)
+    stop            停止所有服务
+    restart         重启所有服务
+    logs            查看应用日志
+    status          查看服务状态
+    build           仅编译项目
+    help            显示此帮助信息
+
+示例:
+    ./deploy.sh start           # 启动基础服务
+    ./deploy.sh start-with-ocr  # 启动包含 OCR 的完整服务
+    ./deploy.sh logs            # 查看日志
+
+EOF
+}
+
+# 主函数
+main() {
+    local action=${1:-help}
+    
+    case $action in
+        start)
+            check_dependencies
+            build_project
+            stop_services
+            start_services false
+            log_info "部署完成!"
+            log_info "访问地址: http://localhost:8000"
+            log_info "Swagger文档: http://localhost:8000/swagger-ui.html"
+            log_info "Druid监控: http://localhost:8000/druid/ (用户名: admin, 密码: admin123)"
+            log_info "RabbitMQ管理界面: http://localhost:15672 (用户名: admin, 密码: admin123)"
+            log_info ""
+            log_warn "提示: 使用 './deploy.sh logs' 查看日志"
+            ;;
+        start-with-ocr)
+            check_dependencies
+            build_project
+            stop_services
+            start_services true
+            log_info "部署完成(包含 OCR 服务)!"
+            log_info "访问地址: http://localhost:8000"
+            log_info "PaddleOCR服务: http://localhost:8866"
+            ;;
+        stop)
+            stop_services
+            log_info "服务已全部停止"
+            ;;
+        restart)
+            check_dependencies
+            build_project
+            stop_services
+            start_services false
+            log_info "服务重启完成"
+            ;;
+        logs)
+            show_logs
+            ;;
+        status)
+            check_status
+            ;;
+        build)
+            build_project
+            ;;
+        help)
+            show_help
+            ;;
+        *)
+            log_error "未知选项: $action"
+            show_help
+            exit 1
+            ;;
+    esac
+}
+
+# 执行主函数
+main "$@"

+ 139 - 0
docker-compose.yml

@@ -0,0 +1,139 @@
+version: '3.8'
+
+services:
+  # PostgreSQL 数据库
+  postgres:
+    image: postgres:16-alpine
+    container_name: lingyue-postgres
+    restart: unless-stopped
+    environment:
+      POSTGRES_DB: lingyue_zhibao
+      POSTGRES_USER: postgres
+      POSTGRES_PASSWORD: postgres123
+      POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
+    ports:
+      - "5432:5432"
+    volumes:
+      - postgres_data:/var/lib/postgresql/data
+      - ./backend/sql:/docker-entrypoint-initdb.d
+    networks:
+      - lingyue-network
+    healthcheck:
+      test: ["CMD-SHELL", "pg_isready -U postgres"]
+      interval: 10s
+      timeout: 5s
+      retries: 5
+
+  # Redis 缓存
+  redis:
+    image: redis:7-alpine
+    container_name: lingyue-redis
+    restart: unless-stopped
+    command: redis-server --appendonly yes
+    ports:
+      - "6379:6379"
+    volumes:
+      - redis_data:/data
+    networks:
+      - lingyue-network
+    healthcheck:
+      test: ["CMD", "redis-cli", "ping"]
+      interval: 10s
+      timeout: 3s
+      retries: 5
+
+  # RabbitMQ 消息队列
+  rabbitmq:
+    image: rabbitmq:3.13-management-alpine
+    container_name: lingyue-rabbitmq
+    restart: unless-stopped
+    environment:
+      RABBITMQ_DEFAULT_USER: admin
+      RABBITMQ_DEFAULT_PASS: admin123
+    ports:
+      - "5672:5672"   # AMQP 端口
+      - "15672:15672" # 管理界面端口
+    volumes:
+      - rabbitmq_data:/var/lib/rabbitmq
+    networks:
+      - lingyue-network
+    healthcheck:
+      test: ["CMD", "rabbitmq-diagnostics", "ping"]
+      interval: 10s
+      timeout: 5s
+      retries: 5
+
+  # 灵越智报应用
+  lingyue-app:
+    build:
+      context: ./backend
+      dockerfile: Dockerfile
+    container_name: lingyue-app
+    restart: unless-stopped
+    ports:
+      - "8000:8000"
+    environment:
+      # 数据库配置
+      DB_USERNAME: postgres
+      DB_PASSWORD: postgres123
+      # Redis 配置
+      REDIS_HOST: redis
+      REDIS_PORT: 6379
+      REDIS_PASSWORD: ""
+      # RabbitMQ 配置
+      RABBITMQ_HOST: rabbitmq
+      RABBITMQ_PORT: 5672
+      RABBITMQ_USERNAME: admin
+      RABBITMQ_PASSWORD: admin123
+      # JWT 配置
+      JWT_SECRET: lingyue-zhibao-production-secret-key-please-change-this-in-production-environment
+      # PaddleOCR 配置
+      PADDLEOCR_SERVER_URL: http://paddleocr:8866
+      # DeepSeek API 配置 (需要自行配置)
+      DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}
+    volumes:
+      - app_data:/tmp/lingyue-zhibao
+      - app_logs:/app/logs
+    networks:
+      - lingyue-network
+    depends_on:
+      postgres:
+        condition: service_healthy
+      redis:
+        condition: service_healthy
+      rabbitmq:
+        condition: service_healthy
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://localhost:8000/actuator/health"]
+      interval: 30s
+      timeout: 10s
+      retries: 3
+      start_period: 60s
+
+  # PaddleOCR 服务(可选)
+  paddleocr:
+    image: paddlepaddle/paddleocr:latest-cpu
+    container_name: lingyue-paddleocr
+    restart: unless-stopped
+    ports:
+      - "8866:8866"
+    networks:
+      - lingyue-network
+    profiles:
+      - with-ocr
+
+volumes:
+  postgres_data:
+    driver: local
+  redis_data:
+    driver: local
+  rabbitmq_data:
+    driver: local
+  app_data:
+    driver: local
+  app_logs:
+    driver: local
+
+networks:
+  lingyue-network:
+    driver: bridge

+ 382 - 0
server-deploy.sh

@@ -0,0 +1,382 @@
+#!/bin/bash
+
+# ============================================
+# 灵越智报 2.0 - 服务器一键部署脚本
+# 适用于: Ubuntu 22.04 LTS
+# 服务器: lanaipc
+# ============================================
+
+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"
+LOG_DIR="/var/log/lingyue"
+DATA_DIR="/mnt/win_home/lingyue-data"
+
+# 数据库配置
+DB_NAME="lingyue_zhibao"
+DB_USER="lingyue"
+DB_PASS="123123"
+
+# RabbitMQ 配置
+MQ_USER="admin"
+MQ_PASS="admin123"
+
+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 "\n${BLUE}========== $1 ==========${NC}\n"; }
+
+# 检查 root 权限
+check_root() {
+    if [ "$EUID" -ne 0 ]; then
+        log_error "请使用 root 用户运行此脚本"
+        exit 1
+    fi
+}
+
+# 安装基础依赖
+install_dependencies() {
+    log_title "安装基础依赖"
+    
+    apt update
+    apt install -y openjdk-17-jdk maven git curl wget
+    
+    log_info "Java 版本: $(java -version 2>&1 | head -1)"
+    log_info "Maven 版本: $(mvn -version 2>&1 | head -1)"
+}
+
+# 安装 PostgreSQL + pgvector
+install_postgresql() {
+    log_title "安装 PostgreSQL + pgvector"
+    
+    # 安装 PostgreSQL
+    apt install -y postgresql postgresql-contrib postgresql-server-dev-all build-essential
+    
+    # 编译安装 pgvector
+    if [ ! -d "/tmp/pgvector" ]; then
+        cd /tmp
+        git clone https://github.com/pgvector/pgvector.git
+    fi
+    cd /tmp/pgvector
+    make clean || true
+    make
+    make install
+    
+    # 启动服务
+    systemctl enable postgresql
+    systemctl restart postgresql
+    
+    log_info "PostgreSQL 已安装并启动"
+}
+
+# 配置数据库
+setup_database() {
+    log_title "配置数据库"
+    
+    # 创建用户和数据库
+    sudo -u postgres psql <<EOF
+DO \$\$
+BEGIN
+    IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '${DB_USER}') THEN
+        CREATE USER ${DB_USER} WITH PASSWORD '${DB_PASS}';
+    END IF;
+END
+\$\$;
+
+SELECT 'CREATE DATABASE ${DB_NAME} OWNER ${DB_USER}' 
+WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${DB_NAME}')\gexec
+
+GRANT ALL PRIVILEGES ON DATABASE ${DB_NAME} TO ${DB_USER};
+EOF
+
+    # 创建扩展
+    sudo -u postgres psql -d ${DB_NAME} <<EOF
+CREATE EXTENSION IF NOT EXISTS vector;
+CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
+EOF
+    
+    log_info "数据库 ${DB_NAME} 配置完成"
+}
+
+# 安装 Redis
+install_redis() {
+    log_title "安装 Redis"
+    
+    apt install -y redis-server
+    systemctl enable redis-server
+    systemctl restart redis-server
+    
+    log_info "Redis 已安装: $(redis-cli ping)"
+}
+
+# 安装 RabbitMQ
+install_rabbitmq() {
+    log_title "安装 RabbitMQ"
+    
+    apt install -y rabbitmq-server
+    systemctl enable rabbitmq-server
+    systemctl restart rabbitmq-server
+    
+    # 启用管理插件
+    rabbitmq-plugins enable rabbitmq_management
+    
+    # 创建用户
+    rabbitmqctl add_user ${MQ_USER} ${MQ_PASS} 2>/dev/null || true
+    rabbitmqctl set_user_tags ${MQ_USER} administrator
+    rabbitmqctl set_permissions -p / ${MQ_USER} ".*" ".*" ".*"
+    
+    log_info "RabbitMQ 已安装,管理界面: http://localhost:15672"
+}
+
+# 安装 Ollama
+install_ollama() {
+    log_title "安装 Ollama"
+    
+    if ! command -v ollama &> /dev/null; then
+        curl -fsSL https://ollama.ai/install.sh | sh
+    fi
+    
+    # 启动 Ollama
+    nohup ollama serve > /var/log/ollama.log 2>&1 &
+    sleep 5
+    
+    # 下载 Embedding 模型
+    if ! ollama list | grep -q "nomic-embed-text"; then
+        log_info "下载 nomic-embed-text 模型..."
+        ollama pull nomic-embed-text
+    fi
+    
+    log_info "Ollama 已安装"
+}
+
+# 部署项目
+deploy_project() {
+    log_title "部署项目"
+    
+    # 创建目录
+    mkdir -p ${LOG_DIR}
+    mkdir -p ${DATA_DIR}
+    
+    # 进入项目目录
+    if [ ! -d "${PROJECT_DIR}" ]; then
+        log_error "项目目录不存在: ${PROJECT_DIR}"
+        log_info "请先克隆项目到 ${PROJECT_DIR}"
+        exit 1
+    fi
+    
+    cd ${PROJECT_DIR}
+    
+    # 初始化数据库表
+    log_info "初始化数据库表..."
+    PGPASSWORD=${DB_PASS} psql -U ${DB_USER} -d ${DB_NAME} -h localhost -f backend/sql/init.sql
+    PGPASSWORD=${DB_PASS} psql -U ${DB_USER} -d ${DB_NAME} -h localhost -f backend/sql/rag_tables.sql 2>/dev/null || true
+    
+    # 编译项目
+    log_info "编译项目..."
+    cd backend
+    mvn clean package -DskipTests -q
+    
+    log_info "项目编译完成"
+}
+
+# 创建 Systemd 服务
+create_systemd_service() {
+    log_title "创建 Systemd 服务"
+    
+    cat > /etc/systemd/system/lingyue.service <<EOF
+[Unit]
+Description=Lingyue Zhibao Application
+After=network.target postgresql.service redis-server.service rabbitmq-server.service
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=${PROJECT_DIR}/backend
+ExecStart=/usr/bin/java -Xms1g -Xmx2g -XX:+UseG1GC -jar lingyue-starter/target/lingyue-starter.jar
+Restart=always
+RestartSec=10
+StandardOutput=append:${LOG_DIR}/lingyue.log
+StandardError=append:${LOG_DIR}/lingyue-error.log
+
+Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
+Environment=SPRING_PROFILES_ACTIVE=prod
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+    systemctl daemon-reload
+    log_info "Systemd 服务已创建"
+}
+
+# 启动应用
+start_app() {
+    log_title "启动应用"
+    
+    systemctl enable lingyue
+    systemctl restart lingyue
+    
+    sleep 10
+    
+    if systemctl is-active --quiet lingyue; then
+        log_info "应用启动成功"
+        log_info "访问地址: http://$(hostname -I | awk '{print $1}'):8000"
+    else
+        log_error "应用启动失败,查看日志: journalctl -u lingyue -f"
+    fi
+}
+
+# 停止应用
+stop_app() {
+    log_title "停止应用"
+    systemctl stop lingyue
+    log_info "应用已停止"
+}
+
+# 查看状态
+show_status() {
+    log_title "服务状态"
+    
+    echo "PostgreSQL:  $(systemctl is-active postgresql)"
+    echo "Redis:       $(systemctl is-active redis-server)"
+    echo "RabbitMQ:    $(systemctl is-active rabbitmq-server)"
+    echo "Lingyue:     $(systemctl is-active lingyue)"
+    
+    if command -v ollama &> /dev/null && curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then
+        echo "Ollama:      running"
+    else
+        echo "Ollama:      stopped"
+    fi
+    
+    echo ""
+    if systemctl is-active --quiet lingyue; then
+        log_info "应用访问地址: http://$(hostname -I | awk '{print $1}'):8000"
+    fi
+}
+
+# 查看日志
+show_logs() {
+    journalctl -u lingyue -f
+}
+
+# 健康检查
+health_check() {
+    log_title "健康检查"
+    
+    local health=$(curl -s http://localhost:8000/actuator/health 2>/dev/null)
+    if [ -n "$health" ]; then
+        echo "$health" | python3 -m json.tool 2>/dev/null || echo "$health"
+    else
+        log_error "应用未响应"
+    fi
+}
+
+# 完整安装
+full_install() {
+    check_root
+    install_dependencies
+    install_postgresql
+    setup_database
+    install_redis
+    install_rabbitmq
+    install_ollama
+    deploy_project
+    create_systemd_service
+    start_app
+    
+    log_title "部署完成"
+    show_status
+}
+
+# 仅更新代码
+update_only() {
+    log_title "更新代码"
+    
+    cd ${PROJECT_DIR}
+    git pull origin main || git pull origin master || true
+    
+    cd backend
+    mvn clean package -DskipTests -q
+    
+    systemctl restart lingyue
+    
+    sleep 10
+    health_check
+}
+
+# 显示帮助
+show_help() {
+    cat <<EOF
+灵越智报 2.0 - 服务器部署脚本
+
+用法: ./server-deploy.sh [命令]
+
+命令:
+    install         完整安装(首次部署)
+    update          仅更新代码并重启
+    start           启动应用
+    stop            停止应用
+    restart         重启应用
+    status          查看服务状态
+    logs            查看应用日志
+    health          健康检查
+    help            显示此帮助
+
+首次部署:
+    ./server-deploy.sh install
+
+更新部署:
+    ./server-deploy.sh update
+
+EOF
+}
+
+# 主函数
+main() {
+    case "${1:-help}" in
+        install)
+            full_install
+            ;;
+        update)
+            update_only
+            ;;
+        start)
+            start_app
+            ;;
+        stop)
+            stop_app
+            ;;
+        restart)
+            systemctl restart lingyue
+            sleep 5
+            health_check
+            ;;
+        status)
+            show_status
+            ;;
+        logs)
+            show_logs
+            ;;
+        health)
+            health_check
+            ;;
+        help|--help|-h)
+            show_help
+            ;;
+        *)
+            log_error "未知命令: $1"
+            show_help
+            exit 1
+            ;;
+    esac
+}
+
+main "$@"

+ 293 - 0
start.sh

@@ -0,0 +1,293 @@
+#!/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 "$@"

+ 70 - 11
进度报告.md

@@ -1,22 +1,32 @@
 # 📊 灵越智报 2.0 - 当前进度总结
 
-**整体进度:45%**  |  **报告日期:2026-01-16**
+**整体进度:50%**  |  **报告日期:2026-01-17**
 
 ---
 
-## ✅ 已完成(45%)
+## ✅ 已完成(50%)
 
 ### 基础设施
-- Spring Boot 3.1.5 单体应用已启动成功
-- 数据库、缓存、消息队列配置完成
+- Spring Boot 3.1.5 单体应用架构(lingyue-starter)
+- 数据库(PostgreSQL + pgvector)、缓存(Redis)、消息队列(RabbitMQ)配置完成
 - 6大服务模块框架搭建完成
+- **Docker 容器化部署配置完成**
 
 ### 核心模块现状
 - 📁 文档管理、解析、认证 → 框架完成
 - 🤖 AI服务、图谱服务 → 数据层完成,RAG 功能已实现
 - 🔍 **RAG 向量化存储** → ✅ 已完成
+- 🐳 **容器化部署** → ✅ 已完成
 
-### 新增功能(2026-01-16)
+### 新增功能(2026-01-17)
+- ✅ **单体应用架构重构** - 统一到 lingyue-starter 模块
+- ✅ **配置文件统一** - 全部使用 .properties 格式,删除 .yml 文件
+- ✅ **MyBatisPlusConfig 统一** - 移除各模块独立配置,集中管理
+- ✅ **Docker 部署配置** - Dockerfile + docker-compose.yml
+- ✅ **部署脚本** - deploy.sh(支持 start/stop/restart/logs)
+- ✅ **配置指南文档** - CONFIG_GUIDE.md(环境变量、配置优先级说明)
+
+### 已完成功能(2026-01-16)
 - ✅ pgvector 向量数据库集成(text_chunks, vector_embeddings 表)
 - ✅ 文本分块服务(智能句子边界切分,500字符/块,50字符重叠)
 - ✅ Ollama Embedding 向量化服务(nomic-embed-text 模型)
@@ -28,21 +38,70 @@
 
 ---
 
+## 🐳 部署架构
+
+```
+docker-compose.yml
+├── postgres (PostgreSQL 16 + pgvector)
+├── redis (Redis 7)
+├── rabbitmq (RabbitMQ 3.13 + Management)
+├── lingyue-app (Spring Boot 应用)
+└── paddleocr (可选, --profile with-ocr)
+```
+
+**快速部署命令:**
+```bash
+./deploy.sh start           # 启动基础服务
+./deploy.sh start-with-ocr  # 启动包含 OCR 的完整服务
+./deploy.sh logs            # 查看日志
+```
+
+---
+
 ## ⚠️ 关键缺失(对照技术预研表)
 
 | 预研项 | 进度 | 表格要求 | 已完成 ✅ | 待实现 ❌ |
 |--------|------|----------|-----------|-----------|
-| **1️⃣ 规则"智能体"设计** | 35% | 报告生成逻辑规则多样(字符逻辑、语义理解、实体关系多层计算) | Graph Service 架构(7个Repository)<br>规则、模板数据模型<br>数据访问层<br>**RAG 问答服务** | 规则DSL定义与解析<br>规则执行引擎<br>多层计算算法 |
-| **2️⃣ 产品定位与功能逻辑** | 40% | 产品交互界面、智能体集群、规则逻辑校验 | 6大后端服务框架<br>Flutter 项目结构<br>路由、主题、基础组件 | 所有前端页面UI<br>智能体集群架构<br>规则校验功能<br>前后端API对接 |
+| **1️⃣ 规则"智能体"设计** | 35% | 报告生成逻辑规则多样(字符逻辑、语义理解、实体关系多层计算) | Graph Service 架构(9个Repository)<br>规则、模板数据模型<br>数据访问层<br>**RAG 问答服务** | 规则DSL定义与解析<br>规则执行引擎<br>多层计算算法 |
+| **2️⃣ 产品定位与功能逻辑** | 40% | 产品交互界面、智能体集群、规则逻辑校验 | 6大后端服务框架<br>Flutter 项目结构<br>路由、主题、基础组件<br>**Docker 部署配置** | 所有前端页面UI<br>智能体集群架构<br>规则校验功能<br>前后端API对接 |
 | **3️⃣ 规则智能体模拟** | 40% | 单规则逻辑树构建、规则测试、API记忆化(知识图谱) | TextStorage(文本存储)<br>GraphNode、GraphRelation<br>ParseTask(任务管理)<br>**文本分块、向量存储**<br>**向量相似度检索** | 规则逻辑树算法<br>单规则校验引擎<br>知识图谱构建算法<br>图谱查询与推理 |
-| **4️⃣ AI模态体型/OCR** | 60% | AI模态体型、OCR、文本分析代码,NSDK集成 | PaddleOCR Client 接口<br>PDF/Word 文本提取<br>AI Service 框架<br>Element、Annotation 实体<br>**DeepSeek API 客户端**<br>**Ollama Embedding 服务** | AI模态体模型接入<br>NSDK集成<br>NLP文本分析算法<br>OCR后处理优化 |
-| **5️⃣ 前端交互设计** | 15% | AI产品"交互应简单"体验、核心交互功能规划 | Flutter 项目结构<br>路由、主题配置<br>基础组件、业务组件 | 所有7个核心页面UI<br>页面交互逻辑<br>与后端API对接<br>WebSocket实时通信 |
+| **4️⃣ AI模态体型/OCR** | 60% | AI模态体型、OCR、文本分析代码,NSDK集成 | PaddleOCR Client 接口<br>PDF/Word/Excel 文本提取<br>AI Service 框架<br>Element、Annotation 实体<br>**DeepSeek API 客户端**<br>**Ollama Embedding 服务** | AI模态体模型接入<br>NSDK集成<br>NLP文本分析算法<br>OCR后处理优化 |
+| **5️⃣ 前端交互设计** | 15% | AI产品"交互应简单"体验、核心交互功能规划 | Flutter 项目结构<br>路由、主题配置<br>基础组件、业务组件<br>7个页面骨架 | 所有7个核心页面UI<br>页面交互逻辑<br>与后端API对接<br>WebSocket实时通信 |
+
+---
+
+## 📁 项目结构
+
+```
+backend/
+├── common/                 # 公共模块(AjaxResult、异常处理、工具类)
+├── auth-service/           # 认证服务(JWT、Session、User)
+├── document-service/       # 文档管理服务
+├── parse-service/          # 解析服务(OCR、PDF/Word/Excel提取、任务中心)
+├── ai-service/             # AI服务(DeepSeek客户端)
+├── graph-service/          # 图谱服务(RAG、向量检索、知识图谱)
+├── notification-service/   # 通知服务(WebSocket)
+├── gateway-service/        # 网关服务(JWT过滤器、CORS)
+├── lingyue-starter/        # 单体应用启动器(统一配置)
+├── Dockerfile              # Docker 镜像构建
+└── sql/                    # 数据库初始化脚本
+
+frontend_flutter/
+├── lib/
+│   ├── models/             # 数据模型(6个)
+│   ├── pages/              # 页面(7个)
+│   ├── providers/          # 状态管理(4个)
+│   ├── widgets/            # 组件(8个)
+│   └── theme/              # 主题配置
+└── web/                    # Web 构建产物
+```
 
 ---
 
 ## 🎯 下一步(按优先级)
 
-1. **规则引擎** - 报告生成的核心逻辑
+1. **规则引擎** - 报告生成的核心逻辑(规则DSL定义与执行)
 2. **知识图谱算法** - 实体关系提取与图谱构建
-3. **前端核心页面** - 上传、解析、RAG问答界面
+3. **前端核心页面** - 上传、解析、RAG问答界面实现
 4. **NLP文本分析** - 基于 RAG 的文本理解增强
+5. **前后端联调** - API对接与WebSocket实时通信