# Dify.ai 工作流平台

## 概览

[Dify.ai](https://github.com/langgenius/dify) 是一个开源的 LLM 应用开发平台，具有 **114K+ GitHub 星标**。它将可视化工作流构建器、检索增强生成（RAG）管道、Agent 协调、模型管理和一键 API 部署层整合到一个可自托管的堆栈中。

在 **Clore.ai** 您可以在租用的 GPU 服务器上以最低约运行完整的 Dify 堆栈——包括其 Postgres 数据库、Redis 缓存、Weaviate 向量存储、Nginx 反向代理、API 工作进程和 Web 前端，费用低至 **$0.20–$0.35/小时** （RTX 3090/4090）。GPU 对 Dify 本身是可选的，但当您通过 Ollama 或 vLLM 后端集成本地模型推理时，GPU 就变得至关重要。

**主要功能：**

* 🔄 **可视化工作流构建器** — 支持分支、循环和条件逻辑的拖放式 LLM 管道
* 📚 **RAG 管道** — 上传 PDF、URL、Notion 页面；切片 + 嵌入 + 检索均在 UI 中管理
* 🤖 **Agent 模式** — 支持 ReAct 与函数调用的 agent，并能使用工具（网络搜索、代码解释器、自定义 API）
* 🚀 **API 优先** — 每个应用都会即时生成一个 REST 端点和 SDK 代码片段
* 🔌 **100+ 模型集成** — OpenAI、Anthropic、Mistral、Cohere，以及通过 Ollama/vLLM 的本地模型
* 🏢 **多租户** — 团队、工作区、RBAC、使用配额

***

## 要求

Dify 作为多容器的 Docker Compose 堆栈运行。用于开发的最低可行服务器是纯 CPU 实例；若要在生产中启用本地模型推理，您需要一个 GPU 节点。

| 配置                | GPU             | 显存    | 系统内存   | 磁盘     | Clore.ai 价格     |
| ----------------- | --------------- | ----- | ------ | ------ | --------------- |
| **最小** （仅 API 密钥） | 无 / 仅 CPU       | —     | 8 GB   | 30 GB  | \~$0.05/小时（CPU） |
| **标准**            | RTX 3080        | 10 GB | 16 GB  | 50 GB  | 约 $0.15/小时      |
| **推荐**            | RTX 3090 / 4090 | 24 GB | 32 GB  | 80 GB  | $0.20–0.35/小时   |
| **生产 + 本地 LLM**   | A100 80 GB      | 80 GB | 64 GB  | 200 GB | \~$1.10/小时      |
| **高吞吐量**          | H100 SXM        | 80 GB | 128 GB | 500 GB | \~$2.50/小时      |

> **提示：** 如果您仅使用云 API 提供商（OpenAI、Anthropic 等），任何 2 核 CPU、8 GB 内存的实例都可工作。只有在通过 Ollama 或 vLLM 运行本地模型时才需要 GPU —— 详见 [GPU 加速](#gpu-acceleration) 下文。

### 磁盘说明

随着文档上传，Weaviate 和 Postgres 数据会迅速增长。请预留 **至少 50 GB** 并通过 Clore.ai 的卷选项挂载持久存储。

***

## 快速开始

### 1. 租用 Clore.ai 服务器

浏览到 [clore.ai](https://clore.ai)，按所需 GPU 筛选，然后部署带有以下配置的服务器：

* **已预装 Docker** （所有 Clore 镜像均包含它）
* 开放端口 **80** 和 **443** （如需，可在报价设置中添加自定义端口）
* 已启用 SSH 访问

### 2. 连接并准备服务器

```bash
# SSH 登录到您的 Clore 服务器
ssh root@<clore-server-ip> -p <ssh-port>

# 更新系统包
apt-get update && apt-get upgrade -y

# 验证 Docker 是否可用
docker --version
docker compose version   # 应为 v2.x
```

### 3. 克隆 Dify 并启动

```bash
# 克隆代码仓库
git clone https://github.com/langgenius/dify.git
cd dify/docker

# 复制示例环境文件
cp .env.example .env

# （可选）在启动前编辑设置
nano .env

# 拉取所有镜像并在后台启动所有服务
docker compose up -d

# 在启动期间查看日志（首次运行需 2-3 分钟）
docker compose logs -f
```

### 4. 验证所有服务运行健康

```bash
# 检查容器状态
docker compose ps

# 预计输出：
# NAME                    STATUS
# docker-api-1            Up (healthy)
# docker-web-1            Up (healthy)
# docker-worker-1         Up (healthy)
# docker-nginx-1          Up
# docker-db-1             Up (healthy)
# docker-redis-1          Up (healthy)
# docker-weaviate-1       Up (healthy)
# docker-sandbox-1        Up (healthy)
```

### 5. 访问 Web 界面

在浏览器中打开并访问：

```
http://<clore-server-ip>:80
```

首次启动时，Dify 会将您重定向到设置向导以创建管理员账户。完成向导后登录即可。

***

## 配置

所有配置都存放在 `dify/docker/.env`。以下是最重要的设置：

### 必要的环境变量

```bash
# ── 密钥（请更改） ──────────────────────────────────────────────
SECRET_KEY=your-super-secret-key-change-this-immediately
# 生成一个强密钥：
# python3 -c "import secrets; print(secrets.token_hex(32))"

# ── 应用 URL ──────────────────────────────────────────────────────────
# 设置为服务器的公网 IP 或域名
CONSOLE_WEB_URL=http://<clore-server-ip>
APP_WEB_URL=http://<clore-server-ip>

# ── 数据库（Postgres） ─────────────────────────────────────────────────────
DB_USERNAME=postgres
DB_PASSWORD=difyai123456          # 在生产环境中请更改！
DB_HOST=db
DB_PORT=5432
DB_DATABASE=dify

# ── Redis ───────────────────────────────────────────────────────────────────
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=difyai123456       # 在生产环境中请更改！

# ── 存储（默认为本地磁盘） ─────────────────────────────────────────
STORAGE_TYPE=local
# 或使用兼容 S3 的存储：
# STORAGE_TYPE=s3
# S3_ENDPOINT=https://s3.amazonaws.com
# S3_BUCKET_NAME=your-dify-bucket
# S3_ACCESS_KEY=...
# S3_SECRET_KEY=...

# ── 默认 LLM 提供者 ─────────────────────────────────────────────────────
# 登录后在 UI 中设置，或在此处预配置：
# OPENAI_API_KEY=sk-...
```

### 更改暴露端口

默认情况下 Nginx 监听端口为 **80**。要更改它：

```bash
# 在 docker-compose.yaml 中，编辑 nginx 服务：
# ports:
#   - "8080:80"   ← 将 8080 更改为您偏好的主机端口

# 然后重启：
docker compose down && docker compose up -d
```

### 持久化数据卷

Dify 的 Compose 文件默认挂载以下卷：

```yaml
volumes:
  oradata:          # Postgres 数据
  redis_data:       # Redis AOF
  weaviate_data:    # 向量存储
  app_storage:      # 上传的文档和生成的文件
```

要备份：

```bash
# 先停止服务，然后打包 Docker 卷
docker compose stop
docker run --rm \
  -v docker_oradata:/data \
  -v $(pwd)/backups:/backup \
  alpine tar czf /backup/postgres-$(date +%Y%m%d).tar.gz /data
docker compose start
```

***

## GPU 加速

Dify 的核心平台基于 CPU，但通过集成 **Ollama** 或 **vLLM** 作为模型提供者即可启用本地模型推理——两者都极大受益于 GPU。

### 选项 A：Ollama 旁车（最简单）

在同一 Clore 服务器上与 Dify 并行运行 Ollama：

```bash
# 安装 Ollama
curl -fsSL https://ollama.com/install.sh | sh

# 拉取一个模型（例如 Llama 3 8B）
ollama pull llama3:8b

# 验证是否使用了 GPU
ollama run llama3:8b "Hello!"
nvidia-smi   # 应显示 ollama 进程正在使用显存
```

然后在 Dify UI → **设置 → 模型提供者 → Ollama**:

* 基础 URL： `http://localhost:11434`
* 选择您的模型并保存

> 完整的 Ollama 指南，请参见 [language-models/ollama.md](https://docs.clore.ai/guides/guides_v2-zh/yu-yan-mo-xing/ollama).

### 选项 B：vLLM 旁车（高吞吐量）

```bash
# 以 GPU 直通方式将 vLLM 作为单独容器运行
docker run -d \
  --name vllm \
  --gpus all \
  --runtime nvidia \
  -p 8000:8000 \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  -e HUGGING_FACE_HUB_TOKEN=<your-hf-token> \
  vllm/vllm-openai:latest \
  --model mistralai/Mistral-7B-Instruct-v0.2 \
  --dtype auto \
  --max-model-len 4096

# 验证端点
curl http://localhost:8000/v1/models
```

然后在 Dify UI → **设置 → 模型提供者 → OpenAI 兼容**:

* 基础 URL： `http://localhost:8000/v1`
* API 密钥： `dummy`
* 模型名称： `mistralai/Mistral-7B-Instruct-v0.2`

> 有关完整的 vLLM 设置，请参见 [language-models/vllm.md](https://docs.clore.ai/guides/guides_v2-zh/yu-yan-mo-xing/vllm).

### 本地模型的 GPU 显存建议

| A100              | 所需显存   | 推荐的 Clore GPU   |
| ----------------- | ------ | --------------- |
| Llama 3 8B（Q4）    | 6 GB   | 按小时费率           |
| Llama 3 8B（FP16）  | 16 GB  | RTX 3090 / 4090 |
| Mistral 7B（Q4）    | 5 GB   | 按小时费率           |
| Llama 3 70B（Q4）   | 40 GB  | 按日费率            |
| Llama 3 70B（FP16） | 140 GB | 2× H100         |

***

## 提示与最佳实践

### 在 Clore.ai 上的成本优化

```bash
# 使用抢占（spot）价格 — Dify 的数据库状态保存在卷中
# 因此您可以廉价地停止/重启实例

# 在停止 Clore 实例之前，导出数据库：
docker exec docker-db-1 pg_dump -U postgres dify > dify_backup_$(date +%Y%m%d).sql

# 压缩存储卷以便传输
tar czf dify_storage_$(date +%Y%m%d).tar.gz \
  $(docker volume inspect docker_app_storage --format '{{.Mountpoint}}')
```

### 使用 Caddy 启用 HTTPS（生产建议）

```bash
# 将 Caddy 添加到 docker-compose.yaml 或独立运行
docker run -d \
  --name caddy \
  --network docker_default \
  -p 443:443 -p 80:80 \
  -v $PWD/Caddyfile:/etc/caddy/Caddyfile \
  -v caddy_data:/data \
  caddy:latest

# Caddyfile 内容：
# your-domain.com {
#     reverse_proxy nginx:80
# }
```

### 为重负载扩展 worker 数量

```bash
# 运行 4 个 celery worker 而不是 1 个
docker compose up -d --scale worker=4
```

### 监控资源使用情况

```bash
# 实时容器统计
docker stats

# GPU 利用率（如果使用本地模型）
watch -n1 nvidia-smi

# Dify 应用日志
docker compose logs -f api worker
```

### RAG 性能调优

* 设置 **切片大小** 对大多数文档类型为 512–1024 令牌
* 启用 **父子检索** 用于数据集设置中的长文档
* 使用 **混合搜索** （关键词 + 向量），在技术内容上可获得更好的召回率
* 在非高峰时段索引文档以避免 API 速率限制

***

## # 使用固定种子以获得一致结果

### 服务不断重启

```bash
# 检查故障服务的日志
docker compose logs --tail=50 api
docker compose logs --tail=50 worker

# 常见原因：SECRET_KEY 错误或数据库连接问题
# 确保 .env 中的 SECRET_KEY 已设置且唯一
grep SECRET_KEY .env
```

### 启动时出现 “Migration failed”

```bash
# 手动运行数据库迁移
docker compose exec api flask db upgrade

# 如果失败，先检查 Postgres 是否健康
docker compose exec db pg_isready -U postgres
```

### 无法从 Dify 连接到 Ollama

```bash
# Ollama 默认绑定到 127.0.0.1
# 将其更改为监听所有接口：
OLLAMA_HOST=0.0.0.0 ollama serve

# 或编辑 systemd 服务：
systemctl edit ollama
# 在 [Service] 下添加：
# Environment="OLLAMA_HOST=0.0.0.0"
systemctl restart ollama

# 在 Dify 容器内测试：
docker compose exec api curl http://host.docker.internal:11434/api/tags
```

### 磁盘空间不足

```bash
# 检查卷大小
df -h
docker system df

# 删除未使用的镜像
docker image prune -a

# Weaviate 日志可能变大 — 请截断/轮转它们
docker compose exec weaviate truncate -s 0 /tmp/weaviate.log
```

### Weaviate 向量存储错误

```bash
# 重置 Weaviate（警告：会删除所有嵌入，需要重新索引）
docker compose stop weaviate
docker volume rm docker_weaviate_data
docker compose up -d weaviate

# 然后在 Dify UI → Datasets → [dataset] → Re-index 重新索引您的数据集
```

### 端口 80 已被占用

```bash
# 查找占用 80 端口的进程
ss -tlnp | grep :80
# 或
lsof -i :80

# 停止冲突服务或在 docker-compose.yaml 中更改 Dify 的 nginx 端口
```

***

## 延伸阅读

* [Dify 官方文档](https://docs.dify.ai)
* [Dify GitHub 仓库](https://github.com/langgenius/dify)
* [Dify 自托管指南](https://docs.dify.ai/getting-started/install-self-hosted/docker-compose)
* [在 Clore.ai 上运行 Ollama](https://docs.clore.ai/guides/guides_v2-zh/yu-yan-mo-xing/ollama)
* [在 Clore.ai 上运行 vLLM](https://docs.clore.ai/guides/guides_v2-zh/yu-yan-mo-xing/vllm)
* [Clore.ai GPU 对比](https://docs.clore.ai/guides/guides_v2-zh/ru-men/gpu-comparison)
* [Dify 社区 Discord](https://discord.gg/FngNHpbcY7)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.clore.ai/guides/guides_v2-zh/ai-ping-tai-yu-zhi-neng-ti/dify.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
