关键词:RAGFlow、RAG引擎、本地部署、非Docker、macOS、Elasticsearch、智能体编排

阅读时间:约 15 分钟 | 难度:中高级


前言:为什么要"裸机"部署 RAGFlow?

如果你关注 AI 应用开发,一定听过 RAG(Retrieval-Augmented Generation,检索增强生成)——它让大模型不再只靠"训练时的记忆"回答问题,而是能实时查阅你的私有文档库,给出有据可查的精准回答。

RAGFlow 是目前最火的开源 RAG 引擎之一,由 InfiniFlow 团队开发,GitHub Star 数已突破 40K+。它不仅支持深度文档解析、知识库管理,还提供了强大的可视化智能体(Agent)编排功能——拖拖拽拽就能搭建复杂的 AI 工作流。

官方文档推荐使用 Docker 一键部署,简单高效。但对于想深入理解 RAGFlow 架构自定义开发、或者 Mac 上没装 Docker 的开发者来说,从源码裸机部署更有价值。

本文记录了我在 macOS(Apple Silicon M系列芯片) 上完整部署 RAGFlow v0.23 的全过程,包括遇到的 7 个关键坑点 及解决方案,希望能帮你少走弯路。

先看下最终搭建后的效果:
在这里插入图片描述


一、RAGFlow 的技术架构——先看清全貌

在动手之前,先理解 RAGFlow 的技术栈,部署时才能胸有成竹:

在这里插入图片描述

四大基础设施服务,缺一不可:

服务 作用 为什么需要
MySQL 9.x 关系数据库 存储用户、对话、知识库元数据
Elasticsearch 8.x 搜索引擎 文档切片的全文检索 + 向量相似度搜索
Redis 7.x 内存队列 任务队列、缓存、会话管理
MinIO 对象存储 上传的 PDF/Word 等原始文件存储

前后端分离

  • 后端:Python 3.12 + Flask + LiteLLM(统一多模型调用)
  • 前端:Node.js 20 + Vite + React + TypeScript

了解了这些,就知道我们需要依次搞定:基础设施 → RAGFlow 源码 → 后端依赖 → 前端依赖 → 配置文件 → 启动。


二、环境准备与依赖安装

2.1 前置条件

我的开发机配置:

项目 配置
芯片 Apple M 系列(ARM64)
内存 16 GB
macOS 15.x
磁盘可用 约 16 GB
Homebrew 已安装

磁盘空间提醒:RAGFlow 完整部署(含 ES、Node 模块等)约需 8-12 GB。如果磁盘紧张,后面会遇到 Elasticsearch 磁盘水位线的坑。

2.2 安装基础工具

# Python 3.12(RAGFlow 要求)
brew install python@3.12

# Node.js 20+(前端构建要求,注意:不能低于 v20!)
brew install node@20

# uv(Python 包管理器,比 pip 快 10 倍)
brew install uv

# MySQL、Redis
brew install mysql redis

# 启动 MySQL 和 Redis
brew services start mysql
brew services start redis

2.3 坑点一:Elasticsearch 和 MinIO 的 Xcode 依赖

如果你的 Xcode 版本较旧(如 12.x),Homebrew 会报错:

Error: Your Xcode (12.5.1) at /Applications/Xcode.app is too outdated.

解决方案:不通过 Homebrew 安装,直接下载官方预编译二进制文件。

# 创建部署目录
DEPLOY_DIR="$(pwd)/ragflow-deploy"
mkdir -p "$DEPLOY_DIR/bin"

# 下载 Elasticsearch 8.18.0(macOS ARM64)
curl -L "https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.18.0-darwin-aarch64.tar.gz" \
  | tar xz -C "$DEPLOY_DIR"
mv "$DEPLOY_DIR/elasticsearch-8.18.0" "$DEPLOY_DIR/elasticsearch"

# 下载 MinIO
curl -L "https://dl.min.io/server/minio/release/darwin-arm64/minio" \
  -o "$DEPLOY_DIR/bin/minio"
chmod +x "$DEPLOY_DIR/bin/minio"

2.4 坑点二:Node.js 版本冲突

如果系统中已有旧版 Node.js(如 v14),可能与 Homebrew 安装的 v20 冲突:

error @react-router/dev@7.11.0: The engine "node" is incompatible.
Expected: node:">=20.0.0"  Actual: v14.x

解决方案:在脚本开头强制指定 PATH 优先级:

export PATH="/opt/homebrew/opt/node@20/bin:/opt/homebrew/bin:$PATH"

三、克隆 RAGFlow 源码并安装依赖

3.1 克隆代码

cd ragflow-deploy
git clone https://github.com/infiniflow/ragflow.git
cd ragflow

3.2 安装 Python 后端依赖

# 创建虚拟环境
uv venv .venv --python 3.12
source .venv/bin/activate

