前言

在当下 AI 浪潮汹涌的时代,DeepSeek 以其卓越的性能和出色的表现,迅速成为了众多专业人士和科技爱好者热议的焦点工具。在众多AI大模型的比拼中,DeepSeek 展现出了优越的实力。然而,对于许多企业和组织而言,出于数据安全、网络稳定性以及合规性等多方面的考量,将 DeepSeek 进行内网离线部署成为了一项紧迫且极具挑战性的任务。近期,因工作需要,完成了 DeepSeek 的内网离线部署,现在将部署经验分享给大家。

1. ollama安装部署

1.1 下载ollama的部署包

https://github.com/ollama/ollama/releases/download/v0.5.8/ollama-linux-amd64.tgz

1.2 将部署包上传到服务器,然后进行解压

sudo tar -C /usr -xzf ollama-linux-amd64.tgz

提示输入当前用户的密码

[sudo] password for XXX:

然后等待解压缩文件,1-2分钟。

然后在/usr/bin目录下找到解压缩后的ollama文件

ls -lrt /usr/bin/ollama

1.3 解压后,查看ollama的版本

ollama -v

1.4 前台启动ollama

ollama serve

启动成功后记录ollama服务的端口:127.0.0.1:11434,后续关联UI服务用到。

1.5 创建 Ollama 的用户和组并且指定该用户的主目录

sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama

sudo usermod -a -G ollama $(whoami)

注释:命令解释

1. sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama

useradd

这是用于在 Linux 系统中创建新用户的命令。

-r

该参数表示创建一个系统用户。系统用户通常用于运行系统服务或守护进程,它们一般不用于交互式登录,其 UID(用户标识符)通常小于 1000(在某些系统中可能规则略有不同)。

-s /bin/false

-s 参数用于指定用户的默认登录 shell。/bin/false 是一个特殊的 shell,它在被调用时会立即退出,返回一个失败状态码。将用户的 shell 设置为 /bin/false 意味着该用户无法通过正常方式登录系统,只能用于运行特定服务。

-U

该参数会自动创建一个与用户名相同的用户组,并将该用户添加到这个组中。例如,这里会创建一个名为 ollama 的用户组,并且用户 ollama 会成为该组的成员。

-m

此参数表示在创建用户时,自动为该用户创建主目录。主目录是用户在系统中的个人工作空间,通常包含用户的配置文件、文档等。

-d /usr/share/ollama

-d 参数用于指定用户的主目录路径。这里将用户 ollama 的主目录设置为 /usr/share/ollama,而不是默认的 /home/ollama

ollama

这是要创建的新用户的用户名。

2. sudo usermod -a -G ollama $(whoami)

usermod

这是一个用于修改用户账户信息的命令。可以对已存在用户的各种属性进行修改,比如用户名、用户 ID、主目录、所属用户组等。

-a

-a 是 --append 的缩写,它的作用是将用户追加到指定的用户组中,而不是替换用户原本所属的用户组。也就是说,执行该命令后,用户会保留原有的用户组成员身份,同时新增为指定用户组的成员。

-G

-G 即 --groups,用于指定要将用户添加到的目标用户组。这里指定的目标用户组是 ollama

$(whoami)

这是一个命令替换的语法。whoami 命令的作用是显示当前登录用户的用户名。通过 $( ) 将 whoami 命令括起来,会先执行 whoami 命令并获取其输出结果(即当前用户的用户名),然后将这个结果作为 usermod 命令要操作的用户名

1.6 配置系统自启动

先在 `/etc/systemd/system/` 目录下创建一个名为 `ollama.service` 的服务文件。

sudo vim /etc/systemd/system/ollama.service

然后在打开的 `vim` 编辑器中,输入以下示例内容:

[Unit]

Description=Ollama Service

After=network-online.target

[Service]

ExecStart=/usr/bin/ollama serve

User=ollama

Group=ollama

Restart=always

RestartSec=3

Environment="PATH=$PATH"

Environment="OLLAMA_HOST=0.0.0.0:11434"

Environment="OLLAMA_ORIGINS=*"

[Install]

WantedBy=default.target

在 `vim` 编辑器中,按下 `Esc` 键,然后输入 `:wq` 并按下回车键,即可保存并退出编辑器。

1.7 系统的方式启动ollama

1,重新加载 `systemd` 管理器配置

sudo systemctl daemon-reload

2,启动服务

sudo systemctl start ollama.service

3,查看服务状态

sudo systemctl status ollama.service

4,设置服务开机自启

sudo systemctl enable ollama.service

5,重启服务

sudo systemctl restart ollama.service

