☰
Mac上Dify社区版部署全指南:Docker Compose + Ollama本地模型接入
2026/9/26 22:52:32 网站建设 项目流程

这几年只要碰AI应用开发,多多少少都会撞见Dify。这个开源智能体平台把模型接入、工作流编排、知识库、Agent应用都收拢到一个界面里,对个人开发者和小团队来说确实省事。不过很多人在Mac上动手部署时,第一步就卡在环境上,Homebrew没装好、Docker Desktop没起来、拉镜像慢、Ollama连不上,各种细节能折腾一晚上。

这篇文章是我在Mac上完整部署Dify社区版的实操记录,从环境准备、源码拉取、容器启动,到接入DeepSeek本地模型、处理常见报错,全部走了一遍。适合想在本地玩Dify、准备做知识库或Agent验证,又不太想被部署细节劝退的朋友。我会尽量讲清楚每一步为什么要这么做,遇到问题怎么排查,尽量让照着做的人少踩几个坑。

1. 部署思路:为什么是Docker Compose,而不是原生安装

1.1 Dify到底是什么

Dify简单说就是一个AI应用开发平台,数据层、服务层、前端界面都被封装好了。你不需要自己拼装LangChain,也不用管向量数据库的连接细节,直接在里面拖拽工作流、上传文档建知识库、选模型供应商,就能把一个大模型应用跑起来。

它解决的核心问题很实在:把“调用大模型”这件事从一段段散落的Python脚本,变成可视化、可维护、可多人协作的应用工程。尤其在做RAG(检索增强生成)类应用时,光知识库的文档拆分、检索策略、引用格式就能耗掉大量时间,Dify把这些做了标准化,个人项目和小团队用起来性价比很高。

适合谁来用?第一类是产品原型验证者,想快速知道某个AI功能能不能落地;第二类是正在做企业内部知识库的开发者,需要私有化部署;第三类是AI学习者,在本地跑通一个完整智能体,比只看文档有用得多。

1.2 为什么Mac上只能走Docker

很多Mac用户第一次看到Dify的部署文档会疑惑:为什么不能直接brew install dify?原因在于Dify并不是单个程序,而是一整套服务集群。

它至少包含API后端、Web前端、负责执行代码的Sandbox、PostgreSQL数据库、Redis缓存、向量数据库、反SSRF代理,以及插件守护进程。这些组件各有各的运行环境要求,依赖的Python包和Node模块也很容易互相冲突。如果全部原生化安装,你可能要先在Mac上装好Python 3.11、Node.js 20、PostgreSQL、Redis、Weaviate,再逐一配置依赖,中间任何一个版本不匹配都可能导致后端起不来。

Docker Compose把这一整套服务用容器隔离,镜像里已经把依赖固定好,启动、停止、删除都是一条命令的事。官方仓库也是按这个方式提供的,所以最优解就是遵守官方预期,用Docker Compose部署。另一个好处是版本干净,升级Dify时执行git pull再重新拉镜像即可,不会在系统里留下各种残留依赖。

1.3 部署前必须知道的资源账

部署前我建议先算一下账,免得装到一半才发现内存或磁盘不够。

从实际经验看,Dify全家桶启动之后,包含镜像占用的磁盘、容器日志、数据卷在内,至少需要6到8GB空间。这还不算模型权重。如果你计划用Ollama拉一个DeepSeek量化模型,比如7B级别的,模型文件本身就要4到5GB,embedding模型再占几百MB。所以给Docker目录预留15到20GB是比较稳妥的。

内存方面,Docker Desktop在Mac上会从系统总内存里划走一块,建议至少给Docker分配4GB以上。如果Mac本身只有8GB内存,跑Dify加Ollama会很吃力,容器频繁被OOM杀掉;16GB内存的机器体验会舒服很多。我自己的M1 MacBook Air是16GB,同时跑Dify、Ollama和浏览器前台页面,整体还能接受,但风扇反应也比较明显。

2. 环境准备:把Homebrew、Docker Desktop、Git一次配齐

2.1 用Homebrew搭建Mac软件管理基础

Mac上的包管理工具GameChanger就是Homebrew。装软件、装命令行工具都离不开它。官方安装命令长这样:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