# 安装依赖(使用 uv 极速安装)
uv pip install -r requirements.txt

3.3 安装前端依赖

cd web
npm install

3.4 坑点三:NLTK 数据缺失

RAGFlow 后端启动时需要 NLTK 自然语言处理数据包,否则会报错:

LookupError: Resource punkt_tab not found.

解决方案

import nltk
nltk.download('punkt_tab')
nltk.download('averaged_perceptron_tagger_eng')
nltk.download('wordnet')

四、配置文件——打通所有连接

这是最关键的一步。RAGFlow 的默认配置是为 Docker 环境设计的(密码、端口都是 Docker 内部的),本地部署需要修改。

编辑 ragflow/conf/service_conf.yaml

mysql:
  name: 'rag_flow'
  user: 'root'
  password: ''           # ← 本地 MySQL 通常无密码
  host: '127.0.0.1'
  port: 3306

minio:
  user: 'minioadmin'     # ← MinIO 默认用户名
  password: 'minioadmin' # ← MinIO 默认密码
  host: '127.0.0.1:9000'

es:
  hosts: 'http://127.0.0.1:9200'
  username: ''           # ← 本地 ES 禁用安全认证
  password: ''

redis:
  password: ''           # ← 本地 Redis 通常无密码
  db: 1
  host: '127.0.0.1:6379'

4.1 Elasticsearch 配置优化

编辑 elasticsearch/config/elasticsearch.yml,添加:

# 禁用安全认证(开发环境)
xpack.security.enabled: false
xpack.security.http.ssl.enabled: false

# 单节点模式
discovery.type: single-node

# 磁盘水位线(重要!后面会讲到这个坑)
cluster.routing.allocation.disk.watermark.low: "95%"
cluster.routing.allocation.disk.watermark.high: "96%"
cluster.routing.allocation.disk.watermark.flood_stage: "98%"

控制 ES 内存使用(创建 config/jvm.options.d/ragflow.options):

-Xms512m
-Xmx512m

4.2 坑点四:Elasticsearch 的 JAVA_HOME 冲突

如果系统装过旧版 JDK(如 JDK 11),ES 8.x 启动时可能报错:

java.nio.file.NoSuchFileException: .../temurin-11.jdk/.../tools.jar

原因:ES 8.x 自带 JDK 21,但系统 JAVA_HOME 指向了旧版。

解决方案:启动 ES 前清除环境变量:

unset JAVA_HOME
unset CLASSPATH
./elasticsearch/bin/elasticsearch -d  # -d 后台运行

五、启动所有服务

5.1 启动顺序

严格按顺序启动,因为后端依赖前面的基础设施:

# 1. MySQL(如果还没启动)
brew services start mysql

# 2. Redis
brew services start redis

# 3. Elasticsearch
unset JAVA_HOME && unset CLASSPATH
./elasticsearch/bin/elasticsearch -d

# 4. MinIO
MINIO_ROOT_USER=minioadmin MINIO_ROOT_PASSWORD=minioadmin \
  ./bin/minio server ./minio_data --console-address ":9001" &

# 5. RAGFlow 后端
cd ragflow
source .venv/bin/activate
python -u api/ragflow_server.py &

# 6. RAGFlow 前端
cd web
npm run dev &

5.2 验证服务状态

# 检查各端口
lsof -i :3306  # MySQL
lsof -i :9200  # Elasticsearch
lsof -i :6379  # Redis
lsof -i :9000  # MinIO
lsof -i :9380  # RAGFlow 后端
lsof -i :9222  # RAGFlow 前端

全部正常后,打开浏览器访问:http://127.0.0.1:9222/

注册账号即可使用!


六、部署后的两个"隐藏Boss"

6.1 坑点五:前端端口不是 5173

RAGFlow 的 Vite 前端配置了自定义端口。如果你习惯性访问 http://localhost:5173,会报 ERR_CONNECTION_REFUSED

实际端口是 9222,查看 web/vite.config.ts 即可确认。

6.2 坑点六:Elasticsearch 磁盘水位线——最隐蔽的坑

这是我遇到的最诡异的 Bug:上传文档到知识库,解析成功,但点击查看切片时报错:

ApiError('search_phase_execution_exception', 
  'no_shard_available_action_exception', status=503)

排查过程

# 1. 检查 ES 集群健康状态
curl http://127.0.0.1:9200/_cluster/health?pretty
# 结果:status: "red" ← 不健康

# 2. 查看分片分配
curl http://127.0.0.1:9200/_cat/shards?v
# 发现大量 UNASSIGNED 分片

# 3. 检查分配失败原因
curl http://127.0.0.1:9200/_cluster/allocation/explain?pretty
# 关键信息:
# "decider": "disk_threshold"
# "explanation": "the node is above the high watermark [90%]"

