一、前言

Dify 是一个开源的 LLM 应用开发平台,支持通过可视化界面快速构建基于大语言模型的聊天机器人、知识库问答系统等。然而,在某些企业或政府环境中,服务器无法直接访问互联网,这就要求我们采用“离线安装”的方式部署 Dify。本文将详细介绍如何在完全离线的环境中完成 Dify 的部署。

二、前置条件

在开始之前,请确保你的系统已安装以下工具:
Docker 20.10+
Docker Compose 2.0+
你可以通过以下命令验证是否已安装:

docker --version
# 示例输出:Docker version 20.10.0, build 7287ab3
docker-compose --version
# 示例输出:Docker Compose version v2.3.2

三、下载源码包及镜像

1、dify源码下载:

下载地址:https://github.com/langgenius/dify/archive/refs/tags/1.9.2.zip

2、镜像下载(需要找一台联网的机器拉取镜像):

需要的镜像如下:

备注:直接使用docker pull 可能会导致网络问题无法正常拉取,需要配置docker加速,或者在无法拉取的镜像前面加docker.1ms.run

例如:docker pull langgenius/dify-web:1.9.2无法拉取,
则使用: docker pull docker.1ms.run/langgenius/dify-web:1.9.2
拉取完后重新给镜像打标签,后续用到,
docker tag docker.1ms.run/langgenius/dify-web:1.9.2 langgenius/dify-web:1.9.2
其他镜像同理。

最终拉取的镜像如下所示

docker images
## 示例输出
REPOSITORY                      TAG                            IMAGE ID       CREATED         SIZE
langgenius/dify-web             1.9.2                          eeecff942cc8   9 days ago      571MB
langgenius/dify-api             1.9.2                          9beedc03fb54   9 days ago      2.42GB
nginx                           latest                         9d0e6f6199dc   9 days ago      152MB
langgenius/dify-plugin-daemon   0.3.3-local                    f1b5df78ac77   2 weeks ago     1.49GB
ubuntu/squid                    latest                         dabbf93b6765   3 weeks ago     207MB
postgres                        15-alpine                      ba05c11fe977   3 weeks ago     273MB
redis                           6-alpine                       a58b74ba639d   5 weeks ago     30.2MB
milvusdb/milvus                 v2.5.15                        4d85dedc45c3   3 months ago    1.96GB
langgenius/dify-sandbox         0.2.12                         ba1b250b9505   6 months ago    578MB
semitechnologies/weaviate       1.27.0                         f24b5f0e68e6   12 months ago   161MB
langgenius/qdrant               v1.7.3                         69f6f6622b52   22 months ago   232MB
minio/minio                     RELEASE.2023-03-20T20-16-18Z   400c20c8aac0   2 years ago     252MB
quay.io/coreos/etcd             v3.5.5                         673f29d03de9   3 years ago     182MB

3、保存镜像

vi save_images.sh
## 插入以下内容
#!/bin/bash

# 定义要保存的镜像列表
images_to_save=(
    "langgenius/dify-web:1.9.2"
    "langgenius/dify-api:1.9.2"
    "nginx:latest"
    "langgenius/dify-plugin-daemon:0.3.3-local"
    "ubuntu/squid:latest"
    "postgres:15-alpine"
    "redis:6-alpine"
    "milvusdb/milvus:v2.5.15"
    "langgenius/dify-sandbox:0.2.12"
    "semitechnologies/weaviate:1.27.0"
    "langgenius/qdrant:v1.7.3"
    "minio/minio:RELEASE.2023-03-20T20-16-18Z"
    "quay.io/coreos/etcd:v3.5.5"
)

echo "正在拉取所有镜像(如果本地不存在)..."
for image in "${images_to_save[@]}"; do
    docker pull "$image" 2>/dev/null || echo "警告:无法拉取 $image,将尝试使用本地镜像。"
done