国内网络环境下,这个脚本偶尔会卡在下载阶段,因为安装过程中要访问GitHub和Homebrew官方源。如果卡住,可以先配置镜像源再执行安装,比较常见的做法是把brew的下载地址换成清华或中科大的源。更省事的思路是把仓库文件直接下载下来本地安装,不过那样后续update会比较麻烦。

装完之后用以下命令确认:

brew --version

接着把Git准备好,Mac自带Git但版本可能偏老,可以用brew刷新:

brew install git

如果之前装过Homebrew但用起来报错,多半是权限或源问题。常见的处理办法是执行brew doctor让它自己分析,错误信息一般都能看懂。卸载残留方面,brew也是比较干净的,卸载后不会留下一堆动态库。

2.2 Docker Desktop安装与芯片差异

Docker的安装方式有图形安装包和命令行两种。我推荐用Homebrew装:

brew install --cask docker

这样系统里会多出一个Docker.app,启动它之后,Docker引擎才真正跑起来。验证方式:

docker --version docker compose version

注意Intel和Apple Silicon在部署上有一点区别。Apple Silicon机器(M1/M2/M3)建议直接用arm64镜像,Dify官方镜像仓库已经提供了多架构镜像,拉取时能自动匹配,不需要额外配置。如果你在Intel Mac上跑,流程相同,但镜像体积和内存占用都会更大。

有一种情况需要留意:在Apple Silicon上,Docker Desktop会默认在“高级设置”里提供使用Rosetta模拟x86应用的选项,但Dify的服务镜像走arm64原生方式即可,不必强制开Rosetta。开了反而可能让部分镜像以模拟方式运行,性能更差。

2.3 配置镜像加速

拉取Dify镜像时,最大的痛点其实是Docker Hub在国内访问不稳定。如果发现pull镜像慢或超时,最有效的办法是在Docker Desktop里配置registry mirror。

打开Docker Desktop,进入Settings -> Docker Engine,在json配置里加入registry-mirrors节点:

{ "registry-mirrors": [ "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://mirror.ccs.tencentyun.com" ] }

保存后Docker Desktop会自动重启引擎。这个配置对我实际部署帮助很大,不配置时拉postgres镜像可能要等十分钟,配置之后一两分钟就能完成。需要注意的是镜像加速地址稳定性不一,某一天某个源失效了,更换一个即可,不影响已有镜像。

2.4 资源预检

开始部署前,我建议先确认Docker的资源上限。打开Docker Desktop -> Settings -> Resources,Memory滑块建议至少拖到4GB以上,CPU保持默认即可。磁盘位置最好选剩余空间较大的盘,Dify的镜像和数据卷会占用相当空间。

如果你装过其他开发环境,还要检查本机端口占用。Dify默认通过80端口对外提供页面,而很多本地服务都占用80端口,比如Nginx、Apache或者某些调试代理。如果80端口被占,后面部署阶段可以通过改.env解决,也可以在启动前先用这条命令看端口占用情况:

lsof -i :80

3. 正式部署Dify:拉源码、改配置、一键启动

3.1 获取Dify源码

Dify的部署文件都在官方GitHub仓库里,部署目录是docker。找一个工作目录执行:

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

如果你不想拉整个仓库历史,也可以只拉最新代码:

git clone --depth 1 https://github.com/langgenius/dify.git

拉完之后,观察docker目录下的文件结构,你会看到一个docker-compose.yaml、一个.env.example文件,和一些描述容器内部文件。.env.example就是配置模板,我们接下来要复制它并修改。

如果GitHub直接clone很慢,可以从官网Releases页面下载源码压缩包,解压后进入docker目录,效果是一样的。不用纠结方式,最终拿到源码和目标版本就行。

3.2 .env环境变量与密钥生成

部署时唯一必须修改的环境文件就是.env。先把模板复制出来:

cp .env.example .env

用编辑器打开.env,你首先需要生成一个SECRET_KEY。这个密钥用于会话加密和敏感信息签名,不能留空,也不能用默认值。生成方式:

openssl rand -base64 42

然后填入:

SECRET_KEY=这里填生成出来的一长串字符

除此之外,需要关注的是暴露端口。Dify默认用80端口对外,如果你机器上80已被占用,改成其他端口更安全:

EXPOSE_NGINX_PORT=8080

改完这个变量后,访问地址就是http://localhost:8080,而不是http://localhost。

