单机极简版 Dify + Ollama 运维部署指南 (Docker Compose)


本指南专为 16GB 内存笔记本 / 单机实战环境 打造,对原版 Dify 开源架构进行了彻底精简与资源压榨,移除了企业级高并发组件(如 SSRF Proxy、Plugin Daemon、Sandbox、Elasticsearch/Vector 服务等),并使用轻量级 pgvector 结合单机 PostgreSQL 替代过重的专门向量数据库。

一、 架构拆解与资源裁减策略

组件分类

保留 / 替换方案

内存限制 (Limit)

裁减说明与优化目的

模型推理引擎

Ollama

CPU / 动态(4G-6G)

单机 CPU/GPU 推理引擎,支持量化模型(如 qwen2.5:7b-instruct-q4_K_M)。

关系与向量数据库

PostgreSQL + pgvector

1GB

合并关系库与向量库,替代单独部署 Milvus / Weaviate,节约 2G+ 内存。

缓存与队列

Redis (Alpine)

256MB

提供会话缓存与 Celery 异步任务 Broker。

API 与 Web 服务

Dify API & Web (合并/精简)

1.5GB (API) + 256MB (Web)

Dify 核心业务逻辑与前端界面,限制 Gunicorn worker 数量以减少内存开销。

异步任务处理器

Dify Worker

1GB

处理知识库文档分块、向量化索引构建等异步耗时任务。

反向代理与网关

Nginx (Alpine)

128MB

路由前端静态资源与后端 API 接口,配置流式代理 (SSE)。

资源优化总效果: 整体后台基础服务静态内存开销限制在 4GB ~ 4.5GB 左右,为 Ollama 加载 7B 量化模型留出足够(8GB+)的内存空间,彻底防止 OOM Panic。

二、 完整 `docker-compose.yml` 配置文件

创建本地工作目录,并保存以下内容为 docker-compose.yml:

version: '3.8'
x-logging-config: &default-logging
  driver: "json-file"
  options:
    max-size: "20m"
    max-file: "3"
networks:
  dify-network:
    driver: bridge
volumes:
  geand_db_data:
  redis_data:
  dify_storage:
  ollama_data:
services:
  # ---------------------------------------------------------------------------
  # 1. Ollama 本地推理服务
  # ---------------------------------------------------------------------------
  ollama:
    image: ollama/ollama:latest
    container_name: dify-ollama
    restart: unless-stopped
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama
    networks:
      - dify-network
    environment:
      - OLLAMA_KEEP_ALIVE=24h
      - OLLAMA_NUM_PARALLEL=2
    deploy:
      resources:
        limits:
          memory: 8192M
        reservations:
          memory: 2048M
    logging: *default-logging
# ---------------------------------------------------------------------------
  # 2. PostgreSQL 15 + pgvector (合并关系型与向量存储)
  # ---------------------------------------------------------------------------
  db:
    image: pgvector/pgvector:pg15
    container_name: dify-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${PG_USER:-postgres}
      POSTGRES_PASSWORD: ${PG_PASSWORD:-dify_secure_pass_2026}
      POSTGRES_DB: ${PG_DB:-dify}
      PGDATA: /var/lib/postgresql/data/pgdata
    volumes:
      - geand_db_data:/var/lib/postgresql/data
    networks:
      - dify-network
    deploy:
      resources:
        limits:
          memory: 1024M
        reservations:
          memory: 256M
    logging: *default-logging
# ---------------------------------------------------------------------------
  # 3. Redis (缓存与 Task Queue Broker)
  # ---------------------------------------------------------------------------
  redis:
    image: redis:7-alpine
    container_name: dify-redis
    restart: unless-stopped
    command: redis-server --save 60 1 --loglevel notice --requirepass ${REDIS_PASSWORD:-dify_redis_pass_2026}
    volumes:
      - redis_data:/data
    networks:
      - dify-network
    deploy:
      resources:
        limits:
          memory: 256M
    logging: *default-logging