6,停止服务

sudo systemctl stop ollama.service

查看服务状态,确定ollama服务处于运行中。

2. 下载模型文件

2.1 下载模型

可以访问https://www.modelscope.cn/models网址进行模型下载

2.2 下载deepseek蒸馏过的模型,找到以GGUF为结尾的模型

比如:DeepSeek-R1-Distill-Qwen-7B-GGUF:选择合适机器的模型。

https://www.modelscope.cn/models/unsloth/DeepSeek-R1-Distill-Qwen-7B-GGUF

2.3 下载好的模型,需要上传到ollama部署的服务器

2.4 导入模型

1.模型文件同级目录下创建一个文件,这里命名叫做 Modelfile,文件内写入

FROM ./DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf

2.保存文件,执行命令

ollama create <模型名称-可自定义> -f ./Modelfile

ollama create DeepSeek-R1-Distill-Qwen-7B-Q4_K_M -f ./Modelfile

2.5模型导入完成后,查看导入的模型

ollama list

2.6 运行导入的模型

ollama run <上一步定义的模型名称>

ollama run DeepSeek-R1-Distill-Qwen-7B-Q4_K_M

到这步deepseek模型已经部署好了,但是只能后台命令运行,不方便,需要再部署一个UI前台服务方便使用。

3. 部署ollama-ui(docker方式部署)

3.1 下载ollama-ui的部署包

1.找一台可以科学联网的linux服务器,且该服务部署了docker

参考网址:https://github.com/jakobhoeg/nextjs-ollama-llm-ui

2.使用docker的方式拉取镜像

docker pull jakobhoeg/nextjs-ollama-ui

3.镜像拉取成功,打包镜像

docker save -o jakobhoeg_nextjs-ollama-ui.tar jakobhoeg/nextjs-ollama-ui:latest

3.2 将上面打包好的镜像包,上传到内网环境

1.内网环境,找一台安装了docker的服务器

2.加载镜像包

docker load -i jakobhoeg_nextjs-ollama-ui.tar

3.查看镜像

docker images

3.3 启动ollama-ui

1.ollama和ollama-ui没有部署在同一台服务器 (example.com需要更改为部署了ollama的服务器ip)

docker run -d -p 3000:3000 --add-host=host.docker.internal:host-gateway -e OLLAMA_URL=http://example.com:11434 --name nextjs-ollama-ui --restart always jakobhoeg/nextjs-ollama-ui:latest

2.ollama和ollama-ui部署在同一台服务器

docker run -d -p 3000:3000 --add-host=host.docker.internal:host-gateway -e OLLAMA_URL=http://host.docker.internal:11434 --name nextjs-ollama-ui --restart always jakobhoeg/nextjs-ollama-ui:latest

--修改ollama-ui默认监听端口

先查看端口是否被占用

netstat -tuln | grep 8000

没占用的话,即可修改UI监听端口

这里 8000 是宿主机的端口,3000 是容器内部服务监听的端口。

docker run -d -p 8000:3000 --add-host=host.docker.internal:host-gateway -e OLLAMA_URL=http://host.docker.internal:11434 --name nextjs-ollama-ui --restart always jakobhoeg/nextjs-ollama-ui:latest

3.4 打开浏览器,访问ollama-ui

http://host:8000/,选择模型,对话测试下

结尾
通过这次对内网离线部署 DeepSeek 的实践,我们不仅拓宽了技术视野,更在保障数据安全与高效利用工具之间找到了平衡。相信这次分享能为有类似需求的同行们提供有价值的参考。
 
如果你觉得文章内容对你有所启发,不妨点赞、关注支持一下。要是你在实际操作中遇到了不一样的情况,或是有独特的见解和经验,欢迎在评论区分享交流,大家共同进步。