.env里还有大量数据库、Redis、向量库的配置项,这些保持默认即可,因为Compose文件里已经把它们关联起来了。不要单独修改容器内部的数据库密码却不同步修改Compose里的database连接信息,那样启动时api服务会一直报连不上数据库。

关于Dify 1.10之后社区版加入的多租户特性,部署层面你不需要额外配置太多。只需要把.env中的相关开关打开,比如DIFY_WORKSPACE相关配置,再配合前端管理后台的用户和空间管理功能,就可以给不同成员分配独立工作空间。多租户的价值在于,一个Dify实例可以服务多个小团队,各自的Agent、知识库、模型配置相互隔离。

3.3 启动容器与初始化

配置好.env后,直接执行:

docker compose up -d

第一次启动会拉取大量镜像,包括nginx、postgres、redis、weaviate、sandbox、api、web等十几个服务,耗时取决于网络状况。镜像拉取完成后,Compose会自动创建网络和数据卷,并按依赖顺序启动容器。

启动完成后,用这条命令看所有容器状态:

docker compose ps

理想状态下,所有容器的STATUS都应该是Up,关键服务api和web最终会变成healthy。如果某个服务反复重启或一直NotFound,就需要查看对应的日志。

日志查看命令:

docker compose logs -f api docker compose logs -f web

如果只是想快速确认是否启动成功,也可以直接访问浏览器。打开http://localhost:8080或http://localhost,会看到初始化页面,要求设置管理员邮箱和密码。这一步会写入PostgreSQL,之后就可以进入主界面了。

3.4 验证部署是否成功

进入主界面后,建议做三件事验证系统是否正常。

第一,进入“模型供应商”页面,看看是否能正常加载供应商列表。如果页面空白或接口报错,大概率是api容器或数据库连接有问题。

第二,随便创建一个App,进入Debug界面,不选任何模型,点击对话。如果前端能正常展示错误弹窗并提示“请先配置模型”,说明前后端通信链路是通的。如果页面转圈然后无语反应,通常是nginx配置或容器网络问题。

第三,在终端查看日志是否持续刷错误。正常情况下,没有用户操作时日志应该是安静的。如果有大量数据库连接错误或Redis访问超时,说明中间件和服务之间没配对。

3.5 更新与版本管理

Dify迭代很快,社区版两三个月就会有大版本更新。更新流程不复杂,但顺序不能乱:

cd dify git pull docker compose down docker compose pull docker compose up -d

执行docker compose down会把容器停掉并移除网络,但数据卷默认保留。数据库、向量库的数据都留在卷里,所以更新后旧应用和知识库数据还在。升级前最好先备份.env,因为新版可能新增配置项。如果升级后api容器一直报错,先看日志,再对比.env.example里新增的变量,补上即可。

还有一点需要提醒,尽量不要用docker compose down -v来删除卷,这会连同数据库和向量库一起清掉。如果不小心执行了,只能重新初始化。

4. 接入本地模型:Ollama + DeepSeek

4.1 安装Ollama

Dify本身不自带模型,要跑通完整对话,必须有模型供应商。如果你不想付费调用云端API,本地安装Ollama是最直接的方式。Ollama是一个本地模型运行时,专门简化大模型的下载和调用。

安装命令:

brew install ollama

安装完成后,需要手动启动服务。前台运行:

ollama serve

如果你希望后台常驻,可以用brew services:

brew services start ollama

用brew services启动的好处是开机自动运行,坏处是环境变量配置略微麻烦。我实际部署时更喜欢前台跑,调试时能直接看到模型加载日志。

4.2 拉取DeepSeek模型

Ollama跑起来之后,拉模型就是一条命令的事:

ollama pull deepseek-r1:7b

Dify适配DeepSeek的方式很简单,通过Ollama供应商接入后,模型名填deepseek-r1:7b即可。如果内存不够,也可以选择量化更低的版本,比如deepseek-r1:1.5b,或者用Qwen系列:

ollama pull qwen2.5:7b

模型越大,推理效果越好,但Mac的小内存会受不了。一个7B模型基本占5GB内存,加上Dify本身的开销,16GB机器勉强能跑,8GB机器建议用1.5B模型。

4.3 让Dify容器访问宿主机Ollama

这一步是新手最容易踩坑的地方。Dify的api服务运行在容器里,容器内部访问宿主机不能直接用localhost。原因很简单:容器内的localhost指容器自身,不是你的Mac。

