在 Windows 环境下,想要体验或开发基于大语言模型的应用,Dify 是一个极具吸引力的选择。它提供了一个直观的可视化界面,让开发者无需深入底层代码,就能通过拖拽和配置的方式,构建复杂的 AI 工作流,例如智能客服、内容生成或数据分析助手。然而,Dify 官方文档虽然详尽,但其部署流程涉及 Docker、WSL 等多个组件,对于初次接触的 Windows 用户来说,从环境准备到最终访问,每一步都可能遇到意想不到的“坑”。本文将扮演你的技术向导,带你从零开始,在 Windows 系统上,基于 Docker 完成 Dify 的本地部署。我们会详细解释每一步操作的目的,提供清晰的命令和配置,并重点梳理那些容易导致部署失败的常见问题及其排查路径。完成本文的实践后,你将拥有一个运行在本地的、功能完整的 Dify 开发环境。
1. 理解部署架构与环境准备
在动手之前,我们需要理解 Dify 在 Docker 下的运行原理,并准备好一个正确配置的 Windows 环境。这是后续所有步骤的基础,环境配置不当是导致部署失败最常见的原因。
1.1 Dify 的 Docker 架构概览
Dify 并非一个单一的应用,而是一个由多个微服务组成的复杂系统。当使用 Docker Compose 启动时,它会拉起一系列容器,协同工作。理解这些组件有助于后续的排错。
- 核心服务容器:
api:提供后端 RESTful API,是业务逻辑的核心。web:提供前端用户界面,我们通过浏览器访问的就是它。worker:异步任务处理单元,负责执行耗时较长的 AI 模型推理等任务。worker_beat:定时任务调度器,负责触发周期性的任务。plugin_daemon:插件守护进程,管理扩展功能。
- 依赖组件容器:
db_postgres:PostgreSQL 数据库,存储应用数据、用户信息、工作流配置等。redis:缓存和消息队列,用于提升性能和协调服务间通信。weaviate:向量数据库,用于存储和检索文本的向量嵌入,是实现语义搜索、记忆等功能的关键。nginx:反向代理服务器,处理外部 HTTP/HTTPS 请求并分发到前端或后端服务。sandbox:代码沙箱环境,安全地执行用户自定义的 Python 代码块。ssrf_proxy:安全代理,防止服务端请求伪造攻击。
这些容器通过 Docker 网络相互连接,构成一个完整的应用生态。我们的目标就是在 Windows 上,通过 Docker Desktop 来管理和运行这一整套服务。
1.2 Windows 环境准备清单
由于 Docker 原生运行在 Linux 内核上,在 Windows 上我们需要借助 Windows Subsystem for Linux 2 (WSL 2) 来提供一个兼容的 Linux 环境。请严格按照以下清单检查和操作。
第一步:启用 WSL 2WSL 2 是必须的,它提供了更好的性能和对 Docker 的完整支持。
- 以管理员身份打开 PowerShell。
- 运行以下命令启用 WSL 功能并安装默认的 Linux 发行版(通常是 Ubuntu)。
# 启用适用于 Linux 的 Windows 子系统 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart # 启用虚拟机平台功能 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart - 重启计算机。这一步至关重要,否则后续步骤可能失败。
- 重启后,再次以管理员身份打开 PowerShell,将 WSL 2 设置为默认版本。
wsl --set-default-version 2 - 安装一个 Linux 发行版。可以从 Microsoft Store 搜索并安装 “Ubuntu”,或者在 PowerShell 中运行
wsl --install -d Ubuntu。
第二步:安装 Docker Desktop for Windows
- 访问 Docker 官网,下载 Docker Desktop for Windows 安装程序。
- 安装过程中,确保勾选 “Use WSL 2 instead of Hyper-V” 选项。安装完成后,再次重启计算机。
- 启动 Docker Desktop。首次启动时,它可能会提示你同意服务条款并完成一些初始配置。
- 验证安装:打开 PowerShell 或 WSL 终端,运行
docker --version和docker compose version。确保docker compose版本至少为 2.24.0。如果只显示docker-compose(带横杠) 且版本较低,需要更新 Docker Desktop。
第三步:配置 Docker 资源与镜像加速Dify 启动多个容器,对资源有一定要求。
- 右键点击系统托盘中的 Docker 鲸鱼图标,选择 “Settings”。
- 在 “Resources” -> “WSL Integration” 中,确保你安装的 Linux 发行版(如 Ubuntu)已启用集成。
- 在 “Resources” -> “Advanced” 中,建议将 CPU 核心数设置为至少 4,内存设置为至少 8GB。这能保证 Dify 所有服务流畅运行。
- 在 “Docker Engine” 配置中,可以添加国内镜像加速器地址以提升拉取镜像的速度。将以下配置添加到
registry-mirrors数组中(注意 JSON 格式):
点击 “Apply & Restart” 使配置生效。{ "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ] }
完成以上三步,你的 Windows 开发环境就已经为运行 Dify 做好了准备。
2. 获取 Dify 源码与启动服务
环境就绪后,我们将进入具体的部署操作。这一步的核心是使用 Git 获取代码,并通过 Docker Compose 一键启动所有服务。
2.1 克隆 Dify 源代码
官方推荐克隆特定发布版本,以确保稳定性。我们将在 WSL 的 Linux 环境中进行操作。
- 打开 “Ubuntu” 或你安装的其他 WSL 发行版。
- 选择一个合适的工作目录,例如家目录
~或/mnt/c/Users/YourName/Desktop(后者对应你的 Windows 桌面,方便文件交互)。 - 执行克隆命令。以下命令会自动获取最新的稳定版标签。
如果系统提示未安装# 克隆最新发布版本的代码 git clone --branch "$(curl -s https://api.github.com/repos/langgenius/dify/releases/latest | jq -r .tag_name)" https://github.com/langgenius/dify.gitjq工具,可以先安装它:sudo apt update && sudo apt install -y jq。 如果网络原因导致克隆缓慢或失败,也可以直接指定一个已知版本,例如:git clone --branch v1.10.1 https://github.com/langgenius/dify.git - 克隆完成后,进入
dify/docker目录,这是所有 Docker 部署相关文件的所在地。cd dify/docker
2.2 配置环境变量并启动容器
Dify 通过环境变量文件.env来控制基础配置。我们需要从模板创建它。
复制环境变量示例文件:
cp .env.example .env此时,
dify/docker目录下会生成一个.env文件。对于首次本地部署,通常不需要修改这个文件。它已经包含了本地开发所需的基本配置,如数据库密码、服务端口等。注意:
.env文件包含敏感信息(如数据库密码),请不要将其提交到版本控制系统。.gitignore文件通常已将其忽略。在启动前,最后确认一下 Docker Compose 版本:
docker compose version确保输出版本号 >= 2.24.0。
使用 Docker Compose 启动所有服务。
-d参数表示在后台运行。docker compose up -d这个命令会执行以下操作:
- 读取
docker-compose.yml文件。 - 从 Docker Hub 拉取所需的镜像(首次运行耗时较长)。
- 创建 Docker 网络和卷(用于持久化数据)。
- 按依赖顺序启动第 1.1 节中提到的所有容器。
- 读取
观察启动日志。命令执行后,你会看到类似下面的输出,显示每个容器的创建和启动状态:
[+] Running 13/13 ✔ Network docker_ssrf_proxy_network Created 10.0s ✔ Network docker_default Created 0.1s ✔ Container docker-sandbox-1 Started 0.3s ✔ Container docker-db_postgres-1 Healthy 2.8s ✔ Container docker-web-1 Started 0.3s ... (其他容器)所有容器状态最终应为
Created或Started,数据库等健康检查通过后显示Healthy。
2.3 验证服务运行状态
启动命令完成后,并不意味着所有服务都已就绪。我们需要检查容器的运行状态。
使用以下命令查看所有容器的详细状态:
docker compose ps理想的输出应如下所示,所有容器的
STATUS一栏显示为 “Up” 一段时间,并且健康服务显示为 “healthy”:NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS docker-api-1 langgenius/dify-api:1.10.1 "/bin/bash /entrypoi…" api 2 minutes ago Up 2 minutes 5001/tcp docker-db_postgres-1 postgres:15-alpine "docker-entrypoint.s…" db_postgres 2 minutes ago Up 2 minutes (healthy) 5432/tcp docker-nginx-1 nginx:latest "sh -c 'cp /docker-e…" nginx 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp ... (其他容器)关键点:
docker-nginx-1的PORTS列显示0.0.0.0:80->80/tcp,这表示宿主机的 80 端口已映射到 Nginx 容器的 80 端口。db_postgres和redis等依赖服务的状态应为healthy。如果长时间处于starting或unhealthy,则部署可能有问题。
如果发现某个容器状态异常(如
Exited),需要查看其日志来定位问题:# 查看所有容器的最近日志 docker compose logs # 查看特定容器(如 api)的日志 docker compose logs api # 持续跟踪某个容器的日志输出 docker compose logs -f worker日志是排错的第一手资料。
3. 初始化访问与基础配置
当所有容器都正常运行后,我们就可以通过浏览器访问 Dify 了。首次访问需要进行管理员初始化。
3.1 完成管理员账户初始化
- 打开你的 Windows 浏览器(如 Chrome, Edge)。
- 在地址栏输入
http://localhost或http://127.0.0.1。 - 如果一切正常,你将被重定向到
http://localhost/install初始化页面。如果直接看到了登录页,说明系统已初始化过,请跳至 3.2 节。 - 在初始化页面,你需要设置:
- 管理员邮箱:用于登录的账号。
- 管理员密码:请设置一个强密码并妥善保管。
- 确认密码:再次输入密码。
- 点击 “初始化” 按钮。系统会进行数据库迁移等初始化操作,稍等片刻。
- 初始化成功后,页面会自动跳转到登录界面
http://localhost。
3.2 登录并探索 Dify 界面
- 使用刚才设置的管理员邮箱和密码登录。
- 登录后,你将进入 Dify 的主控制台。在这里,你可以:
- 创建应用:选择“对话型”或“文本生成型”应用模板。
- 配置模型:在“模型供应商”设置中,接入 OpenAI、Azure OpenAI、 Anthropic Claude 或本地部署的模型(如通过 Ollama)。
- 构建工作流:使用可视化工具编排提示词、上下文处理、条件分支等节点。
- 发布与集成:将应用发布为 API 或 Web 聊天窗口。
至此,Dify 已经在你的 Windows 本地成功部署并可以访问。但部署成功只是第一步,要让 Dify 真正为你所用,还需要进行一些关键配置。
3.3 关键环境变量配置(可选但重要)
虽然默认的.env文件能让服务跑起来,但生产或深度使用时,你可能需要修改配置。所有配置都通过环境变量管理,主要涉及两个位置:
基础配置 (
docker/.env):此文件优先级最高,包含数据库连接、Redis 连接、密钥等核心设置。除非必要,不建议直接修改此文件,因为它是从.env.example复制来的,未来升级时可能会被覆盖。如需修改,请做好备份。# 查看当前 .env 内容 cat .env # 使用 vim 或 nano 编辑 vim .env常见可修改项:
LOG_LEVEL=INFO:可改为DEBUG以获取更详细的日志,排查问题时有用。- 各类密码(
POSTGRES_PASSWORD,REDIS_PASSWORD):部署到公网前务必修改。
功能模块配置 (
docker/envs/目录):这是推荐的自定义配置方式。目录下有针对不同功能的.env.example模板文件。- 例如,要配置外部向量数据库 Milvus:
cd dify/docker # 复制模板文件并移除 .example 后缀 cp envs/vectorstores/milvus.env.example envs/vectorstores/milvus.env # 编辑新创建的 milvus.env 文件,填写你的 Milvus 连接信息 vim envs/vectorstores/milvus.env - 编辑后,需要重启 Dify 服务以使配置生效:
docker compose down docker compose up -d
- 例如,要配置外部向量数据库 Milvus:
4. 常见问题排查与运维管理
部署和运行过程中,难免会遇到问题。本节将系统性地梳理常见故障现象、原因及解决方案。
4.1 容器启动失败或状态异常
这是最常遇到的问题,通常可以通过检查日志来解决。
| 问题现象 | 可能原因 | 检查与解决步骤 |
|---|---|---|
docker compose up -d失败,提示端口冲突 | 本地 80、443、5432(PostgreSQL)、6379(Redis)等端口被占用。 | 1. 运行 `netstat -ano |
某个容器(如db_postgres-1)状态为Exited (1) | 初始化数据库时出错,可能是磁盘权限问题或旧数据卷冲突。 | 1.docker compose logs db_postgres查看具体错误。2. 常见于 WSL 文件系统权限。尝试将项目移到 WSL 的 Linux 原生文件系统(如 /home/username/dify),而不是/mnt/c/下的 Windows 路径。3. 删除旧的数据卷重试: docker compose down -v(警告:这会清除所有数据库数据),然后重新docker compose up -d。 |
worker或api容器不断重启 | 依赖服务(如 Redis、PostgreSQL)未就绪,或环境变量配置错误导致连接失败。 | 1. 确保db_postgres和redis容器状态为healthy。2. 检查 .env文件中REDIS_HOST、POSTGRES_HOST等连接信息是否正确。在 Docker Compose 网络内,应使用服务名(如redis、db_postgres)作为主机名。3. 查看应用容器的日志: docker compose logs api --tail=50。 |
访问localhost显示 “502 Bad Gateway” 或连接被拒绝 | Nginx 容器未成功启动,或后端api/web服务未就绪。 | 1.docker compose ps确认nginx、api、web容器是否在运行。2. docker compose logs nginx查看 Nginx 错误日志。3. 可能是前端资源编译失败。尝试重启服务: docker compose restart web。 |
4.2 访问与功能问题
服务跑起来了,但页面访问或功能使用不正常。
| 问题现象 | 可能原因 | 检查与解决步骤 |
|---|---|---|
浏览器访问localhost一片空白或加载失败 | 前端资源加载错误,或浏览器缓存问题。 | 1. 打开浏览器开发者工具(F12),查看 “Console” 和 “Network” 标签页是否有 JS/CSS 文件加载错误。 2. 尝试清除浏览器缓存或使用无痕模式访问。 3. 检查 docker compose logs web是否有前端服务错误。 |
| 无法连接外部 AI 模型(如 OpenAI) | 网络问题,或模型 API 密钥配置错误。 | 1. 在 Dify 控制台 “模型供应商” 设置中,确认 API Key、Base URL 填写正确。 2. 在 WSL 终端内,尝试 curl https://api.openai.com测试网络连通性(注意,此操作需确保网络环境允许)。3. 如果使用代理,需要在 Dify 的容器环境中配置代理变量,或修改 docker-compose.yml为服务添加environment部分。 |
| 工作流执行失败,提示 “Sandbox error” | 代码沙箱执行超时或资源不足。 | 1. 检查sandbox容器日志:docker compose logs sandbox。2. 可能是沙箱内存限制。可以尝试在 docker-compose.yml中调整sandbox服务的deploy.resources.limits.memory。 |
| 上传文件或图片失败 | 文件大小超过限制,或存储路径权限问题。 | 1. 默认上传大小限制在 Nginx 和 API 服务中配置。检查docker/nginx/conf.d/default.conf.template和 API 相关配置。2. 确保 Docker 卷有正确的写入权限。 |
4.3 日常运维命令
掌握基本的 Docker Compose 命令,是管理 Dify 服务的基础。
# 查看所有服务状态 docker compose ps # 查看所有服务的日志(实时) docker compose logs -f # 查看特定服务(如 api)的日志 docker compose logs api -f # 停止所有服务,但保留数据卷和网络 docker compose down # 停止所有服务,并删除数据卷(谨慎!会丢失数据库数据) docker compose down -v # 重启所有服务 docker compose restart # 重启单个服务(如 worker) docker compose restart worker # 进入某个容器内部执行命令(例如,检查 PostgreSQL 数据库) docker compose exec db_postgres psql -U postgres -d dify # 拉取最新镜像并重新启动服务(用于升级) docker compose pull docker compose up -d4.4 数据备份与迁移
数据存储在 Docker 卷中。了解其位置对于备份至关重要。
- 查看数据卷:
通常会看到名为docker volume ls | grep difydify_postgres_data、dify_redis_data、dify_weaviate_data等卷。 - 备份 PostgreSQL 数据库:
# 将数据库导出到宿主机当前目录 docker compose exec db_postgres pg_dump -U postgres dify > dify_backup_$(date +%Y%m%d).sql - 恢复数据库:
# 首先,确保服务已启动且数据库容器运行正常 cat dify_backup.sql | docker compose exec -T db_postgres psql -U postgres -d dify
5. 生产环境考量与进阶配置
本地部署主要用于开发和测试。如果你计划将 Dify 用于更严肃的用途,甚至小规模生产,以下方面需要额外关注。
5.1 安全加固
- 修改默认密码:立即修改
.env文件中的SECRET_KEY、POSTGRES_PASSWORD、REDIS_PASSWORD等默认密码,并使用强密码生成器。 - 限制网络访问:在
docker-compose.yml中,为不需要外网访问的服务(如db_postgres、redis)配置仅内部网络internal: true,或移除端口映射。 - 启用 HTTPS:生产环境必须使用 HTTPS。你需要准备 SSL 证书,并修改 Nginx 配置 (
docker/nginx/conf.d/default.conf.template) 来启用 TLS。 - 定期更新:关注 Dify 项目的安全更新和版本发布,定期升级到新版本以修复漏洞。
5.2 性能与资源优化
- 资源配置:在 Docker Desktop 设置中,根据你的机器硬件,适当增加分配给 WSL 和 Docker 的 CPU 和内存资源。
- 使用外部服务:考虑将数据库(PostgreSQL)、缓存(Redis)和向量数据库(Weaviate)迁移到更专业、可独立扩展的外部服务或云服务上。这需要修改
docker/.env和docker/envs/下的相关配置,指向外部服务地址。 - 调整日志级别:生产环境将
LOG_LEVEL从DEBUG改回INFO或WARNING,以减少日志输出对磁盘 I/O 的影响。
5.3 监控与日志
- 日志持久化:默认情况下,容器日志存储在 Docker 的日志驱动中。考虑配置日志驱动将日志发送到 ELK Stack、Loki 等集中日志管理系统,或至少挂载卷将日志文件持久化到宿主机。
- 基础监控:使用
docker stats命令可以实时查看各容器的 CPU、内存使用情况。对于生产环境,建议集成 Prometheus 和 Grafana 进行更全面的监控。
5.4 版本升级
升级 Dify 版本需要谨慎操作,务必先阅读目标版本的官方 Release Notes 和升级指南。
- 备份数据库和重要的配置文件。
- 停止当前服务:
docker compose down。 - 拉取最新的代码(注意分支或标签)或修改
docker-compose.yml中的镜像标签。 - 比较新旧版本的
.env.example文件,将新增的配置变量合并到你的.env文件中。 - 启动新版本服务:
docker compose up -d。 - 观察日志,确认升级过程中数据库迁移等操作执行成功。
通过以上步骤,你不仅能在 Windows 上成功部署 Dify,还能建立起一套从问题排查到生产维护的完整认知。记住,容器化部署的优势在于环境一致性和可重复性,多利用docker compose logs查看日志,是解决大多数问题的钥匙。接下来,你可以开始在 Dify 中创建你的第一个 AI 应用,探索其强大的工作流和编排能力了。