Docker Compose 部署 Dify 1.7.1:从崩溃到稳定运行的实战指南

摘要
本文基于真实生产环境实践,详细记录了在 45GB 内存的裸金属服务器上,使用 Docker Compose 部署开源 LLMOps 平台 Dify 1.7.1 的全过程。重点分析了因 Gunicorn Worker 被 SIGKILL 导致的服务崩溃问题,通过深入排查最终定位并解决。文章包含完整的架构图、排障流程图、Python 监控脚本、甘特图、思维导图及常见问题 FAQ,可作为国内 AI 应用开发者的参考手册。


目录

  1. 背景与目标
  2. 部署架构
  3. 环境准备
  4. 首次部署
  5. 故障现象
  6. 根因分析
  7. 解决方案
  8. 验证与监控
  9. 最佳实践
  10. 常见问题 FAQ
  11. 总结与展望
  12. 参考资料

1 背景与目标 {#背景与目标}

随着大模型技术的发展,越来越多的企业开始构建自己的 AI 应用平台。Dify 作为一个开源的 LLMOps 平台,为开发者提供了快速搭建 AI 应用的能力。

项目信息

项目说明
业务场景企业内部知识库问答 + 低代码 Agent
版本Dify 1.7.1
部署方式Docker Compose
宿主机Ubuntu 22.04 / 45 GB RAM
目标单节点高可用,支持 100 并发

知识脉络思维导图

在这里插入图片描述

mindmap
  root((Dify部署))
    架构
      容器图
      网络图
    故障
      现象
      定位
      解决
    监控
      脚本
      告警
    扩展
      高可用
      多租户

2 部署架构 {#部署架构}

Dify 的核心组件包括 API 服务、Worker 服务、数据库、缓存、向量数据库等。通过 Docker Compose 进行编排,形成一个完整的 AI 应用平台。

系统组件关系图

Core Services
Nginx
Client
PostgreSQL
api:5001
Redis:6379
Weaviate:8080
Sandbox:8194
worker
plugin_daemon:5002
反向代理
80/443
浏览器 / 小程序

3 环境准备 {#环境准备}

在开始部署之前,需要准备好基础环境。以下是在 Ubuntu 22.04 上的安装示例:

软件版本要求

软件版本安装命令示例
Docker26apt install docker.io
Composev2curl -SL .../docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
Git2.34apt install git

部署计划甘特图

2024-08-01 2024-08-01 2024-08-01 2024-08-01 2024-08-01 2024-08-01 2024-08-01 2024-08-01 2024-08-02 2024-08-02 安装Docker 安装Compose Clone代码 配置.env docker-compose up 观察日志 调整Worker 压测验证 环境 部署 排障 Dify 部署计划

4 首次部署 {#首次部署}

按照官方文档进行首次部署,通常可以快速启动服务。

克隆官方仓库

git clone https://github.com/langgenius/dify.git
cd dify/docker

一键启动

cp .env.example .env
docker compose -p dify up -d

访问验证

http://<宿主机IP>

首次访问会引导初始化管理员账号。


5 故障现象 {#故障现象}

在高并发场景下,服务出现异常崩溃。查看日志发现以下关键信息:

时间日志内容
08-02 08:27Worker (pid:34) was sent SIGKILL! Perhaps out of memory?

故障触发链路流程图

高并发
Worker激增
内存飙升
内核/容器Kill

6 根因分析 {#根因分析}

虽然系统有 45GB 内存,但通过排查发现以下问题:

排查项结果
free -h45 GB 充足
`dmesggrep killed`
docker stats-- / -- 无限制
.env 默认配置SERVER_WORKER_AMOUNT=1未显式设置 GUNICORN_WORKERS

默认计算公式

# entrypoint.sh 片段
workers = multiprocessing.cpu_count() * 2 + 1
# 8核 -> 17 workers,占用内存 ≈ 17 * 200MB ≈ 3.4GB

问题在于 Dify 默认根据 CPU 核心数计算 Worker 数量,但在高并发场景下,过多的 Worker 会消耗大量内存,导致系统 Kill 进程。


7 解决方案 {#解决方案}

通过显式限制 Worker 数量来解决内存过载问题。

1. 显式限制 Worker

.env 末尾追加:

GUNICORN_WORKERS=2

2. 平滑重启

docker compose -p dify restart api

3. 验证

docker compose -p dify logs --since 10m api | grep -i error
# 无输出即成功

8 验证与监控 {#验证与监控}

为了确保服务稳定运行,需要建立监控机制。

Python 监控脚本(含中文注释)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
dify_monitor.py
每 30 秒采样一次容器内存,超过 80% 即告警
"""
import docker
import time
import psutil

client = docker.from_env()
THRESHOLD = 0.8  # 80%

while True:
    for c in client.containers.list():
        stats = c.stats(stream=False)
        mem_usage = stats["memory_stats"]["usage"]
        mem_limit = stats["memory_stats"]["limit"]
        if mem_limit == 0:
            continue
        ratio = mem_usage / mem_limit
        if ratio > THRESHOLD:
            print(f"[告警] {c.name} 内存使用率 {ratio:.2%}")
    time.sleep(30)

运行监控脚本:

pip install docker psutil
python3 dify_monitor.py

9 最佳实践 {#最佳实践}

根据实际运行经验,总结以下最佳实践配置:

实践推荐值备注
GUNICORN_WORKERS2~4根据并发调整
GUNICORN_TIMEOUT360s支持长 SSE
CELERY_WORKER_AMOUNT1~2任务队列
日志级别INFO排查够用
备份每日 pg_dumpcron 定时

内存占用分布饼图

60% 20% 15% 5% 内存占用对比 API Worker PostgreSQL Weaviate Others

10 常见问题 FAQ {#常见问题}

问题回答
如何升级 Dify?git pull && docker compose pull && docker compose up -d
如何接入 Ollama?.env 中设置 OLLAMA_API_BASE=http://ollama:11434
如何开启 HTTPS?./nginx/ssl 放证书,.envNGINX_HTTPS_ENABLED=true
如何限制文件大小?UPLOAD_FILE_SIZE_LIMIT=50(单位 MB)

11 总结与展望 {#总结与展望}

通过本次实践,我们成功解决了 Dify 在高并发场景下的内存崩溃问题,并建立了完整的监控体系。

关键成果

  • ✅ 通过显式限制 Gunicorn Worker解决 SIGKILL
  • ✅ 提供完整监控脚本甘特图便于落地
  • ⏳ 下一步:
    • 多节点 Swarm 部署
    • 接入 K8s HPA
    • 引入 Prometheus + Grafana

12 参考资料 {#参考资料}

  1. Dify 官方文档
  2. Gunicorn 设计文档
  3. Docker Compose 资源限制
  4. NumPy 并发线程说明
### 如何使用 Docker Compose 部署 Dify 项目 在 Ubuntu 22.04 或其他支持 Docker 的操作系统上,可以使用 Docker Compose部署 Dify 项目。以下是详细的说明: #### 环境准备 确保系统中已正确安装 DockerDocker Compose,并且版本兼容。可以通过以下命令检查版本: ```bash docker -v docker compose version ``` 如果使用的是 Docker Compose V1,则需要通过 `docker-compose` 命令进行操作;如果是 Docker Compose V2(推荐),则可以直接使用 `docker compose`[^2]。 #### 下载 Dify 代码仓库 进入 Dify 项目的根目录,该目录应包含 `docker-compose.yaml` 文件。如果没有下载代码仓库,可以通过以下命令克隆: ```bash git clone https://github.com/dify-ai/dify.git cd dify ``` #### 启动容器 根据 Docker Compose 的版本选择合适的命令启动服务: - 如果使用 Docker Compose V2(推荐): ```bash docker compose up -d ``` - 如果使用 Docker Compose V1: ```bash docker-compose up -d ``` 启动过程中,Docker 将自动拉取所需的镜像并初始化服务。首次启动可能需要几分钟时间来完成镜像下载和服务初始化[^3]。 #### 检查容器运行状态 启动完成后,可以使用以下命令检查所有容器是否正常运行: ```bash docker compose ps ``` 正常情况下,输出应显示以下服务正在运行:3 个业务服务(`api`、`worker`、`web`)和 6 个基础组件(`weaviate`、`db`、`redis`、`nginx`、`ssrf_proxy`、`sandbox`)[^4]。 #### 访问 Dify Web 界面 部署完成后,可以通过浏览器访问以下地址查看 Dify 的 Web 界面: ``` http://localhost ``` #### 停止服务 如需停止服务,可以使用以下命令: ```bash docker-compose down ``` #### 注意事项 - 确保 DockerDocker Compose 已正确安装。 - 确保所需端口未被占用。 - 首次启动时,可能需要较长时间来拉取镜像和初始化服务,请耐心等待。 --- ### 示例代码 以下是一个简单的脚本,用于自动化部署过程: ```bash #!/bin/bash # 检查 DockerDocker Compose 是否已安装 if ! command -v docker &> /dev/null; then echo "Docker is not installed." exit 1 fi if ! command -v docker-compose &> /dev/null; then echo "Docker Compose is not installed." exit 1 fi # 克隆 Dify 代码仓库 git clone https://github.com/dify-ai/dify.git cd dify # 启动服务 if docker compose version &> /dev/null; then docker compose up -d else docker-compose up -d fi # 检查容器状态 docker compose ps ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CarlowZJ

我的文章对你有用的话,可以支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值