Dify - 架构、部署、扩展与二次开发指南_dify二次开发
本文详细解析 Dify 的架构、部署流程、高可用中间件的独立部署方法,以及二次开发流程,帮助开发者更高效地管理和扩展 Dify。
1. 本地DEMO部署
安装Docker,执行下面脚本,可能需要配置镜像。
git clone https://github.com/langgenius/dify.gitcd difycd dockercp .env.example .envdocker compose up -d
1. Dify 部署后的整体结构
Dify 使用容器部署,主要由多个模块组成,分为 Dify 核心服务、中间件组件 和 存储支持,所有流量经过 Nginx 反向代理 进行管理。
1.1 Dify 核心服务
api
5001
work
web
3000
plugin_daemon
5002
sandbox
8194
1.2 中间件
Dify 依赖多个中间件组件来存储数据和提供缓存支持:
PostgreSQL
5432
Redis
6379
Weaviate
/ Qdrant
/ Milvus
/…8080
(Weaviate), 6333
(Qdrant), 19530
(Milvus)ssrf_proxy
3128
1.3 Nginx 作为网关
Nginx 充当反向代理,管理所有流量:
nginx:80
处理所有进入的流量,并路由到web:3000
、api:5001
、plugin_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
修改 .env
或 docker-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\"
修改 .env
或 docker-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. 如何进行二次开发
3.1 修改代码
如果需要修改 Dify API 代码,例如添加自定义 API 端点:
- 克隆 Dify 代码仓库:
git clone https://github.com/langgenius/dify.gitcd dify
- 进入
api
目录,修改 Python 代码:cd apivim app/routes/custom.py
示例:添加新接口
from flask import Blueprint, jsonifycustom_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 镜像
- 进入
api
目录,构建新的 API 镜像:docker build -t dify-api-custom .
- 修改
docker-compose.yaml
以使用自定义镜像:services: api: image: dify-api-custom
- 重新部署:
docker-compose down && docker-compose up -d
3.3 修改 Web 前端
- 进入
web
目录:cd webvim src/pages/index.tsx
- 重新构建 Web 镜像:
docker build -t dify-web-custom .
- 修改
docker-compose.yaml
以使用自定义镜像:services: web: image: dify-web-custom
- 重新部署:
docker-compose down && docker-compose up -d
3.4 修改环境变量
Dify 依赖多个 .env
配置文件:
- 修改
middleware.env
(用于中间件) - 修改
.env
(用于核心 API)
例如,修改 .env
使用阿里云 OSS:
STORAGE_TYPE=opendalOPENDAL_SCHEME=ossALIYUN_OSS_BUCKET_NAME=your-bucket-nameALIYUN_OSS_ACCESS_KEY=your-access-keyALIYUN_OSS_SECRET_KEY=your-secret-keyALIYUN_OSS_ENDPOINT=https://oss-cn-shanghai.aliyuncs.com
4. 总结
- Dify 架构:由 API、Web 前端、插件系统、沙箱环境和多个中间件组成。
- 独立部署高可用中间件:可以单独部署 PostgreSQL、Redis 和向量数据库,并修改
docker-compose.middleware.yaml
进行配置。 - 二次开发流程:
- 修改
api
或web
代码 - 重新打包 Docker 镜像
- 修改
docker-compose.yaml
使其使用新的镜像 - 修改
.env
适配存储配置
- 修改
通过本指南,你可以更高效地管理 Dify 的部署、扩展和二次开发,提高 AI 应用的灵活性和可维护性。