# ---------------------------------------------------------------------------
  # 4. Dify API (后端核心服务)
  # ---------------------------------------------------------------------------
  api:
    image: langgenius/dify-api:0.15.3
    container_name: dify-api
    restart: unless-stopped
    environment:
      # 模式与基础配置
      MODE: api
      LOG_LEVEL: INFO
      SECRET_KEY: ${SECRET_KEY:-sk-dify-single-node-key-2026-secret}
      # 数据库连接 (pgvector)
      DB_USERNAME: ${PG_USER:-postgres}
      DB_PASSWORD: ${PG_PASSWORD:-dify_secure_pass_2026}
      DB_HOST: db
      DB_PORT: 5432
      DB_DATABASE: ${PG_DB:-dify}
      # 向量数据库驱动(指定 pgvector 替代外部数据库)
      VECTOR_STORE: pgvector
      PGVECTOR_HOST: db
      PGVECTOR_PORT: 5432
      PGVECTOR_USER: ${PG_USER:-postgres}
      PGVECTOR_PASSWORD: ${PG_PASSWORD:-dify_secure_pass_2026}
      PGVECTOR_DB: ${PG_DB:-dify}
      # Redis 连接
      REDIS_HOST: redis
      REDIS_PORT: 6379
      REDIS_PASSWORD: ${REDIS_PASSWORD:-dify_redis_pass_2026}
      REDIS_USE_SSL: 'false'
      # Celery 异步队列配置
      CELERY_BROKER_URL: redis://:${REDIS_PASSWORD:-dify_redis_pass_2026}@redis:6379/1
      # 存储配置(本地文件存储)
      STORAGE_TYPE: local
      STORAGE_LOCAL_PATH: /app/api/storage
      # 单机性能调优参数
      SERVER_WORKER_AMOUNT: 2
      SQLALCHEMY_POOL_SIZE: 10
      SQLALCHEMY_MAX_OVERFLOW: 5
    volumes:
      - dify_storage:/app/api/storage
    depends_on:
      - db
      - redis
    networks:
      - dify-network
    deploy:
      resources:
        limits:
          memory: 1536M
    logging: *default-logging
# ---------------------------------------------------------------------------
  # 5. Dify Worker (异步任务处理组件)
  # ---------------------------------------------------------------------------
  worker:
    image: langgenius/dify-api:0.15.3
    container_name: dify-worker
    restart: unless-stopped
    environment:
      MODE: worker
      LOG_LEVEL: INFO
      SECRET_KEY: ${SECRET_KEY:-sk-dify-single-node-key-2026-secret}
      DB_USERNAME: ${PG_USER:-postgres}
      DB_PASSWORD: ${PG_PASSWORD:-dify_secure_pass_2026}
      DB_HOST: db
      DB_PORT: 5432
      DB_DATABASE: ${PG_DB:-dify}
      VECTOR_STORE: pgvector
      PGVECTOR_HOST: db
      PGVECTOR_PORT: 5432
      PGVECTOR_USER: ${PG_USER:-postgres}
      PGVECTOR_PASSWORD: ${PG_PASSWORD:-dify_secure_pass_2026}
      PGVECTOR_DB: ${PG_DB:-dify}
      REDIS_HOST: redis
      REDIS_PORT: 6379
      REDIS_PASSWORD: ${REDIS_PASSWORD:-dify_redis_pass_2026}
      REDIS_USE_SSL: 'false'
      CELERY_BROKER_URL: redis://:${REDIS_PASSWORD:-dify_redis_pass_2026}@redis:6379/1
      STORAGE_TYPE: local
      STORAGE_LOCAL_PATH: /app/api/storage
      # 降低后台 Worker 并发数以节约 CPU/内存
      CELERY_WORKER_CONCURRENCY: 2
    volumes:
      - dify_storage:/app/api/storage
    depends_on:
      - db
      - redis
    networks:
      - dify-network
    deploy:
      resources:
        limits:
          memory: 1024M
    logging: *default-logging
