你们都知道,我去年这时候买了个 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
中修改成非标端口即可。
这个时候,不要着急去点注册,还是得等一会,不然会报502,造成点注册点登录都没有反应。
在这里我就踩了个坑,到处找原因,包括把 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至少需要配置两个模型,chat
模型负责上下文对话,embedding
模型负责解析和推测。
网上大部分都推荐本地配Ollma,让 RAGFlow 调用,这里我没有这么做,原因还是,我 NAS 的性能不够,搞不了。所以我使用的是字节的火山方舟,没别的原因,只是因为他的文档比较多,接入起来方便而已。
导入知识库文档
知识库支持的文件类型是很多的,基本上常见的图片/文字/网页/pdf 都能做为知识库导入,但是如果是图片的话,上面的大模型还得要配置一个图片大模型才行。
这里我是纯markdown文本上传作为知识库,上传以后,需要点击一下进行解析,当所有文本解析完成以后,就可以在后续的 Chat/Agent 直接使用了。
PS:这破解析,真费token,22份文档,到现在免费额度花完,已经花了我1块钱了,还没解析完。