搭建RAGFlow
RAGFlow 是一款基于深度文档理解构建的开源 RAG(Retrieval-Augmented Generation)引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用户各类不同的复杂格式数据提供可靠的问答以及有理有据的引用。
前提条件
- CPU >= 4 核
- RAM >= 16 GB
- Disk >= 50 GB
- Docker >= 24.0.0 & Docker Compose >= v2.26.1
如果你并没有在本机安装 Docker(Windows、Mac,或者 Linux), 可以参考文档 Install Docker Engine 自行安装。
🚀 启动服务器
-
确保
vm.max_map_count
不小于 262144:如需确认
vm.max_map_count
的大小:$ sysctl vm.max_map_count
如果
vm.max_map_count
的值小于 262144,可以进行重置:# 这里我们设为 262144: $ sudo sysctl -w vm.max_map_count=262144
你的改动会在下次系统重启时被重置。如果希望做永久改动,还需要在 /etc/sysctl.conf 文件里把
vm.max_map_count
的值再相应更新一遍:vm.max_map_count=262144
-
克隆仓库:
$ git clone https://github.com/infiniflow/ragflow.git
-
进入 docker 文件夹,利用提前编译好的 Docker 镜像启动服务器:
运行以下命令会自动下载 dev 版的 RAGFlow slim Docker 镜像(
dev-slim
),该镜像并不包含 embedding 模型以及一些 Python 库,因此镜像大小约 1GB。$ cd ragflow/docker $ docker compose -f docker-compose.yml up -d
- 如果你想下载并运行特定版本的 RAGFlow slim Docker 镜像,请在 docker/.env 文件中找到
RAGFLOW_IMAGE
变量,将其改为对应版本。例如RAGFLOW_IMAGE=infiniflow/ragflow:v0.13.0-slim
,然后再运行上述命令。 - 如果您想安装内置 embedding 模型和 Python 库的 dev 版本的 Docker 镜像,需要将 docker/.env 文件中的
RAGFLOW_IMAGE
变量修改为:RAGFLOW_IMAGE=infiniflow/ragflow:dev
。 - 如果您想安装内置 embedding 模型和 Python 库的指定版本的 RAGFlow Docker 镜像,需要将 docker/.env 文件中的
RAGFLOW_IMAGE
变量修改为:RAGFLOW_IMAGE=infiniflow/ragflow:v0.13.0(当前改的这个)
。修改后,再运行上面的命令。 注意: 安装内置 embedding 模型和 Python 库的指定版本的 RAGFlow Docker 镜像大小约 9 GB,可能需要更长时间下载,请耐心等待。
- 如果你想下载并运行特定版本的 RAGFlow slim Docker 镜像,请在 docker/.env 文件中找到
-
服务器启动成功后再次确认服务器状态:
$ docker logs -f ragflow-server
出现以下界面提示说明服务器启动成功:
____ ___ ______ ______ __ / __ \ / | / ____// ____// /____ _ __/ /_/ // /| | / / __ / /_ / // __ \| | /| / // _, _// ___ |/ /_/ // __/ / // /_/ /| |/ |/ / /_/ |_|/_/ |_|\____//_/ /_/ \____/ |__/|__/ * Running on all addresses (0.0.0.0)* Running on http://127.0.0.1:9380* Running on http://x.x.x.x:9380INFO:werkzeug:Press CTRL+C to quit
如果您跳过这一步系统确认步骤就登录 RAGFlow,你的浏览器有可能会提示
network anormal
或网络异常
,因为 RAGFlow 可能并未完全启动成功。 -
在你的浏览器中输入你的服务器对应的 IP 地址并登录 RAGFlow。
上面这个例子中,您只需输入 http://IP_OF_YOUR_MACHINE 即可:未改动过配置则无需输入端口(默认的 HTTP 服务端口 80)。
-
在 service_conf.yaml 文件的
user_default_llm
栏配置 LLM factory,并在API_KEY
栏填写和你选择的大模型相对应的 API key。详见 llm_api_key_setup。
好戏开始,接着奏乐接着舞!
🔧 系统配置
系统配置涉及以下三份文件:
- .env:存放一些基本的系统环境变量,比如
SVR_HTTP_PORT
、MYSQL_PASSWORD
、MINIO_PASSWORD
等。 - service_conf.yaml:配置各类后台服务。
- docker-compose.yml: 系统依赖该文件完成启动。
请务必确保 .env 文件中的变量设置与 service_conf.yaml 文件中的配置保持一致!
如果不能访问镜像站点hub.docker.com或者模型站点huggingface.co,请按照.env注释修改RAGFLOW_IMAGE
和HF_ENDPOINT
。
./docker/README 文件提供了环境变量设置和服务配置的详细信息。请一定要确保 ./docker/README 文件当中列出来的环境变量的值与 service_conf.yaml 文件当中的系统配置保持一致。
如需更新默认的 HTTP 服务端口(80), 可以在 docker-compose.yml 文件中将配置 80:80
改为 <YOUR_SERVING_PORT>:80
。
所有系统配置都需要通过系统重启生效:
$ docker compose -f docker-compose.yml up -d
按照上面的文档默认启动后,检查日志是有报错的。
错误信息:
处理办法:更换镜像版本,注意查看红色的代码位置
最终的文件修改如下:
root@node11:~/ragflow/docker# ll
total 6656
drwxr-xr-x 4 root root 4096 11月 18 12:32 ./
drwxr-xr-x 16 root root 4096 11月 13 15:01 ../
-rw-r--r-- 1 root root 924 11月 13 15:01 docker-compose-admin-tool.yml
-rw-r--r-- 1 root root 3416 11月 18 10:24 docker-compose-base.yml
-rw-r--r-- 1 root root 767 11月 13 15:01 docker-compose-CN-oc9.yml
-rw-r--r-- 1 root root 925 11月 13 15:01 docker-compose-gpu-CN-oc9.yml
-rw-r--r-- 1 root root 853 11月 18 10:36 docker-compose-gpu.yml
-rw-r--r-- 1 root root 1059 11月 13 15:01 docker-compose.yml
-rwxr-xr-x 1 root root 841 11月 13 15:01 entrypoint.sh*
-rw-r--r-- 1 root root 4407 11月 18 12:32 .env
-rwxr-xr-x 1 root root 2631 11月 13 15:01 init-kibana.sh*
-rw-r--r-- 1 root root 53 11月 13 15:01 init.sql
-rw-r--r-- 1 root root 2733 11月 13 15:01 launch_backend_service.sh
drwxr-xr-x 2 root root 4096 11月 13 15:01 nginx/
-rw-r--r-- 1 root root 4582686 11月 15 09:49 r1.log
-rw-r--r-- 1 root root 2107770 11月 14 00:28 rag1.log
drwxr-xr-x 4 root root 4096 11月 18 12:29 ragflow-logs/
-rw-r--r-- 1 root root 5037 11月 13 15:58 rag.log
-rwxr-xr-x 1 root root 198 11月 13 16:14 rag.sh*
-rw-r--r-- 1 root root 6864 11月 13 15:01 README.md
-rw-r--r-- 1 root root 945 11月 16 19:41 r.log
-rwxr-xr-x 1 root root 84 11月 14 09:03 r.sh*
-rw-r--r-- 1 root root 1740 11月 18 10:41 service_conf.yaml
-rw-r--r-- 1 root root 8700 11月 18 09:28 service_conf.yaml-bak
-rw-r--r-- 1 root root 2024 11月 13 15:01 service_conf.yaml.template
root@node11:~/ragflow/docker# more docker-compose-base.yml
services:
es01:
container_name: ragflow-es-01
image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
volumes:
- esdata01:/usr/share/elasticsearch/data
ports:
- ${ES_PORT}:9200
env_file: .env
environment:
- node.name=es01
- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
- bootstrap.memory_lock=false
- discovery.type=single-node
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=false
- xpack.security.transport.ssl.enabled=false
- TZ=${TIMEZONE}
mem_limit: ${MEM_LIMIT}
ulimits:
memlock:
soft: -1
hard: -1
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:9200"]
interval: 10s
timeout: 10s
retries: 120
networks:
- ragflow
restart: on-failure
# infinity:
# container_name: ragflow-infinity
# image: infiniflow/infinity:v0.5.0-dev2
# volumes:
# - infinity_data:/var/infinity
# ports:
# - ${INFINITY_THRIFT_PORT}:23817
# - ${INFINITY_HTTP_PORT}:23820
# - ${INFINITY_PSQL_PORT}:5432
# env_file: .env
# environment:
# - TZ=${TIMEZONE}
# mem_limit: ${MEM_LIMIT}
# ulimits:
# nofile:
# soft: 500000
# hard: 500000
# networks:
# - ragflow
# healthcheck:
# test: ["CMD", "curl", "http://localhost:23820/admin/node/current"]
# interval: 10s
# timeout: 10s
# retries: 120
# restart: on-failure
mysql:
# mysql:5.7 linux/arm64 image is unavailable.
image: mysql:8.0.39-debian
container_name: ragflow-mysql
env_file: .env
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
- TZ=${TIMEZONE}
command:
--max_connections=1000
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--default-authentication-plugin=mysql_native_password
--tls_version="TLSv1.2,TLSv1.3"
--init-file /data/application/init.sql
ports:
- ${MYSQL_PORT}:3306
volumes:
- mysql_data:/var/lib/mysql
- ./init.sql:/data/application/init.sql
networks:
- ragflow
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-uroot", "-p${MYSQL_PASSWORD}"]
interval: 10s
timeout: 10s
retries: 3
restart: on-failure
minio:
# image: quay.io/minio/minio:RELEASE.2023-04-28T18-11-17Z
image: quay.io/minio/minio:RELEASE.2023-12-20T01-00-02Z
container_name: ragflow-minio
command: server --console-address ":9001" /data
ports:
- ${MINIO_PORT}:9000
- ${MINIO_CONSOLE_PORT}:9001
env_file: .env
environment:
- MINIO_ROOT_USER=${MINIO_USER}
- MINIO_ROOT_PASSWORD=${MINIO_PASSWORD}
- TZ=${TIMEZONE}
volumes:
- minio_data:/data
networks:
- ragflow
restart: on-failure
redis:
image: redis:7.2.4
# image: valkey/valkey:8
container_name: ragflow-redis
command: redis-server --requirepass ${REDIS_PASSWORD} --maxmemory 128mb --maxmemory-policy allkeys-lru
env_file: .env
ports:
- ${REDIS_PORT}:6379
volumes:
- redis_data:/data
networks:
- ragflow
restart: on-failure
volumes:
esdata01:
driver: local
infinity_data:
driver: local
mysql_data:
driver: local
minio_data:
driver: local
redis_data:
driver: local
networks:
ragflow:
driver: bridge
root@node11:~/ragflow/docker# more docker-compose-admin-tool.yml
include:
- path: ./docker-compose.yml
env_file: ./.env
services:
kibana:
image: kibana:${STACK_VERSION}
container_name: ragflow-kibana
environment:
ELASTICSEARCH_USERNAME: ${KIBANA_USER}
ELASTICSEARCH_PASSWORD: ${KIBANA_PASSWORD}
ELASTICSEARCH_HOSTS: "http://es01:9200"
ports:
- ${KIBANA_PORT}:5601
depends_on:
es01:
condition: service_healthy
kibana-user-init:
condition: service_completed_successfully
networks:
- ragflow
kibana-user-init:
image: appropriate/curl
depends_on:
es01:
condition: service_healthy
volumes:
- ./init-kibana.sh:/app/init-kibana.sh
environment:
- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
- KIBANA_USER=${KIBANA_USER}
- KIBANA_PASSWORD=${KIBANA_PASSWORD}
command: /bin/sh -c "sh /app/init-kibana.sh"
networks:
- ragflow
restart: 'no'
root@node11:~/ragflow/docker# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 node11
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
root@node11:~/ragflow/docker# more .env|grep -v '#'|grep -v '$^'
STACK_VERSION=8.11.3
ES_HOST=es01
ES_PORT=1200
ELASTIC_PASSWORD=infini_rag_flow
KIBANA_PORT=6601
KIBANA_USER=rag_flow
KIBANA_PASSWORD=infini_rag_flow
MEM_LIMIT=8073741824
INFINITY_THRIFT_PORT=23817
INFINITY_HTTP_PORT=23820
INFINITY_PSQL_PORT=5432
MYSQL_PASSWORD=infini_rag_flow
MYSQL_HOST=mysql
MYSQL_DBNAME=rag_flow
MYSQL_PORT=5455
MINIO_HOST=minio
MINIO_CONSOLE_PORT=9001
MINIO_PORT=9000
MINIO_USER=rag_flow
MINIO_PASSWORD=infini_rag_flow
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=infini_rag_flow
SVR_HTTP_PORT=9380
RAGFLOW_IMAGE=infiniflow/ragflow:v0.13.0
TIMEZONE='Asia/Shanghai'
root@node11:~/ragflow/docker#
可参考连接:
https://github.com/infiniflow/ragflow/issues/2587
https://github.com/infiniflow/ragflow/issues/3418
RAG 实践- Ollama+RagFlow 部署本地知识库_ragflow本地化部署知识库-CSDN博客
相关文章:

