# 可落地的 RAGFlow v0.26.x + Keycloak + AD（LDAP）企业级 SSO 标准架构部署方案

下面给你一套**可落地的 RAGFlow v0.26.x + Keycloak + AD（LDAP）企业级 SSO 标准架构部署方案**。这套是按“生产可用”设计的，不是 demo。

我会直接按你当前环境（Docker + 同机 Keycloak + AD 已同步）给出完整结构。

---

# 🧱 一、目标架构（企业级标准）

```text
                ┌──────────────┐
                │   Browser    │
                └──────┬───────┘
                       │
                       ▼
            ┌────────────────────┐
            │   RAGFlow Web UI   │
            └────────┬───────────┘
                     │
                     ▼
        ┌──────────────────────────┐
        │   RAGFlow API Gateway    │  ← ★核心（你现在缺的）
        │   /api /auth /oauth      │
        └───────┬───────────┬──────┘
                │           │
                ▼           ▼
        Worker/CPU      Keycloak (OIDC)
                          │
                          ▼
                        AD/LDAP

```

---

# 🧨 二、你当前问题总结（必须先修）

你现在只有：

```text
ragflow-cpu（worker/adminserver）

```

缺少：

```text
❌ ragflow-api（SSO入口）
❌ ragflow-web（UI正确版本）

```

👉 所以你所有 OAUTH2 配置都不会生效

---

# 🧩 三、完整 docker-compose（企业版）

下面是**可用标准结构（重点）**

---

## 📦 1. 基础服务

```yaml
version: "3.9"

services:

  mysql:
    image: mysql:8.0
    container_name: ragflow-mysql
    environment:
      MYSQL_ROOT_PASSWORD: ragflow
      MYSQL_DATABASE: ragflow
    volumes:
      - ./data/mysql:/var/lib/mysql

  redis:
    image: redis:7
    container_name: ragflow-redis

  elasticsearch:
    image: elasticsearch:8.11.3
    container_name: ragflow-es
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
    volumes:
      - ./data/es:/usr/share/elasticsearch/data

  minio:
    image: minio/minio
    container_name: ragflow-minio
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123456
    ports:
      - "9000:9000"
      - "9001:9001"

```

---

## 🚀 2. RAGFlow API（关键）

```yaml
  ragflow-api:
    image: swr.cn-north-4.myhuaweicloud.com/infiniflow/ragflow:v0.26.1
    container_name: ragflow-api
    command: ["./entrypoint.sh", "--api-server"]
    depends_on:
      - mysql
      - redis
      - elasticsearch
    environment:
      - DB_HOST=mysql
      - REDIS_HOST=redis
      - ES_HOST=elasticsearch
      - MINIO_HOST=minio

```

---

## 🖥️ 3. RAGFlow Web UI

```yaml
  ragflow-web:
    image: swr.cn-north-4.myhuaweicloud.com/infiniflow/ragflow-web:v0.26.1
    container_name: ragflow-web
    ports:
      - "80:80"
    depends_on:
      - ragflow-api

```

---

## ⚙️ 4. Worker（你现在这个）

```yaml
  ragflow-worker:
    image: swr.cn-north-4.myhuaweicloud.com/infiniflow/ragflow:v0.26.1
    container_name: ragflow-worker
    command: ["./entrypoint.sh", "--worker"]
    depends_on:
      - ragflow-api

```

---

# 🔐 四、Keycloak 企业级配置（重点）

---

## 1️⃣ Client 配置

Client ID：

```text
ragflow

```

Settings：

- Client type: OpenID Connect
- Access type: confidential
- Standard flow: ON
- Direct access: OFF

---

## 2️⃣ Redirect URI（必须）

```text
http://192.168.4.16/oauth/callback
http://192.168.4.16/*

```

---

## 3️⃣ Mapper（关键）

必须添加：

<table id="bkmrk-name-mapper-username"><thead><tr><th>Name</th><th>Mapper</th></tr></thead><tbody><tr><td>username</td><td>preferred\_username</td></tr><tr><td>email</td><td>email</td></tr><tr><td>groups</td><td>group membership</td></tr></tbody></table>

---

## 4️⃣ Scope

必须：

```text
openid email profile

```

---

# ⚙️ 五、RAGFlow API SSO配置（核心）

在 **ragflow-api**：

```yaml
environment:
  - OAUTH2_ENABLE=true
  - OAUTH2_TYPE=oidc
  - OAUTH2_DISPLAY_NAME=AD域登录
  - OAUTH2_CLIENT_ID=ragflow
  - OAUTH2_CLIENT_SECRET=xxxx

  - OAUTH2_METADATA_URL=http://192.168.4.16:8081/realms/shuncom/.well-known/openid-configuration

  - OAUTH2_REDIRECT_URI=http://192.168.4.16/oauth/callback

  - OAUTH2_SCOPES=openid email profile

  # ⭐关键
  - OAUTH2_USER_ID_CLAIM=preferred_username

  # 自动建用户
  - OAUTH2_AUTO_CREATE_USER=true
  - REGISTER_ENABLED=1

```

---

# 🧠 六、关键修复点（你之前全部踩坑）

## ❌ 错误1：用 worker 容器做 SSO

✔ 正确：SSO 在 API，不在 worker

---

## ❌ 错误2：email 作为 user\_id

✔ 正确：

```text
preferred_username

```

---

## ❌ 错误3：缺 API gateway

✔ 必须有：

```text
/ api / auth / oauth endpoints

```

---

# 🌐 七、验证是否成功

---

## 1️⃣ API是否正常

```bash
curl http://192.168.4.16/api/health

```

---

## 2️⃣ OIDC provider

```bash
curl http://192.168.4.16/api/auth/providers

```

---

## 3️⃣ Keycloak redirect

访问：

```text
http://192.168.4.16

```

应该看到：

- 本地登录
- ⭐ AD域账号登录按钮

---

# 🔥 八、企业级增强（推荐）

---

## 1️⃣ 自动角色映射（RBAC）

Keycloak groups → RAGFlow roles：

```text
AD Group → Keycloak Group → RAGFlow Role

```

---

## 2️⃣ 自动部门隔离

```text
group = IT / Finance / Ops

```

---

## 3️⃣ 审计日志

开启：

- login logs
- token logs
- API logs

---

# 🧨 九、你当前必须做的事（非常重要）

你现在不要再调：

- ❌ OAUTH2参数
- ❌ Keycloak
- ❌ AD

👉 先做：

## 🚨 补齐 RAGFlow API 层

否则所有 SSO 都是无效的

---

# 📌 十、如果你要我帮你下一步升级

我可以继续帮你做三件更高级的：

### 🔐 1. AD → Keycloak 自动同步（含OU映射）

### 🔐 2. Keycloak → RAGFlow RBAC自动绑定

### 🔐 3. 多租户 + 部门级权限隔离

### 🔐 4. 一键 docker-compose 企业版（可直接生产）

只要你说一句：

> “升级企业级SSO+RBAC”

我可以给你一套**可以直接上线生产的版本（含全部yaml + keycloak导入文件）**。