> 适用版本:Dify 1.16.x(本文以 langgenius/dify-web:1.16.0-rc1 为参考)
> 环境:Windows 10/11 + Docker Desktop + Git Bash
> 最终访问地址示例:http://localhost:8080
本文以「能跑通」为目标,走官方 Docker Compose 路线,不额外加 /dify 子路径,不另起自定义反向代理。后面若要改端口或对外访问,见同系列第二篇。
一、你最终会得到什么
启动成功后,浏览器访问:
text
http://localhost:8080
首次访问通常会 跳转到**/install**,进入初始化管理员账号页面。这是正常现象,不是报错。
一套最小可用栈一般包括:
| 组件 | 作用 |
|---|---|
web |
前端(Next.js) |
api / worker |
后端与异步任务 |
nginx |
统一入口(默认映射到宿主机 8085) |
db_postgres |
PostgreSQL 业务库 |
weaviate |
向量库(知识库检索) |
redis |
缓存 / 队列 |
二、前置条件
- 已安装并启动 Docker Desktop
- 建议可用内存 ≥ 8GB(知识库 + 向量库会吃内存)
- 已安装 Git(用 Git Bash 操作更方便)
- 端口
8080、443、5003未被占用
检查 Docker:
bash
docker version
docker compose version
三、获取代码并进入正确目录
bash
cd /d/Dify # 按你实际磁盘路径调整
# 若还没有源码:
# git clone https://github.com/langgenius/dify.git
cd /d/Dify/dify/docker
关键坑:
docker compose 必须在包含 docker-compose.yaml 的目录执行。
在 /d/Dify 根目录执行会报:
text
no configuration file provided: not found
正确目录是:
text
.../dify/docker
四、配置 .env
首次部署复制示例配置:
bash
cp .env.example .env
# Windows 也可用:
# cp .env.example .env
用编辑器打开 .env,确认下面几项(本地访问够用):
env
CONSOLE_API_URL=http://localhost:8080
CONSOLE_WEB_URL=http://localhost:8080
APP_API_URL=http://localhost:8080
APP_WEB_URL=http://localhost:8080
SERVER_CONSOLE_API_URL=http://api:5001
EXPOSE_NGINX_PORT=8080
EXPOSE_NGINX_SSL_PORT=443
DB_TYPE=postgresql
VECTOR_STORE=weaviate
说明:
CONSOLE_*/APP_*给浏览器用,必须是你本机能打开的地址SERVER_CONSOLE_API_URL给容器内 SSR 用,应走 Docker 服务名api:5001- 不要手动设置
NEXT_PUBLIC_BASE_PATH=/dify(本地直连根路径不需要)
数据库账号密码默认一般是:
env
DB_USERNAME=postgres
DB_PASSWORD=difyai123456
DB_HOST=db_postgres
DB_PORT=5432
DB_DATABASE=dify
生产环境务必改强密码。
五、启动服务(最容易踩坑的一步)
正确启动方式
bash
cd /d/Dify/dify/docker
推荐:显式打开数据库、向量库、协作相关 profile
docker compose --profile postgresql --profile weaviate --profile collaboration up -d
若 .env 中已配置:
env
COMPOSE_PROFILES=weaviate,postgresql,collaboration
也可简化为:
bash
docker compose up -d
错误示范:--profile core
很多旧教程写:
bash
docker compose --profile core up -d
在新版 compose 里,不一定存在名为 core 的 profile。
结果是:web/api/nginx 起来了,但 PostgreSQL、Weaviate 没启动。
表现:
- 访问
http://localhost:8080→500/502 - API 日志出现:
could not translate host name "db_postgres" web日志:ECONNREFUSED ...:5001或 Internal Server Error
这不是「再改 Nginx 就能修好」的问题,而是缺数据库。
六、确认容器状态
bash
cd /d/Dify/dify/docker
docker compose ps
重点看:
docker-api-1:healthydocker-db_postgres-1:healthydocker-web-1、docker-nginx-1:Updocker-weaviate-1:Up
再测入口:
bash
curl -I http://localhost:8085/
期望类似:
text
HTTP/1.1 307 Temporary Redirect
location: /install
或直接 200。出现 502 Bad Gateway 时,多半是 nginx 已启动但 web/api 还没就绪,等 10~30 秒再试;若持续 502,执行:
bash
docker compose up -d --force-recreate nginx web api
七、浏览器访问与初始化
- 打开 无痕窗口(避免旧重定向缓存)
- 访问:
http://localhost:8080 - 在
/install创建管理员账号 - 登录后进入工作室,即可创建应用、配置知识库
八、常用运维命令
查看日志:
bash
docker compose logs web --tail 50
docker compose logs api --tail 50
docker compose logs nginx --tail 50
重启:
bash
docker compose restart
停止(保留数据卷):
bash
docker compose down
更新镜像后重建:
bash
docker compose pull
docker compose up -d
九、Windows / Git Bash 特别注意
1. 进容器请用 winpty + 双斜杠
bash
# 容易失败
docker exec -it docker-web-1 /bin/sh
推荐
winpty docker exec -it docker-web-1 //bin/sh
原因:Git Bash 会把 /bin/sh 映射成 Windows 路径。
2. 不要用 docker run 顶掉 compose 的 docker-web-1
例如:
bash
docker run -d --name docker-web-1 ... langgenius/dify-web:...
这会:
- 丢掉 compose 注入的整套环境变量
- 后续
docker compose up报 容器名 Conflict - Nginx 仍缓存旧 upstream IP,出现假 502
正确做法永远是:
bash
docker compose up -d --force-recreate web
3. 慎用 /dify 子路径
本地知识库场景直接用根路径 http://localhost:8080 即可。
强行 NEXT_PUBLIC_BASE_PATH=/dify + Nginx 补斜杠,很容易出现重定向循环(另文详解)。
十、验收清单
- 目录在
dify/docker -
.env中浏览器 URL 为http://localhost:8080 - 已启用
postgresql+weaviateprofile -
docker compose ps能看到 postgres / weaviate -
curl -I http://localhost:8085/不是 404 No Found/循环重定向 - 无痕模式能打开安装或登录页
小结
2026 年在 Windows 上本地部署 Dify,核心就三句:
- 进对目录 :
dify/docker - 开对 profile :至少
postgresql+weaviate - 走官方 nginx 入口 :
http://localhost:8080,先别折腾自定义/dify代理