搭建RAGFlow
RAGFlow 是一款基于深度文档理解构建的开源 RAG(Retrieval-Augmented Generation)引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用户各类不同的复杂格式数据提供可靠…...

css中的box-sizing,记录
border-box:最终高度为height,默认包含padding border等属性 content-box:box-sizing默认值,最终大小为heightpaddingborder 等...
使用useCallback引发对闭包的理解
一、先简单介绍一下闭包: 闭包是 JavaScript 中的重要概念,它指的是一个函数可以“记住”并访问其词法作用域,即使在这个函数的外部被执行。简单来说,闭包是由函数及其相关的环境组合而成的。 闭包的特性 函数内部可以访问外部变量: 闭包…...

gvim添加至右键、永久修改配置、放大缩小快捷键、ctrl + c ctrl +v 直接复制粘贴、右键和还原以前版本(V)冲突
一、将 vim 添加至右键 进入安装目录找到 vim91\install.exe 管理员权限执行 Install will do for you:1 Install .bat files to use Vim at the command line:2 Overwrite C:\Windows\vim.bat3 Overwrite C:\Windows\gvim.bat4 Overwrite C:\Windows\evim.bat…...
腾讯云-COS
COS 对象存储 是一种可扩展的云端数据存储服务。它适用于存储任意类型的文件,并且可以针对这些文件进行访问控制。 CORS 跨域资源共享 是一种机制,它使用额外的HTTP头来告诉浏览器允许一个域上的Web应用请求另一个域上的资源。当需要从一个域名下的网页向…...