有两个解决方案。推荐用host.docker.internal,这是Docker Desktop为Mac、Windows提供的特殊域名,专门用来指代宿主机:

http://host.docker.internal:11434

前提是Ollama服务必须监听在可访问的地址上。默认Ollama服务只监听127.0.0.1:11434,如果只监听本机回环地址,容器访问host.docker.internal同样会被拒绝。

解决办法是让Ollama监听所有网络接口:

OLLAMA_HOST=0.0.0.0:11434 ollama serve

如果你通过brew services启动,也可以查看一下服务的plist配置,修改其中的OLLAMA_HOST环境变量。改完后用浏览器或curl测试一下:

curl http://localhost:11434/api/tags

返回模型列表json就说明服务正常。

另一个方案是直接用局域网IP,比如让你的Mac通过路由器拿到的IP是192.168.1.100,那么在Dify里填http://192.168.1.100:11434。这个方式不依赖Docker提供的特殊域名,但要求Mac防火墙允许端口入站,而且会暴露给局域网内其他设备。

4.4 在Dify平台配置Ollama供应商

进入Dify管理界面,路径是“设置 -> 模型供应商 -> 添加Ollama”。填写三项核心信息:

  • API Base URL:http://host.docker.internal:11434 或 http://192.168.x.x:11434
  • 模型类型:选择对话类型LLM,并填写模型名称,例如deepseek-r1:7b
  • 上下文长度和最大Token:按模型默认值或保守值填写

保存后,点击“测试”按钮。如果看到连通成功提示,说明模型网关已通。如果看到“An error occurred during credentials validation”,先别怀疑密钥,Ollama根本不需要密钥,真正原因多半是URL填了127.0.0.1,或者Ollama没有监听0.0.0.0。

配置成功后,再新建或编辑一个Agent/聊天助手,系统模型下拉框里就能选到刚配好的模型了。

4.5 补充配置embedding模型与知识库

如果你打算用Dify做知识库,光有对话模型还不够,还需要一个embedding模型,用来把文档拆成的文本片段向量化。

Ollama里拉一个轻量embedding模型:

ollama pull nomic-embed-text

然后在Dify的模型供应商配置里,同样添加Ollama,但模型类型选“Embedding”,模型名填nomic-embed-text。这样在创建知识库时,系统“Embedding模型”那一栏就能切换到本地模型。

知识库的完整跑通流程是:上传PDF或TXT,选择分段模式,Dify会调用embedding模型生成向量,写入向量数据库。之后在应用里开启知识库检索,用户提问时,Dify会把问题向量化、检索最相关片段,再交给LLM生成答案。本地部署的优势是文档不用上传到云端,适合敏感内容。劣势是embedding模型的精度和速度都不如商业API,大文档分段处理会明显变慢。

5. 实操中遇到的坑与解决办法

5.1 Ollama连接失败

最常见的表现是在Dify测试模型时提示“Failed to connect to Ollama”或者“connection refused”。

排查顺序固定为三步:第一步,在宿主机确认Ollama服务状态,用curl http://localhost:11434/api/tags看看有没有json返回;第二步,确认Ollama监听地址,lsof -i :11434应该看到*:11434或0.0.0.0:11434,而不是127.0.0.1:11434;第三步,确认Dify的URL填写正确,容器内连接宿主机用host.docker.internal,局域网IP方式要保证IP是当前网段且防火墙放行。

我实际遇到的一个隐蔽问题是,Mac自带的应用防火墙拦住了来自docker网络的入站连接,导致即使Ollama监听0.0.0.0,Dify容器也连不上。后来在系统设置里放行了Ollama才解决。

5.2 端口被占用

假设你启动时看到nginx容器反复重启,日志里提示Address already in use,那一定是宿主机有程序占了默认的80端口。解决方法有两种:找到占用程序并停掉,或者修改.env里的EXPOSE_NGINX_PORT。

我建议直接改端口,因为Mac上开发环境进程实在太多,没必要因为一个Dify去停掉现有服务。把EXPOSE_NGINX_PORT改成8080之后,再执行docker compose up -d,重启nginx容器就会生效。

5.3 内存不足与Docker Desktop资源上限

如果你的Dify启动后,api容器或docker容器频繁崩溃,而且日志出现OOMKilled,说明内存分配不够。Docker Desktop默认内存上限可能只有2GB,跑Dify全家桶根本不够。

