内网环境部署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 ...
随机推荐
- django静态文件、form表单和request对象
目录 一.静态文件 1.静态文件概念 2.资源访问 3.静态文件资源访问 二.静态文件相关配置 1.接口前缀 2.接口前缀动态匹配 三.form表单 action属性 method属性 四.reque ...
- IPV6禁用导致 RabbitMQ 无法启动的问题
问题现象 在开发的过程中遇到了 RabbitMQ 怎么也启动不起来的现象.查看 RabbitMQ 自身的启动日志,并没有发现有什么有用的报错信息,只是从某天开始就一直在打印重启的日志,尝试多次重启也不 ...
- Qt/C++开发经验小技巧291-295
国内站点:https://gitee.com/feiyangqingyun 国际站点:https://github.com/feiyangqingyun 关于在pro中区分linux系统,在Qt4套件 ...
- Qt编写物联网管理平台41-自动清理早期数据
一.前言 随着时间的增加,存储的历史记录也在不断增加,如果设备数量很多,存储间隔很短,不用多久,数据库中的记录就非常多,至少是百万级别起步,而且有些用户还是需要存储每一次的采集的数据,这数据量别说一年 ...
- 一句话,我让 AI 帮我做了个 P 图网站!
每到过节,不少小伙伴都会给自己的头像 P 个图,加点儿装饰. 比如圣诞节给自己头上 P 个圣诞帽,国庆节 P 个小红旗等等.这是一类比较简单.需求量却很大的 P 图场景,也有很多现成的网站和小程序,能 ...
- Linux C语言面试考点
数组 数组初始化方法 /* 以下为自动类型 *//* 一维数组 */int arr[] = {1, 3, 5}; //不指定长度,由编译器自动计算int arr[5] = {0, }; //指定长度 ...
- 【转】Java操作Excel竟然这么简单!
最近项目需求需要用到操作Excel的功能,之前使用POI实现,但是数据量大了之后支持不是很好,所以就在网上找找资源,果不其然,如下: 原文链接:没想到啊,Java操作Excel竟然这么简单!
- cmake-2
似懂非懂,一定要搞懂基础的,剩下的边做边学,从案例中入手. 有关cmake的介绍,请参考: 1.https://www.cnblogs.com/pam-sh/p/13885959.html 2.htt ...
- 微信小程序slot(二)
在组件的 wxml 中可以包含 slot 节点,用于承载组件使用者提供的 wxml 结构. 默认情况下,一个组件的 wxml 中只能有一个 slot .需要使用多 slot 时,可以在组件 js 中声 ...
- 认识soui4js(第1篇)
源代码:https://github.com/soui4js/soui4js soui4js是soui4+quickjs的结合体. soui4是一套c++ directui客户端开发框架,soui4j ...