Dify 离线部署实战——解决公开访问 URL 请求 127.0.0.1 的问题

首先看成果
在这里插入图片描述

🚀 场景:棘手的问题

在一台离线服务器上,通过 Docker Compose 成功部署了 Dify。一切看起来都很完美:

  • .env 文件里的 APP_WEB_URLSERVICE_API_URL 都已配置为正确的公网 IP (例如 http://172.20.**.***:15001)。
  • 外层的 Nginx 反向代理也已正确配置。
  • Dify 的后台管理界面 (/app/...) 访问完全正常

但是,当你满心欢喜地打开“应用”里的“公开访问 URL” (/chat/...) 时,页面空白,F12 开发者工具显示一个刺眼的红色错误:

(failed) net::ERR_CONNECTION_REFUSED
Request URL: http://127.0.0.1:5001/api/webapp/access-mode?appCode=...

无论你怎么修改 .env 文件、硬编码 docker-compose.yml 里的环境变量、重启服务,这个 127.0.0.1 就像幽灵一样挥之不去。

🔍 根本原因:构建时 vs 运行时

在经历了漫长的排错后,我们终于锁定了根本原因。

Dify 的 web 容器是一个 Next.js 前端应用。对于 Next.js 来说,环境变量分为两种:

  1. 服务端变量:在服务器运行时读取(比如 APP_API_URL)。
  2. 客户端变量 (以 NEXT_PUBLIC_ 开头):这些变量在构建镜像时 (Build Time) 会被读取,并**硬编码(烘焙)**到最终生成的静态 JavaScript 文件中。

你从 Docker Hub pull 下来的官方 langgenius/dify-web:latest 镜像是 Dify 官方在他们服务器上提前构建好的。在构建时,它不知道你的 IP,所以它烘焙到 JS 文件里的 API 地址就是默认的 127.0.0.1

这就是为什么你无论怎么在运行时 (Run Time) 传入环境变量,都无法改变 JS 文件里那个被写死的 127.0.0.1

我们的思路是:

  1. 启动这个“坏的” web 容器。
  2. docker exec 进去。
  3. 找到那个被烘焙了 127.0.0.1 的 JS 文件。
  4. sed 命令强行替换 IP。
  5. docker commit 将修改后的容器保存为一个新的、已修复的本地镜像。
  6. 修改 docker-compose.yml 使用这个新镜像。

详细操作步骤

第 1 步:进入正在运行的 web 容器

首先,确保你的 Dify 正在运行 (docker-compose up -d)。

Bash

# 找到你的 web 容器名
docker ps

# 假设容器名叫 dify-web-1
docker exec -it dify-web-1 /bin/sh
第 2 步:(在容器内) 搜索“病灶”文件

我们需要找到是哪个 JS 文件被硬编码了。

Bash

# (在容器的 sh 命令行里执行)
grep -r "http://127.0.0.1:5001" /app/web/.next/static/chunks/

在我的案例中,grep 返回了一个目标文件(你的文件名可能不同):

/app/web/.next/static/chunks/app/(commonLayout)/app/(appDetailLayout)/[appId]/develop/page-cc67ab8adafd2566.js: ... "http://127.0.0.1:5001" ...
第 3 步:(在容器内) 执行 sed 替换手术

我们使用 sed 命令,将这个文件里的错误 IP 替换为我们的正确 IP。

注意:

  1. 将下面的 http://172.20.**.***:15001 换成你自己的公网 API 地址
  2. 将下面文件名替换为你上一步搜到的文件名
  3. 文件名中的 ()[] 需要用 \ 来转义。

Bash

# (在容器内执行 - 这是一整行命令)
sed -i 's|http://127.0.0.1:5001|http://172.20.**.***:15001|g' /app/web/.next/static/chunks/app/\(commonLayout\)/app/\(appDetailLayout\)/\[appId\]/develop/page-cc67ab8adafd2566.js

执行完毕后,没有任何输出就是最好的结果。然后输入 exit 退出容器。

第 4 步:(在宿主机) 固化修改

我们已经修改了容器的文件系统,现在把它保存为一个新的本地镜像,命名为 dify-web-patched:latest

Bash

# (在你的服务器上执行)
# 将 dify-web-1 替换为你的真实容器名
docker commit dify-web-1 dify-web-patched:latest
第 5 步:修改 docker-compose.yml

这是最后一步。编辑你的 docker-compose.yml,告诉 web 服务使用我们“打过补丁”的新镜像。

同时,我们必须保留 environment:,因为这些变量(如 APP_API_URL)对于 Next.js 的服务端渲染和 API 响应生成仍然至关重要

YAML

services:
  web:
    # image: langgenius/dify-web:latest    <--- 注释掉或删除这行
    image: dify-web-patched:latest       # <--- 替换为这行

    # --- !! 关键:这个 environment 块必须保留 !! ---
    environment:
      CONSOLE_API_URL: "http://172.20.**.***:15001"
      CONSOLE_WEB_URL: "http://172.20.**.***:17777"
      APP_WEB_URL: "http://172.20.**.***:17777"
      APP_API_URL: "http://172.20.**.***:15001"
      SERVICE_API_URL: "http://172.20.**.***:15001"
    # --- !! 保留结束 !! ---

    depends_on: [ "api" ]
    env_file: [ ".env" ] 
    volumes: 
      # ... 你的 volumes 保持不变 ...
    restart: always
    networks:
      - dify_net

  # ... 其他服务保持不变 ...
第 6 步:重启并见证奇迹

保存 docker-compose.yml,然后重启。

Bash

docker-compose down
docker-compose up -d

现在,清除你的浏览器缓存(或使用 Ctrl + Shift + R 强制刷新),再次打开那个“公开访问 URL”。

你会发现 127.0.0.1 的请求消失了,取而代之的是你正确的 172.20.**.***:15001 地址。离线部署的 Dify 完美运行!

MATLAB主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性内容概要:本文主要介绍了一种在MATLAB环境下实现的主动噪声和振动控制算法,该算法针对较大的次级路径变化具有较强的鲁棒性。文中详细阐述了算法的设计原理与实现方法,重点解决了传统控制系统中因次级路径动态变化导致性能下降的问题。通过引入自适应机制和鲁棒控制策略,提升了系统在复杂环境下的稳定性和控制精度,适用于需要高精度噪声与振动抑制的实际工程场景。此外,文档还列举了多个MATLAB仿真实例及相关科研技术服务内容,涵盖信号处理、智能优化、机器学习等多个交叉领域。; 适合人群:具备一定MATLAB编程基础和控制系统理论知识的科研人员及工程技术人员,尤其适合从事噪声与振动控制、信号处理、自动化等相关领域的研究生和工程师。; 使用场景及目标:①应用于汽车、航空航天、精密仪器等对噪声和振动敏感的工业领域;②用于提升现有主动控制系统对参数变化的适应能力;③为相关科研项目提供算法验证与仿真平台支持; 阅读建议:建议读者结合提供的MATLAB代码进行仿真实验,深入理解算法在不同次级路径条件下的响应特性,并可通过调整控制参数进一步探究其鲁棒性边界。同时可参考文档中列出的相关技术案例拓展应用场景。
### Dify离线部署方法指南 Dify是一款开源的大语言模型(LLM)应用开发平台,结合了后端即服务(BaaS)和LLMOps理念,能够帮助开发者快速搭建生产级的生成式AI应用。以下是对Dify离线部署方法的详细介绍。 #### 一、离线部署的优势 在无网环境中实现私有化部署可以带来以下优势: - **数据隐私保障**:敏感数据无需上传至第三方平台[^1]。 - **定制化开发**:开发者可以根据企业需求自由修改代码。 - **性能优化**:根据硬件资源配置进行深度调优[^1]。 - **成本控制**:长期使用相较于云服务更具经济性。 - **网络限制适应**:适用于无外网连接的内网环境[^1]。 #### 二、部署前准备 ##### 1. 环境要求 确保服务器或本地机器满足以下最低配置要求: - **操作系统**:Ubuntu 20.04+ 或 CentOS 7+(推荐Linux),也可以选择Windows/macOS。 - **硬件配置**: - CPU:4核以上(建议8核)。 - 内存:8GB以上(建议16GB)。 - 存储:50GB以上可用空间。 - **必备组件**: - Docker 20.10+。 - Docker Compose 2.20+。 如果需要在无网络环境下安装Docker,可以提前下载Docker的离线安装包[^1]。 ##### 2. 下载Dify源码及依赖 运行以下命令以克隆Dify插件重打包仓库并进入相关目录: ```bash git clone https://github.com/junjiem/dify-plugin-repackaging.git cd dify-plugin-repackaging ``` 注意:上述步骤假设您已经具备联网环境来获取初始代码库。若完全处于离线状态,则需预先将代码库打包并传输至目标设备[^2]。 #### 三、离线部署步骤 ##### 1. 配置Docker环境 确保Docker已正确安装并运行。对于离线环境,可以通过以下方式加载Docker镜像: - 提前从联网设备拉取所需镜像,并保存为`.tar`文件。 - 使用`docker load`命令加载镜像到目标设备中。 例如: ```bash docker load < path/to/image.tar ``` ##### 2. 启动Dify服务 通过Docker Compose启动Dify服务。首先编辑`docker-compose.yml`文件,根据实际硬件环境调整资源配置。然后执行以下命令: ```bash docker-compose up -d ``` ##### 3. 验证部署成功 访问部署环境中的指定地址(通常是`http://localhost:8000`),确认Dify服务是否正常运行。 #### 四、常见问题解决方法 - **问题1**:Docker无法启动。 检查系统资源是否充足,并确保Docker版本符合要求[^1]。 - **问题2**:服务启动失败。 查看日志文件,定位具体错误原因。通常可能是镜像缺失或配置错误[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值