RuoYi AI离线部署方案:无网络环境下的本地化AI服务搭建
在企业级AI应用落地过程中,网络隔离环境(如政务内网、金融专网、工业控制网络)的部署需求日益凸显。传统依赖云端API的AI服务因网络限制无法使用,而本地化部署常面临环境配置复杂、组件依赖冲突、数据安全合规等挑战。本文基于RuoYi AI开源项目,提供一套完整的离线部署解决方案,通过Docker容器化技术实现"一次打包,到处运行",解决无网络环境下的AI服务搭建难题。
部署架构与组件说明
RuoYi AI离线部署采用分层架构设计,包含基础设施层、数据存储层、AI引擎层和应用服务层四个核心层级,所有组件均通过Docker容器运行,确保环境一致性和隔离性。
系统架构概览
flowchart TD
subgraph 基础设施层
A[Docker Engine] --> B[Docker Compose]
B --> C[网络隔离环境]
end
subgraph 数据存储层
D[MySQL 8.0] --> E[业务数据]
F[Redis 6.2] --> G[缓存数据]
H[Weaviate 1.30] --> I[向量数据]
end
subgraph AI引擎层
J[本地LLM服务] --> K[文本生成]
L[BGE-M3向量模型] --> M[文本嵌入]
N[Midjourney兼容接口] --> O[图像生成]
end
subgraph 应用服务层
P[后端服务] --> Q[ruoyi-admin]
R[前端服务] --> S[管理界面]
T[Web服务] --> U[用户界面]
end
A --> D
A --> F
A --> H
A --> J
A --> P
A --> R
A --> T
D --> P
F --> P
H --> L
J --> P
L --> P
N --> P
P --> R
P --> T
核心组件说明
| 组件名称 | 版本号 | 作用 | 离线部署要点 |
|---|---|---|---|
| MySQL | 8.0.33 | 存储用户数据、配置信息、业务数据 | 需提前导入初始化SQL脚本 |
| Redis | 6.2 | 缓存会话数据、API令牌、临时计算结果 | 配置持久化策略防止数据丢失 |
| Weaviate | 1.30.0 | 向量数据库,存储文档嵌入向量 | 禁用自动更新,使用本地模块 |
| RuoYi后端 | 自定义 | 业务逻辑处理、AI模型调度 | 替换云端API调用为本地服务 |
| Admin前端 | 自定义 | 管理控制台,系统配置界面 | 打包时内置后端服务地址 |
| Web前端 | 自定义 | 用户交互界面,AI功能入口 | 离线资源本地化处理 |
网络拓扑设计
在无网络环境下,所有服务通过Docker内部网络通信,仅暴露必要端口到宿主机。生产环境建议配置防火墙策略,仅允许特定IP访问服务端口。
network
participant 宿主机
participant Docker网络
participant MySQL
participant Redis
participant Weaviate
participant 后端服务
participant 前端服务
宿主机 -- 端口映射 --> Docker网络
Docker网络 --> MySQL: 3306
Docker网络 --> Redis: 6379
Docker网络 --> Weaviate: 50050/50051
Docker网络 --> 后端服务: 6039
Docker网络 --> 前端服务: 8081/8082
部署前准备工作
硬件环境要求
RuoYi AI离线部署对硬件配置有一定要求,特别是在运行大语言模型时需要充足的内存和计算资源:
| 组件 | 最低配置 | 推荐配置 | 资源用途 |
|---|---|---|---|
| CPU | 8核Intel i5 | 16核Intel i7/Ryzen 7 | 服务运行、模型推理 |
| 内存 | 16GB | 32GB | 模型加载、向量计算、缓存 |
| 存储 | 200GB SSD | 500GB NVMe SSD | 镜像存储、数据库文件、向量数据 |
| 网络 | 无要求 | 千兆以太网 | 内部服务通信 |
注意:若需运行7B以上参数的大语言模型,推荐配置64GB内存和支持AVX2指令集的CPU。
软件环境要求
部署环境需满足以下软件依赖,所有安装包需提前下载并存储在本地:
- 操作系统:Ubuntu 20.04 LTS / CentOS 7.9
- Docker Engine:20.10.17+
- Docker Compose:2.12.2+
- 容器运行时:runc 1.1.4+
- 本地镜像仓库:可选,用于存储私有化镜像
离线资源包准备
-
基础镜像包:需提前拉取并保存以下Docker镜像:
- mysql:8.0.33
- redis:6.2
- semitechnologies/weaviate:1.30.0
- openjdk:17-jdk-slim
- nginx:1.25-alpine
- node:20
-
项目源码包:从官方仓库克隆完整代码:
git clone https://gitcode.com/ageerle/ruoyi-ai -
模型资源包:根据需求下载预训练模型(以BGE-M3向量模型为例):
# 创建模型存储目录 mkdir -p models/embedding # 假设已通过其他方式获取模型文件 cp /path/to/bge-m3 models/embedding/ -
初始化数据:SQL脚本和配置文件:
详细部署步骤
1. 环境准备
1.1 安装Docker环境
在离线服务器上安装Docker和Docker Compose,以Ubuntu系统为例:
# 解压离线安装包(假设已提前下载)
tar -zxvf docker-offline-20.10.17.tar.gz
cd docker-offline
# 安装Docker引擎
sudo dpkg -i *.deb
# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
docker --version
docker-compose --version
1.2 加载基础镜像
将提前准备的Docker镜像加载到本地:
# 加载镜像(示例命令,需根据实际文件名调整)
docker load -i mysql-8.0.33.tar
docker load -i redis-6.2.tar
docker load -i weaviate-1.30.0.tar
# ... 加载其他所有基础镜像
1.3 创建部署目录
# 创建主目录
mkdir -p /opt/ruoyi-ai/{data,logs,models,scripts}
# 创建数据子目录
mkdir -p /opt/ruoyi-ai/data/{mysql,redis,weaviate}
# 设置权限
sudo chmod -R 777 /opt/ruoyi-ai
2. 配置文件准备
2.1 生成环境变量文件
基于模板创建.env文件,关键配置如下:
# 进入部署目录
cd /opt/ruoyi-ai
# 创建.env文件
cat > .env << EOF
# 基础配置
TZ=Asia/Shanghai
# MySQL配置
MYSQL_PORT=3306
MYSQL_DATABASE=ruoyi-ai
MYSQL_ROOT_PASSWORD=SecurePassword123!
# Redis配置
REDIS_PORT=6379
REDIS_PASSWORD=RedisPass456!
REDIS_DATABASE=0
REDIS_TIMEOUT=10s
# 后端服务配置
SERVER_PORT=6039
BACKEND_HOST=ruoyi-backend
DB_USERNAME=root
DB_PASSWORD=SecurePassword123!
# 前端服务配置
ADMIN_PORT=8082
WEB_PORT=8081
# Weaviate配置
WEAVIATE_HTTP_PORT=50050
WEAVIATE_GRPC_PORT=50051
WEAVIATE_QUERY_LIMIT=25
WEAVIATE_ANONYMOUS_ACCESS=true
WEAVIATE_DATA_PATH=/var/lib/weaviate
WEAVIATE_VECTORIZER_MODULE=none
WEAVIATE_MODULES=text2vec-huggingface
WEAVIATE_CLUSTER_HOSTNAME=node1
WEAVIATE_PROTOCOL=http
WEAVIATE_CLASSNAME=LocalKnowledge
# 生产环境数据库配置
PROD_DB_URL=jdbc:mysql://mysql:3306/ruoyi-ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
PROD_DB_USERNAME=root
PROD_DB_PASSWORD=SecurePassword123!
# Redis生产环境配置
PROD_REDIS_HOST=redis
PROD_REDIS_PORT=6379
PROD_REDIS_DATABASE=0
PROD_REDIS_PASSWORD=RedisPass456!
PROD_REDIS_TIMEOUT=10s
# 前端API配置
FRONTEND_API_BASE_URL=http://ruoyi-backend:6039
EOF
2.2 创建Docker Compose配置
创建docker-compose.yaml文件:
cat > docker-compose.yaml << EOF
version: '3'
services:
mysql:
image: mysql:8.0.33
container_name: ruoyi-ai-mysql
env_file:
- ./.env
environment:
- MYSQL_ROOT_PASSWORD=\${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=\${MYSQL_DATABASE}
ports:
- "\${MYSQL_PORT}:3306"
volumes:
- ./data/mysql:/var/lib/mysql
- ./scripts/mysql-init:/docker-entrypoint-initdb.d
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
restart: always
networks:
- ruoyi-net
redis:
image: redis:6.2
container_name: ruoyi-ai-redis
env_file:
- ./.env
ports:
- "\${REDIS_PORT}:6379"
volumes:
- ./data/redis:/data
command: redis-server --appendonly yes --requirepass \${REDIS_PASSWORD}
restart: always
networks:
- ruoyi-net
weaviate:
image: semitechnologies/weaviate:1.30.0
container_name: ruoyi-ai-weaviate
env_file:
- ./.env
environment:
- QUERY_DEFAULTS_LIMIT=\${WEAVIATE_QUERY_LIMIT}
- AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=\${WEAVIATE_ANONYMOUS_ACCESS}
- PERSISTENCE_DATA_PATH=\${WEAVIATE_DATA_PATH}
- DEFAULT_VECTORIZER_MODULE=\${WEAVIATE_VECTORIZER_MODULE}
- ENABLE_MODULES=\${WEAVIATE_MODULES}
- CLUSTER_HOSTNAME=\${WEAVIATE_CLUSTER_HOSTNAME}
command: --host 0.0.0.0 --port 8080 --scheme http
ports:
- "\${WEAVIATE_HTTP_PORT}:8080"
- "\${WEAVIATE_GRPC_PORT}:50051"
volumes:
- ./data/weaviate:/var/lib/weaviate
restart: always
networks:
- ruoyi-net
ruoyi-backend:
image: ruoyi-ai-backend:local
container_name: ruoyi-ai-backend
env_file:
- ./.env
ports:
- "\${SERVER_PORT}:6039"
volumes:
- ./logs:/ruoyi/server/logs
- ./models:/ruoyi/models
depends_on:
- mysql
- redis
- weaviate
restart: always
networks:
- ruoyi-net
ruoyi-admin:
image: ruoyi-ai-admin:local
container_name: ruoyi-ai-admin
ports:
- "\${ADMIN_PORT}:80"
depends_on:
- ruoyi-backend
restart: always
networks:
- ruoyi-net
ruoyi-web:
image: ruoyi-ai-web:local
container_name: ruoyi-ai-web
ports:
- "\${WEB_PORT}:80"
depends_on:
- ruoyi-backend
restart: always
networks:
- ruoyi-net
networks:
ruoyi-net:
driver: bridge
EOF
3. 应用部署
3.1 数据库初始化
将SQL脚本复制到MySQL初始化目录:
# 假设SQL文件已传输到服务器
cp /path/to/ruoyi-ai.sql /opt/ruoyi-ai/scripts/mysql-init/
3.2 启动服务
# 进入部署目录
cd /opt/ruoyi-ai
# 启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
3.3 验证部署
服务启动后,通过以下方式验证:
-
检查容器状态:
docker-compose ps所有服务应显示为"Up"状态。
-
查看日志:
# 查看后端服务日志 docker-compose logs -f ruoyi-backend -
访问Web界面: 打开浏览器访问
http://服务器IP:8081,应能看到RuoYi AI的用户界面。 -
测试AI功能: 登录系统后,尝试使用一个不需要外部API的AI功能(如知识库问答),验证服务正常工作。
模型部署与配置
本地大语言模型部署
RuoYi AI支持集成本地运行的大语言模型,以Llama 2系列模型为例:
1. 模型准备
将下载的模型文件放置到指定目录:
# 创建模型目录
mkdir -p /opt/ruoyi-ai/models/llm/llama-2-7b-chat
# 复制模型文件(假设已通过外部介质传输)
cp /path/to/llama-2-7b-chat/* /opt/ruoyi-ai/models/llm/llama-2-7b-chat/
2. 配置模型服务
修改后端配置文件,添加本地模型支持:
# 进入后端容器
docker exec -it ruoyi-ai-backend /bin/bash
# 编辑配置文件
vi /ruoyi/conf/application-prod.yml
添加以下配置:
ai:
model:
local:
enabled: true
type: llama
path: /ruoyi/models/llm/llama-2-7b-chat
parameters:
max_new_tokens: 1024
temperature: 0.7
top_p: 0.9
3. 重启服务
# 退出容器
exit
# 重启后端服务
docker-compose restart ruoyi-backend
向量模型配置
RuoYi AI使用向量模型将文档转换为嵌入向量,配置本地向量模型:
-
上传模型文件:
mkdir -p /opt/ruoyi-ai/models/embedding/bge-m3 cp /path/to/bge-m3/* /opt/ruoyi-ai/models/embedding/bge-m3/ -
配置模型参数: 通过管理界面配置向量模型参数:
- 访问
http://服务器IP:8082登录管理后台 - 进入"系统配置" > "AI模型配置"
- 选择"向量模型"标签
- 设置"模型路径"为
/ruoyi/models/embedding/bge-m3 - 点击"测试连接"验证模型可用性
- 保存配置
- 访问
数据迁移与备份
数据迁移策略
在无网络环境下,数据迁移需通过物理介质进行:
timeline
title 离线数据迁移流程
section 准备阶段
数据导出 : 在联网环境导出用户数据、知识库内容
介质准备 : 将数据存储到USB硬盘或其他移动介质
section 迁移阶段
数据导入 : 将移动介质连接到离线服务器
校验数据 : 验证数据完整性和一致性
section 部署阶段
初始化数据库 : 导入用户数据和配置
重建向量索引 : 对知识库内容重新生成向量
备份策略
定期备份关键数据,防止数据丢失:
# 创建备份脚本
cat > /opt/ruoyi-ai/scripts/backup.sh << EOF
#!/bin/bash
DATE=\$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/opt/ruoyi-ai/backup/\$DATE
# 创建备份目录
mkdir -p \$BACKUP_DIR
# 备份MySQL数据
docker exec ruoyi-ai-mysql mysqldump -uroot -p\$MYSQL_ROOT_PASSWORD ruoyi-ai > \$BACKUP_DIR/mysql_backup.sql
# 备份Redis数据
docker exec ruoyi-ai-redis redis-cli -a \$REDIS_PASSWORD SAVE
cp /opt/ruoyi-ai/data/redis/dump.rdb \$BACKUP_DIR/
# 备份Weaviate数据
tar -zcvf \$BACKUP_DIR/weaviate_backup.tar.gz /opt/ruoyi-ai/data/weaviate
# 保留最近10个备份
ls -tp /opt/ruoyi-ai/backup/ | grep -v '/$' | tail -n +11 | xargs -I {} rm -rf /opt/ruoyi-ai/backup/{}
EOF
# 添加执行权限
chmod +x /opt/ruoyi-ai/scripts/backup.sh
# 添加到定时任务
crontab -e
# 添加以下行,每天凌晨2点执行备份
0 2 * * * /opt/ruoyi-ai/scripts/backup.sh
常见问题与解决方案
服务启动失败
问题:后端服务启动后立即退出。
排查步骤:
- 查看日志:
docker-compose logs ruoyi-backend - 检查数据库连接:确认MySQL服务正常运行
- 验证配置文件:确保数据库密码和端口正确
解决方案:
# 检查数据库连接
docker exec -it ruoyi-ai-mysql mysql -uroot -p$MYSQL_ROOT_PASSWORD
# 如果数据库连接失败,检查网络
docker network inspect ruoyi-net
AI功能无法使用
问题:调用AI功能时提示"模型不可用"。
排查步骤:
- 确认模型文件已正确放置
- 检查模型配置路径是否正确
- 查看后端日志中的模型加载信息
解决方案:
# 进入后端容器
docker exec -it ruoyi-ai-backend /bin/bash
# 手动测试模型加载
java -jar /ruoyi/ruoyi-admin.jar --test-model
性能优化建议
在离线环境中,硬件资源通常有限,可通过以下方式优化性能:
-
调整JVM参数:
# 编辑docker-compose.yaml,修改后端服务配置 environment: - JAVA_OPTS=-Xms4g -Xmx8g -XX:+UseG1GC -
优化数据库:
# 进入MySQL容器 docker exec -it ruoyi-ai-mysql /bin/bash # 编辑配置文件 vi /etc/mysql/my.cnf # 添加以下优化参数 [mysqld] innodb_buffer_pool_size=2G query_cache_size=64M max_connections=200 -
调整向量检索参数: 通过管理界面减少每次检索的文档数量,平衡速度和准确性。
部署验证与验收
功能验证清单
部署完成后,需验证以下核心功能:
| 功能模块 | 验证方法 | 预期结果 |
|---|---|---|
| 用户管理 | 创建测试用户,分配权限 | 用户可正常登录,权限控制生效 |
| 知识库 | 上传测试文档,执行问答 | 系统能基于文档内容回答问题 |
| 文本生成 | 使用本地LLM生成文本 | 生成内容符合预期,无网络请求 |
| 向量检索 | 搜索相似文档 | 返回相关文档,响应时间<2秒 |
| 系统配置 | 修改关键参数,重启服务 | 配置生效,服务正常启动 |
性能指标验收
在生产环境中,应达到以下性能指标:
-
响应时间:
- 简单查询:<500ms
- AI文本生成:<5秒(短句)
- 向量检索:<2秒
-
并发能力:
- 支持10+同时在线用户
- 每秒可处理5+AI请求
-
资源占用:
- 内存使用:<16GB(含所有服务)
- CPU使用率:峰值<80%
- 磁盘IO:平稳,无明显波动
总结与展望
RuoYi AI的离线部署方案通过容器化技术和本地化模型集成,解决了无网络环境下的AI服务搭建难题。本文详细介绍了从环境准备、配置文件创建、服务部署到模型配置的完整流程,提供了一套可落地的企业级解决方案。
未来优化方向:
- 模型轻量化:使用更小的量化模型,降低硬件需求
- 增量更新:实现离线环境下的组件增量更新机制
- 监控系统:集成离线监控工具,实现服务状态可视化
- 自动化部署:开发一键部署脚本,简化部署流程
通过本方案,企业可以在严格的网络隔离环境中安全地部署和使用AI技术,充分利用人工智能提升业务效率,同时满足数据安全和合规要求。
附录:资源清单与参考资料
离线部署资源清单
-
基础软件包:
- Docker Engine 20.10.17
- Docker Compose 2.12.2
- OpenJDK 17
- Nginx 1.25
-
Docker镜像:
- MySQL 8.0.33
- Redis 6.2
- Weaviate 1.30.0
- 后端服务镜像
- 前端服务镜像
-
模型文件:
- BGE-M3向量模型
- 本地LLM模型(如Llama 2)
-
配置模板:
参考文档
- 项目源码:ruoyi-ai
- 部署脚本:deploy-cn.sh
- 数据库脚本:ruoyi-ai.sql
- 官方文档:README_EN.md
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00