简介:Dify官方安装包是从GitHub平台下载的开源软件/插件项目压缩包,面向需要快速部署Dify或进行二次开发的开发者与运维人员。压缩包共2000个文件,以Python源码为主(1337个py),配合JSON配置、CSS与JavaScript前端资源、YAML部署清单、Markdown说明文档及Shell脚本、SQL文件,覆盖后端逻辑、界面样式、环境配置与文档指引,整体约20.25MB。此类结构既便于直接安装运行,也适合阅读源码。目前已有2758人学习下载,具备一定参考热度。解压后获得Dify-main主目录,内含运行所需库文件、配置与文档,用户可参照官方指南快速安装;基于清晰的项目结构,也可了解模块划分与实现思路,为后续功能定制和排错提供便利。
1. 为什么官方安装包值得下载:先看清 Dify 到底是什么
如果你最近在折腾大模型应用,大概率听过 Dify 这个名字。它是一个开源的大模型应用开发平台,把模型接入、知识库、工作流编排、Agent 和插件全部集成在一个可视化界面里,等于免去了自己从零拼装前端、后端、向量库和评测体系的重复劳动。而你要做的,就是拿到它的官方安装包,在自有服务器上把它跑起来。
这个“官方安装包”有个容易被误解的点:它不是一个几百 MB 的大镜像压缩包,而是一套 docker-compose 编排文件、环境变量模板和部署脚本的组合,真正的镜像在启动时从镜像仓库拉取。许多第一次下载的人打开 zip 后发现“里面没有安装程序”就懵了,所以这篇笔记就把从 GitHub 下载、解压、配置、启动、避坑到验证的完整路径讲透,适合准备自托管、想完全掌控数据和运行环境的开发者。
2. GitHub 下载与 Release 包拆解:版本、目录结构与运行门槛
2.1 Release 页面怎么找、怎么选版本
Dify 的代码托管在 GitHub 上,Release 页面会把你需要的所有部署文件打包成 zip 和 tar.gz 两种格式。我的建议是优先下载 tar.gz,因为在 Linux 服务器上解压时它能保留完整权限位,后续执行脚本时不容易出现权限问题。zip 格式更通用,但偶尔会出现解压后没有可执行权限的情况。
选版本时不要盲目追最新。先去 Release 页面看发布时间和 release 说明,如果说明里写的是“daily build”或者带“rc”字样,这类版本通常不建议直接上生产;带稳定版本号的正式发布版本,部署后遇到问题也更容易在社区里找到对应解法。一个实用判断标准是:看该版本对应的 docker-compose 文件依赖的镜像 tag,镜像 tag 与 release 版本一致时,才是维护方正式推送的组合。
2.2 解压后目录结构:哪些文件是真正的部署入口
下载完成后把包传到服务器,用 tar 命令解压。下面是我在部署机上常用的第一步操作:
tar -zxvf dify-*.tar.gz cd dify-* ls -la解压后你会看到一个清晰的目录结构。其中最需要关注的是docker目录,它里面放着docker-compose.yaml和env.example。env.example是环境变量模板,你需要把它复制成.env再修改;docker-compose.yaml是服务编排入口文件。另外docker/volumes目录会在首次启动时自动创建,用于持久化数据库和向量库数据。
这里有一个容易误导新手的细节:release 包里并不包含任何容器镜像,所有镜像都是 compose 启动时动态拉取。所以下载包本身只有几 MB,全部镜像拉下来才占几个 GB。如果你在服务器上看到下载包很小而怀疑是不是官方包,这个属于正常现象,不用慌。
2.3 安装前检查:三件事没做对,后面全白费
动手部署前,先确认三件事。第一是服务器硬件,Dify 包含前后端、数据库、向量库和任务队列等多个服务,最低配建议 2 核 4G 内存,我实际部署时用 4 核 8G 才跑得比较轻松;第二是 Docker 环境,必须同时装好 Docker 引擎和 Docker Compose 插件;第三是网络,启动时要拉取多个镜像,如果拉取超时,后面所有容器都是退出状态。
检查 Docker 环境的命令如下:
docker --version docker compose version新版 Docker 已经内置 compose 子命令,输出Docker Compose version v2.x.x就说明没问题。如果你的系统还在用旧的docker-compose二进制,也可以在目录里用docker-compose替代docker compose,但配置参数写法基本一致。服务器系统建议选 Ubuntu 22.04 或 Debian 12 这类 LTS 版本,不推荐在精简版系统上直接跑,缺少系统库会导致容器内组件异常启动。
3. Docker Compose 落地部署:.env 配置与启动链路逐行拆解
3.1 从 env.example 生成 .env:哪些参数必须改
进入docker目录后,第一步是把模板复制成环境变量文件。这一步确认是整个部署的关键,很多人直接把env.example当.env用,结果密钥和端口全是默认值,要么启动报错,要么留下安全隐患。
cd docker cp env.example .env复制完成后打开.env文件,重点看下面这些参数。SECRET_KEY是核心服务之间通信的签名密钥,官方模板里是占位符,必须改成足够长的随机字符串;POSTGRES_PASSWORD和SANDBOX_PASSWORD建议一并改掉。端口映射上,默认EXPOSE_NGINX_PORT=80和EXPOSE_NGINX_SSL_PORT=443会占用宿主机的 80 和 443,如果你服务器上已经有 Nginx 或其他 Web 服务,这里一定要改。我把这套参数整理成了一张表,方便你逐项核对。
| 参数名 | 默认值 | 说明 | 我的建议 |
|---|---|---|---|
| SECRET_KEY | 占位符 | 服务间通信签名密钥 | 用随机字符串生成器生成 64 位以上 |
| EXPOSE_NGINX_PORT | 80 | Web 访问端口 | 冲突时改为 8080 等高位端口 |
| EXPOSE_NGINX_SSL_PORT | 443 | HTTPS 端口 | 暂不使用 HTTPS 可保持默认 |
| POSTGRES_PASSWORD | difyai123456 | 数据库密码 | 必须修改 |
| EXPOSE_SSH_PORT | 2222 | 沙箱 SSH 端口 | 宿主机 22 被占用时无需调整 |
3.2 启动命令与首次启动链路
配置好.env后就可以启动了,通用做法是先拉镜像再启动容器,避免up -d时卡在拉取步骤。执行下面的命令:
docker compose pull docker compose up -dpull会先拉取 compose 文件里定义的所有镜像,up -d则按依赖顺序创建并启动容器。启动是分层的:先是 PostgreSQL 和 Redis 这两个基础存储,然后是向量数据库和 Sandbox 沙箱,最后才是api、worker和web这三个核心服务。你可以用docker compose ps看所有容器状态,用docker compose logs -f api跟踪某个服务的启动日志。
首次启动最常遇到的现象是web容器已经就绪,但api容器还在等待数据库初始化。这属于正常情况,PostgreSQL 首次初始化需要十几秒,耐心等一会儿再刷新页面。如果docker compose ps显示某个容器反复重启,就需要进入下一步排查。
3.3 首次访问:确认端口映射与页面状态
启动完成后来到浏览器,访问刚才设置的端口,比如http://服务器IP:80。首次进入会要求设置管理员邮箱和密码,这个账号就是后面管理平台的总入口。有一点需要特别留意:Dify 的管理员账号初始化连接的是本地 PostgreSQL,如果你改过POSTGRES_PASSWORD,务必确认.env里和 compose 文件里引用的是同一个变量值,否则初始化会提示数据库连接失败。
如果页面一直转圈或报 502,大概率是api服务没有完全起来。这时候看一眼日志:
docker compose logs api | tail -n 50日志里出现worker started或Application startup complete之类的关键字,说明后端已经就绪。出现connection refused则说明 api 容器访问数据库或 Redis 失败,优先检查.env里的数据库密码和端口是否与 compose 文件一致。
4. 初始化接入模型与知识库:把平台变成可用状态
4.1 配置模型供应商:API Key 与 Base URL 的填写位置
平台跑起来之后,第一件事不是急着写应用,而是先把模型供应商配好。Dify 支持几十家模型服务商,但它们的接入方式可以分成两类:一类是平台原生支持的直连方式,只填 API Key 就行;另一类是兼容 OpenAI API 协议的第三方服务,需要额外填 Base URL。
我一般用兼容协议方式接入,因为它的适配度最高。在设置页面的模型供应商里选择对应的服务商,然后把 API Key 填进去。如果你的模型服务商提供的是完整接口地址,注意看 Base URL 的格式,有的需要写到/v1结尾,有的只要写到域名根路径,填错了会在调用时出现 404。判断办法很简单:用 curl 直接测一下这个地址,能返回模型列表就是对的。
4.2 创建知识库:嵌入模型与分块参数的取舍
知识库是 Dify 最常用的功能,本质是对文档做切片、嵌入向量化后存储,再在问答时检索。创建知识库时选择嵌入模型很关键,这个模型决定了文本向量的语义质量。如果只做内部资料问答,用一个中等规模的嵌入模型就够;如果文档主题差异很大,比如既有法律合同又有技术手册,建议按文档类型拆分多个知识库,检索效果比强行塞进一个库里好得多。
分块参数里最需要注意的是chunk size和overlap。我在处理混合排版 PDF 时,默认 chunk size 取 500,overlap 取 50,这样既能保留上下文关联,又不会因为块太大导致检索命中不精准。表格型文档则建议调小到 200 左右,避免大块文本把表格语义稀释掉。上传后可以在“召回测试”里直接验证某段提问能不能命中正确片段,不用等完整应用搭好再试。
4.3 用 API 验证整条链路是否打通
配置完模型和知识库,可以在控制台创建一个最简单的问答应用,然后在“访问 API”页面拿到应用密钥,用 curl 直接调一次接口,验证整条链路是否打通。
curl -X POST 'http://服务器IP/v1/chat-messages' \ -H 'Authorization: Bearer app-你的应用密钥' \ -H 'Content-Type: application/json' \ -d '{ "inputs": {}, "query": "请根据知识库回答:什么是向量数据库?", "response_mode": "blocking", "user": "tester" }'参数里Authorization的Bearer后面接的是应用专属密钥,不是管理员账号密码;response_mode用blocking表示同步等待完整回答,如果用streaming则返回流式数据。返回内容里有answer字段并且包含知识库里的信息,就说明模型接入、知识检索、应用编排三层全部正常。这一步验证好了再去做复杂的 Agent 和工作流,排查问题时能少走很多弯路。
5. 部署避坑手册:安装阶段五个高频翻车点与定位方法
5.1 端口被占用:nginx 容器起不来
现象:执行docker compose up -d后,docker compose ps里nginx容器状态是exited,日志提示address already in use。
原因:宿主机上已经有进程占用了 80 或 443 端口,最常见的是服务器预装的开源 Web 服务或云平台监控组件。
解决:先在宿主机上执行ss -tlnp | grep ':80 '找到占用进程的 PID,然后改.env里的EXPOSE_NGINX_PORT为 8080 或其他空闲端口,重新docker compose up -d。我不建议直接杀掉占用进程,因为那可能是服务器上其他业务的入口,改端口更稳妥。
5.2 web 容器 502:API 服务就绪太慢
现象:页面能打开但接口全部 502,或者打开后一直白屏转圈。
原因:web容器是纯前端静态页面,启动极快;api容器要等数据库迁移完成才能对外服务。前端先起来后请求后端,后端还没就绪就报 502。另一个原因是迁移任务卡住。
解决:执行docker compose logs api --tail 100。如果日志停在中途不再输出,常见做法是重启 api 容器等它把迁移跑完;如果有already exists之类的提示,通常是数据库用户权限问题,需要进 PostgreSQL 容器确认.env里配置的账号是否有建表权限。
5.3 模型调用返回 401:API Key 或 Base URL 拼接问题
现象:控制台上模型供应商显示“已连接”,但应用对话时返回 401 或 404。
原因:这是最典型的“配置界面不校验真实调用”的坑。Dify 的供应商连接测试可能只测到网络连通性,真正的模型请求走的是另一套地址拼接逻辑。
解决:打开模型供应商配置页,把 Base URL 末尾多带的/v1去掉再试一次,或者反过来补上/v1再试。我的经验是:一半的 401 是 Base URL 多写了路径,一半的 404 是 Base URL 少了/v1路径。改成后可以先用 curl 直接请求这个供应商接口确认,确认通了再回来填配置。
5.4 知识库索引一直 pending:向量库连通性没检验
现象:上传文档后显示“索引中”,但等了很久状态还是 pending。
原因:文档向量化任务由worker容器执行,worker 需要连接向量数据库。如果.env里向量库的地址配置成localhost或写错端口,worker 连接不上,任务永远停在等待队列里。
解决:检查.env里的向量数据库 endpoint 是否指向容器名。简单验证方式是:
docker compose exec worker sh curl -s http://向量库容器名:端口能返回响应说明 worker 到向量库的网络链路是通的,再把.env改成相同地址,重启 worker 容器即可。
5.5 升级后数据异常:volumes 没备份
现象:执行版本升级后,以前创建的应用还在,但知识库文档全部丢失或者登录后看不到旧数据。
原因:升级时执行了不规范操作,比如手动删除容器时带了-v参数,把 volumes 一起删了;或者新版本镜像与旧数据目录结构不兼容。
解决:升级前先备份整个volumes目录。我习惯在升级前执行docker compose stop而不是down,然后打包docker/volumes整个目录,确认可以回滚后再继续。升级完成如果发现数据异常,把备份的目录整个解压覆盖回去再重启,基本都能恢复。
6. 用日志与端口自检,验证 Dify 真正可用
6.1 三分钟自检清单:端口、日志、接口
部署完成后不要直接用完就撤,我习惯把下面这套自检流程从头走一遍。先确认所有容器状态正常:
docker compose ps状态栏全部是running或healthy,容器没有反复重启,说明编排层没问题。接着用ss -tlnp确认端口在监听,用curl -I http://127.0.0.1:端口验证 HTTP 响应状态码是 200 或 302。最后检查一轮日志关键字:
docker compose logs --tail 200 | grep -E "ERROR|Traceback|refused"这个命令过滤出近期所有异常记录,如果没有输出,说明各个服务之间通信正常。
6.2 升级与迁移:给后续维护留好后悔药
自托管平台最怕升级翻车,我的固定流程是:先docker compose stop,备份 volumes 目录,再docker compose pull拉新镜像,最后docker compose up -d。迁移服务器时也是同样思路,把 volumes 目录打包搬到新机器,在新机器上配好相同版本的 compose 文件和.env,解压 volumes 后直接启动,数据和应用原样保留。这套操作有一个必须遵守的顺序:先恢复数据,再启动新容器。
从那以后,我每次部署完 Dify 都会强制走一遍自检清单,确认端口通、日志干净、接口能返回数据才敢交付。这个习惯在之后的无数次迭代升级里帮我避开了不少损坏风险。希望这篇拆解能帮你把这套平台顺利跑起来,少走我当年反复重启容器的弯路。
本文还有配套的精品资源,点击获取