终于搞定了,本地部署 RAGFlow



对本文有任何问题,可加我的个人微信询问:kymjs666

你们都知道,我去年这时候买了个 NAS,后来一直想把这个搞成个服务器来用,期间做了本地的 maven,自己博客的对象存储,Android 各个版本 SDK 的镜像,gradle 镜像等等。

但其实我的 NAS 配置还挺高的,CPU 和内存现在都还有大量的空闲,一直在想办法把他的性能榨干。

体验了一下 Coze 的开源版本,相比商业版差太多了,准备放弃的时候刚好发现 RAGFlow 不需要 GPU 也可以跑,还只支持 x86,这不就是给我 NAS 空闲资源准备的吗。

安装和部署

首先看看机器性能要求:

  • CPU >= 4 核
  • RAM >= 16 GB
  • Disk >= 50 GB
  • Docker >= 24.0.0 & Docker Compose >= v2.26.1

这一步很恶心,群晖7.2自带的docker compose是2.22的,还得更新一下,更新方法直接 deepseek(这里要求 2.26 的原因是因为 yml 文件中采用了 include 语法,这个语法是 2.26 才加入的。如果不想更新,需要自己改一下 yml 把 include 的内容手动聚合到一个 yml 里面,也是可以的):

# 下载最新版 Docker Compose(替换系统架构,如 aarch64/armv7/x86_64)
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 授予执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证版本
docker-compose version

还有个点,网上很多文章都没有讲:由于 docker 镜像里面依赖了es,所以对内存映射也有要求。像 NAS 这种破机器,mmap最大值默认都是只有1G,肯定不够用。

首先命令行查看一下自己的大小

sudo sysctl vm.max_map_count
 
// 如果 vm.max_map_count 的值小于 262144,需要扩大:
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p  # 重新加载配置

拉依赖

直接从github

git clone https://github.com/infiniflow/ragflow.git 

拉完以后,照着官网的操作指南一步一步来

cd ragflow/docker
# Use CPU for embedding and DeepDoc tasks:
docker compose -f docker-compose.yml up -d

# To use GPU to accelerate embedding and DeepDoc tasks:
# docker compose -f docker-compose-gpu.yml up -d

这一步比较麻烦,在NAS上部署的时候得改一下,首先是群晖只有docker-compose并没有 docker 命令,其次我也不知道是什么原因,在我的机器上,一直没有 -f 命令,即便我更新了版本以后也提示没有。

后来查了一下,不加 -f 默认执行的是docker-compose.yaml其次执行的是docker-compose.yml所以索性不加了,就按照最正常的命令执行也可以:

sudo docker-compose up -d

直接启动大概率会报错 ependency failed to start: container ragflow-mysql is unhealthy,还是因为 NAS 的机器性能不如专业服务器,mysql启动速度太慢了,超过了脚本等待时长,在命令行里面会报错。
但实际上,等一会再重新手动把服务起一下就行了。

具体参考 GitHub 这个 issue。 https://github.com/infiniflow/ragflow/issues/8958

启动服务

当各个服务都正常启动以后,打开网页应该就能看到如下界面。默认是80端口,当然在公网上得改端口号,直接在docker-compose.yaml中修改成非标端口即可。

RagFlow

这个时候,不要着急去点注册,还是得等一会,不然会报502,造成点注册点登录都没有反应。

RagFlow

在这里我就踩了个坑,到处找原因,包括把 nginx 的配置都整个看了一遍也没发现问题,还是通过 nginx 里加了一条日志,才发现原来是 server 还没启动,造成在 docker 里面调度不到这台容器。

server {
    listen 80;
    server_name _;
    root /ragflow/web/dist;

    location ~ ^/(v1|api) {
        proxy_pass http://ragflow:9380;
        include proxy.conf;
    }
。。。
}

就是这里的 http://ragflow:9380,正常情况 docker 会自动 DNS,把 ragflow DNS 到实际的虚拟机上,但实际上页面打开的时候,虚拟机的服务还没有启动,造成 http 502

具体可看这个issue :https://github.com/infiniflow/ragflow/issues/4815

配置大模型

RagFlow

RAGFlow至少需要配置两个模型,chat模型负责上下文对话,embedding模型负责解析和推测。
网上大部分都推荐本地配Ollma,让 RAGFlow 调用,这里我没有这么做,原因还是,我 NAS 的性能不够,搞不了。所以我使用的是字节的火山方舟,没别的原因,只是因为他的文档比较多,接入起来方便而已。

导入知识库文档

知识库支持的文件类型是很多的,基本上常见的图片/文字/网页/pdf 都能做为知识库导入,但是如果是图片的话,上面的大模型还得要配置一个图片大模型才行。

RagFlow

这里我是纯markdown文本上传作为知识库,上传以后,需要点击一下进行解析,当所有文本解析完成以后,就可以在后续的 Chat/Agent 直接使用了。

PS:这破解析,真费token,22份文档,到现在免费额度花完,已经花了我1块钱了,还没解析完。

RagFlow