Dify 开源 LLM 应用平台部署教程:零基础 Docker Compose 复现全流程
信息来源:Dify GitHub README / docs.dify.ai 原生部署逻辑
部署方式:官方 Docker Compose 方案
对应版本:Dify v1.18.0(2026-10-23 发布)
Dify 是目前开源圈里最"完整"的 LLM 应用开发平台之一——它把可视化工作流编排、RAG 知识库、Agent 构建、多模型接入这四件事做进了同一个控制台,应用既可以发布成 API 给后端调用,也可以直接生成 WebApp 交给前端嵌入。相比自己用 LangChain 拼一套,Dify 省掉的是"胶水代码"那几十小时;相比 Coze 这种闭源平台,它胜在数据完全在自己手里。
本文严格对照官方仓库的 docker/ 目录,走一遍从克隆、配置 .env、启动容器、初始化管理员、接入模型供应商,到创建第一个 RAG 应用的全过程,并在每个环节标注官方文档里明确写过的坑。
一、项目介绍
Dify 的核心是一套「应用(App)」抽象。每个应用有三种典型形态:
- Chatflow(对话流):多轮对话 + 知识库检索,最常见的客服 / 问答机器人形态;
- Workflow(工作流):纯流程编排,无对话历史,适合文档处理、批量生成这类任务;
- Agent(智能体):给 LLM 挂上工具(搜索、代码执行、HTTP 请求),让它自主决策下一步。
底层支撑则是四大件:
- 可视化编排画布:拖拽节点连线就能定义 LLM 调用链路,不必写胶水代码;
- RAG 引擎:文档上传后自动分段、向量化、索引,检索时按相似度召回;
- 多模型供应商:OpenAI / Anthropic / 通义千问 / 文心一言 / 智谱 / Gemini / Ollama 等统一在设置页配置;
- 应用发布:一键生成 API Key 与调用示例,也可打包成嵌入前端的小组件。
二、功能拆解
- 可视化 Prompt 编排与工作流画布(节点式拖拽)
- 多模型接入(OpenAI / Anthropic / Ollama / 通义 / 文心 / 智谱 / Gemini 等)
- 知识库文档向量化检索(RAG),支持分段预览与召回测试
- 应用发布为 API / 可嵌入 WebApp,支持分享链接
- 多用户管理、工作空间隔离、对话日志追踪与标注反馈
- 插件体系(Plugin Daemon)扩展模型与工具
- 沙箱(Sandbox)执行用户代码,SSRF 代理隔离出站请求
三、官方 / GitHub 链接
- GitHub:https://github.com/langgenius/dify
- 官方文档:https://docs.dify.ai
- 环境变量参考:https://docs.dify.ai/en/getting-started/install-self-hosted/environment-variables
- 常见部署问题:https://docs.dify.ai/en/getting-started/install-self-hosted/common-issues
四、环境要求
官方当前对自部署的最低要求如下:
| 依赖 | 版本要求 |
|---|---|
| 操作系统 | Linux / macOS(Windows 需 Docker Desktop) |
| Docker | ≥ 19.03(Linux) |
| Docker Compose | ≥ v2.24.0 |
| CPU | ≥ 2 核 |
| 内存 | ≥ 4 GiB(macOS 建议给 Docker Desktop 分配 8 GiB) |
| 磁盘 | ≥ 20 GB(含镜像与向量库数据) |
| 端口 | 80(可通过 EXPOSE_NGINX_PORT 修改) |
需要提前准备:Git、curl、jq(用于拉取最新 release 标签),以及至少一个可用的模型 API Key,或本机已跑起来的 Ollama。
五、部署步骤
步骤 1:克隆仓库
官方推荐直接检出最新 release 标签,而不是跟随 main 分支:
git clone --branch "$(curl -s https://api.github.com/repos/langgenius/dify/releases/latest | jq -r .tag_name)" https://github.com/langgenius/dify.git
cd dify/docker
如果机器上没有 jq,直接 git clone https://github.com/langgenius/dify.git 拉 main 分支也能跑,但生产环境建议锁定 release 标签。
步骤 2:准备环境变量
cp .env.example .env
这是最关键的一步。.env.example 里大量配置是空值或默认值,直接启动等于把密钥暴露在公网上。
必须修改的核心项:
# 1. 应用密钥(必须改成随机值,否则会话可被伪造)
SECRET_KEY=改成随机字符串
# 生成方式:openssl rand -base64 42
# 2. 数据库密码(默认是 difyai123456,人人皆知)
DB_PASSWORD=改成你自己的强密码
# 3. Redis 密码
REDIS_PASSWORD=改成你自己的强密码
# 4. 首次安装的管理员密码(不设则 /install 页面任何人可抢注)
INIT_PASSWORD=设置初始管理员密码
INIT_PASSWORD 是官方文档特别强调的一项:如果服务器在管理员创建前就暴露在公网,另一个访问者可能抢先注册第一个账号。设了它,/install 页面就需要凭密码才能进入。
关于向量库与存储的默认值:
VECTOR_STORE=weaviate # 默认内置 Weaviate,可换 qdrant / pgvector / milvus 等
STORAGE_TYPE=opendal # 默认 opendal,附件落在本地卷
步骤 3:启动服务
docker compose up -d
docker compose ps
默认启动的服务集由 .env 里的这一行决定:
COMPOSE_PROFILES=${VECTOR_STORE:-weaviate},${DB_TYPE:-postgresql},collaboration
也就是 db_postgres、weaviate、api_websocket 这些带 profile 的服务会被自动拉起。docker compose ps 里 init_permissions 显示 Exited 是正常现象——它是一次性初始化任务,跑完就退出。其余容器应当是 Up 或 healthy。
初次拉镜像比较久(包含向量库和 Postgres),耐心等几分钟。
步骤 4:初始化管理员
浏览器打开 http://你的服务器IP/install,设置邮箱和密码,创建第一个管理员账号。
注意端口由
EXPOSE_NGINX_PORT(默认 80)和NGINX_PORT(默认 80)共同决定,被占用就改EXPOSE_NGINX_PORT=8080,然后访问http://你的服务器IP:8080/install。
步骤 5:接入模型供应商
进入「设置 → 模型供应商」:
- OpenAI / Anthropic / 通义千问 / 智谱:填 API Key 即可;
- 本地 Ollama:如果 Ollama 跑在宿主机上,Base URL 填
http://host.docker.internal:11434,并确认 Ollama 监听0.0.0.0:
sudo systemctl edit ollama
# 加入:[Service]
# Environment="OLLAMA_HOST=0.0.0.0:11434"
sudo systemctl restart ollama
步骤 6:创建第一个 RAG 应用
- 「知识库」→ 新建知识库 → 上传文档(支持 PDF / Word / Markdown / TXT 等);
- 选择分段策略与索引方式(高质量 / 经济),等待向量化完成;
- 「工作室」→ 创建应用 → 选 Chatflow → 挂上刚才的知识库 → 调好 Prompt;
- 预览调试,确认能正确召回片段后再发布。
六、配置文件全部参数解释
Dify 的配置分两层,理解这一点能省很多困惑:
docker/.env:必填项,放核心配置(数据库、Redis、密钥、对外 URL);docker/envs/**:可选项,按模块拆分的模板文件(如envs/vectorstores/qdrant.env.example)。只在需要某个可选组件时才复制对应模板、去掉.example后缀再改。
读取优先级:.env 优先于 envs/*.env。
常用 URL 变量(留空时单域名 Nginx 部署可自动探测):
| 变量 | 作用 |
|---|---|
CONSOLE_API_URL |
控制台 API 对外地址,OAuth 回调要用 |
CONSOLE_WEB_URL |
控制台前端地址,邮件里的链接用它 |
APP_WEB_URL |
应用前端地址,人机交互表单用它 |
TRIGGER_URL |
外部触发器回调地址 |
FILES_URL |
文件预览的公开基地址 |
INTERNAL_FILES_URL |
容器内部访问文件的地址,可能与 FILES_URL 不同 |
如果 OAuth 回调跳到了错误地址,或者发布的应用表单里出现 localhost,基本都是这几个变量没配对。
七、对公网暴露与 HTTPS
生产环境不要直接用明文 HTTP 暴露控制台。Compose 项目自带 Nginx 与 Certbot 配置:
# 单域名 + 自动签证书
certbot --nginx -d your-domain.com
同时务必把 .env 里的对外 URL 从 IP / localhost 改成真实域名,否则生成的链接依然指向内网。
八、功能实操教程
以「把一篇文档变成可问答的知识库」为例的最小闭环:
用户提问
→ LLM 意图判断(是否需要检索)
→ 知识库检索(按向量相似度召回 top-k 片段)
→ LLM 结合上下文生成答案
→ 引用来源标注
在画布上就是「开始 → LLM → 知识检索 → LLM → 结束」四个节点连起来的线。把 Prompt IDE 里调好的提示词固化到 LLM 节点,再从「发布 → API 访问」拿到应用密钥:
curl -X POST http://your-domain.com/v1/chat-messages \
-H "Authorization: Bearer app-your-api-key" \
-H "Content-Type: application/json" \
-d '{
"inputs": {},
"query": "Dify 的向量库默认用哪个?",
"user": "user-123",
"response_mode": "blocking"
}'
这样你就拥有了一个自己托管的、可被任意后端调用的问答接口。
九、全套报错故障排查
| 现象 | 原因 | 处理 |
|---|---|---|
| 页面一直打不开 | Nginx 容器未 healthy,或宿主防火墙未放行端口 | docker compose ps 看状态,检查安全组与 ufw |
/install 进不去 |
INIT_PASSWORD 已设但你不知道 |
看 .env 里该项;也可临时清空再初始化 |
| OAuth 回调地址错误 | CONSOLE_API_URL 未配置 |
改成真实域名,并与模型供应商后台登记的回调一致 |
| 应用表单里出现 localhost | APP_WEB_URL / TRIGGER_URL 未配置 |
补齐对应域名 |
| 文件预览 404 | FILES_URL 与 INTERNAL_FILES_URL 混用 |
分别设置为浏览器可达地址与容器内可达地址 |
| 向量化任务一直失败 | 向量库容器未起或内存不足 | 确认 VECTOR_STORE 对应 profile 的容器在跑,给足 4GB+ 内存 |
| 插件安装失败 | plugin_daemon 未就绪 |
docker compose logs -f plugin_daemon 看日志 |
| 容器频繁 OOM | 内存不足 | 调大 Docker 内存,或换更轻的向量库(pgvector) |
| 改了 .env 不生效 | 未重建容器 | docker compose down && docker compose up -d |
排查顺序建议:先 docker compose ps 看容器状态,再 docker compose logs -f --tail=200 看最近日志,不要盲改。
十、升级、回滚与卸载
每次升级都要当成一次配置变更来做,Dify 官方也这样强调。标准流程:
cd dify/docker
# 1. 备份数据卷
docker compose down
sudo tar -czf ~/dify-backup-$(date +%Y%m%d).tar.gz ./volumes/
# 2. 拉取新版本代码
git pull origin main
# 或重新 clone 目标 release 标签
# 3. 比对新旧 .env.example,把新增变量补进本地 .env
# 官方提供了 dify-env-sync.sh 辅助:先做带时间戳的备份,
# 再把新增变量追加进去且不覆盖已有值——但输出仍需人工复核
# 4. 重建
docker compose pull
docker compose up -d
回滚:切回上一个 release 标签,同时把 .env 和 volumes/ 一起还原。只回滚代码不回滚数据卷,新版本写入的数据结构可能让旧版本读不了。
卸载:
docker compose down -v # -v 会删除数据卷,慎用
sudo rm -rf dify/volumes/
十一、商用许可与合规风险提示
Dify 采用的是修改版 Apache 2.0(Open Source License),除 Apache 2.0 的常规条款外,额外加了两条限制,商用前务必确认:
- 多租户限制:除非获得 Dify 官方书面授权,不能用 Dify 源码搭建多租户环境。Dify 语境下一个租户 = 一个 workspace。
- LOGO 与版权信息:使用 Dify 前端时,不得移除或修改控制台及应用中的 LOGO 与版权信息;仅使用后端 API 而不涉及前端的场景不受此限。
此外还有两条对贡献者的约定:官方可以调整开源协议的宽松/严格程度;你贡献的代码可能被用于官方商业业务(包括其云业务)。
另需注意:交互设计部分受外观设计专利(appearance patent)保护。
商用部署前建议:确认你的使用模式是否为多租户、是否对外提供 Dify 前端。这两条踩线的场景都需要走官方商业授权。
参考链接
- 官方仓库:https://github.com/langgenius/dify
- 官方文档:https://docs.dify.ai
- Docker 部署说明:https://docs.dify.ai/en/getting-started/install-self-hosted/docker-compose
- 环境变量参考:https://docs.dify.ai/en/getting-started/install-self-hosted/environment-variables
- 常见问题排查:https://docs.dify.ai/en/getting-started/install-self-hosted/common-issues
- License 全文:https://github.com/langgenius/dify/blob/main/LICENSE