配置管理系统
配置管理系统
相关源文件
本章引用的主要源码文件:
api/.env.exampleapi/Dockerfileapi/app.pyapi/app_factory.pyapi/configs/feature/__init__.pyapi/configs/middleware/__init__.pyapi/configs/observability/__init__.pyapi/configs/observability/otel/otel_config.pyapi/configs/packaging/__init__.pyapi/controllers/console/datasets/datasets.pyapi/core/rag/datasource/vdb/vector_factory.pyapi/core/rag/datasource/vdb/vector_type.pyapi/extensions/ext_compress.pyapi/extensions/ext_otel.pyapi/extensions/otel/instrumentation.pyapi/pyproject.tomlapi/tests/unit_tests/configs/test_dify_config.pyapi/tests/unit_tests/core/workflow/graph_engine/test_table_runner.pyapi/uv.lockdocker/.env.exampledocker/README.mddocker/docker-compose-template.yamldocker/docker-compose.middleware.yamldocker/docker-compose.yamldocker/envs/core-services/shared.env.exampledocker/envs/infrastructure/nginx.env.exampledocker/envs/security.env.exampledocker/nginx/conf.d/default.conf.templateweb/.env.exampleweb/Dockerfileweb/app/layout.tsxweb/config/index.tsweb/docker/entrypoint.shweb/package.jsonweb/types/feature.ts
本文档描述了 Dify 的配置系统,该系统管理 API、Worker 和 Web 服务的应用程序设置、功能开关、中间件连接和部署参数。系统在后端使用 Pydantic 进行类型安全的配置管理,在部署时使用环境变量进行自定义配置。
架构总览
Dify 的配置系统在后端使用 Pydantic 的 BaseSettings 进行类型安全的配置管理,在部署时采用多层方法(环境变量 + .env 文件 + Docker Compose 覆盖)进行配置。
系统级配置架构
标题:配置数据流与实体映射
来源:api/configs/feature/__init__.py:20-103、api/configs/packaging/__init__.py:6-15、docker/docker-compose.yaml:8-68、docker/docker-compose-template.yaml:2-62
后端配置加载流程
后端配置系统使用 Pydantic 的 BaseSettings,支持自动环境变量解析和校验。
三阶段配置加载
标题:Pydantic 设置解析管线
来源:api/configs/feature/__init__.py:5-15、api/configs/feature/__init__.py:194-204、api/configs/packaging/__init__.py:6-15
Docker 部署加载
在使用 Docker Compose 的生产环境中,配置从多个特定的 .env 文件中聚合而来。x-shared-api-worker-config YAML 锚点定义了加载到容器中的环境文件层级。
来源:docker/docker-compose.yaml:8-68、docker/docker-compose-template.yaml:2-62
配置类层次结构
功能配置
位于 api/configs/feature/__init__.py 中,这些类管理应用级逻辑和安全参数。
| 类 | 用途 | 关键代码实体 |
|---|---|---|
SecurityConfig | 认证和加密 | SECRET_KEY、RESET_PASSWORD_TOKEN_EXPIRY_MINUTES |
AppExecutionConfig | 运行时约束 | APP_MAX_EXECUTION_TIME、HUMAN_INPUT_GLOBAL_TIMEOUT_SECONDS |
CodeExecutionSandboxConfig | 沙箱设置 | CODE_EXECUTION_ENDPOINT、CODE_EXECUTION_API_KEY |
TriggerConfig | Webhook 设置 | WEBHOOK_REQUEST_BODY_MAX_SIZE |
AsyncWorkflowConfig | 异步执行 | ASYNC_WORKFLOW_SCHEDULER_GRANULARITY |
带校验的配置示例 api/configs/feature/__init__.py:83-94:
class AppExecutionConfig(BaseSettings):
APP_MAX_EXECUTION_TIME: PositiveInt = Field(
description="应用程序允许的最大执行时间(秒)",
default=1200,
)
APP_DEFAULT_ACTIVE_REQUESTS: NonNegativeInt = Field(
description="每个应用的默认并发活动请求数(0 表示无限制)",
default=0,
)
中间件配置
管理对外部基础设施服务的连接。
| 类 | 用途 | 详情 |
|---|---|---|
DatabaseConfig | 主数据库 | DB_TYPE(PostgreSQL/MySQL)、SQLALCHEMY_POOL_SIZE |
RedisConfig | 缓存/消息代理 | REDIS_HOST、REDIS_USE_SENTINEL、REDIS_USE_CLUSTERS |
StorageConfig | 文件存储 | STORAGE_TYPE(opendal、s3、azure-blob 等) |
VectorDatabaseConfig | 向量数据库 | VECTOR_STORE(weaviate、qdrant、milvus 等) |
来源:api/configs/feature/__init__.py:20-220、api/.env.example:45-105、docker/docker-compose.yaml:16-100
环境变量解析
Dify 在 Docker 部署中使用细粒度的环境策略,将变量拆分到特定领域的文件中(例如 security.env、redis.env)。
环境文件组成
在 docker/docker-compose.yaml:8-68 中,配置通过包含多个路径来组成。列表中的最后一个文件(./.env)优先级高于前面的文件:
x-shared-api-worker-config: &shared-api-worker-config
env_file:
- path: ./envs/core-services/shared.env
- path: ./envs/core-services/api.env
- path: ./envs/security.env
- path: ./envs/databases/db-postgres.env
- ./.env
中间件默认值
像 db_postgres 和 redis 这样的中间件服务使用环境变量来配置其内部行为,例如 POSTGRES_MAX_CONNECTIONS 或 REDIS_PASSWORD,这些变量从主机环境映射到容器中。
来源:docker/docker-compose.middleware.yaml:12-22、docker/docker-compose.middleware.yaml:89-94、docker/.env.example:71-113
类型安全与校验
Pydantic 使用专门的类型和装饰器提供运行时校验,防止无效配置到达运行时。
字段约束
Dify 利用 Pydantic 的约束类型来强制配置限制 api/configs/feature/__init__.py:5-14:
PositiveInt:用于超时和计数(例如CODE_MAX_NUMBER)。NonNegativeInt:用于计数(例如APP_DEFAULT_ACTIVE_REQUESTS)。HttpUrl:校验服务端点(例如CODE_EXECUTION_ENDPOINT)。
自定义校验逻辑
使用 @field_validator 实现载荷校验器,以强制领域特定的约束,例如确保提供的提供者字符串存在于支持的列表中 api/controllers/console/datasets/datasets.py:147-152:
@field_validator("provider")
@classmethod
def validate_provider(cls, value: str) -> str:
if value not in Dataset.PROVIDER_LIST:
raise ValueError("无效的提供者。")
return value
来源:api/configs/feature/__init__.py:108-191、api/controllers/console/datasets/datasets.py:142-152
存储与向量数据库配置
Dify 的配置系统支持存储和向量索引的模块化后端。
存储后端选择
STORAGE_TYPE 变量控制存储实现。系统默认使用 opendal api/.env.example:111。使用 opendal 时,OPENDAL_SCHEME(例如 fs、s3)决定具体的驱动程序 api/.env.example:114。
向量存储选择
VECTOR_STORE 设置决定向量数据库提供者 api/.env.example:205。此配置由 VectorFactory 用于实例化相应的提供者特定客户端。
| 设置 | 支持的值(部分列表) |
|---|---|
VECTOR_STORE | weaviate、qdrant、milvus、pgvector、chroma、elasticsearch |
STORAGE_TYPE | opendal、s3、azure-blob、aliyun-oss、google-storage |
来源:api/.env.example:108-115、api/.env.example:203-208、docker/.env.example:151-155
前端配置系统
Web 前端使用 Next.js 环境变量。面向浏览器的变量通常以 NEXT_PUBLIC_ 为前缀,以便打包到客户端代码中。
Web 配置加载
前端使用变量进行服务发现和功能开关。在 Docker 部署期间,这些变量通过服务定义中的 environment 块传递:
CONSOLE_API_URL:控制台的后端 API 端点docker/.env.example:15。APP_API_URL:Web 应用的后端 API 端点docker/.env.example:19。NEXT_PUBLIC_SOCKET_URL:用于实时更新的 WebSocket 端点docker/.env.example:24。
来源:web/package.json:27-32、docker/.env.example:14-24、web/Dockerfile:36-40