环境配置与运行时模式
环境配置与运行时模式
相关源文件
本章引用的主要源码文件:
.devcontainer/Dockerfile.devcontainer/devcontainer.json.devcontainer/post_create_command.sh.devcontainer/post_start_command.sh.gitignore.vscode/launch.json.templateapi/Dockerfileapi/README.mdapi/docker/entrypoint.shapi/tasks/generate_summary_index_task.pyapi/tasks/regenerate_summary_index_task.pyapi/tasks/remove_document_from_index_task.pyapi/tests/unit_tests/tasks/test_summary_queue_isolation.pydev/start-webdev/start-workerweb/.env.exampleweb/Dockerfileweb/app/layout.tsxweb/config/index.tsweb/docker/entrypoint.shweb/types/feature.ts
本文档详细说明了 Dify 的 API 容器如何通过 entrypoint.sh 脚本和 MODE 环境变量在多种运行时模式下运行。单个 Docker 镜像(langgenius/dify-api)会根据运行时配置,作为 API 服务器、Celery Worker、调度器或迁移工具来提供服务。
核心概念
入口点脚本:api/docker/entrypoint.sh api/docker/entrypoint.sh:1-134 控制容器的启动过程,设置编码,运行数据库迁移,并根据 MODE 环境变量切换执行模式。
MODE 变量:决定服务的行为:
api:使用 Gunicorn HTTP 服务器运行 Flask 应用(默认模式)api/docker/entrypoint.sh:125-133。worker:运行 Celery Worker,处理跨专用队列的异步任务api/docker/entrypoint.sh:66-69。beat:运行 Celery Beat 调度器,用于执行周期性任务api/docker/entrypoint.sh:71-72。migration:通过 Flask-Migrate 执行数据库迁移,然后退出api/docker/entrypoint.sh:11-19。job:执行任意的 Flask CLI 命令(例如flask create-tenant)api/docker/entrypoint.sh:74-119。
配置管理:Dify 使用 uv 进行后端依赖管理和环境隔离 api/README.md:7-9。环境变量会被校验并加载到应用上下文中,Dockerfile 中提供了特定的默认值 api/Dockerfile:33-39。
环境变量管理
配置加载过程
Dify 使用多层配置系统。在本地开发环境中,使用 uv 管理后端依赖并运行服务器 api/README.md:34。在容器化环境中,变量从 .env 文件传递到操作系统环境。entrypoint.sh 脚本确保 Python 运行时使用标准的 UTF-8 编码 api/docker/entrypoint.sh:5-9。
配置流程图
下图展示了从环境变量到 Flask 和 Next.js 应用中代码实体的映射流程。
来源:api/docker/entrypoint.sh:1-10, api/Dockerfile:33-40, web/docker/entrypoint.sh:15-24, web/config/index.ts:9-35
环境变量分类
后端和前端配置按功能模块划分如下:
| 类别 | 关键变量 | 用途 |
|---|---|---|
| 服务器 | DIFY_BIND_ADDRESS, DIFY_PORT, SERVER_WORKER_AMOUNT | 调优 Gunicorn/Flask Web 服务器 api/docker/entrypoint.sh:122-128 |
| Worker | CELERY_WORKER_CLASS, CELERY_WORKER_AMOUNT, CELERY_QUEUES | 调优异步任务处理 api/docker/entrypoint.sh:31-63 |
| 前端 | CONSOLE_API_URL, APP_API_URL, NEXT_PUBLIC_SITE_ABOUT | 配置 Next.js 客户端端点 web/docker/entrypoint.sh:18-26 |
| 安全 | SECRET_KEY, COOKIE_DOMAIN | 会话安全与跨子域认证 api/README.md:61-65 |
运行时模式
入口点脚本决策逻辑
entrypoint.sh 脚本充当容器生命周期的首要路由器。
来源:api/docker/entrypoint.sh:1-134
API 模式(模式=api 或默认模式)
用途:在生产环境中使用 Gunicorn 提供 REST API 服务,在调试模式下则使用 Python 模块 app。
生产配置 api/docker/entrypoint.sh:126-132:
- 服务器:Gunicorn
- Worker 类:
SERVER_WORKER_CLASS(默认为geventwebsocket.gunicorn.workers.GeventWebSocketWorker)。 - 超时时间:
GUNICORN_TIMEOUT(默认为 200)。 - 绑定地址:通过
DIFY_BIND_ADDRESS和DIFY_PORT配置。
Worker 模式(模式=worker)
用途:执行异步后台任务,例如检索增强生成(RAG)索引和工作流执行。
队列管理: Worker 会根据 EDITION 和 CELERY_QUEUES 环境变量动态决定监听哪些队列 api/docker/entrypoint.sh:35-45:
- 云版本:包含专用队列,如
workflow_professional、workflow_team和workflow_sandboxapi/docker/entrypoint.sh:38。 - 社区版本(SELF_HOSTED):使用标准的
workflow队列api/docker/entrypoint.sh:41。 - Kubernetes 支持:
CELERY_WORKER_QUEUES可以覆盖默认值,以实现细粒度的扩缩容api/docker/entrypoint.sh:53-56。
自动扩缩容: 如果 CELERY_AUTO_SCALE 为 true,Worker 会使用 nproc 来确定最大进程数 api/docker/entrypoint.sh:24-32。
Beat 模式(模式=beat)
用途:触发周期性任务的调度器。 实现:使用 app.celery 实例运行 celery beat api/docker/entrypoint.sh:72。
Job 模式(模式=job)
用途:运行一次性管理任务或 Flask CLI 命令,例如 create-tenant 或 reset-password。 用法:传递给容器的参数会被转发给 flask 命令,容器会以该任务的退出码退出 api/docker/entrypoint.sh:104-118。
前端环境配置
Web 前端(Next.js)通过 web/docker/entrypoint.sh 处理配置,该脚本将环境变量映射到 Next.js 构建系统所需的 NEXT_PUBLIC_ 前缀变量 web/docker/entrypoint.sh:15-46。
功能开关与限制
web/config/index.ts 和 web/env.example 中的前端配置定义了各种系统限制和功能开关:
- 检索增强生成(RAG)限制:
NEXT_PUBLIC_TOP_K_MAX_VALUEweb/.env.example:57。 - 工作流限制:
NEXT_PUBLIC_LOOP_NODE_MAX_COUNT和NEXT_PUBLIC_MAX_PARALLEL_LIMITweb/.env.example:65-71。 - 认证功能:
enable_email_password_login、enable_social_oauth_loginweb/types/feature.ts:86-87。
模式执行技术总结
| 模式 | 入口点命令 | 主进程 | 关键配置来源 |
|---|---|---|---|
| api | gunicorn app:socketio_app | Gunicorn 主进程 | api/docker/entrypoint.sh |
| worker | celery worker | Celery Worker | api/docker/entrypoint.sh |
| beat | celery beat | Celery 调度器 | api/docker/entrypoint.sh |
| migration | flask upgrade-db | Flask CLI (Alembic) | api/docker/entrypoint.sh |
| job | flask <args> | Flask CLI | api/docker/entrypoint.sh |
来源:api/docker/entrypoint.sh:1-134, api/Dockerfile:123, web/docker/entrypoint.sh:48-52