Dify本地部署完整教程:Docker与Git配置指南
在AI应用开发日益普及的今天,越来越多开发者希望快速搭建一个支持大模型(LLM)调用、Agent编排和RAG能力的可视化平台。Dify正是为此而生——它不仅开源、功能完整,还通过容器化设计实现了极高的可移植性。对于想在本地快速验证想法或进行二次开发的技术人员来说,基于Docker的本地部署是最高效的选择。
但实际操作中,不少用户卡在了环境准备阶段:镜像拉取超时、端口冲突、数据库初始化失败……这些问题看似琐碎,却足以打断整个部署流程。本文将带你从零开始,一步步完成Dify的本地部署,并重点解决那些“明明按文档做了却还是不行”的典型问题。
环境准备:让工具真正为你所用
要跑起Dify,核心依赖两个工具:Docker和Git。它们不是简单的安装即可,而是需要根据本地系统特性做适当调整,才能确保后续流程顺畅。
Docker 安装不只是点“下一步”
Dify由多个微服务组成,包括Web前端、API后端、数据库、缓存和消息队列等,这些都通过Docker容器运行。因此,Docker不仅是推荐工具,更是必需品。
Windows用户的特殊挑战
如果你使用的是Windows,安装Docker Desktop时会遇到一个关键提示:“WSL 2 is not enabled” 或 “Hyper-V unavailable”。这并非警告,而是硬性要求。Docker Desktop for Windows依赖于Windows Subsystem for Linux 2(WSL2)或Hyper-V来提供Linux运行环境。
解决方法很简单但容易被忽略:
- 打开「控制面板」→「程序」→「启用或关闭Windows功能」
- 勾选以下两项:
- ✅ Hyper-V
- ✅ Windows Subsystem for Linux - 点击确定并重启电脑
⚠️ 即使你已经安装过WSL1,也必须手动升级到WSL2。可通过命令
wsl --set-default-version 2设置。
完成这一步后,再启动Docker Desktop才会成功。首次启动可能需要几分钟时间初始化引擎。
别让海外镜像拖慢你的节奏
默认情况下,Docker会从registry-1.docker.io拉取镜像。但对于国内用户而言,这个地址往往响应缓慢甚至超时。尤其是在拉取langgenius/dify-api:latest这类大型镜像时,等待数分钟却最终失败的情况屡见不鲜。
解决方案是配置国内镜像加速器。主流云厂商如DaoCloud、阿里云都提供了免费的公共镜像代理服务。
操作路径如下:
- 右键任务栏Docker图标 → Settings → Docker Engine
- 修改JSON配置,在根节点添加:
"registry-mirrors": [ "https://docker.m.daocloud.io", "https://docker.hlmirror.com", "https://mirror.baidubce.com" ]保存后点击Apply & Restart。重启完成后,执行docker info,你会看到类似输出:
Registry Mirrors: https://docker.m.daocloud.io/ https://docker.hlmirror.com/这意味着所有后续的docker pull请求都会优先走这些镜像站,下载速度通常能提升5倍以上。
💡 实测建议优先使用
daocloud.io的镜像源,其同步频率高且稳定性强,尤其适合拉取较新的Dify版本镜像。
Git 配置中的几个关键选择
Git的作用看似简单——克隆代码。但在安装过程中有几个选项直接影响你后续能否顺利更新项目或提交自定义修改。
安装时的关键决策点
在Git for Windows安装向导中,有两处设置尤为重要:
PATH环境集成
- 推荐选择:Git from the command line and also from 3rd-party software
- 原因:这样可以在PowerShell、CMD以及VS Code终端中直接使用git命令,避免“’git’ is not recognized”的尴尬。行尾换行符处理
- 推荐选择:Checkout Windows-style, commit Unix-style line endings
- 原因:Dify项目主要在Linux环境下开发,其脚本文件使用LF(\n)作为换行符。若你在Windows上检出时保留CRLF(\r\n),可能导致某些Shell脚本执行异常。
此外,勾选“Enable credential helper”也很实用。它可以记住你的GitHub账号密码(或Token),避免每次拉取都要重新输入。
验证安装是否到位
打开Git Bash(不要用CMD),执行:
git --version正常应返回类似:
git version 2.40.1.windows.1同时建议立即设置全局用户名和邮箱,否则在本地修改代码时会报错:
git config --global user.name "your-name" git config --global user.email "your-email@example.com"这两项信息虽不影响部署,但在未来参与社区贡献或调试源码时必不可少。
开始部署:从克隆到运行
当Docker和Git都准备就绪后,真正的部署之旅才刚刚开始。
获取最新源码
确保当前目录是你希望存放项目的路径,然后执行:
git clone https://github.com/langgenius/dify.git克隆完成后会生成一个dify文件夹,进入其Docker部署子目录:
cd dify/docker这里包含了所有与容器化部署相关的资源:
docker-compose.yml:定义了7个服务的启动规则.env.example:环境变量模板init.d/:数据库初始化脚本
正确配置你的运行环境
复制示例配置为正式文件:
# 在CMD中 copy .env.example .env # 在PowerShell中 Copy-Item .env.example .env打开.env文件,重点关注以下几个参数:
| 参数 | 建议值 | 说明 |
|---|---|---|
COMPOSE_PROJECT_NAME | dify | 所有容器将以该名称为前缀,便于管理 |
WEB_PORT | 3000 | 对外访问端口,可改为3001避免冲突 |
API_PORT | 5001 | API服务监听端口 |
DB_PASSWORD | 自定义强密码 | 强烈建议修改,默认值存在安全隐患 |
其他参数如Redis密码、JWT密钥等也可根据安全需求调整,但本地测试阶段保持默认即可。
启动服务:见证容器逐个就位
一切准备就绪,现在可以启动整套系统了。
先确认Compose版本
Docker Compose经历了V1到V2的重大重构。新版命令为docker compose(无连字符),旧版为docker-compose(带连字符)。两者语法兼容,但调用方式不同。
检查当前版本:
docker compose version只要显示v2.x以上,就可以统一使用新语法。
拉取并启动容器
执行一键启动命令:
docker compose up -d首次运行将自动拉取以下镜像:
nginx:alpine:轻量级反向代理,处理静态资源和路由转发postgres:15:持久化存储应用数据和用户信息redis:7-alpine:支撑任务队列和会话缓存langgenius/dify-api:latest:核心逻辑层,处理Prompt执行、Agent调度等langgenius/dify-web:latest:React前端界面
⏱️ 首次拉取耗时约5~15分钟,取决于网络状况。请耐心等待,期间不要中断。
你可以通过以下命令实时查看进度:
docker compose logs -f当看到类似日志时表示服务已就绪:
dify-nginx-1 | 172.18.0.1 - - [10/Apr/2025:08:23:45 +0000] "GET / HTTP/1.1" 200 1234检查服务状态
任何时候都可以用这条命令查看各容器运行情况:
docker compose ps理想输出如下:
NAME SERVICE STATUS PORTS dify-api-1 api running 5001/tcp dify-web-1 web running 0.0.0.0:3000->80/tcp dify-db-1 db running 5432/tcp dify-redis-1 redis running 6379/tcp dify-nginx-1 nginx running 0.0.0.0:80->80/tcp只要所有状态都是running,说明基础架构已稳定运行。
初始化与访问:打造属于你的AI开发平台
容器跑起来了,但Dify还没有初始化数据表结构,也无法登录。接下来需要完成最后一步引导配置。
进入安装向导
打开浏览器,访问:
👉 http://localhost/install
页面会引导你完成三项设置:
- 输入管理员邮箱(用于接收系统通知)
- 设置管理员密码(务必使用高强度组合)
- 系统自动检测数据库连接状态
提交后,后台将执行一系列SQL迁移脚本,创建所需的表结构(如apps、datasets、workflows等),并插入初始用户记录。
🕐 整个过程约需30秒,请勿刷新页面。
完成后页面会自动跳转至登录页。
登录并探索Dify
访问主界面:
👉 http://localhost
使用刚才设置的账号登录,你会看到Dify的主控台,包含:
- 应用管理中心:创建文本生成、Agent、聊天机器人等
- 数据集模块:上传PDF/TXT构建知识库,支持分段与向量化
- 模型管理:接入OpenAI、Anthropic、通义千问、百川、星火等主流模型API
- 日志监控:查看每次调用的输入输出、延迟与成本统计
此时你已拥有一个功能完整的本地AI应用开发环境。无论是做原型验证、教学演示,还是私有化部署测试,都可以立即开始。
常见问题实战排查
即便严格按照步骤操作,仍有可能遇到各种“意外”。以下是我们在真实部署中总结出的四大高频问题及其解决方案。
问题一:镜像拉取失败,总是timeout
现象描述:
Error response from daemon: Get "https://registry-1.docker.io/v2/...": net/http: request canceled这是最典型的网络问题。即使你配置了镜像加速器,也可能因为未正确重启Docker而导致设置未生效。
解决流程:
- 再次进入Docker Engine设置,确认
registry-mirrors已填写 - 点击Apply & Restart
- 重启后执行:
docker system prune -f docker compose down docker compose up -d🔍 技巧:可用
docker pull langgenius/dify-api:latest单独测试某个镜像是否能拉下。
问题二:端口被占用导致启动失败
错误信息:
listen tcp 0.0.0.0:3000: bind: address already in use常见原因包括:
- 已运行另一个Node.js项目
- 上次部署未完全关闭Dify
- 使用了相同端口的其他Web服务
应对策略:
- 查看占用端口的进程:
netstat -ano | findstr :3000记下PID,去任务管理器结束对应程序。
- 或直接修改
.env文件:
WEB_PORT=3001 API_PORT=5002然后重建服务:
docker compose down docker compose up -d之后访问 http://localhost:3001/install
问题三:数据库连接拒绝或表不存在
典型日志:
psql: could not connect to server: Connection refused relation "tenants" does not exist这通常是由于PostgreSQL容器未能完成初始化,或者旧数据卷残留导致。
终极解决办法:
彻底清除旧数据:
docker compose down -v⚠️ 注意:-v参数会删除所有命名卷(named volumes),包括之前创建的用户和应用数据,请提前备份重要信息。
然后重新启动:
docker compose up -d系统将重新创建干净的PostgreSQL实例,并从头执行初始化脚本。
问题四:页面空白或502 Bad Gateway
表现形式:
- 浏览器白屏
- Nginx返回502错误
-/health接口无法访问
这说明Nginx无法代理到上游服务(API或Web)。
排查顺序:
- 检查所有容器是否运行:
docker compose ps如果api或web处于exited状态,查看其日志:
docker compose logs api- 测试API健康接口:
curl http://localhost:5001/health预期返回:
{"status":"ok"}若无法访问,说明API服务未正常暴露端口。
- 若仍无效,尝试全面清理重建:
docker compose down -v docker system prune -f docker compose up -d这套“三连击”几乎能解决90%以上的疑难杂症。
写在最后:你的AI开发旅程由此开启
Dify的强大之处在于,它把复杂的LLM工程链路封装成了可视化的操作界面。你不再需要手写繁琐的Prompt模板、手动管理Embedding流程、或是编写Agent的状态机逻辑。只需几次点击,就能构建出具备记忆、检索和决策能力的智能体。
更重要的是,本地部署意味着你对数据拥有绝对控制权。无论是企业内部的知识问答系统,还是涉及敏感信息的自动化流程,都可以在完全隔离的环境中运行,无需担心数据外泄。
当你顺利完成这次部署,其实已经迈过了最大的门槛。接下来可以尝试:
- 使用Prompt编排功能设计一个多轮对话流程
- 上传一份公司产品手册PDF,构建专属知识库
- 接入国产大模型API(如通义千问、百川),实现全链路国产化
- 调用Dify提供的REST API,将其嵌入到现有业务系统中
技术的进步从来不是为了增加复杂度,而是为了让创造变得更简单。而现在,这个工具已经在你手中。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考