deepseek内网离线部署手册的更多相关文章

  1. kubernetes 内网节点部署笔记(一)

    在Centos7上部署kubernetes时,碰到很多坑,特别在摸拟在内网部署时,有来自GFW的障碍,有来自Firewalld的阻塞,反正是各种不服,终于慢慢理顺了思路,自己记录一下,防止遗忘. 环境 ...

  2. yum仓库配置与内网源部署记录

    使用yum的好处主要就是在于能够自动解决软件包之间的依赖.这使得维护更加容易.这篇文章主要就是记录部署内网源的操作过程以及yum工具如何使用 因为需要.数据库要从Oracle迁移至MySQL.在部署M ...

  3. k8s内网安装部署(二)

    续上篇 https://www.cnblogs.com/wangql/p/13397034.html 一.kubeadm安装 1.kube-proxy开启ipvs的前置条件 modprobe br_n ...

  4. Gradle AndroidStudio内网离线构建配置踩坑记录

    最近一家新公司,由于办公环境都是在内网机上,导致在Unity导出android工程后,gradle离线构建也是第一次搞,花了一天时间也踩了一些坑,最后也终于构建成功了,这里记录下,方便大家少走些弯路. ...

  5. Linux系统如何在离线环境或内网环境安装部署Docker服务和其他服务

    如何在离线环境或纯内网环境的Linux机器上安装部署Docker服务或其他服务.本次我们以Docker服务和Ansible服务为例. 获取指定服务的所有rpm包 保证要获取rpm包的机器能够上网. 本 ...

  6. Microsonf visual c++ 14+ 离线内网安装

    内网离线安装方法:先下载官方的visualcppbuildtools: <br  href=http://go.microsoft.com/fwlink/?LinkId=691126 >& ...

  7. 工具篇:使用natapp工具映射内网到外网访问

    一.环境说明 开发基于微信公众号的应用最大的痛苦之处就是调试问题,每次实现一个功能后都需要部署到一个公网服务器进行测试,因为微信用户每次向公众号发起请求时,微信服务器会先接收到用户的请求,然后再转发到 ...

  8. 内网网络摄像机(RTSP/IPC/NVR)如何能在公网进行RTMP/HLS/HTTP-FLV直播

    一.背景需求 传统监控行业里不管是设备端.服务器端亦或是客户端都在一个内网里面.而且现在的大部分监控方案都是这样的格局,小到一个公司范围内的监控,再到一个园区.一个仓库监控.一个农业园林监控.一个养殖 ...

  9. frp 用于内网穿透的基本配置和使用

    frp 用于内网穿透的基本配置和使用 今天是端午节,先祝端午安康! frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP.UDP.HTTP.HTTPS 等多种协议.可以将内网服务以安全.便 ...

  10. Hyperledger Fabric 1.0 从零开始(三)——环境构建(内网/准离线)

    有公网环境的服务器可以直接看 Hyperledger Fabric 1.0 从零开始(二)--环境构建(公网) ,本篇内容与上篇相似,只不过环境搭建需要在内网下,也就是网络被限制的情况下. 1:环境构 ...

随机推荐

  1. IM开发干货分享:我是如何解决大量离线消息导致客户端卡顿的

    1.引言 好久没写技术文章了,今天这篇不是原理性文章,而是为大家分享一下由笔者主导开发实施的IM即时通讯聊天系统,针对大量离线消息(包括消息漫游)导致的用户体验问题的升级改造全过程. 文章中,我将从如 ...

  2. 微信小游戏直播在Android端的跨进程渲染推流实践

    本文由微信开发团队工程师"virwu"分享. 1.引言 近期,微信小游戏支持了视频号一键开播,将微信升级到最新版本,打开腾讯系小游戏(如跳一跳.欢乐斗地主等),在右上角菜单就可以看 ...

  3. Solution Set -「NOIP Simu.」20221014

    \(\mathscr{A}\sim\)「Unknown」tothecrazyones   有 \(n\) 堆石子, 第 \(i\) 堆有 \(a_i\) 个. Alice 和 Bob 轮流抓取, Al ...

  4. neo4j存储数据-图数据库

    1. 简介 本文主要介绍neo4j是如何将图数据保存在磁盘上的,采用的是什么存储方式.分析这种存储方式对进行图查询/遍历的影响. 2. 图数据库简介 生产环境中使用的图数据库主要有2种,分别是带标签的 ...

  5. 理解Java的接口和抽象类

    深入理解Java的接口和抽象类   对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多 不同的地方.很多人在 ...

  6. SM9-密钥交换

    算法过程 代码实现 ///************************************************************************ // File name: ...

  7. VS中无法识别unistd.h的问题

    问题 VS 无法打开源文件 unistd.h 参考:链接 方法 许多在Linux下开发的C程序都需要头文件unistd.h,但VC中没有个头文件,所以用VC编译总是报错.把下面的内容保存为unistd ...

  8. Kotlin:反引号中的函数命名、匿名函数、函数类型与隐式返回

  9. Spaghetti pg walkthrough Intermediate

    nmap ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.170.160 Starting Nmap 7.94SVN ( https://nmap.org ) a ...

  10. Matplotlab显示OpenCV读取到的图像

    Matplotlab显示OpenCV读取到的图像 一. 确认图像的数组类型 在使用 OpenCV 的 cv2.imread() 函数读取图像时,第二个参数(标志)决定了图像的读取方式.具体来说,0.1 ...