搭建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博客