简介:Dify官方安装包是从GitHub获取的开源项目主体压缩包,面向需要本地部署或二次开发Dify的开发者及运维人员,提供完整可安装的程序核心。包体约20.25MB,总计2000个文件,其中1337个Python文件构成服务端核心逻辑,366个JSON与32个YAML分别承载配置项与容器编排声明,116个CSS与84个JS组成可自定义的Web前端资源,另有38个Markdown说明文档和12个Shell脚本方便查阅与快速启动,文件类型覆盖从代码到部署的完整链路。目前已有2758人学习下载,适合具备基础Linux或容器使用经验的用户。解压后dify-main目录内主程序、静态资源与文档分区清晰,可依据指南快速完成安装;对于需要定制功能或研究源码的开发者,也能直接定位核心模块,显著节省环境搭建与排错时间。
1. 先把 Dify 安装包这件事讲透:GitHub 官方仓库能给你什么
很多人一搜 Dify 安装包,第一反应是去到处找打包好的压缩包、某某网盘链接。实际用下来你会发现,官方在 GitHub 上维护的安装包才是最可控的形态——它不是一个 zip,不是一键安装脚本,而是一整套 Docker Compose 编排文件和配置模板。你能拿到最新版本、能看历史 Release、能 diff 升级改动,出问题还能翻 issue。这篇文章我按自己真实部署的经验,把从 GitHub 拉取 Dify 官方安装包到启动、调参、避坑的完整路径写出来,适合自己有一台 Linux 服务器或本地 Docker 环境、想快速跑起一个可用的 LLM 应用开发平台的开发者。
2. 安装形态与选型:为什么 Docker Compose 是官方主推路线
2.1 所谓“官方安装包”,其实是一套服务编排文件
我第一次拉 Dify 仓库的时候也愣了一下:没有常见的 install.sh,没有预编译二进制,docker 目录下就是一份 docker-compose.yaml、一个 .env.example 和一堆子目录。这套东西把平台拆成了六个左右的容器在跑:API 服务、Worker 异步任务、Web 前端、PostgreSQL 数据库、Redis 缓存、向量数据库(默认用 Weaviate,也可以换 Qdrant 或 Milvus)。每个服务各自一个镜像,没有谁去“包含”谁。
这种形态的好处是用容器隔离掉运行时环境差异。你在自己机器上能跑,换一台新服务器,只要 Docker 装好了,配置一丢就能复现。它不像“一键安装脚本”那样黑匣子式地帮你把环境改了,而是把主动权交给你:端口占不占、存储卷放哪、数据库要不要换,全部通过 .env 文件显式控制,可审计、可回滚。
2.2 为什么不是源码裸跑或单文件部署
先说说源码裸跑。Dify 后端是 Python 写的,依赖一堆,涉及数据库迁移、Celery 任务队列、前端静态资源构建。裸跑意味着你要自己处理 Python 虚拟环境、npm build、Postgres 初始化、Redis 版本兼容,这些环节任何一个版本对不上,排查成本都不低。我一般不会在生产环境用源码裸跑,Docker Compose 方案最大的价值是把这套复杂度封装进了编排文件,容器间的网络、启动顺序、数据卷都由 Compose 管理,你只需要关心业务配置。
至于单文件部署,Dify 官方没有提供这种形态的安装包,社区有人封装过,但跟踪官方更新很被动。所以我的选型结论很直接:官方 Git 仓库 + Docker Compose 是最适合跟版本、最不容易走到死胡同的路径。你要做的不是“装一个包”,而是“把官方仓库拉到本地,按需改 .env,然后 compose up”。
2.3 目录结构与部署前的理解成本
docker 目录下面是这样的核心结构:docker-compose.yaml 定义所有服务;.env.example 是环境变量模板;volumes 目录里按服务区分了数据存储位置。另外还有一个 docker-compose.yaml 的横向扩展配置(用于多节点部署)。初次部署只需要关注基础版的 compose 文件就够了。
提示:从 GitHub 拉取的仓库里,docker 目录才是部署入口。别在仓库根目录直接敲 docker compose 命令,根目录没有编排文件。
3. 从 GitHub 拉取官方安装包:三分钟拿到干净配置
3.1 先确认环境:硬件与 Docker 版本的底线
动手前先把环境确认了,省得后面一脸懵。最低配置我是按 2 核 4G 内存来卡的——这是能把服务启动起来并做一个简单应用的下限;想要跑 RAG 这类偏重的场景,建议 4 核 8G 起。Docker Engine 要 19.03 以上,Docker Compose 建议用 v2 语法(docker compose 命令,而不是老掉牙的 docker-compose)。这两点不过关,后面所有步骤都白搭。
照这个命令确认一下环境:
docker --version docker compose version free -h先看 docker --version 输出,比如 20.10.x 以上都行;docker compose version 输出第二行有版本号,v2 开头就没问题。free -h 看内存,注意看 available 那一列,别盯着 total 看——有些机器内存被其他进程吃了,available 低于 3G 跑 Dify 会明显吃力。
3.2 拉取仓库并进入部署目录
安装包不用去 Release 页面下 zip,直接 git clone 拉仓库效率更高,还能看到 .git 历史,以后升级 diff 方便。用 --depth 1 只拉最新一层历史,省流量也省时间:
git clone --depth 1 https://github.com/dify/dify.git cd dify/docker ls -la这里 --depth 1 的意思是只克隆最新的 commit,不要完整历史。初次部署不需要历史记录,仓库体积能小不少。进入 docker 目录后你应该能看到 docker-compose.yaml、.env.example、volumes 这三个关键对象。看到这些,说明仓库拉对了。
如果你拉取时网络很慢或者中断,检查一下是不是代理环境变量干扰了 git 操作,或者是本地网络对 GitHub 的连通性差。常见做法是用镜像加速地址,但注意镜像源要选可信的,别随便抄一个第三方加速地址就往里填,容易把人带沟里。
3.3 初始化 .env:真正“属于你”的配置文件
.env.example 是模板,你不能直接拿它启动。每一次部署都要复制一份 .env,然后至少把 SECRET_KEY 换掉。这个 key 是用来给 session、token 做签名用的,在线上环境如果所有人都用同一个默认 key,等于给攻击者留了后门。
cp .env.example .env openssl rand -base64 42openssl rand -base64 42 生成一串随机字符,把它复制出来,然后用编辑器把 .env 里的 SECRET_KEY= 改成你自己生成的那串。42 长度是社区里比较常用的值,足够长且不会因为超长触发行尾解析问题。如果你不想手动编辑,也可以用 sed 一行搞定,但新手我建议手动看一下改了哪一行,至少知道 .env 长什么样。
这一步非常关键。很多人第一次启动后 api 容器反复重启,一看日志写着 SECRET_KEY is missing,就是因为这里没设置。.env 里的其他配置项先不用动,默认值能覆盖本地部署的绝大多数情况。
4. 启动与环境变量调参:把服务跑起来再接入模型
4.1 第一次启动:docker compose up 的正确姿势
环境准备好之后就可以启动了。注意 Dify 第一次启动会去 Docker Hub 拉六七个镜像,耗时取决于网络,几分钟到十几分钟都是正常的。建议前台跑第一次,能直接看到日志输出:
docker compose up -d docker compose ps-up -d 表示后台运行,但第一次我建议先不加 -d,直接 docker compose up 看滚动日志,等所有服务都稳定运行了再 Ctrl+C,然后重新 docker compose up -d 切到后台。这样比直接后台启动后发现问题再翻日志要直观。
docker compose ps 看所有容器的状态,全部是 running 或 healthy 才算启动成功。如果有 restarting 状态的容器,说明某个服务崩了,最常见的是 api 或 worker,这时候要拉日志看原因,别急着刷新网页。等所有服务都起来了,浏览器访问 http://localhost/ 就能看到初始化页面,设置管理员账号密码,完事进入主界面。
4.2 端口冲突与数据目录:最常见的两个自定义项
很多人的服务器上 80 端口已经被 Nginx 或者其他 Web 服务占了,这时候要改映射端口。Dify 的端口控制分两处,很多人只改了 NGINX_PORT 没改 EXPOSE_NGINX_PORT,结果还是冲突。我一般这样改:
# .env 里修改 EXPOSE_NGINX_PORT=8080 NGINX_PORT=80EXPOSE_NGINX_PORT 是宿主机实际映射出去的端口,NGINX_PORT 是容器内部 Nginx 监听的端口。所以改成上面这样之后,访问地址是 http://localhost:8080/,而不是 80。改完 .env 后要重启才生效,不能只 docker compose restart,要 docker compose down 再 up,因为 Compose 是在创建容器时读取端口配置的。
数据目录默认挂在 docker/volumes 下,分别是 postgres、redis、storage 这些子目录。如果你服务器磁盘紧张,或者想把数据放在独立数据盘上,可以在 .env 里改 VOLUME_DIR 指向新的路径。改之前先把旧数据迁移过去,不然容器一启动发现目录空的,会重新初始化一套空库。
4.3 接入模型 API:让平台真正“有脑子”
Dify 本身不带模型,你要连一个 LLM 服务商才能创建应用。现在主流做法是找一家提供 OpenAI 兼容接口的服务商,或者用各类国产大模型的 API。在 Dify 界面左侧点“设置”,找到“模型供应商”,填 API Key 即可。有的模型还需要填 Base URL,格式类似 https://api.example.com/v1。
也可以提前在 .env 里预置,但不建议第一次就这么做——界面上配错了能直接看到报错详情,配 .env 反而多一层排查成本。我一般先在界面上配通一个模型,确认对话正常,再考虑要不要固化成环境变量。
4.4 核心环境变量速查表
部署和调参过程中用得最多的变量就这几个,列个表方便对照:
| 变量名 | 作用 | 改完需要重启方式 |
|---|---|---|
| SECRET_KEY | 签名与加密密钥,必须改为随机值 | down 后 up |
| EXPOSE_NGINX_PORT | 宿主机对外端口 | down 后 up |
| NGINX_PORT | 容器内 Nginx 监听端口 | down 后 up |
| VOLUME_DIR | 数据卷宿主机路径 | down 后 up |
| POSTGRES_PASSWORD | 数据库密码,默认自动生成 | down 后 up |
这些变量修改后都必须 docker compose down && docker compose up -d 才会重新读入,restart 不会重新加载 .env。
5. 安装避坑记录:五个我踩过的启动报错
5.1 初始化与镜像相关的坑
坑一:docker compose up 后 api 容器无限重启,日志提示 SECRET_KEY is missing。
现象是 docker compose ps 里 api 状态永远是 restarting,日志大段报错。原因很简单:直接拿 .env.example 当 .env 用了,SECRET_KEY 是空的。解决方法是按 3.3 节的步骤生成随机 key 写入 .env,然后 down 再 up。这个坑太经典了,我身边不止一个同事翻过车。
坑二:拉镜像速度极慢,甚至卡在某一层不动。
现象是 docker compose up 输出停在 pulling 某个镜像,半天不动。原因是 Docker Hub 在国内网络环境下访问不稳定,这是比较常见的状况,不是配置问题。解决方式是给 Docker 配置一个可用的镜像加速地址,改 /etc/docker/daemon.json 后 systemctl restart docker。选加速地址时只认官方渠道或大厂正式公告的地址,别随手抄网上的,免得出信任问题。
坑三:首次访问页面 502,但容器全是 running。
现象是页面能打开,但请求 API 时报 502,或者提示数据库连接失败。原因是数据库容器和 API 容器启动顺序竞争——Compose 只会保证启动顺序,不保证数据库初始化完成。解决方法是等:看 db 容器日志,出现 database system is ready to accept connections 再刷新页面。不要急着重启容器,重启反而打断初始化。
5.2 配置与升级阶段的坑
坑四:改了 EXPOSE_NGINX_PORT 后访问仍走 80。
现象是你明明把 .env 改成 8080 了,但访问 80 还是通,8080 也通,很迷惑。原因是旧容器没删干净,docker compose restart 不会把端口配置重写。解决方法是 docker compose down 确认容器全部移除,再 docker compose up -d,docker compose ps 里看端口映射是不是变成 0.0.0.0:8080->80/tcp 了。从那以后我每次改端口都强制 down。
坑五:升级后页面打开是 502,API 日志全是 relation does not exist。
现象是 git pull 拉到新版本后直接 docker compose up -d,结果报数据库表缺失。原因是版本升级带了数据库 schema 变更,需要跑迁移脚本。解决方法是执行 docker compose exec api flask db upgrade,等待迁移完成再刷新页面。这个动作在官方 Release 说明里通常会写,但很容易被忽略。
提示:只要 Dify 版本跨了二次开发都不建议硬跳,升级前先看 GitHub 上 Release 说明有没有标注 breaking changes,再决定是直接拉最新还是先升到中间版本。
6. 收尾技巧:升级与备份的固定动作
升级这件事,很多人的习惯是看到新版本就直接改代码、直接重启,但在带数据库和向量库的平台上,这很容易翻车。我后来养成的固定动作用一个脚本记录了下来,核心是三条:先备份再升级、升级必须跑迁移、备份不能用 docker 热拷贝。
备份的正确姿势是先 docker compose down 停掉所有容器,再把整个 volumes 目录打包。因为 Postgres 在运行状态下的数据文件直接拷贝是危险操作,文件系统级不一致会导致数据损坏,这不是玄学,是数据库本身的一致性要求。
docker compose down tar -czvf dify_backup_$(date +%Y%m%d).tar.gz volumes/备份文件要跟项目代码分开存放,至少丢到另外一块磁盘上。恢复的时候先 docker compose up -d 让数据库初始化,然后 down 掉,用备份解压出的 volumes 覆盖当前 volumes,再 up。顺序错一步,恢复完就会各种怪问题。
升级路径上是这样走的:先去 GitHub 上看 Release 页面,确认新版本相对当前版本有没有数据库迁移需求,然后在 docker 目录下 git pull 拉代码,接着 docker compose pull 拉新镜像,最后 docker compose up -d。起来之后立刻看 api 容器日志,如果提示需要迁移就执行 docker compose exec api flask db upgrade。这个过程我每次部署新环境都强制走一遍,哪怕只差一个小版本,也不敢省掉迁移检查这一步。GitHub 上安装包的意义就在这——你能清晰看到每次升级改了什么,知道自己在跑哪个版本,心里有底,希望帮到你。
本文还有配套的精品资源,点击获取