根因:我的磁盘已用 92.86%,超过 ES 默认高水位线(90%),ES 自动拒绝分配分片!

解决方案:动态调高水位线 + 触发重新分配:

# 调高水位线
curl -X PUT "http://127.0.0.1:9200/_cluster/settings" \
  -H 'Content-Type: application/json' -d '{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "95%",
    "cluster.routing.allocation.disk.watermark.high": "96%",
    "cluster.routing.allocation.disk.watermark.flood_stage": "98%"
  }
}'

# 触发重新路由
curl -X POST "http://127.0.0.1:9200/_cluster/reroute?retry_failed=true"

建议:在 elasticsearch.yml 中持久化这些配置,否则重启后会恢复默认值。

6.3 坑点七:MySQL 版本升级冲突

如果你之前用过旧版 MySQL(如 8.0.29),而 Homebrew 安装了新版(如 9.2.0),启动会报错:

Invalid MySQL server upgrade: Cannot upgrade from 80029 to 90200.

解决方案(开发环境,无重要数据时):

# 备份旧数据
mv /opt/homebrew/var/mysql /opt/homebrew/var/mysql_backup

# 重新初始化
mysqld --initialize-insecure --user=$(whoami)
brew services restart mysql

七、配置大语言模型——让 RAGFlow 拥有"大脑"

RAGFlow 本身只是 RAG 引擎,必须接入 LLM 才能工作

  1. 登录 RAGFlow → 右上角头像 → 模型管理
  2. 添加模型供应商:
模型 Base URL 推荐理由
通义千问 https://dashscope.aliyuncs.com/compatible-mode/v1 新用户有免费额度
DeepSeek https://api.deepseek.com/v1 性价比最高
  1. 设置为系统默认模型

建议选择通义千问,价格实惠
在这里插入图片描述


八、部署成果与资源消耗

最终部署成功后的资源占用:

服务 内存占用 磁盘占用
MySQL ~200 MB ~500 MB
Elasticsearch ~600 MB ~2 GB
Redis ~50 MB 极少
MinIO ~100 MB 随文件增长
RAGFlow 后端 ~500 MB ~3 GB(含依赖)
RAGFlow 前端 ~200 MB ~1.5 GB(node_modules)
合计 ~1.6 GB ~8 GB

在 16 GB 内存的 Mac 上运行流畅,但建议关闭其他吃内存的应用。


九、总结与心得

踩坑清单回顾

# 坑点 根因 解决思路
1 Xcode 太旧装不了 ES/MinIO Homebrew 编译依赖 直接下载官方二进制
2 Node.js 版本冲突 旧版 v14 抢占 PATH 显式指定 PATH 优先级
3 NLTK 数据缺失 首次运行未下载 手动 nltk.download
4 ES 的 JAVA_HOME 冲突 系统旧 JDK 干扰 unset JAVA_HOME
5 前端端口不是 5173 Vite 配置自定义端口 查看 vite.config.ts
6 ES 磁盘水位线 磁盘使用率 >90% 调高 watermark 阈值
7 MySQL 版本升级失败 数据目录版本不兼容 备份后重新初始化

三点建议

  1. 磁盘至少留 15 GB。ES 和 Node.js 都是吃磁盘大户。
  2. 用脚本自动化。部署涉及 6 个服务的启停,写成脚本省心省力。
  3. 先跑 Docker 版体验,确认要深入开发再搞源码部署。裸机部署的价值在于理解架构、定制开发、性能调优——不是为了"难"而难。

附录:一键启停脚本

为方便日常使用,建议将启动和停止封装为脚本:

# 启动:./start.sh
#!/bin/bash
brew services start mysql
brew services start redis
unset JAVA_HOME && unset CLASSPATH
./elasticsearch/bin/elasticsearch -d
sleep 5
MINIO_ROOT_USER=minioadmin MINIO_ROOT_PASSWORD=minioadmin \
  ./bin/minio server ./minio_data --console-address ":9001" &
sleep 2
cd ragflow && source .venv/bin/activate
python -u api/ragflow_server.py > ../logs/backend.log 2>&1 &
cd web && npm run dev > ../../logs/frontend.log 2>&1 &
echo "RAGFlow 已启动 → http://127.0.0.1:9222/"
# 停止:./stop.sh
#!/bin/bash
pkill -f ragflow_server
pkill -f "npm run dev"
pkill -f minio
pkill -f elasticsearch
brew services stop redis
brew services stop mysql
echo "所有服务已停止"

关于作者:AI 技术爱好者,热衷于 RAG、Agent 等技术的实践探索。本文所有踩坑经历均为真实部署记录,如有问题欢迎评论区交流。

如果本文对你有帮助,请点赞收藏,你的支持是我持续输出的动力!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