内网环境部署Deepseek+Dify,构建企业私有化AI应用
0.简介
公司为生产安全和保密,内部的服务器不可连接外部网络,为了可以在内网环境下部署,采用的方案为ollama(Docker)+Dify(Docker Compose),方便内网环境下迁移和备份,下文将介绍部署的全部过程。
1.镜像拉取
镜像拉取为准备工作,因服务器在内网环境,需要先在可以连接外网的电脑上拉取相关镜像或文件。由于公司笔记本的Windows系统屏蔽了Microsoft Store,导致Docker Desktop安装不成功,故使用虚拟机创建Ubuntu系统,在Ubuntu下进行相关操作。
1.1 ollama
ollama采用docker进行部署,首先拉取ollama docker镜像
docker pull ollama/ollama
通过以下命令可以创建容器
docker run -d --name ollama -v /home/LLM/ollama/models:/usr/share/ollama/.ollama/models -p 11434:11434 ollama/ollama:latest
可以根据实际情况更改配置:
- --name:容器名
- -v:硬盘挂载,
宿主机路径:容器内部路径 - -p:端口映射,
宿主机端口:容器内端口
在Linux非root用户下,ollama模型默认保存位置为/usr/share/ollama/.ollama/models
root用户默认存储在/root/.ollama/models,docker容器默认使用root用户
Tips:-v参数建议不要更改为root用户路径,和模型导入有关,在后文会提到
模型拉取需要进入容器内进行操作
在启动ollama的容器后,通过以下命令查看ollama容器的信息
docker ps | grep ollama
根据容器ID来进入容器内部
docker exec -it 容器ID /bin/bash
模型可以在ollama官网查看

以Deepseek为例,选择14b参数量的模型后,复制右侧的命令到ollama,即可拉取模型并运行
# 拉取模型并运行
ollama run deepseek-r1:14b
# 仅拉取模型
ollama pull deepseek-r1:14b
运行后可以在终端中进行对话测试
已有的模型可以通过 ollama list 命令来查看,模型文件的保存位置可以通过以下命令查看
ollama show deepseek-r1:14b --modelfile
输出结果的第一行就是模型文件的存储位置。至此,ollama相关的镜像文件全部下载完毕。
1.2 Dify
Dify社区版支持多种部署方式,我们选择使用Docker Compose方式来部署
按照官方文档进行操作,首先克隆Dify的源代码到本地环境
# 假设当前最新版本为 0.15.3
git clone https://github.com/langgenius/dify.git --branch 0.15.3
注意:在2025.3.3时,最新版为1.0.0版本,该版本为测试版本,在接入Deepseek时存在严重Bug,无法成功接入,实测0.15.3版本使用正常,建议先使用稳定版本
进入Dify的docker目录并复制环境配置文件
cd dify/docker
cp .env.example .env
根据系统上的Docker Compose版本,选择合适的命令来启动容器
# Docker Compose V2
docker compose up -d
# Docker Compose V1
docker-compose up -d
使用Docker Compose拉取镜像时会受到镜像源的影响,一旦存在拉取失败,全部镜像都会拉取失败,需要配置多个可用国内镜像源才能成功
或者可以逐个拉取所需要的镜像,0.15.3版本所需的各个镜像为:
| REPOSITORY | TAG | SIZE |
|---|---|---|
| ubuntu/squid | latest | 243MB |
| postgres | 15-alpine | 273MB |
| langgenius/dify-web | 0.15.3 | 436MB |
| langgenius/dify-api | 0.15.3 | 2.97GB |
| nginx | latest | 192MB |
| redis | 6-alpine | 30.2MB |
| langgenius/dify-sandbox | 0.2.10 | 567MB |
| semitechnologies/weaviate | 1.19.0 | 52.5MB |
镜像拉取成功后使用 docker compose up -d 命令启动Dify,服务器所使用的Docker没有集成Docker Compose工具,需要手动进行安装。(参考手动安装docker compose - 博客园进行安装,内网服务器选用独立安装的方式离线安装)
Dify默认使用80端口,可以通过.env文件进行修改,部署时可以根据实际情况修改
首次启动需要访问以下地址设置管理员账户:
http://your_server_ip/install
访问主页面进入以下地址:
http://your_server_ip
如需要停止容器,使用
docker compose down
2.镜像导出
2.1 Docker镜像导出
使用以下命令查看本机docker镜像,并根据镜像ID保存对应镜像到本地
docker images
docker save 镜像ID > 文件名.tar
将所需要的全部docker镜像都导出(包括ollama和Dify)
Dify导出镜像的同时还需要将上一步操作的Dify/docker文件夹也复制导出,该文件夹会存储Dify的全部配置以及相关数据,为Dify运行的主目录
2.2 模型文件导出
在ollama容器内下载的模型,首先查看模型文件的存储位置
ollama show deepseek-r1:14b --modelfile
ollama docker内,模型默认存储在/root/.ollama/models/blobs下,该路径下还存有一些验证文件,一个模型文件+三个验证文件共四个文件