去Settings -> Resources,把Memory拉到4GB乃至6GB,保存重启引擎后重新执行docker compose up -d。磁盘空间不够时,看到pull镜像时提示no space left on device,也需要到Resources里把Disk image size调大,或者直接用清理工具精简无用镜像:

docker system prune

这个命令会删除所有停止的容器、悬空镜像和未使用的网络卷缓存。执行前确认没有用到这些资源,因为它不会删除正在运行的容器数据卷,但会清掉已停止的容器和缓存镜像。

5.4 登录报错与密码重置

Dify登录界面提示“Too many incorrect password attempts. Please try again later”,一般是系统做了登录限流,你在短时间内输错太多次,Redis里记了一个锁定标记。处理方法是等几分钟,等待自动解锁。如果你只是忘了密码,可以在API容器内重置。

通过命令行重置管理员密码的办法是进入api容器,执行flask相关命令或直接更新数据库中的user表。实际操作中更快的做法是,清掉Redis中保存的登录失败计数相关key,然后重新登录。如果连管理员邮箱都忘了,可以进PostgreSQL查user表:

docker exec -it dify-db psql -U postgres -d dify select email from users where role='admin';

这种方式适合恢复环境,但更建议平时给管理员账号设置强密码,同时在.env里开启邮箱服务,这样Dify自己就能管理密码找回流程。

5.5 模型校验失败与SSL错误

“An error occurred during credentials validation”这个报错除了网络原因外,还有可能是模型供应商配置里填了错误的模型名。比如Ollama里拉的是deepseek-r1:7b,但Dify里填成deepseek-r1,两者不匹配,校验时拉不到模型就会报错。解决办法是在Ollama里查询已安装模型,确保名字完全一致:

ollama list

关于“dify ssl错误”这个问题,常见于你配置了自定义域名或反向代理,把外部HTTPS请求转发给Dify,但Dify内部并未正确设置SSL证书。本地部署且只在本机访问时,建议直接用HTTP访问,不需要开启SSL。如果你一定要用HTTPS,可以在nginx反向代理层做证书终止,而不要让Dify自己启用443服务。否则日志里会频繁出现证书相关报错,排查起来很麻烦。

5.6 磁盘空间清理与卸载残留

Mac用户如果之前装过其他Docker应用或开发环境,磁盘很容易被镜像占满。查看占用:

docker system df

清理未使用镜像:

docker image prune -a

如果你最终想卸载Dify,步骤也简单。先停止并删除容器:

docker compose down

然后手动删除整个dify源码目录,再把Docker Desktop里对应的容器镜像删掉。数据卷会保留在Docker目录中,如果确定不再使用,可以在Docker Desktop的磁盘设置里清理,或者删除对应数据卷目录。这样不会在Homebrew和系统里留下残留,比手动一个个进程去卸载省心得多。

5.7 Docker Compose版本兼容问题

如果你在配置较旧的Mac或手动安装过Compose,启动时可能会遇到“version或services格式不可识别”的错误。这通常是Compose V1和V2的差异导致的。Dify的docker-compose.yaml已经使用无version写法和较新的service定义,建议用Docker Desktop自带的docker compose子命令。遇到这种问题,先确认:

docker compose version

如果本地使用的是旧版docker-compose,可以直接升级,或者统一改用docker compose。实在不想折腾就把旧版删除,让Docker Desktop管理Compose命令。

6. 部署完成后的一些体会

Dify在Mac上的部署难度其实不在Dify本身,而在于它背后的容器环境是否顺手。Homebrew、Docker Desktop、Ollama这几个组件如果平时就在用,部署Dify基本半小时能搞定;如果其中一个组件出了问题,排查时间会成倍增加。

我个人实际使用中比较推荐的组合是:M系列Mac + Docker Desktop 4.x + Dify最新社区版 + Ollama跑DeepSeek量化模型。这样既能在本地体验完整的Agent编排,又不依赖云端API。开发调试时,用一个小模型做链路验证,等逻辑稳定后再切换成大模型的API,成本和体验都能兼顾。

部署只是第一步,真正有价值的是Dify里的工作流编排和知识库设计。建议部署完成后花点时间把模型供应商、知识库检索策略、Agent的推理设置都调一遍,这些参数对最终效果的影响,往往比部署过程更值得深究。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询