一切皆留「轨迹」

RAGFlow的使用

Mar 21,2026
4
0

RAGFlow的使用

  • 基于Windows10 - 版本:21H2

  • Docker Desktop - 版本:4.11.0

    若遇到WSL或者重启之后Docker运行不了的问题,可以powershell运行一下这个命令再重启看看

    bcdedit /set hypervisorlaunchtype Auto

    Ollama (服务端口:1521)需要LLM模型比如:deepseek-r1:1.5b、embedding模型比如:qwen3-embedding:8b

    相关连接:https://ollama.com/

操作步骤

  • 安装Docker Desktop (Docker Desktop Installer.exe)

  • 安装WSL2 (wsl_update_x64.msi)

  • 创建目录,用于RAG Flow资源存放,以D:/ai为例

  • 目录下打开命令行,输入命令拉取资源文件(需安装git):

git clone https://github.com/infiniflow/ragflow.git
  • 进入ragflow目录的docker文件夹下,修改.env的SVR_WEB_HTTP_PORT等内容,防止端口被占用

  • 修改docker-compose.yml文件内容:

    services:
      # Elasticsearch 服务
      es01:
        profiles:
          - elasticsearch
        image: 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
          - cluster.routing.allocation.disk.watermark.low=5gb
          - cluster.routing.allocation.disk.watermark.high=3gb
          - cluster.routing.allocation.disk.watermark.flood_stage=2gb
        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: unless-stopped
    ​
      # OpenSearch 服务
      opensearch01:
        profiles:
          - opensearch
        image: opensearchproject/opensearch:2.19.1
        volumes:
          - osdata01:/usr/share/opensearch/data
        ports:
          - ${OS_PORT}:9201
        env_file: .env
        environment:
          - node.name=opensearch01
          - OPENSEARCH_PASSWORD=${OPENSEARCH_PASSWORD}
          - OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_PASSWORD}
          - bootstrap.memory_lock=false
          - discovery.type=single-node
          - plugins.security.disabled=false
          - plugins.security.ssl.http.enabled=false
          - plugins.security.ssl.transport.enabled=true
          - cluster.routing.allocation.disk.watermark.low=5gb
          - cluster.routing.allocation.disk.watermark.high=3gb
          - cluster.routing.allocation.disk.watermark.flood_stage=2gb
          - http.port=9201
        mem_limit: ${MEM_LIMIT}
        ulimits:
          memlock:
            soft: -1
            hard: -1
        healthcheck:
          test: ["CMD-SHELL", "curl http://localhost:9201"]
          interval: 10s
          timeout: 10s
          retries: 120
        networks:
          - ragflow
        restart: unless-stopped
    ​
      # Infinity 服务
      infinity:
        profiles:
          - infinity
        image: infiniflow/infinity:v0.7.0-dev2
        volumes:
          - infinity_data:/var/infinity
          - ./infinity_conf.toml:/infinity_conf.toml
        command: ["-f", "/infinity_conf.toml"]
        ports:
          - ${INFINITY_THRIFT_PORT}:23817
          - ${INFINITY_HTTP_PORT}:23820
          - ${INFINITY_PSQL_PORT}:5432
        env_file: .env
        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: unless-stopped
    ​
      # OceanBase 服务
      oceanbase:
        profiles:
          - oceanbase
        image: oceanbase/oceanbase-ce:4.4.1.0-100000032025101610
        volumes:
          - ./oceanbase/data:/root/ob
          - ./oceanbase/conf:/root/.obd/cluster
          - ./oceanbase/init.d:/root/boot/init.d
        ports:
          - ${OCEANBASE_PORT:-2881}:2881
        env_file: .env
        environment:
          - MODE=normal
          - OB_SERVER_IP=127.0.0.1
        mem_limit: ${MEM_LIMIT}
        healthcheck:
          test: [ 'CMD-SHELL', 'obclient -h127.0.0.1 -P2881 -uroot@${OB_TENANT_NAME:-ragflow} -p${OB_TENANT_PASSWORD:-infini_rag_flow} -e "CREATE DATABASE IF NOT EXISTS ${OCEANBASE_DOC_DBNAME:-ragflow_doc};"' ]
          interval: 10s
          retries: 30
          start_period: 30s
          timeout: 10s
        networks:
          - ragflow
        restart: unless-stopped
    ​
      # SeekDB 服务
      seekdb:
        profiles:
          - seekdb
        image: oceanbase/seekdb:latest
        container_name: seekdb
        volumes:
          - ./seekdb:/var/lib/oceanbase
        ports:
          - ${SEEKDB_PORT:-2881}:2881
        env_file: .env
        environment:
          - ROOT_PASSWORD=${SEEKDB_PASSWORD:-infini_rag_flow}
          - MEMORY_LIMIT=${SEEKDB_MEMORY_LIMIT:-2G}
          - REPORTER=ragflow-seekdb
        mem_limit: ${MEM_LIMIT}
        healthcheck:
          test: ['CMD-SHELL', 'mysql -h127.0.0.1 -P2881 -uroot -p${SEEKDB_PASSWORD:-infini_rag_flow} -e "CREATE DATABASE IF NOT EXISTS ${SEEKDB_DOC_DBNAME:-ragflow_doc};"']
          interval: 5s
          retries: 60
          timeout: 5s
        networks:
          - ragflow
        restart: unless-stopped
    ​
      # Sandbox 执行器管理服务
      sandbox-executor-manager:
        profiles:
          - sandbox
        image: ${SANDBOX_EXECUTOR_MANAGER_IMAGE-infiniflow/sandbox-executor-manager:latest}
        privileged: true
        ports:
          - ${SANDBOX_EXECUTOR_MANAGER_PORT-9385}:9385
        env_file: .env
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        networks:
          - ragflow
        security_opt:
          - no-new-privileges:true
        environment:
          - SANDBOX_EXECUTOR_MANAGER_POOL_SIZE=${SANDBOX_EXECUTOR_MANAGER_POOL_SIZE:-3}
          - SANDBOX_BASE_PYTHON_IMAGE=${SANDBOX_BASE_PYTHON_IMAGE:-infiniflow/sandbox-base-python:latest}
          - SANDBOX_BASE_NODEJS_IMAGE=${SANDBOX_BASE_NODEJS_IMAGE:-infiniflow/sandbox-base-nodejs:latest}
          - SANDBOX_ENABLE_SECCOMP=${SANDBOX_ENABLE_SECCOMP:-false}
          - SANDBOX_MAX_MEMORY=${SANDBOX_MAX_MEMORY:-256m}
          - SANDBOX_TIMEOUT=${SANDBOX_TIMEOUT:-10s}
        healthcheck:
          test: ["CMD", "curl", "http://localhost:9385/healthz"]
          interval: 10s
          timeout: 10s
          retries: 120
        restart: unless-stopped
    ​
      # MySQL 服务
      mysql:
        # mysql:5.7 linux/arm64 image is unavailable.
        image: mysql:8.0.39
        env_file: .env
        environment:
          - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
        command:
          --max_connections=1000
          --character-set-server=utf8mb4
          --collation-server=utf8mb4_unicode_ci
          --default-authentication-plugin=mysql_native_password
          --tls_version="TLSv1.2,TLSv1.3"
          --init-file /data/application/init.sql
          --binlog_expire_logs_seconds=604800
        ports:
          - ${EXPOSE_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: 120
        restart: unless-stopped
    ​
      # MinIO 服务
      minio:
        image: quay.io/minio/minio:RELEASE.2025-06-13T11-33-47Z
        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}
        volumes:
          - minio_data:/data
        networks:
          - ragflow
        restart: unless-stopped
        healthcheck:
          test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
          interval: 10s
          timeout: 10s
          retries: 120
    ​
      # Redis/Valkey 服务
      redis:
        # swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/valkey/valkey:8
        image: valkey/valkey:8
        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: unless-stopped
        healthcheck:
          test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
          interval: 10s
          timeout: 10s
          retries: 120
    ​
      # TEI CPU 服务
      tei-cpu:
        profiles:
          - tei-cpu
        image: ${TEI_IMAGE_CPU}
        hostname: tei
        ports:
          - ${TEI_PORT-6380}:80
        env_file: .env
        networks:
          - ragflow
        command: ["--model-id", "/data/${TEI_MODEL}", "--auto-truncate"]
        restart: unless-stopped
    ​
      # TEI GPU 服务
      tei-gpu:
        profiles:
          - tei-gpu
        image: ${TEI_IMAGE_GPU}
        hostname: tei
        ports:
          - ${TEI_PORT-6380}:80
        env_file: .env
        networks:
          - ragflow
        command: ["--model-id", "/data/${TEI_MODEL}", "--auto-truncate"]
        deploy:
          resources:
            reservations:
              devices:
                - driver: nvidia
                  count: all
                  capabilities: [gpu]
        restart: unless-stopped
    ​
      # Kibana 服务
      kibana:
        profiles:
          - kibana
        image: kibana:${STACK_VERSION}
        ports:
          - ${KIBANA_PORT-5601}:5601
        env_file: .env
        volumes:
          - kibana_data:/usr/share/kibana/data
        depends_on:
          es01:
            condition: service_started
        healthcheck:
          test: ["CMD", "curl", "-f", "http://localhost:5601/api/status"]
          interval: 10s
          timeout: 10s
          retries: 120
        networks:
          - ragflow
        restart: unless-stopped
    ​
      # RAGFlow CPU 服务
      ragflow-cpu:
        depends_on:
          mysql:
            condition: service_healthy
        profiles:
          - cpu
        image: ${RAGFLOW_IMAGE}
        # Example configuration to set up an MCP server:
        # command:
        #   - --enable-mcpserver
        #   - --mcp-host=0.0.0.0
        #   - --mcp-port=9382
        #   - --mcp-base-url=http://127.0.0.1:9380
        #   - --mcp-script-path=/ragflow/mcp/server/server.py
        #   - --mcp-mode=self-host
        #   - --mcp-host-api-key=ragflow-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        # Optional transport flags for MCP (customize if needed).
        # Host mode need to combined with --no-transport-streamable-http-enabled flag, namely, host+streamable-http is not supported yet.
        # The following are enabled by default unless explicitly disabled with --no-<flag>.
        #   - --no-transport-sse-enabled # Disable legacy SSE endpoints (/sse and /messages/)
        #   - --no-transport-streamable-http-enabled #  Disable Streamable HTTP transport (/mcp endpoint)
        #   - --no-json-response # Disable JSON response mode in Streamable HTTP transport (instead of SSE over HTTP)
    ​
        # Example configuration to start Admin server:
        command:
          - --enable-adminserver
        ports:
          - ${SVR_WEB_HTTP_PORT}:80
          - ${SVR_WEB_HTTPS_PORT}:443
          - ${SVR_HTTP_PORT}:9380
          - ${ADMIN_SVR_HTTP_PORT}:9381
          - ${SVR_MCP_PORT}:9382 # entry for MCP (host_port:docker_port). The docker_port must match the value you set for `mcp-port` above.
          - ${GO_HTTP_PORT}:9384
          - ${GO_ADMIN_PORT}:9385
        volumes:
          - ./ragflow-logs:/ragflow/logs
          - ./nginx/ragflow.conf:/etc/nginx/conf.d/ragflow.conf
          - ./nginx/proxy.conf:/etc/nginx/proxy.conf
          - ./nginx/nginx.conf:/etc/nginx/nginx.conf
          - ./service_conf.yaml.template:/ragflow/conf/service_conf.yaml.template
          - ./entrypoint.sh:/ragflow/entrypoint.sh
        env_file: .env
        networks:
          - ragflow
        restart: unless-stopped
        # https://docs.docker.com/engine/daemon/prometheus/#create-a-prometheus-configuration
        # If you use Docker Desktop, the --add-host flag is optional. This flag ensures that the host's internal IP is exposed to the Prometheus container.
        extra_hosts:
          - "host.docker.internal:host-gateway"
    ​
      # RAGFlow GPU 服务
      ragflow-gpu:
        depends_on:
          mysql:
            condition: service_healthy
        profiles:
          - gpu
        image: ${RAGFLOW_IMAGE}
        # Example configuration to set up an MCP server:
        # command:
        #   - --enable-mcpserver
        #   - --mcp-host=0.0.0.0
        #   - --mcp-port=9382
        #   - --mcp-base-url=http://127.0.0.1:9380
        #   - --mcp-script-path=/ragflow/mcp/server/server.py
        #   - --mcp-mode=self-host
        #   - --mcp-host-api-key=ragflow-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        # Optional transport flags for MCP (customize if needed).
        # Host mode need to combined with --no-transport-streamable-http-enabled flag, namely, host+streamable-http is not supported yet.
        # The following are enabled by default unless explicitly disabled with --no-<flag>.
        #   - --no-transport-sse-enabled # Disable legacy SSE endpoints (/sse and /messages/)
        #   - --no-transport-streamable-http-enabled #  Disable Streamable HTTP transport (/mcp endpoint)
        #   - --no-json-response # Disable JSON response mode in Streamable HTTP transport (instead of SSE over HTTP)
    ​
        # Example configuration to start Admin server:
        command:
          - --enable-adminserver
        ports:
          - ${SVR_WEB_HTTP_PORT}:80
          - ${SVR_WEB_HTTPS_PORT}:443
          - ${SVR_HTTP_PORT}:9380
          - ${ADMIN_SVR_HTTP_PORT}:9381
          - ${SVR_MCP_PORT}:9382 # entry for MCP (host_port:docker_port). The docker_port must match the value you set for `mcp-port` above.
        volumes:
          - ./ragflow-logs:/ragflow/logs
          - ./nginx/ragflow.conf:/etc/nginx/conf.d/ragflow.conf
          - ./nginx/proxy.conf:/etc/nginx/proxy.conf
          - ./nginx/nginx.conf:/etc/nginx/nginx.conf
          - ./service_conf.yaml.template:/ragflow/conf/service_conf.yaml.template
          - ./entrypoint.sh:/ragflow/entrypoint.sh
        env_file: .env
        networks:
          - ragflow
        restart: unless-stopped
        # https://docs.docker.com/engine/daemon/prometheus/#create-a-prometheus-configuration
        # If you use Docker Desktop, the --add-host flag is optional. This flag ensures that the host's internal IP is exposed to the Prometheus container.
        extra_hosts:
          - "host.docker.internal:host-gateway"
        deploy:
          resources:
            reservations:
              devices:
                - driver: nvidia
                  count: all
                  capabilities: [gpu]
    ​
      # Executor 服务(注释状态,按需启用)
      # executor:
      #   depends_on:
      #     mysql:
      #       condition: service_healthy
      #   image: ${RAGFLOW_IMAGE}
      #   volumes:
      #     - ./ragflow-logs:/ragflow/logs
      #     - ./nginx/ragflow.conf:/etc/nginx/conf.d/ragflow.conf
      #   env_file: .env
      #   entrypoint: "/ragflow/entrypoint_task_executor.sh 1 3"
      #   networks:
      #     - ragflow
      #   restart: unless-stopped
      #   # https://docs.docker.com/engine/daemon/prometheus/#create-a-prometheus-configuration
      #   # If you're using Docker Desktop, the --add-host flag is optional. This flag makes sure that the host's internal IP gets exposed to the Prometheus container.
      #   extra_hosts:
      #     - "host.docker.internal:host-gateway"
      #   deploy:
      #     resources:
      #       reservations:
      #         devices:
      #           - driver: nvidia
      #             count: all
      #             capabilities: [gpu]
    ​
    # 数据卷定义
    volumes:
      esdata01:
        driver: local
      osdata01:
        driver: local
      infinity_data:
        driver: local
      ob_data:
        driver: local
      seekdb_data:
        driver: local
      mysql_data:
        driver: local
      minio_data:
        driver: local
      redis_data:
        driver: local
      tei_data:
        driver: local
      kibana_data:
        driver: local
    ​
    # 网络定义
    networks:
      ragflow:
        driver: bridge

  • 打开命令控制台运行一下命令构建容器:

docker compose -p ragflow -f docker-compose.yml up -d
  • Docker容器应该就能看到ragflow容器了,使用http://localhost:180(你的端口号)进行访问

  • 点击注册 注册一个账户并登录

  • 配置ragflow:

    LLM模型:

    - 点头像
    - 右边选模型ollama
    - 配置模型类型Chat
    - 输入模型名称(ollama list命令查看模型名称)
    - 基础Url输入Ollama服务地址(ipconfig命令查看Docker WSL网络地址)示例:http://172.21.16.1:1521
    - (Ollama 不需要API-Key)
    - token数999999

    配置Embedding(参考LLM模型)

  • http://localhost:180创建知识库上传数据进行解析和测试