将这些文件复制到上一步启动时挂载的路径下,这样就可以在宿主机中操作这些文件了,通过cp命令来复制
cp 源文件 目标文件
这是我踩的一个坑,参考博客 数据不出内网:基于Ollama+OneAPI构建企业专属DeepSeek智能中台 时,该博客并未提到ollama在首次运行或下载Deepseek模型时会进行验证,在按照博客的步骤导入服务器后ollama运行报错验证失败,也没有查到相关的解决方法,在花费一些时间后才发现还需要迁移这些验证文件,实属不易。
除模型文件外还需要导出一个ModelFile文件,用于后续模型导入,该文件也放入blobs文件夹下
ollama show deepseek-r1:14b --modelfile > Modelfile
2.3 传输文件到物理机
VirtualBox创建的虚拟机,可使用自带的共享文件夹功能将保存后的镜像文件传输到物理机中,具体可参考:手把手教你在VirtualBox中与主机共享文件夹_virtualbox共享文件夹在哪-CSDN博客
将全部所需文件传输到物理机,再通过物理机传输到内网服务器中。
3.镜像导入及启动
将镜像传输到服务器后,进行导入
docker load -i 文件名.tar
通过该命令导入镜像后,会丢失镜像的标签信息,需要再手动添加标签信息
docker tag 镜像ID 镜像名:版本
# 以 Ubuntu/squid 为例
docker tag 镜像ID ubuntu/squid:latest
3.1 ollama
在服务器上创建ollama docker容器
docker run -d --name ollama -v /home/LLM/ollama/models:/usr/share/ollama/.ollama/models -p 11434:11434 ollama/ollama:latest
容器创建成功后访问 http://your_server_ip:11434 可以看到Ollama is running的消息提示
/home/LLM/ollama/models目录为自定义的服务器存储模型文件的路径,这个路径要挂载到容器上,以便容器内部进行访问
将模型文件夹blobs存储到你设置的这个目录下,进入ollama容器内部
docker ps | grep ollama
docker exec -it ollama容器ID /bin/bash
在容器内切换到挂载的路径/usr/share/ollama/.ollama/models/blobs
打开之前导出的ModelFile文件,修改第一行的路径,指向挂载的路径
FROM /usr/share/ollama/.ollama/models/blobs/sha256-6e9f90f02bb3b39b59e81916e8cfce9deb45aeaeb9a54a5be4414486b907dc1e
使用以下命令导入模型
ollama create 模型名 -f Modelfile文件路径
导入成功会返回成功的提示,chat模型可以通过run命令运行测试
ollama run deepseek-r1:14b
3.2 Dify
将上一步导出的Dify/docker文件夹放置在服务器指定位置,进入该目录后通过Docker Compose工具再次启动即可,若镜像导入无问题,就可以直接启动成功
如果服务器的Docker不包含Docker Compose工具,1.2中已经介绍了离线安装Docker Compose的方法
4.Dify使用
启动完成后即可正常访问Dify,在设置页可以配置ollama,这样就可以配置Deepseek模型了,Dify的使用可以参考官方文档
5.结束语
Deepseek的突然爆火使得AI相关应用再一次迎来了发展,相关的博客或知识还在逐步增加中,这次的部署可参考的不多,且过于杂乱,本文总结了我在部署时遇到的问题,希望可以给大家一些帮助。
参考
数据不出内网:基于Ollama+OneAPI构建企业专属DeepSeek智能中台
Docker - 实现本地镜像的导出、导入(export、import、save、load)
Dify丝滑云或本地docker部署步骤 适用Linux & macOS
docker常用命令大全(详细版),Linux运维开发经验的有效总结
docker load -i 导入后 看不到image镜像_docker load之后,镜像不见了-CSDN博客
linux加载tar文件成镜像找不到问题及解决办法_docker load 后找不到镜像-CSDN博客
手把手教你在VirtualBox中与主机共享文件夹_virtualbox共享文件夹在哪-CSDN博客
使用 Docker 安装 Ollama 部署本地大模型并接入 One-API_docker_程序员羊羊-云原生技术专区
手动安装docker compose - lqqgis - 博客园
内网环境部署Deepseek+Dify,构建企业私有化AI应用的更多相关文章
- Linux系统如何在离线环境或内网环境安装部署Docker服务和其他服务
如何在离线环境或纯内网环境的Linux机器上安装部署Docker服务或其他服务.本次我们以Docker服务和Ansible服务为例. 获取指定服务的所有rpm包 保证要获取rpm包的机器能够上网. 本 ...
- 内网环境上部署k8s+docker集群:集群ftp的yum源配置
接触docker已经有一年了,想把做的时候的一些知识分享给大家. 因为公司机房是内网环境无法连接外网,所以这里所有的部署都是基于内网环境进行的. 首先,需要通过ftp服务制作本地的yum源,可以从ht ...
- 内网环境下为Elasticsearch 5.0.2 添加head服务
背景: 本项目的服务器是内网环境,没有网络,因此需要在离线的环境中,安装head服务. 需要用到的安装包有: node的安装包 elasticsearch的head插件源码 说明:此次只讲述为elas ...
- Linux内网环境DNS修改域名指向,JAVA应用程序能否实时切换的问题总结
公司内网环境中许多调用资源(数据库.web接口等)都是通过内网DNS服务来进行域名-IP的映射. 但经常出现DNS映射修改完毕后,应用中连接的资源迟迟没有变更. 以前一直笼统的认为是linux的dns ...
- 内网环境使用ansible安装software 需要外网时,如何绑定代理呢
内网环境使用ansible安装software 需要外网时,如何绑定代理呢? 方法一: 在ansible 的脚本里,yum install 的地方,添加语句: environment: https_p ...
- Centos7.2内网环境安装MySQL5.7.24
1.配置本地yum源 内网环境,首先需要配置本地yum源,以解决MySQL的依赖安装,具体参考该文:点击打开 2.查看服务器环境 uname -a 3.去官网下载MySQL安装包 MySQL官网网址: ...
- 内网环境搭建NTP服务器
说在前面:ntp和ntpdate区别 ①两个服务都是centos自带的(centos7中不自带ntp).ntp的安装包名是ntp:ntpdate的安装包是ntpdate.他们并非由一个安装包提供. ② ...
- 内网环境NTP服务及时间同步(CentOS6.x)配置和部署
目标环境,5台linux centos 6.3, 一台作为NTPD服务与外部公共NTP服务同步时间,同时作为内网的NTPD服务器,其他机器与这台服务做时间同步. 服务器IP 角色 说明 同步方式 ...
- kubernetes 内网节点部署笔记(一)
在Centos7上部署kubernetes时,碰到很多坑,特别在摸拟在内网部署时,有来自GFW的障碍,有来自Firewalld的阻塞,反正是各种不服,终于慢慢理顺了思路,自己记录一下,防止遗忘. 环境 ...
- yum仓库配置与内网源部署记录
使用yum的好处主要就是在于能够自动解决软件包之间的依赖.这使得维护更加容易.这篇文章主要就是记录部署内网源的操作过程以及yum工具如何使用 因为需要.数据库要从Oracle迁移至MySQL.在部署M ...
随机推荐
- MySQL 8.0 相对于 MySQL 5.7
MySQL 8.0 相对于 MySQL 5.7,有很多新特性,比如:快速加列.原子 DDL.不可见索引.额外端口.角色管理等.这一节内容,就不讲这些新特性了,只来聊聊最近在工作学习过程中遇到的几处细节 ...
- Socket、Http、WebSocket?强大的Netty几行语句就帮你实现!
一.概述 Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 相比 ...
- 解决phpmyadmin导入MYSQL数据库限制大小为50M的问题
有时候想导入的数据库太大.但是遭到的限制 解决phpmyadmin导入MYSQL数据库限制大小为50M的问题 转载于:https://www.cnblogs.com/wesky/p/10609340. ...
- Qt设置运行时动态库路径的几点说明
随着需求的不断增加,程序不断变大,用到的动态库也越来越多,到了发布程序的时候你会发现和可执行文件同一目录下文件数量真多(比如著名的金融软件 https://www.webull.com/ 哎呀我去,目 ...
- Qt编写的项目作品24-人脸识别综合应用(在线+离线+嵌入式)
一.功能特点 支持的功能包括人脸识别.人脸比对.人脸搜索.活体检测等. 在线版还支持身份证.驾驶证.行驶证.银行卡等识别. 在线版的协议支持百度.旷视,离线版的支持百度,可定制. 除了支持X86架构, ...
- Qt音视频开发29-Onvif云台控制
一.前言 云台控制也是onvif功能中最常用的,最常用的功能排第一的是拿到视频流地址,排第二的就是云台控制了,云台控制的含义就是对带云台的摄像机进行上下左右的移动,一般云台摄像机都是带有一个小电机,一 ...
- Python 进阶:深入理解 import 机制与 importlib 的妙用
大家好,今天我们来深入探讨 Python 中的导入机制和 importlib 模块.相信不少朋友和我一样,平时写代码时可能只用过最基础的 import 语句,或者偶尔用 importlib.impor ...
- 怎么在 Linux 下运行 smart_rtmpd
怎么在 Linux 下运行 smart_rtmpd 操作系统的准备 我们知道比较流行的 Linux 操作系统基本上分为两类,一类是以 Redhat 为基线的 Redhat, CentOS:另一类是 D ...
- SpringBoot进阶教程(八十四)spring-retry
在日常的一些场景中, 很多需要进行重试的操作.而spring-retry是spring提供的一个基于spring的重试框架,某些场景需要对一些异常情况下的方法进行重试就会用到spring-retry. ...
- Solution -「LOCAL」菜
\(\mathscr{Description}\) Private link. 给定 \(N,L,X,Y,K\),求选出 \(0\le a_1\le a_2\le\cdots a_{N-1}\ ...