Dify:详解 docker-compose.yaml配置文件
详解 docker-compose.yaml
配置文件
docker-compose.yaml
是用于定义和运行多容器 Docker 应用的配置文件。下面,我们将详细解释您提供的 docker-compose.yaml
文件,包括各个服务的作用、配置,以及它们与 .env
文件之间的关系。
文件概览
- 自动生成:此配置文件是通过
generate_docker_compose
自动生成的,建议不要直接修改它,而是修改.env.example
或docker-compose-template.yaml
,然后重新生成。 - 环境变量:文件中大量使用了环境变量,这些变量通常在
.env
文件中定义。 - 服务定义:包含了多个服务,包括应用程序、数据库、缓存、向量数据库等。
共享环境变量
x-shared-env: &shared-api-worker-envVARIABLE_NAME: ${VARIABLE_NAME:-默认值}
- 用途:使用 YAML 的锚点和引用机制,定义了一组共享的环境变量,供多个服务使用。
- 示例:
DB_USERNAME: ${DB_USERNAME:-postgres}
- 意味着如果环境变量
DB_USERNAME
未设置,则使用默认值postgres
。
环境变量的使用
- 引用方式:
${VARIABLE_NAME:-默认值}
- 如果环境变量存在,则使用其值;
- 如果不存在,则使用提供的默认值。
- 来源:这些环境变量通常在
.env
文件中定义,当运行docker-compose up
时,Docker Compose 会自动加载.env
文件。 - 注意:一些敏感信息(如密码、密钥)在示例中有默认值,实际使用时应在
.env
文件中更改为安全的值。
服务定义
1. API 服务
services:api:image: langgenius/dify-api:1.4.0restart: alwaysenvironment:<<: *shared-api-worker-envMODE: api# 其他特定于 API 服务的环境变量depends_on:db:condition: service_healthyredis:condition: service_startedvolumes:- ./volumes/app/storage:/app/api/storagenetworks:- ssrf_proxy_network- default
- 作用:运行后端 API 服务,提供应用的核心功能。
- 环境变量:
- 使用了共享环境变量
*shared-api-worker-env
。 MODE: api
:指定运行模式为 API 服务。
- 使用了共享环境变量
- 依赖:
db
(数据库服务)必须健康启动。redis
(缓存)必须已启动。
- 卷映射:
- 将主机的
./volumes/app/storage
目录挂载到容器内的/app/api/storage
,用于存储用户文件。
- 将主机的
- 网络:
- 连接到
ssrf_proxy_network
和默认网络。
- 连接到
2. Worker 服务
worker:image: langgenius/dify-api:1.4.0restart: alwaysenvironment:<<: *shared-api-worker-envMODE: worker# 其他特定于 Worker 服务的环境变量depends_on:db:condition: service_healthyredis:condition: service_startedvolumes:- ./volumes/app/storage:/app/api/storagenetworks:- ssrf_proxy_network- default
- 作用:运行 Celery Worker,处理异步任务和消息队列。
- 环境变量:
- 使用共享环境变量。
MODE: worker
:指定运行模式为 Worker。
- 其他配置:与 API 服务类似。
3. Web 前端服务
web:image: langgenius/dify-web:1.4.0restart: alwaysenvironment:CONSOLE_API_URL: ${CONSOLE_API_URL:-}APP_API_URL: ${APP_API_URL:-}# 其他前端环境变量
- 作用:运行前端 Web 应用,提供用户界面。
- 环境变量:
- 配置前端应用所需的各类 URL 和设置。
- 注意:没有指定卷或网络,默认使用。
4. 数据库服务(PostgreSQL)
db:image: postgres:15-alpinerestart: alwaysenvironment:PGUSER: ${PGUSER:-postgres}POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-your_password_here}POSTGRES_DB: ${POSTGRES_DB:-dify}PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata}command: >postgres -c 'max_connections=${POSTGRES_MAX_CONNECTIONS:-100}'-c 'shared_buffers=${POSTGRES_SHARED_BUFFERS:-128MB}'# 其他 PostgreSQL 配置volumes:- ./volumes/db/data:/var/lib/postgresql/datahealthcheck:test: [ 'CMD', 'pg_isready', '-h', 'db', '-U', '${PGUSER:-postgres}', '-d', '${POSTGRES_DB:-dify}' ]interval: 1stimeout: 3sretries: 60
- 作用:运行 PostgreSQL 数据库,为应用提供数据存储。
- 环境变量:
POSTGRES_PASSWORD
:数据库密码,应在.env
文件中设置为安全的值。POSTGRES_DB
:数据库名称,默认为dify
。
- 命令:以自定义参数启动 PostgreSQL,配置最大连接数、共享缓冲区大小等。
- 卷映射:将主机的
./volumes/db/data
目录挂载到容器内的/var/lib/postgresql/data
。
5. Redis 缓存
redis:image: redis:6-alpinerestart: alwaysenvironment:REDISCLI_AUTH: ${REDIS_PASSWORD:-your_redis_password}volumes:- ./volumes/redis/data:/datacommand: redis-server --requirepass ${REDIS_PASSWORD:-your_redis_password}healthcheck:test: [ 'CMD', 'redis-cli', 'ping' ]
- 作用:运行 Redis,提供缓存和消息队列功能。
- 环境变量:
REDIS_PASSWORD
:Redis 密码,应在.env
文件中设置。
- 命令:启动 Redis 服务,并设置密码。
- 卷映射:将数据目录挂载到主机。
6. Sandbox 服务
sandbox:image: langgenius/dify-sandbox:0.2.12restart: alwaysenvironment:API_KEY: ${SANDBOX_API_KEY:-your_sandbox_api_key}# 其他 Sandbox 配置volumes:- ./volumes/sandbox/dependencies:/dependencies- ./volumes/sandbox/conf:/confnetworks:- ssrf_proxy_network
- 作用:Dify Sandbox,提供安全的代码执行环境。
- 环境变量:
API_KEY
:Sandbox 服务的 API 密钥,应设置为强密钥。
- 网络:
- 连接到
ssrf_proxy_network
,限制外部访问,增强安全性。
- 连接到
7. 插件守护进程(Plugin Daemon)
plugin_daemon:image: langgenius/dify-plugin-daemon:0.0.10-localrestart: alwaysenvironment:DB_DATABASE: ${DB_PLUGIN_DATABASE:-dify_plugin}SERVER_PORT: ${PLUGIN_DAEMON_PORT:-5002}# 其他插件守护进程配置ports:- "${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003}:${PLUGIN_DEBUGGING_PORT:-5003}"volumes:- ./volumes/plugin_daemon:/app/storagedepends_on:db:condition: service_healthy
- 作用:提供插件管理和运行的后台服务。
- 环境变量:
- 配置数据库、端口、密钥等。
- 卷映射:挂载存储目录。
- 端口映射:将主机和容器的调试端口进行映射。
8. SSRF 代理服务器
ssrf_proxy:image: ubuntu/squid:latestrestart: alwaysvolumes:- ./ssrf_proxy/squid.conf.template:/etc/squid/squid.conf.template- ./ssrf_proxy/docker-entrypoint.sh:/docker-entrypoint-mount.shentrypoint: [ 'sh', '-c', "..." ]environment:HTTP_PORT: ${SSRF_HTTP_PORT:-3128}# 其他 SSRF 代理配置networks:- ssrf_proxy_network- default
- 作用:防止服务器端请求伪造(SSRF)攻击,保护内部服务。
- 配置:
- 使用 Squid 代理,限制网络访问。
- 网络:
- 使用内部网络
ssrf_proxy_network
,隔离服务。
- 使用内部网络
9. Nginx 反向代理
nginx:image: nginx:latestrestart: alwaysvolumes:- ./nginx/nginx.conf.template:/etc/nginx/nginx.conf.template# 其他配置文件和目录entrypoint: [ 'sh', '-c', "..." ]environment:NGINX_SERVER_NAME: ${NGINX_SERVER_NAME:-_}NGINX_HTTPS_ENABLED: ${NGINX_HTTPS_ENABLED:-false}# 其他 Nginx 配置depends_on:- api- webports:- '${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}'- '${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}'
- 作用:作为反向代理,转发请求到 API 和 Web 服务。
- 环境变量:
- 配置服务器名称、SSL 设置、端口等。
- 卷映射:
- 挂载配置模板和 SSL 证书目录。
- 端口映射:
- 将主机的 80 和 443 端口映射到容器内的 Nginx 端口。
向量数据库服务
Weaviate 向量数据库
weaviate:image: semitechnologies/weaviate:1.19.0profiles:- ''- weaviaterestart: alwaysvolumes:- ./volumes/weaviate:/var/lib/weaviateenvironment:PERSISTENCE_DATA_PATH: ${WEAVIATE_PERSISTENCE_DATA_PATH:-/var/lib/weaviate}# 其他 Weaviate 配置
- 作用:提供 Weaviate 向量数据库服务,用于存储和检索向量数据。
- 环境变量:
- 配置数据路径、认证方式等。
- 卷映射:
- 挂载数据目录。
Qdrant 向量数据库
qdrant:image: langgenius/qdrant:v1.7.3profiles:- qdrantrestart: alwaysvolumes:- ./volumes/qdrant:/qdrant/storageenvironment:QDRANT_API_KEY: ${QDRANT_API_KEY:-your_qdrant_api_key}
- 作用:提供 Qdrant 向量数据库服务。
- 环境变量:
QDRANT_API_KEY
:Qdrant 的 API 密钥。
- 卷映射:
- 挂载存储目录。
其他向量数据库
- pgvector:基于 PostgreSQL 的向量数据库扩展。
- Chroma:用于处理向量数据的数据库。
- Milvus:高性能的向量数据库。
- OpenSearch:分布式搜索和分析引擎,可用于向量搜索。
网络和卷定义
网络
networks:ssrf_proxy_network:driver: bridgeinternal: truemilvus:driver: bridgeopensearch-net:driver: bridgeinternal: true
- 说明:
- 定义了多个网络,用于隔离和连接不同的服务。
internal: true
表示该网络无法从外部访问,增强安全性。
卷
volumes:oradata:dify_es01_data:
- 说明:
- 定义了命名卷,用于持久化数据。
- 例如,
oradata
用于 Oracle 数据库的数据存储。
与 .env
文件的关系
- 环境变量加载:
docker-compose.yaml
中的环境变量通过引用${VARIABLE_NAME:-默认值}
,从.env
文件中获取值。 - 敏感信息配置:如数据库密码、API 密钥等,应在
.env
文件中设置,且不要将.env
文件提交到版本控制系统。 - 配置灵活性:通过修改
.env
文件,可以方便地更改配置,而无需直接修改docker-compose.yaml
。
安全注意事项
- 修改默认密码:示例中的密码(如
POSTGRES_PASSWORD
、REDIS_PASSWORD
)仅供测试,实际部署时应更改为强密码。 - API 密钥:所有涉及密钥的环境变量(如
SECRET_KEY
、SANDBOX_API_KEY
)应设置为安全的随机值。 - SSL 证书:如果启用了 HTTPS,应将 SSL 证书放在指定的目录,并正确配置相关环境变量。
总结
此 docker-compose.yaml
文件定义了一个复杂的多容器应用环境,包括应用程序后端、前端、数据库、缓存、向量数据库、插件系统等。通过使用环境变量和共享配置,可以方便地管理各个服务的配置。
在部署和运行此应用时,请注意:
- 配置
.env
文件:根据实际情况修改.env
文件中的变量值,特别是敏感信息。 - 启动服务:使用
docker compose up -d
启动所有服务。 - 检查服务状态:可以使用
docker compose ps
查看所有服务的运行状态。
提示:由于配置文件涉及大量内容,以上解释涵盖了主要服务和配置项,如需更详细的说明,请根据特定服务查阅相关官方文档。例如,Weaviate、Qdrant、Milvus 等向量数据库的详细配置和使用方法,应参考其官方指南。
docker compose up -d
以下是根据你提供的 docker compose up -d 命令输出:
一、镜像拉取信息
服务(Service) | 操作(Action) | 耗时(Duration) |
---|---|---|
web | Pulled | 21.6s |
weaviate | Pulled | 114.4s |
db | Pulled | 38.6s |
ssrf_proxy | Pulled | 32.4s |
api | Pulled | 173.6s |
worker | Pulled | 173.6s |
sandbox | Pulled | 58.2s |
nginx | Pulled | 37.5s |
plugin_daemon | Pulled | 162.9s |
redis | Pulled | 51.2s |
二、网络创建信息
网络名称(Network) | 操作(Action) | 耗时(Duration) |
---|---|---|
docker_ssrf_proxy_network | Created | 0.1s |
docker_default | Created | 0.1s |
三、容器启动信息
容器名称(Container) | 状态(Status) | 耗时(Duration) |
---|---|---|
docker-web-1 | Started | 1.9s |
docker-sandbox-1 | Started | 1.9s |
docker-ssrf_proxy-1 | Started | 2.2s |
docker-redis-1 | Started | 2.1s |
docker-db-1 | Healthy | 5.5s |
docker-weaviate-1 | Started | 1.8s |
docker-plugin_daemon-1 | Started | 5.1s |
docker-worker-1 | Started | 5.3s |
docker-api-1 | Started | 5.4s |
docker-nginx-1 | Started | 6.1s |
四、详细说明
-
镜像拉取(Pull):在执行
docker compose up -d
命令时,Docker 会根据docker-compose.yml
文件中定义的服务,从 Docker Hub 或私有镜像仓库中拉取所需的镜像。上表列出了每个服务对应的镜像拉取耗时。 -
网络创建(Network Create):Docker Compose 会为应用程序创建默认的网络环境,以便各个容器之间能够相互通信。这里创建了两个网络:
docker_ssrf_proxy_network
docker_default
-
容器启动(Container Start):拉取镜像并创建网络后,Docker Compose 会根据配置启动容器。上表列出了各个容器的启动状态和耗时。
- 状态为 Started 表示容器已成功启动。
- 状态为 Healthy 表示容器已启动并通过了健康检查。
五、注意事项
- 依赖关系:某些服务可能依赖于其他服务,例如数据库服务可能需要先于应用程序服务启动。
- 健康检查:
docker-db-1
容器的状态为 Healthy,表示该容器包含健康检查配置,Docker 在确认其健康状态后才标记为 Healthy。 - 启动顺序:容器的启动顺序可能会影响服务的可用性,确保关键服务已成功启动并处于健康状态。