蓝桥杯每日真题 - 第16天
题目:(卡牌) 题目描述(13届 C&C B组C题) 解题思路: 题目分析: 有 n 种卡牌,每种卡牌的现有数量为 a[i],所需的最大数量为 b[i],还有 m 张空白卡牌。 每…...

基因组之全局互作热图可视化
引言 PlotHiC 是一个专为 Hi-C 数据可视化分析而设计的 Python 包。Hi-C 技术是一种能够检测染色体三维结构的实验方法,它能揭示 DNA 在细胞核内的三维组织结构。为了更好地展示和解释这些复杂的数据,PlotHiC[1] 可以帮助用户方便地绘制Hi-C 数据的热图。…...

基于Lora通讯加STM32空气质量检测WIFI通讯
目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着环境污染问题的日益严重,空气质量的监测与管理已经…...
STM32 极速入门第一天基础拓展 驱动i2c屏幕 ( 使用PlatformIO开发STM32单片机 )
输入输出模式解析 输出模式 在输出模式下,通常不需要设置上下拉电阻. 输出电平由 LL_GPIO_SetOutputPin 和 LL_GPIO_ResetOutputPin 函数直 接控制。 输入模式 在输入模式下,设置上下拉电阻是非常重要的. 输入引脚悬空时可能会导致不确定的电平…...

