服务拓扑与 Docker Compose 栈
服务拓扑与 Docker Compose 堆栈
相关源文件
本章引用的主要源码文件:
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
本文档描述了基于 Docker Compose 的 Dify 服务编排,包括完整的服务拓扑、容器依赖关系、网络配置和卷管理。它涵盖了 Docker Compose 堆栈中定义的运行时服务架构。
有关 Docker 构建过程和多阶段镜像的信息,请参阅 3.1 Docker 构建过程与多阶段镜像。有关环境配置和运行时模式的详细信息,请参阅 3.2 环境配置与运行时模式。
服务拓扑总览
Dify 平台以多容器 Docker Compose 堆栈形式部署,包含三类服务:核心应用服务、基础设施服务和可选向量数据库服务。所有服务通过单个 docker-compose.yaml 文件进行编排,并根据配置文件选择数据库 docker/docker-compose.yaml:1-5。
拓扑图:代码实体关联
下图将高级服务名称与仓库中定义的特定代码入口点和配置模式关联起来。
来源: docker/docker-compose.yaml:206-250、docker/docker-compose-template.yaml:200-240、docker/docker-compose.middleware.yaml:1-131、api/Dockerfile:114-123
Docker Compose 结构
使用 YAML 锚点共享环境变量
Docker Compose 文件使用 YAML 锚点在多个服务之间共享环境配置。Dify 定义了三个主要共享锚点,用于从 docker/envs/ 目录下的特定 .env 文件中注入配置 docker/docker-compose.yaml:8-205。
| 锚点名称 | 目标服务 | 包含的环境文件 |
|---|---|---|
x-shared-api-worker-config | api | shared.env、api.env、security.env、数据库/Redis/向量存储环境变量 docker/docker-compose.yaml:8-72 |
x-shared-worker-config | worker | shared.env、worker.env、security.env、数据库/Redis/向量存储环境变量 docker/docker-compose.yaml:74-138 |
x-shared-worker-beat-config | worker_beat | shared.env、worker-beat.env、security.env、数据库/Redis/向量存储环境变量 docker/docker-compose.yaml:140-204 |
来源: docker/docker-compose.yaml:8-205、docker/docker-compose-template.yaml:2-198
核心应用服务
后端服务(相同镜像,不同模式)
所有后端服务使用相同的 langgenius/dify-api 镜像,但根据传递给入口点的 MODE 环境变量执行不同的角色 api/Dockerfile:123。
| 服务 | 镜像 | MODE | 描述 |
|---|---|---|---|
api | langgenius/dify-api:1.14.2 | api | 处理 REST API 请求的 Flask/Gunicorn 服务器 docker/docker-compose-template.yaml:226 |
worker | langgenius/dify-api:1.14.2 | worker | 用于异步任务(索引、工作流执行)的 Celery 工作进程 docker/docker-compose-template.yaml:273 |
worker_beat | langgenius/dify-api:1.14.2 | beat | 用于周期性任务调度的 Celery Beat docker/docker-compose-template.yaml:318 |
api 服务绑定到端口 5001,并使用 gevent 作为工作进程类来处理并发请求 docker/.env.example:54-56。
前端服务
| 服务 | 镜像 | 端口 | 描述 |
|---|---|---|---|
web | langgenius/dify-web:1.14.2 | 3000 | 用于控制台和 WebApp 的 Next.js Web 应用程序 docker/docker-compose-template.yaml:350-352 |
来源: docker/docker-compose-template.yaml:221-380、api/Dockerfile:31-50、docker/.env.example:53-61
基础设施与执行服务
关系型数据库(基于配置文件选择)
Dify 通过 Docker Compose 配置文件支持 PostgreSQL(默认)或 MySQL docker/docker-compose.middleware.yaml:5-46。
- PostgreSQL:使用
postgres:15-alpine。它包含一个使用pg_isready的健康检查docker/docker-compose.middleware.yaml:3-41。 - MySQL:使用
mysql:8.0。仅在指定mysql配置文件时激活docker/docker-compose.middleware.yaml:43-80。
沙箱与插件守护进程
执行层为不受信任的代码提供隔离,并管理插件生态系统。
- 沙箱:
sandbox服务(langgenius/dify-sandbox:0.2.15)为工作流中的CodeNode提供隔离环境。它监听端口8194,并通过CodeExecutionSandboxConfig进行配置docker/docker-compose.middleware.yaml:105-128、api/configs/feature/__init__.py:103-116。 - 插件守护进程:
plugin_daemon服务(langgenius/dify-plugin-daemon:0.6.1-local)处理 Dify 插件的生命周期,并为插件通信提供内部 APIdocker/docker-compose.middleware.yaml:131-150。
来源: docker/docker-compose.middleware.yaml:1-182、api/configs/feature/__init__.py:103-191
网络架构
Dify 使用两个 Docker 网络实现严格的网络隔离,以防止 SSRF 并隔离内部流量 docker/docker-compose-template.yaml:63-65。
default:用于所有内部服务间通信docker/docker-compose-template.yaml:65。ssrf_proxy_network:用于需要出站互联网访问的服务。流量通过ssrf_proxy(Squid)路由,以过滤和监控请求docker/docker-compose-template.yaml:64、docker/docker-compose.middleware.yaml:127-128。
来源: docker/docker-compose-template.yaml:63-71、docker/docker-compose.middleware.yaml:105-128、docker/.env.example:190-195
卷管理与数据持久化
该堆栈使用持久卷来确保数据在容器重启后得以保留。
| 主机路径 | 容器路径 | 服务 | 用途 |
|---|---|---|---|
./volumes/app/storage | /app/api/storage | api、worker | 用户上传、文档和插件数据 docker/docker-compose-template.yaml:254 |
./volumes/db/data | /var/lib/postgresql/data | db_postgres | 数据库存储 docker/docker-compose.middleware.yaml:24 |
./volumes/redis/data | /data | redis | Redis 持久化 docker/docker-compose.middleware.yaml:92 |
./volumes/sandbox/dependencies | /dependencies | sandbox | 代码执行的缓存依赖 docker/docker-compose.middleware.yaml:123 |
初始化:一个 init_permissions 容器(使用 busybox)在其他服务之前运行,以确保 dify 用户(UID 1001)对共享存储卷具有正确的所有权 docker/docker-compose-template.yaml:202-218、api/Dockerfile:54-60。
来源: docker/docker-compose-template.yaml:201-219、docker/docker-compose.middleware.yaml:23-124、api/Dockerfile:53-60