# 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/kuai-su-ru-men/gpu-comparison)
* [Dify 社区 Discord](https://discord.gg/FngNHpbcY7)