【WPF】Prism学习(五)
Prism Commands 1.错误处理(Error Handling) Prism 9 为所有的命令(包含AsyncDelegateCommand)提供了更好的错误处理。 避免用try/catch包装每一个方法根据不同遇到的异常类型来提供特定的逻辑处理可以在多个命令之间共享错误处…...
RabbitMQ的基本概念和入门
RabbitMQ 的基本概念和入门 RabbitMQ 是一款流行的开源消息队列中间件,实现了高级消息队列协议(AMQP)。它使用Erlang语言编写,具备高可用性、可扩展性和易用性等特点,广泛应用于各种分布式系统中。本文将详细介绍Rabb…...

Shell脚本6 -- 条件判断if
声明: 本文的学习内容来源于B站up主“泷羽sec”视频【shell编程(4)脚本与用户交互以及if条件判断】的公开分享,所有内容仅限于网络安全技术的交流学习,不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题,…...
经验笔记:从生成 SSH 密钥到成功连接测试(以Gitee为例)
从生成 SSH 密钥到成功连接测试的经验笔记(以Gitee为例) 1. 生成 SSH 密钥对 选择合适的加密算法 ED25519: 密钥长度:私钥 256 位(32 字节),公钥 256 位(32 字节)&#…...
Object.defineProperty和响应式
Object.defineProperty()是一个监听对象属性变化的方法。一般情况下我们是不会直接使用的,或者说我们遇到的场景还没有这么高级。 最有名的例子就是Vue2的响应式实现,就是通过这个方法来实现的。 用起来不难,就是个API,只是用的…...