# ---------------------------------------------------------------------------
  # 6. Dify Web (前端界面)
  # ---------------------------------------------------------------------------
  web:
    image: langgenius/dify-web:0.15.3
    container_name: dify-web
    restart: unless-stopped
    environment:
      CONSOLE_API_URL: ''
      APP_API_URL: ''
    networks:
      - dify-network
    deploy:
      resources:
        limits:
          memory: 256M
    logging: *default-logging
# ---------------------------------------------------------------------------
  # 7. Nginx (统一接入层与流式代理)
  # ---------------------------------------------------------------------------
  nginx:
    image: nginx:1.25-alpine
    container_name: dify-nginx
    restart: unless-stopped
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - web
      - api
    networks:
      - dify-network
    deploy:
      resources:
        limits:
          memory: 128M
    logging: *default-logging

三、 配套 Nginx 配置文件 (`./nginx/nginx.conf`)

在同级目录下创建 nginx 文件夹,并写入 nginx.conf 文件:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
    worker_connections 1024;
}
http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
    sendfile on;
    keepalive_timeout 65;
server {
        listen 80;
        server_name localhost;
client_max_body_size 50M;
# 前端 UI
        location / {
            proxy_pass http://web:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
# Dify 后端 API 与控制台
        location ~ ^/(console/api|api|v1) {
            proxy_pass http://api:5001;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
# 核心参数:关闭响应缓冲,确保流式输出 (SSE) 实时打字效果
            proxy_buffering off;
            proxy_cache off;
            proxy_read_timeout 3600s;
            proxy_send_timeout 3600s;
# Chunked encoding 支持
            chunked_transfer_encoding on;
        }
    }
}

四、 环境变量与配置调优说明

环境变量 / 参数

推荐设定值

关键功能与优化原理

VECTOR_STORE

pgvector

告诉 Dify 直接使用 PostgreSQL 作为向量数据库,取消对 External Vector DB (Milvus/Weaviate) 的依赖。

SERVER_WORKER_AMOUNT

2

控制 API 服务的 Gunicorn 进程数。默认高并发配置会开 4-8 个 worker,在笔记本环境下 2 个 worker 足够且节省内存。

CELERY_WORKER_CONCURRENCY

2

控制后台并发处理解析文档的进程数,避免上传文档时 CPU 瞬间被挤爆导致其它服务卡死。

OLLAMA_KEEP_ALIVE

24h

维持 Ollama 显存/内存中模型的常驻时间,避免频繁卸载和重新加载模型带来的耗时卡顿。

OLLAMA_NUM_PARALLEL

2

限制 Ollama 允许同时并发处理的模型推理请求数,适应笔记本 CPU 核心数限制。

proxy_buffering off;

Nginx 配置

禁用 HTTP Proxy 缓存。若开启,大模型生成的 SSE 流文本会被 Nginx 拦截积攒,导致前端体验异常。

五、 快速部署与 Ollama 联调步骤

  1. 拉起全栈容器服务:
    docker-compose up -d

  2. 在 Ollama 中下载适合单机运行的轻量级大模型与 Embedding 模型:
    # 进入 ollama 容器下载 Qwen2.5 语言模型 (7B 4bit 量化,约 4.7GB)
    docker exec -it dify-ollama ollama pull qwen2.5:7b-instruct-q4_K_M

    # 下载轻量级文本向量 Embedding 模型 (约 274MB)
    docker exec -it dify-ollama ollama pull bge-large-zh-v1.5

  3. 访问 Dify Web 界面并初始化管理员账号:
    浏览器打开 http://localhost/,按提示设置管理员账号密码。

  4. 配置 Dify 与 Ollama 集成:

  • 登录后,点击右上角个人头像 -> 设置 -> 模型供应商 -> Ollama。

  • 添加 LLM 模型:

  • 模型类型:LLM

  • 模型名称:qwen2.5:7b-instruct-q4_K_M

  • 基础 URL (Base URL):http://ollama:11434 (注意:使用容器内部域名 ollama)

  • 添加 Text Embedding 模型:

  • 模型类型:Text Embedding

  • 模型名称:bge-large-zh-v1.5

  • 基础 URL (Base URL):http://ollama:11434

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