2026年3月更新 8个服务详解

Dify Docker Compose配置指南

关于Dify Docker架构的所有知识——从每个容器的功能到使用自定义配置加固您的生产部署。

Dify的Docker架构

Dify的docker-compose.yaml启动八个服务。了解每个服务的作用有助于您配置、排查故障和扩展部署。

nginx 反向代理/Web服务器

将传入的HTTP请求路由到正确的内部服务(Web UI或API)。这是唯一需要公开访问的容器。

~50 MB
api Dify API服务器

主要的Python/Flask后端。处理所有业务逻辑、LLM调用、RAG管道执行和REST API端点。

~300 MB
worker Celery后台工作进程

处理异步任务:文档索引、数据集导入、长时间运行的LLM链。与API容器共享代码。

~300 MB
web Next.js前端

作为Next.js应用提供的基于React的用户界面。与API容器通信。

~150 MB
db PostgreSQL数据库

存储所有持久数据:应用、对话、数据集元数据、用户和API密钥。

~100 MB
redis 缓存和消息代理

缓存频繁查询,为工作进程存储Celery任务队列,处理速率限制数据。

~30 MB
weaviate 向量数据库

存储RAG知识库的文档嵌入。最大的内存消耗者。可以用pgvector或Qdrant替换。

~500 MB
sandbox 代码执行沙箱

用于在Dify工作流中执行用户定义代码节点的隔离容器。以受限权限运行。

~100 MB

总基础内存:仅容器空闲时约需1.5GB。在4GB服务器上,这为操作系统和实际工作负载留下约2.5GB。生产环境建议使用8GB内存。

环境变量指南

Dify的所有配置都存储在dify/docker/.env中。从.env.example复制并自定义这些关键设置:

安全性(必须)

# 生成命令:openssl rand -base64 42
SECRET_KEY=your-very-long-random-secret-key

# 存储敏感数据的加密密钥
# 生成命令:openssl rand -hex 16
ENCRYPT_IV=your-16-char-hex-value

数据库配置

# PostgreSQL配置(Docker内部网络)
DB_USERNAME=postgres
DB_PASSWORD=change-this-strong-password
DB_HOST=db
DB_PORT=5432
DB_DATABASE=dify

# Redis配置
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=change-this-redis-password
REDIS_DB=0

URL和CORS配置

# 您的域名(末尾不加斜杠)
CONSOLE_URL=https://your-domain.com
APP_URL=https://your-domain.com
SERVICE_API_URL=https://your-domain.com

# CORS来源(逗号分隔)
CONSOLE_CORS_ALLOW_ORIGINS=https://your-domain.com
WEB_API_CORS_ALLOW_ORIGINS=https://your-domain.com

LLM API密钥(配置时可选)

# 也可以在Dify Web UI中配置
# 这些.env设置在首次启动时预配置提供商

OPENAI_API_KEY=sk-your-openai-key
ANTHROPIC_API_KEY=sk-ant-your-key
GOOGLE_API_KEY=your-gemini-key

# 对于Ollama(本地LLMs)
# 在UI中配置:设置 → 模型提供商 → Ollama

自定义配置

自定义端口映射

如果80端口被占用,通过编辑.env更改Dify的Nginx绑定的主机端口:

# 更改Nginx容器的主机端口
EXPOSE_NGINX_PORT=8080
EXPOSE_NGINX_SSL_PORT=8443

禁用Weaviate(改用pgvector)

Weaviate使用约500MB内存。在内存受限的服务器上,切换到pgvector(已在PostgreSQL容器中可用):

# 在.env中——将向量存储更改为pgvector
VECTOR_STORE=pgvector

# 然后不带Weaviate重启
docker compose up -d --scale weaviate=0

启用GPU支持

要传递NVIDIA GPU(用于本地嵌入模型),将GPU运行时添加到您的docker-compose.override.yaml

services:
  api:
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

请查阅GPU托管指南获取完整配置说明。

常用命令

启动所有服务 docker compose up -d
停止所有服务 docker compose down
重启单个服务 docker compose restart api
查看日志(跟踪) docker compose logs -f api worker
进入API容器Shell docker compose exec api bash
检查容器状态 docker compose ps
按容器查看资源使用 docker stats
删除已停止的容器 docker compose down --remove-orphans
下载最新镜像 docker compose pull
重新构建服务 docker compose up -d --build api

故障排查

容器持续重启

检查日志:docker compose logs api。通常由SECRET_KEY格式不正确或缺少必需的环境变量引起。确保SECRET_KEY至少有32个字符。

内存不足——容器被OOM killer杀死

添加交换空间和/或升级到更大的服务器。运行dmesg | grep -i "killed process"确认OOM故障。Weaviate容器通常是罪魁祸首——考虑切换到pgvector。

Web容器无法连接到API

检查.env中的CONSOLE_URLAPP_URL变量是否与您的实际域名匹配。CORS错误几乎总是由URL配置不正确引起的。

常见错误及避免方法

错误一:未正确设置环境变量

许多用户在配置 .env 文件时,遗漏了必要的环境变量,导致服务无法启动。例如,未设置 DB_PASSWORD 会导致数据库连接失败。

解决方法:确保所有必需的环境变量都已正确设置。使用 cat dify/docker/.env 检查配置。

错误二:未开放必要的端口

如果未在 docker-compose.yaml 中开放所需端口,可能会导致无法访问服务。比如,未开放 8080 端口,访问 Nginx 时会出现连接拒绝。

解决方法:检查并确保在 docker-compose.yaml 中的 ports 部分正确映射了所需端口。

错误三:未考虑容器间网络问题

如果服务间通信未正确配置,可能会导致服务无法相互访问。例如,Redis 服务无法被 API 服务访问。

解决方法:确保所有服务都在同一网络中,使用 docker network ls 检查网络配置。

错误四:内存不足

在资源受限的环境中,容器可能因内存不足而崩溃。例如,使用 4GB 内存的服务器运行 Dify 时,可能会遇到 OOM(内存溢出)错误。

解决方法:增加服务器内存,或优化容器配置,减少内存占用。

高级配置

配置连接池

通过配置数据库连接池,可以提高数据库访问的效率。以下是 PostgreSQL 的连接池配置示例:


DB_POOL_SIZE=10
DB_MAX_OVERFLOW=5
        

启用日志记录

启用详细日志记录可以帮助排查问题。可以在 docker-compose.yaml 中设置日志级别:


logging:
  driver: "json-file"
  options:
    max-size: "10m"
    max-file: "3"
        

使用健康检查

添加健康检查可以确保服务在故障时自动重启。以下是 Nginx 的健康检查配置:


healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8080"]
  interval: 30s
  timeout: 10s
  retries: 3