LightRAG 知识图谱+Nginx+fastapi鉴权

项目地址:https://github.com/HKUDS/LightRAG

前置条件(如果不指定系统会使用本地文件模拟):
Graph:Neo4J图数据库
KV:PGKVStorage / RedisKVStorage / MongoKVStorage kv库
Vector:Milvus / Qdrant / Faiss / PGVector
DocStatus:例如 PGDocStatusStorage / MongoDocStatusStorage

neo4j图数据库可用:

docker run -d --name neo4j -p 7474:7474 -p 7687:7687 -e NEO4J_AUTH=neo4j/12345678 neo4j:5.26

密码必须超过8位,否则会启动失败

uv pip install "lightrag-hku[api]" 带服务安装推荐,已封装好文件处理这些
uv pip install lightrag-hku 仅安装核心,不推荐
lightrag-server 运行(会以默认服务启动)

环境配置

拷贝官方.env示范文件来改

# 监听地址
HOST=0.0.0.0
#webui+api接口
PORT=9621
WEBUI_TITLE='页面标题'
WEBUI_DESCRIPTION="webui描述"

# ==========llm配置===========
# 使用哪种后端
LLM_BINDING=openai
# 模型
LLM_MODEL=gpt-4o
#请求地址
LLM_BINDING_HOST=https://api.openai.com/v1
# key
LLM_BINDING_API_KEY=<密钥>

#==========嵌入模型配置===========
EMBEDDING_BINDING=openai
EMBEDDING_MODEL=text-embedding-3-large
EMBEDDING_DIM=3072
EMBEDDING_SEND_DIM=false
EMBEDDING_TOKEN_LIMIT=8192
EMBEDDING_BINDING_HOST=https://api.openai.com/v1
EMBEDDING_BINDING_API_KEY=<密钥>

# ===========重排序==============
RERANK_BINDING=null
# RERANK_MODEL=...    # 中文注释:对应服务的rerank模型名
# RERANK_BINDING_HOST=...
# RERANK_BINDING_API_KEY=...
# MIN_RERANK_SCORE=0.0 # 过滤掉分数低的结果

# ========指定图数据库==============
# 需要执行uv pip install neo4j
LIGHTRAG_GRAPH_STORAGE=Neo4JStorage
NEO4J_URI=bolt://localhost:7687
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD='12345678'
NEO4J_DATABASE=neo4j
NEO4J_MAX_CONNECTION_POOL_SIZE=100
NEO4J_CONNECTION_TIMEOUT=30
NEO4J_CONNECTION_ACQUISITION_TIMEOUT=30
NEO4J_MAX_TRANSACTION_RETRY_TIME=30
NEO4J_MAX_CONNECTION_LIFETIME=300
NEO4J_LIVENESS_CHECK_TIMEOUT=30
NEO4J_KEEP_ALIVE=true

# ==========其它设定=============
# 如果文档主要语言为中文可写
SUMMARY_LANGUAGE=Chinese

本地测试,容器配置,nginx配置

docker-compose.yml

# 本地测试时,如果在windows环境下,可使用这个容器配置
services:
  nginx:
    image: nginx:1.29-alpine-slim
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - D:\code\nginx\nginx.conf:/etc/nginx/nginx.conf:ro   # 中文注释:Windows绝对路径 -> 容器内Linux路径
      - D:\code\nginx\conf.d:/etc/nginx/conf.d:ro           # 中文注释:目录挂载
      - D:\code\nginx\html:/usr/share/nginx/html:ro         # 中文注释:静态目录
      - D:\code\nginx\logs:/var/log/nginx                   # 中文注释:日志目录
    restart: unless-stopped

因为上面使用了D:\code\nginx\nginx.conf路径,所以先创建这个文件:

user  nginx;
worker_processes  auto;

events {
  worker_connections  1024;
}

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  sendfile on;
  keepalive_timeout  65;

  # 日志位置映射到 /var/log/nginx(我们会把它挂到宿主机的 logs/ 目录)
  access_log  /var/log/nginx/access.log;
  error_log   /var/log/nginx/error.log;

  # 加载站点配置
  include /etc/nginx/conf.d/*.conf;
}

然后在D:\code\nginx\conf.d目录下创建lightrag.conf:

server {
  listen 8292;
  http2 on;
  server_name localhost 127.0.0.1;
  root /usr/share/nginx/html/lightrag;
  index index.html;

  # /api 反代(写前面)
  location /user_api/ {
    # --- 透传且防伪造:只信任本层 Nginx,覆盖为 $remote_addr ---
    proxy_set_header Host              $host;          # 中文注释:保留主机头,方便后端取域名
    proxy_set_header X-Real-IP         $remote_addr;   # 中文注释:真实来源IP(由 Nginx 填入)
    proxy_set_header X-Forwarded-For   $remote_addr;   # 中文注释:覆盖而非追加,避免用户伪造 XFF
    proxy_set_header X-Forwarded-Proto $scheme;        # 中文注释:http/https 协议信息
    # 如果都是在容器,直接使用网络名
    proxy_pass http: //host.docker.internal:8293; # 访问宿主机
  }
  
  # /static 静态目录
  location ^~ /static/ {
    alias /usr/share/nginx/html/lightrag/static/;
    access_log off;
    expires 7d;
    add_header Cache-Control "public";
    try_files $uri =404;
  }

  # / → index.html
  location = / {
    try_files /index.html =404;
  }
  
  location ^~ /login {
    try_files $uri /index.html;
  }
  
  # 其他请求按文件/目录处理
  location / {
    try_files $uri $uri/ =404;
  }
  # 授权验证程序,需要验证的路由都请先调用它
  location = /_auth {
      internal;                                   # 只允许Nginx内部发起子请求,外部无法直接访问
      proxy_pass http: //host.docker.internal:8293/user_api/user/verify; #转发到自己的鉴权服务(FastAPI等
      proxy_set_header X-Original-URI $request_uri;    # 把原请求地址传给鉴权服务,便于做权限判断
      # proxy_set_header Cookie $http_cookie;            # 把cookie带过去(如果你用cookie会话)
      proxy_set_header Authorization $http_authorization; # 把JWT/Token带过去(如果你用Bearer)
  }
    # 这里是要代理到lightrag的路由,必须经过转发才
    location /lightrag/ {
      auth_request /_auth;                                       # 先鉴权

      auth_request_set $tenant $upstream_http_x_tenant;          # 从鉴权响应头读取 X-Tenant
      auth_request_set $uid    $upstream_http_x_user_id;         # 从鉴权响应头读取 X-User-Id
        
      proxy_set_header LIGHTRAG-WORKSPACE $tenant;               # 租户映射(可选)
      proxy_set_header X-User-Id $uid;                           # 也可透传用户ID用于审计
      proxy_set_header X-API-Key your_lightrag_key;              # 注入LightRAG API Key
        client_max_body_size 200m;                         # 控制上传大小
      proxy_pass http://host.docker.internal:9621;               # 通过后才反代
  }
}