
本文来自一次真实 Windows Git Bash Docker 部署过程的踩坑复盘。若你正在面对ERR_TOO_MANY_REDIRECTS、404、502 Bad Gateway、Conflict. The container name /docker-web-1可以直接对号入座。一、事故现场长什么样症状组合拳访问http://localhost或/dify/→重定向过多有时变成404退回官方端口8085后又是502docker compose报找不到配置文件重建 web 报容器名冲突代理日志里出现过这种死亡循环GET /dify → 301 → /dify/ GET /dify/ → 308 → /dify GET /dify → 301 → /dify/ ...Nginx 补斜杠Next.js 去斜杠两边对打浏览器直接放弃。二、错误路线是怎么走偏的最初官方栈其实已映射0.0.0.0:8085 → docker-nginx-1:80但排障过程中引入了额外目标再起一个dify-proxy占 80 端口给前端加NEXT_PUBLIC_BASE_PATH/dify用docker run手工替换docker-web-1把 API 地址写成172.18.0.x硬编码 IP启动时使用不存在的--profile core于是问题从「先把官方入口跑通」变成「子路径 自定义代理 IP 漂移」三重地狱。三、每个报错的真实含义1no configuration file provided: not found你在错误目录执行了 compose# 错 cd /d/Dify docker compose ps 对 cd /d/Dify/dify/docker docker compose ps2重定向过多301 ↔ 308根因通常是两套规则冲突组件行为Nginx/dify301 到/dify/Next.jsBASE_PATH/dify/dify/308 到/dify修法本地部署不要上/dify。删掉NEXT_PUBLIC_BASE_PATH删掉自定义dify-proxy回http://localhost:8085根路径。3404常见原因自定义 nginx 没proxy_pass在容器默认 html 目录找/dify/index.htmlBASE_PATH配了但请求没打到对应路径Git Bash 把/dify翻译成C:/Program Files/Git/difybasePath 彻底错乱真实案例环境变量NEXT_PUBLIC_BASE_PATHC:/Program Files/Git/dify这是 Git Bash 路径转换造成的不是 Dify 官方设定。4502 Bad GatewayNginx 活着上游挂了或 IP 过期connect() failed (111: Connection refused) upstream: http://172.18.0.4:3000/复盘时172.18.0.4已经变成plugin_daemon而真正的 web 在172.18.0.8。原因web 被docker run重建后 IP 变了nginx 仍缓存旧 upstream。修法docker compose up -d --force-recreate nginx web5500 Internal Server Error db_postgres解析失败could not translate host name db_postgres to address说明PostgreSQL 容器没启动。常见诱因使用了无效的--profile core只起了应用层没起postgresql/weaviateprofile。正确启动cd /d/Dify/dify/docker docker compose --profile postgresql --profile weaviate --profile collaboration up -d6容器名 ConflictConflict. The container name /docker-web-1 is already in use说明有人用docker run --name docker-web-1创建过同名容器。compose 无法静默覆盖。处理docker rm -f docker-web-1 dify-proxy cd /d/Dify/dify/docker docker compose up -d --force-recreate web nginx四、推荐的止血顺序按优先级把下面当成排障 SOPStep 1回到官方入口先放弃自定义代理cd /d/Dify/dify/docker docker rm -f dify-proxyStep 2清掉被污染的 web交还给 composedocker rm -f docker-web-1Step 3确认.env是浏览器可达地址CONSOLE_API_URLhttp://localhost:8085 CONSOLE_WEB_URLhttp://localhost:8085 APP_API_URLhttp://localhost:8085 APP_WEB_URLhttp://localhost:8085 SERVER_CONSOLE_API_URLhttp://api:5001 EXPOSE_NGINX_PORT8085并检查docker-compose.yaml的web.environment没有硬编码172.18.x.x。Step 4用正确 profile 拉起数据库和向量库docker compose --profile postgresql --profile weaviate --profile collaboration up -dStep 5重建关键链路docker compose up -d --force-recreate api web nginxStep 6验收docker compose ps curl -I http://localhost:8085/成功信号HTTP/1.1 307 Temporary Redirect location: /install或登录页 200。然后用无痕窗口打开避免旧 301/308 被浏览器缓存。五、如果必须挂在子路径/dify一般不建议只有在同一域名多系统共存时才考虑。要同时满足Nginx不要再对/dify强制补/proxy_pass原样转发不要二次改写路径制造双斜杠规则前后端 base path 一致用 curl 验证不能出现 301↔308curl -sI http://localhost/dify | head -5 curl -sI http://localhost/dify/ | head -5本地知识库学习场景直接用根路径更稳。六、Git Bash 防坑速查# 进容器 winpty docker exec -it docker-web-1 //bin/sh 读文件 docker exec docker-web-1 //bin/cat //etc/hosts 避免 -e 路径被改写若必须传 Unix 路径 MSYS2_ARG_CONV_EXCL* docker ...永远优先docker compose exec web sh而不是手动docker run造同名容器。七、一句话结论表面错误真实病因正确动作重定向过多/dify斜杠规则互殴去掉 BASE_PATH 与自定义 301404代理没打到上游 / basePath 被 Git 改写回官方根路径502nginx upstream IP 过期或 web 挂recreate nginx/web500没启 postgres加 postgresql profileConflictdocker run 污染docker rm -f后交给 composecompose not found目录不对进dify/docker最终稳妥访问方式http://localhost:8085先把官方栈跑绿再谈换端口、换局域网 IP、换域名。换地址请看系列文《Dify 本地部署改局域网访问避开 4 大坑一次配对》。