echo "正在保存所有镜像到单个归档文件..."
docker save "${images_to_save[@]}" | gzip > dify_all_images.tar.gz

echo "完成!所有镜像已保存并压缩为 dify_all_images.tar.gz"
# 保存退出 :wq

# 执行脚本:sh save_images.sh
## 将dify_all_images.tar.gz传至无外网的服务器上

4、导入镜像

## 所有镜像会被打包进一个名为 dify_all_images.tar.gz 的压缩文件。将dify_all_images.tar.gz传至无外网的服务器上
## 该文件可通过 docker load < dify_all_images.tar.gz 或 gunzip -c dify_all_images.tar.gz | docker load 加载回 Docker。
docker load < dify_all_images.tar.gz 
# 或
gunzip -c dify_all_images.tar.gz | docker load

四、安装部署dify

## 创建安装目录,将dify源码上传至/opt目录下
cd /opt 
unzip 1.9.2.zip
cd dify-1.9.2/docker
cp .env.example .env
cp docker-compose.yaml cp docker-compose.yamlbak
## 如果需要修改dify访问端口(默认80),改.env
NGINX_PORT=80 -> NGINX_PORT=8888
EXPORT_NGINX_PORT=80 -> EXPORT_NGINX_PORT=8888

# 启动
docker-compose up -d
## 查看状态是否正常,正常状态都是running
docker-compose ps -a
## 示例输出:
[root@master docker]# docker-compose ps -a
NAME                     COMMAND                  SERVICE             STATUS              PORTS
docker-api-1             "/bin/bash /entrypoi…"   api                 running             5001/tcp
docker-db-1              "docker-entrypoint.s…"   db                  running (healthy)   5432/tcp
docker-nginx-1           "sh -c 'cp /docker-e…"   nginx               running             0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, :::80->80/tcp, :::443->443/tcp
docker-plugin_daemon-1   "/bin/bash -c /app/e…"   plugin_daemon       running             0.0.0.0:5003->5003/tcp, :::5003->5003/tcp
docker-redis-1           "docker-entrypoint.s…"   redis               running (healthy)   6379/tcp
docker-sandbox-1         "/main"                  sandbox             running (healthy)   
docker-ssrf_proxy-1      "sh -c 'cp /docker-e…"   ssrf_proxy          running             3128/tcp
docker-web-1             "/bin/sh ./entrypoin…"   web                 running             3000/tcp
docker-worker-1          "/bin/bash /entrypoi…"   worker              running             5001/tcp
docker-worker_beat-1     "/bin/bash /entrypoi…"   worker_beat         running             5001/tcp

五、浏览器访问:

浏览器输入访问地址(修改为部署服务器的ip及端口):
http://192.168.80.100:80/apps

设置账号并登录:

在这里插入图片描述

六、常见问题与注意事项

  • Q1:是否必须使用 Weaviate?

  • A:Dify 默认使用 Weaviate 作为向量数据库,但也可替换为 Milvus、Qdrant 或 PGVector。若需更换,请修改 docker-compose.yaml 并调整 .env 中的 VECTOR_STORE 配置。

  • Q2:如何更新 Dify 版本?

  • A:在中转机上拉取新版本镜像并重新打包,然后在离线服务器上 docker load 新镜像,并更新 docker-compose.yaml 中的镜像标签。

  • Q3:数据持久化在哪?

  • A:Dify 默认将数据挂载到 ./volumes/ 目录下(如 ./volumes/db, ./volumes/weaviate),请确保该目录有足够空间并做好备份。

七、结语

通过上述步骤,我们成功在无网络环境中部署了 Dify,为企业内部构建私有化 AI 应用提供了基础平台。离线部署虽然步骤稍显繁琐,但能有效保障数据安全与合规性。

如果你有更多定制需求(如集成私有大模型、对接企业认证系统等),欢迎继续探索 Dify 的高级功能!

📌 项目地址 https://github.com/langgenius/dify

📚 官方文档:https://docs.dify.ai

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