前端web
题目:制作带有下拉悬停菜单的导航栏 效果图 一、先制作菜单栏 <body> <div id"menu"> <div id"container"> <div class"item">游戏1 <div cla…...

DDNet 服务器配置教程 Linux 环境
DDNet 服务器配置教程 Linux 环境 配置之前可以参考一下官方网址给出的内容 官方网址:DDNet官方 环境说明 OS: Debian 11 安装 可以直接从官网下载,也可以使用这个链接: Linux_DDNet 下载链接 上文中给的链接会因为更新而出现版本落后的情况&#x…...

Vue 2 —监视器实现动态切换表单属性值
目录 一、需求背景 二、监视器语法 三、实例展示 1、HTML部分 2、JS部分 四、使用场景总结 1. 表单验证 2. 动态更新 UI 3. 数据同步 4. 计算属性的替代方案 计算属性的优势 : 简洁性: 监视器的优势 : 灵活性: 多属性依赖: 副…...

Qt_day10_程序打包(完结)
目录 1. 设置图标 2. Debug和Release版本 3. 动态链接库 4. 打包 5. 联系项目要求 Qt开发的程序最终都是要给用户使用的,用户的电脑上不可能装一个Qt的开发环境导入项目使用。因此项目项目开发完成后需要打包——制作成安装包,用户直接下载并安装即可使用…...

golang通用后台管理系统09(系统操作日志记录)
1.日志工具类 package log/**** 日志记录 wangwei 2024-11-18 15:30*/ import ("log""os""path/filepath""time" )// 获取以当前日期命名的日志文件路径 func getLogFilePath() string {currentDate : time.Now().Format("2006-…...

如何确保爬取的数据准确性和完整性?
在数据驱动的业务环境中,爬虫程序的准确性和完整性至关重要。本文将探讨如何使用Java编写爬虫程序,并确保其在爬取数据时的准确性和完整性。 1. 精确的HTML解析 确保数据准确性的第一步是精确地解析HTML。Jsoup是Java中常用的HTML解析库,它提…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
使用python进行图像处理—图像滤波(5)
图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值,以达到平滑(去噪)、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算,…...