Dify:架构解析、部署流程、扩展方式与二次开发详解

文章标题:

Dify:架构剖析、部署步骤、高可用中间件独立部署与二次开发全解

文章内容:本文深入剖析Dify的架构体系、部署流程,讲解高可用中间件的独立部署途径以及二次开发的具体流程,助力开发者更高效地对Dify进行管理与扩展。


1. 本地DEMO的部署

要安装Docker,接着执行如下脚本,可能需要对镜像进行配置。

git clone https://github.com/langgenius/dify.git
cd dify
cd docker
cp .env.example .env
docker compose up -d
此处为图片描述Dify:架构解析、部署流程、扩展方式与二次开发详解

" />

1. Dify部署后的整体构造

Dify采用容器进行部署,主要由多个模块构成,分为Dify核心服务中间件组件以及存储支撑,所有流量都经过Nginx反向代理来进行管理。

此处为图片描述Dify:架构解析、部署流程、扩展方式与二次开发详解

" />

1.1 Dify核心服务

组件 作用 端口
api 核心API服务,处理用户请求 5001
work 核心任务服务,处理用户任务执行
web Web前端 3000
plugin_daemon 插件管理守护进程 5002
sandbox 代码沙箱,提供安全执行环境,执行shell、调用url 8194

1.2 中间件

Dify依赖多个中间件组件来存储数据并提供缓存支持:

组件 作用 端口
PostgreSQL 主要数据库,存储核心数据 5432
Redis 缓存层,提升性能 6379
Weaviate / Qdrant / Milvus/… 向量数据库,支持多种向量数据库 8080 (Weaviate), 6333 (Qdrant), 19530 (Milvus)
ssrf_proxy 请求代理,使用squid,防止SSR攻击 3128

1.3 Nginx作为网关

Nginx充当反向代理,管理所有流量:
- nginx:80处理所有进入的流量,并将其路由到web:3000api:5001plugin_daemon:5002
- plugin_daemon:5002可连接到Marketplace,连接Marketplace需要进行Docker配置代理。

1.4 一个专用网络

在sandbox、api和ssrf_proxy之间创建一个网络,sandbox不能直接访问外部,以此防止SSRF攻击。


2. 如何单独部署高可用中间件

若想要将PostgreSQL、Redis等中间件独立部署来提升可靠性,可参考以下方式。

2.1 部署高可用PostgreSQL

可以采用PostgreSQL主从复制或者Patroni + etcd方案:

services:
  db_primary:
    image: postgres:15-alpine
    environment:
      POSTGRES_PASSWORD: "difyai123456"
      POSTGRES_DB: "dify"
    volumes:
      - ./volumes/db/primary:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  db_replica:
    image: postgres:15-alpine
    environment:
      POSTGRES_PASSWORD: "difyai123456"
      POSTGRES_DB: "dify"
      POSTGRES_REPLICATION_ROLE: "replica"
      POSTGRES_PRIMARY_HOST: "db_primary"
    volumes:
      - ./volumes/db/replica:/var/lib/postgresql/data

修改.envdocker-compose.yaml来配置PostgreSQL地址:

environment:
  DB_HOST: "your-external-postgres-host"
  DB_PORT: "5432"

2.2 部署高可用Redis

使用Redis Sentinel来进行高可用部署:

services:
  redis_master:
    image: redis:6-alpine
    command: redis-server --requirepass "difyai123456"
    ports:
      - "6379:6379"

  redis_sentinel:
    image: bitnami/redis-sentinel
    environment:
      REDIS_MASTER_HOST: "redis_master"
      REDIS_MASTER_PASSWORD: "difyai123456"
    ports:
      - "26379:26379"

修改.envdocker-compose.yaml来配置Redis地址:

environment:
  REDIS_HOST: "your-external-redis-host"
  REDIS_PORT: "6379"

2.3 部署外部向量数据库

Dify支持Milvus, Qdrant, Weaviate等向量数据库,独立部署方式如下:

services:
  milvus:
    image: milvusdb/milvus:v2.5.0-beta
    ports:
      - "19530:19530"

修改docker-compose.yaml来配置Milvus地址:

environment:
  VECTOR_STORE: "milvus"
  MILVUS_URI: "http://your-external-milvus-host:19530"

3. 如何开展二次开发

此处为图片描述Dify:架构解析、部署流程、扩展方式与二次开发详解

" />

3.1 修改代码

若需要修改Dify API代码,比如添加自定义API端点:
1. 克隆Dify代码仓库:

git clone https://github.com/langgenius/dify.git
cd dify
  1. 进入api目录,修改Python代码:
cd api
vim app/routes/custom.py

示例:添加新接口

from flask import Blueprint, jsonify

custom_api = Blueprint('custom_api', __name__)

@custom_api.route('/custom-endpoint', methods=['GET'])
def custom_endpoint():
    return jsonify({'message': 'Hello from custom API!'})

app.register_blueprint(custom_api)

3.2 重新打包API镜像

  1. 进入api目录,构建新的API镜像:
docker build -t dify-api-custom .
  1. 修改docker-compose.yaml以使用自定义镜像:
services:
  api:
    image: dify-api-custom
  1. 重新部署:
docker-compose down && docker-compose up -d

3.3 修改Web前端

  1. 进入web目录:
cd web
vim src/pages/index.tsx
  1. 重新构建Web镜像:
docker build -t dify-web-custom .
  1. 修改docker-compose.yaml以使用自定义镜像:
services:
  web:
    image: dify-web-custom
  1. 重新部署:
docker-compose down && docker-compose up -d

3.4 修改环境变量

Dify依赖多个.env配置文件:
- 修改middleware.env(用于中间件)
- 修改.env(用于核心API)

例如,修改.env以使用阿里云OSS:

STORAGE_TYPE=opendal
OPENDAL_SCHEME=oss
ALIYUN_OSS_BUCKET_NAME=your-bucket-name
ALIYUN_OSS_ACCESS_KEY=your-access-key
ALIYUN_OSS_SECRET_KEY=your-secret-key
ALIYUN_OSS_ENDPOINT=https://oss-cn-shanghai.aliyuncs.com

4. 总结

  • Dify架构:由API、Web前端、插件系统、沙箱环境以及多个中间件构成。
  • 独立部署高可用中间件:能够单独部署PostgreSQL、Redis和向量数据库,并通过修改docker-compose.middleware.yaml来进行配置。
  • 二次开发流程
  • 修改apiweb代码
  • 重新打包Docker镜像
  • 修改docker-compose.yaml使其使用新的镜像
  • 修改.env来适配存储配置

通过本指南,你能够更高效地对Dify的部署、扩展和二次开发进行管理,提升AI应用的灵活性与可维护性。

相关文章

暂无评论

暂无评论...