很多人第一次接触 Dify 时,第一反应往往是"这不就是一个包了一堆大模型 API 的应用平台吗?"但在真正动手本地部署之后才发现,安装 Dify 本身并不难,难的是理解它背后那一整套服务编排逻辑:为什么需要 Nginx?为什么有 API 和 Worker 两个后端?为什么数据库要用 PostgreSQL 而不直接上 MySQL?这些疑问如果在安装前不解决,后面排查问题时会非常吃力。这篇教程我会按照自己的实际部署经验,从环境准备、完整安装步骤、首次初始化和踩坑排查几个维度拆开讲,力争让没接触过 Docker 的朋友也能顺利完成 Dify 本地部署,并搞清楚每一步到底在做什么。
1. 先弄明白 Dify 是什么,再决定要不要装
1.1 Dify 到底解决什么问题
Dify 是一个开源的大语言模型应用开发平台,简单说,它把"接入模型、搭建知识库、编排工作流、做 Agent、管理数据集"这些动作,全部收拢到一个可视化界面里。你不需要从零写代码去对接 OpenAI、Claude 或者国内各种模型接口,也不用自己维护 Prompt 调优、上下文管理等复杂逻辑,直接在界面上配置即可。尤其对于想快速验证产品的团队和个人开发者,它的价值非常大。
从技术架构来看,Dify 的前后端分离设计也比较清晰:前端是 Web 界面,后端拆成了 API 服务和 Worker 异步任务服务,数据存储在 PostgreSQL,缓存和消息队列用 Redis,向量检索用 Weaviate 或 Qdrant,代码执行则放进独立沙箱。整套系统通过 Docker Compose 编排,所以安装 Dify 的本质,就是把这些容器拉起来并配好网络和数据卷。理解这一点之后,你会发现官方文档里那一堆 docker-compose 指令,并不是什么黑魔法。
1.2 适合谁,不适合谁
我用 Dify 也有一段时间了,判断它适不适合你,主要看使用场景。
适合的人群包括:
- 想快速搭建企业内部知识库问答机器人的团队,不需要从零开发 RAG 管线。
- 需要把多个模型(OpenAI、Claude、国产模型、本地 Ollama 等)统一接入一个管理后台的开发者。
- 想把工作流可视化编排出来,让业务人员也能参与 Agent 流程设计的场景。
- 需要本地部署、数据不出内网的企业,看重开源自托管能力。
不太适合的场景也不能忽视:
- 如果只是简单调用一两个模型 API 做个小工具,直接用 SDK 写可能更轻量,没必要部署一套平台。
- 如果需要对底层 RAG 检索策略做极其深度的定制,Dify 的抽象层反而可能会成为限制,那就更适合直接用 LangChain 或 LlamaIndex 这类框架自己搭。
- 如果团队没有任何 Docker 运维经验,生产环境直接裸奔上 Dify,后续升级和排障会非常痛苦。
我的建议是:先在自己的笔记本上通过 Docker Desktop 部署一套跑通全流程,确认它确实能解决你的核心需求,再决定是否上服务器。这个试错成本很低,但能帮你少走很多弯路。
1.3 本地部署和云版本到底差在哪
Dify 官方也提供云服务,注册就能用,很方便。但本地部署的价值在于:
- 数据完全掌握在自己手里,不需要把内部文档、用户对话内容上传到第三方平台。
- 可以随意修改环境变量、接入内网模型服务、定制镜像。
- 不依赖外部服务的配额和限流,模型 API Key 自己管理。
代价就是需要自己承担部署、升级、备份、监控的责任。我见过太多人装了就忘,数据库没有备份,版本也不敢升级,最后数据丢了才后悔。所以如果你决定本地部署,请一定把后续维护当成正式工作来做,而不是装完就完事。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装前的环境检查:Docker 和机器配置才是最大变数
2.1 硬件和系统要求,别拿 2G 内存硬扛
Dify 自带一整套服务,包括 PostgreSQL、Redis、Weaviate、Sandbox、Nginx 等,全部跑起来后内存占用相当可观。官方建议 2 核 4G 内存起步,但我个人实测,4G 内存只能说是"能跑",如果同时做知识库文档解析或者跑多个会话,会明显卡顿。想流畅使用,建议至少 8G 内存,磁盘留给 Docker 镜像和数据卷 50G 以上会比较稳妥。
系统方面,Linux 服务器在 Ubuntu 20.04 或 Debian 11 以上版本用 Docker Engine 部署最省心;Windows 环境用 Docker Desktop 加 WSL2 后端;macOS 直接用 Docker Desktop 也行。无论哪个系统,核心都是先把 Docker 和 Docker Compose 插件搞定。
这里有个容易忽略的点:你的机器架构。大多数云服务器是 x86_64,如果你用的是 Apple Silicon Mac,或者 ARM 架构的服务器,要注意镜像是否支持对应平台。Dify 官方镜像目前对主流架构支持还算好,但个别依赖镜像可能需要切换 tag,建议部署前先看一眼 docker-compose.yml 里镜像是否有 arm64 版本。
2.2 Docker 安装与配置,重点是镜像加速和 WSL2
以 Linux 为例,安装 Docker Engine 的大致流程是:
bash复制sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
这里我强烈建议你安装 docker-compose-plugin 而不是单独安装老旧的 docker-compose,因为 Dify 官方脚本用的是新版 docker compose(中间没有横杠)子命令。
装完后顺手执行:
bash复制sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker $USER
把当前用户加入 docker 组,以后不用每条命令都加 sudo。记得重新登录或执行 newgrp docker 让组生效。
国内网络环境下,Docker Hub 的镜像拉取速度经常让人崩溃,我建议提前配置镜像加速器。在 /etc/docker/daemon.json 里写入:
json复制{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
然后重启 Docker:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
Windows 用户需要注意,Docker Desktop 装完之后,务必确认 Settings 里 Resources 的 WSL Integration 已经开启,否则 Dify 容器可能无法正常访问 WSL2 里的文件系统,导致挂载目录异常。
2.3 初始化配置:提前理解 .env 文件
Dify 的 docker 目录下有一个 .env.example 文件,安装时需要复制成 .env 并修改关键配置。我们提前看一下里面最关键的几项:
| 配置项 | 默认值 | 作用 |
|---|---|---|
| SECRET_KEY | 空 | 用于加密会话和敏感信息,必须改成一个随机长字符串,可用 openssl rand -base64 42 生成 |
| POSTGRES_PASSWORD | difyai123456 | 数据库密码,生产环境必须改掉 |
| DB_PASSWORD | difyai123456 | API 服务连接数据库的密码,要和上面保持一致 |
| EXPOSE_NGINX_PORT | 80 | Web 访问的外部端口,如果 80 被占用就改成 8080 |
| MODE | api,worker | 表示同时启动 API 和 Worker 两个后端进程,一般保持默认 |
修改 .env 后重启容器才会生效,这点后面排障时很重要。很多人改了 .env 发现没变化,就是因为没有重新创建容器,只是 restart 了。
Dify 新版本在安装脚本里还提供了交互式的环境配置引导,你可以按提示逐步设置。但我的建议始终是:改配置可以,但至少要清楚每一项改的是什么,不要一路无脑回车。
3. 从零开始安装 Dify:两种主流方式的全过程
3.1 方式一:Linux 服务器用 Docker Compose 快速部署
官方推荐的安装方式,是通过 git 拉取 Dify 源码,然后进入 docker 目录执行编排。为什么不直接下载镜像?因为 Dify 的 docker-compose.yml 文件需要和代码版本匹配,git 拉取能确保文件一致,以后升级也方便。
操作流程如下:
bash复制cd ~
git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
# 生成随机密钥并写入 .env
echo "SECRET_KEY=$(openssl rand -base64 42)" >> .env
docker compose up -d
docker compose up -d 会按照 docker-compose.yml 里的定义,依次拉取镜像并启动容器。首次执行会根据网络情况等待一段时间,看到类似下面的输出时,说明容器已经在启动了:
code复制[+] Running 11/11
✔ Network docker_default Created
✔ Container docker-web-1 Started
✔ Container docker-weaviate-1 Started
✔ Container docker-db-1 Started
✔ Container docker-redis-1 Started
✔ Container docker-api-1 Started
✔ Container docker-worker-1 Started
✔ Container docker-sandbox-1 Started
✔ Container docker-nginx-1 Started
注意,如果你的机器上还跑着 Nginx、Apache、Jenkins 这类服务,80 端口很容易被占用,导致 Dify 的 Nginx 容器启动失败。这时候有两个选择:一是停掉占用 80 端口的服务,二是修改 .env 里的 EXPOSE_NGINX_PORT 为 8080,然后重新启动。
启动完成后,执行 docker compose ps 查看所有容器状态。如果所有容器都是 Up 状态,说明启动成功。然后浏览器访问 http://服务器IP 或 http://localhost,就能进入 Dify 的初始化页面。
3.2 方式二:Windows/macOS 本地用 Docker Desktop 部署
本地开发环境部署 Dify 和服务器上基本一致,区别只在于 Docker Desktop 本身。Windows 用户请务必先确认以下几点:
- WSL2 已启用,并在 Docker Desktop 设置中打开 WSL Integration。
- 不要将 Dify 项目放在中文路径或带空格的目录中,否则挂载目录可能出现权限或路径解析问题。
- 如果 Windows 防火墙弹出提示,记得允许 Docker 的相关网络访问。
然后同样执行 git clone、复制 .env、docker compose up -d 的流程。在 Windows PowerShell 或 CMD 里执行 docker compose 时,如果提示命令找不到,说明 Docker Desktop 安装后没有把 compose 插件路径加入环境变量,重新安装或手动把 C:\Program Files\Docker\Docker\resources\bin 加入 PATH 即可。
macOS 用户相对省心,Docker Desktop 装好直接跑就行。不过 Apple Silicon 用户如果发现某些镜像拉下来后无法运行,检查一下是否拉了 amd64 版本。可以在 docker-compose.yml 的对应服务里指定 platform: linux/arm64,或者干脆把 Docker Desktop 的 "Use Rosetta for x86_64/amd64 emulation" 选项打开。
3.3 安装过程中 Docker Compose 到底做了什么
很多教程只会告诉你"复制粘贴命令就行",但我觉得理解背后的服务角色,对你的排障能力提升是决定性的。Dify 的 docker compose 文件里默认包含以下关键容器:
| 容器名 | 职责 | 常见故障点 |
|---|---|---|
| nginx | 反向代理,统一入口,转发到 web/api | 端口被占、证书配置错误 |
| web | 前端静态页面 | 镜像版本不对、构建缓存冲突 |
| api | 后端 API 服务 | 数据库连接失败、SECRET_KEY 配置错误 |
| worker | 异步任务队列,处理文档解析、数据集索引等 | Redis 连接失败、队列积压 |
| db | PostgreSQL 数据库 | 数据卷权限错误、密码不一致 |
| redis | 缓存和消息队列 | 持久化目录权限 |
| weaviate | 向量数据库,用于知识库的向量检索 | 资源占用过高、端口冲突 |
| sandbox | 代码执行沙箱,运行工作流中的 Python/JS 节点 | 沙箱服务未就绪导致代码节点报错 |
这些服务之间通过网络内部通信。如果你手动停掉了某个容器而不自知,Dify 表面看起来只是变慢,实际上可能已经在反复报错了。所以我建议你部署完 Dify 后,先熟悉 docker compose ps 的稳定状态,之后再操作就不会慌了。
4. 部署完成后的验证与首次初始化
4.1 确认容器全部健康
安装完成后,先用命令确认状态:
bash复制docker compose ps
正常情况下,所有服务的 STATUS 列都应该是 Up 或 healthy。如果看到 Restarting 或 Exit 1,说明某个服务启动失败,需要看具体日志。
接下来检查 Web 服务能否正常响应。浏览器访问 http://你的服务器IP,如果看到 Dify 的初始化页面,说明 Nginx、前端、后端已经串通了。这一步如果一直白屏或 502,优先看 docker compose logs nginx 和 docker compose logs api,把最近的错误信息贴到搜索引擎,多半能定位问题。
4.2 首次访问:创建管理员账号
Dify 第一次访问会进入管理员初始化页面,你需要设置管理员邮箱和密码。这个账号非常重要,后续所有应用、模型、成员的权限管理都从它开始。密码尽量复杂一些,不要和测试环境用同一个密码。
创建完管理员账号后,系统会引导你进入工作台。这里我建议先别急着建应用,先把模型供应商配置好,否则下一步创建应用时会发现没有任何可用的模型。
4.3 接入模型供应商:从 OpenAI 兼容接口到本地 Ollama
在 Dify 工作台左上角点开"设置",进入"模型供应商"页面。你会看到一排模型厂商卡片,包括 OpenAI、Azure OpenAI、Anthropic、Google Gemini、国内各家模型、Ollama、Xinference 等。
接入方式通常分两类:
- 云 API 型。以 OpenAI 为例,填入 API Key 即可。如果使用 OpenAI 兼容接口(比如某些国内中转服务,或自建的 vLLM 服务),需要填写 Base URL 和 API Key。
- 本地模型型。以 Ollama 为例,先在服务器上装好 Ollama 并拉取模型,然后在 Dify 里填写 Ollama 的服务地址,例如
http://host.docker.internal:11434。Windows/macOS 使用 Docker Desktop 时,容器内访问宿主机的地址要写host.docker.internal,Linux 下则通常写宿主机局域网 IP 或172.17.0.1。
如果你没有云 API 的 Key,但又想快速体验,我推荐先在本机跑 Ollama 加一个小模型,比如 qwen2.5:7b 或 llama3.1:8b,几 GB 显存就能跑起来,作为开发调试完全够用。
4.4 快速验证:用内置模板跑通第一轮对话
模型配置好后,回到工作台,点击"创建空白应用",选择"聊天助手"。这时系统会问你要不要用模板,新手可以直接选一个空白模板。然后在界面右上角选择刚接入的模型,输入随便一句话,比如"你好,介绍一下你自己",能正常生成回复,就说明整条链路是通的。
如果你发现模型选择框是空的,多半是模型供应商配置没保存成功,或者 API Key 校验失败。回到模型供应商页面,重新提交一次,注意看 Dify 的提示信息,通常会明确指出是哪一步失败。
5. 我会踩到的坑:安装与使用中的常见问题排查
5.1 80 端口被占用,Web 页面一直打不开
这是我在服务器上遇到最多的一个问题。很多服务器默认跑了 Nginx 或者宝塔面板,80 端口早就被占了。Dify 的 Nginx 容器启动时会因为端口冲突直接报错退出。
排查方法:
bash复制sudo lsof -i:80
如果有输出,说明端口被某个进程占用。或者用 Docker 的方式:
bash复制docker compose logs nginx
看到类似 bind: address already in use 的报错,基本就是端口冲突。
解决方法有两种:
- 修改
.env里的EXPOSE_NGINX_PORT=8080,然后docker compose up -d,用http://服务器IP:8080访问。 - 停掉占用 80 端口的服务,让 Dify 使用默认端口。
我建议直接改端口,简单干净。但如果你的服务器上还有其他 Web 服务要对外提供 80 端口,可以另外配一层 Nginx 反代到 Dify 的 8080。
5.2 镜像拉取失败或超时,卡在 Pulling 很久
首次部署时,由于需要拉取 PostgreSQL、Weaviate、Sandbox 等十几个镜像,网络稍微不好就会卡在 Pulling 阶段。如果你发现某个镜像一直拉不动,可以单独拉取该镜像先测试网络:
bash复制docker pull langgenius/dify-api:1.0.0
如果这条命令就卡住,说明 Docker Hub 网络连接有问题。优先配置镜像加速器,另外也可以重试几次。有些时候是临时网络抖动,docker compose up -d 重新执行一次就好。
这里特别提醒:不要手动修改 docker-compose.yml 里镜像版本,除非你很确定自己在干什么。Dify 各镜像之间的版本需要保持一致,混用不同 tag 容易导致 API 和 Worker 行为不一致,出现莫名其妙的问题。
5.3 修改了 .env 配置但容器没有生效
很多人改完 .env 之后,执行了 docker compose restart,发现配置还是老样子,一脸懵。其实 restart 只会重启容器,不会重新读取环境变量。正确做法是:
bash复制docker compose up -d --force-recreate
这会根据当前 .env 和 docker-compose.yml 重新创建容器。如果你连 docker-compose.yml 本身也改了,那么可能要再加一个参数:
bash复制docker compose up -d --force-recreate --remove-orphans
这样 Dify 才会真正把新配置应用起来。
5.4 数据库连接报错,API 容器反复重启
API 容器启动失败最常见原因之一就是连不上 PostgreSQL。常见错误信息类似 connection refused 或 password authentication failed。
先查日志:
bash复制docker compose logs api | tail -100
如果是连接拒绝,多半是 db 容器没起来,先看 docker compose ps 里 db 的状态;如果 db 显示 Up 但 API 连接被拒,检查 .env 里 POSTGRES_PASSWORD 和 DB_PASSWORD 是否一致。这两个必须统一,否则 API 服务拿错误的密码去连数据库,必然失败。
还有一种隐蔽情况:之前用旧版本启动过 db,数据卷里的数据库密码和当前 .env 对不上。这种情况最稳妥的做法是备份数据卷里需要的东西,然后清掉旧的 db 数据卷重新初始化。但注意,这个操作会删除掉已有的应用数据,执行前务必确认没有需要保留的数据。
5.5 正确查看日志的方式
Dify 排障最核心的手段就是看日志。我习惯用这几个命令组合:
bash复制# 查看所有容器最近日志
docker compose logs --tail=50
# 只看某个容器日志
docker compose logs api
# 实时跟踪某个容器日志
docker compose logs -f worker
日志里如果出现大量 ERROR,不要慌,先看时间戳和具体组件。比如 API 报错但 Worker 正常,问题多半出在 API 服务本身;如果 Worker 报错而 API 正常,问题大概率是异步任务处理出了问题,比如文档解析卡住或 Redis 队列异常。把日志信息复制出来,去掉 IP、密钥等敏感信息,再去找对应问题的资料,效率会高很多。
6. 升级、备份与日常维护建议
6.1 升级 Dify 的正确顺序
Dify 迭代速度很快,社区版几乎每月都有新版本。升级前务必先看官方 Release Notes,尤其是检查有没有 breaking change。我见过太多人直接 git pull && docker compose up -d,结果数据库迁移失败,导致整个平台无法访问。
推荐做法是:
bash复制cd ~/dify
git pull origin main
# 进入 docker 目录,先备份数据,再更新镜像和容器
cd docker
docker compose down
docker compose pull
docker compose up -d
docker compose down 会停止并移除容器,但不会删除数据卷,所以数据还在。如果升级后出现问题,可以用旧镜像重新启动。为了保险起见,升级前我还会手动备份一次数据库。
6.2 备份与恢复:不想数据白干,必须做这一步
Dify 的数据核心在 PostgreSQL 和向量数据库,还有一个容易忽略的 docker/volumes 目录,里面存放着上传文件、日志和沙箱相关配置。
我用得最多的备份方案是定时用 pg_dump 导出数据库:
bash复制docker exec docker-db-1 pg_dump -U postgres dify > dify_backup_$(date +%Y%m%d).sql
恢复时:
bash复制cat dify_backup.sql | docker exec -i docker-db-1 psql -U postgres dify
另外,把 docker 目录整体打包备份到对象存储或另一台机器上。这样即使服务器整机故障,也能在最短时间内恢复到新机器。恢复流程就是把新的 Dify 部署好,然后把备份的数据库导入,数据卷文件覆盖回去。
6.3 让 Dify 长期稳定运行的几个小习惯
- 定期执行
docker compose ps检查容器状态,发现异常及时处理。 - 监控磁盘空间,Dify 的知识库文档解析、向量索引、日志都会占用磁盘,满了会导致服务异常。
- .env 文件属于敏感文件,别提交到 Git 仓库,也别随意发给别人。
- 模型 API Key 优先在 Dify 界面里配置,避免在服务器环境变量里暴露。
- 如果需要接入私有化模型或自定义数据库,先在小版本上做好测试再上生产。
多租户方面,新版本社区版开始支持多租户隔离能力,对于企业内部分团队管理来说非常实用。安装时默认是单租户,如果你有对应的使用需求,可以在初始化后到系统设置里开启相关功能。这块和具体的业务组织方式有关,我的建议是先跑通单租户,确认平台本身没问题,再评估是否需要启用多租户。
最后分享一个我个人的习惯:我会把 Dify 部署目录做成一个带版本号的软链接,比如 dify-1.0.0 -> dify,升级时先复制一份旧目录作为回滚点。每次升级前十分钟,我都会把这条命令放进 cron 里执行一次数据库备份。别嫌麻烦,等哪天真遇到升级导致数据迁移失败,你就知道这十分钟有多值钱了。
