简介:《基于银河麒麟桌面&服务器操作系统的DeepSeek本地化部署方法》是一份面向银河麒麟桌面与服务器用户的AI模型落地指南,适合需要在Linux发行版上完成深度学习模型本地部署、API集成与客户端接入的开发者及运维人员。PDF围绕网页版访问、客户端使用、本地部署后客户端接入、API Key配置及VS Code辅助编程等场景展开,并给出ollama与DeepSeek-R1模型安装运行、ARM架构依赖库缺失等问题的处理思路,附桌面系统部署过程截图,便于对照排查。资源包共1个PDF文件,约1.98MB,结构按概述、场景操作、集成开发与附录组织,可按需检索。已有513人学习,适合希望在内网或本地环境中快速搭建DeepSeek服务、了解多客户端选择的读者参考。
1. 一台没有外网出口的服务器,正在等一个能对话的模型
机房角落摆着一台刚装完系统的机架服务器,没有外网出口,却要跑起一个能对话、能补代码的大模型——这类需求在国产化改造项目里出现得越来越密集。手上这份 PDF 就是冲着这个场景写的:它把 DeepSeek 在国产 Linux 桌面版与高级服务器版上的四种用法拆开讲,从浏览器直接打开网页、装客户端填 API Key,到用 ollama 在服务器上把 deepseek-r1 真正跑起来、再由桌面端接回内网,连 VS Code 里怎么接辅助编程插件都给了截图级步骤。适合两类人:手上有一台国产化服务器要交付、又不愿意把代码和文档发到公网的人;以及第一次在 ARM 机器上装 ollama、被 GLIBCXX 报错卡在半路的值班运维。
2. 四条路线先算账:网页版、API 客户端、本地部署分别适合谁
拿到这份手册最容易犯的错,是跳过选型直接翻到第四章照抄命令。手册本身把四种用法并列放在目录里,没有替你决策,因为四种路径的数据流向、硬件成本和合规边界完全不同。先把账算清楚,后面每一步才知道自己在干什么。
2.1 三种接入方式的数据流向与成本对照
网页版最轻:浏览器打开官方站点,或者从系统自带软件商店装一个"网页版"壳子,本质还是把问题发到公网服务端。零硬件成本,零运维,代价是数据出内网,并且依赖外网连通性。客户端(Chatbox、NextChat、Cherry Studio 这类)是第二种:软件装在本机,但模型仍然在远端,客户端只承担界面和会话管理,配置时填的是官方 API Key。它的价值在于把多轮对话、提示词模板、文件拖拽这些交互做顺,比浏览器标签页好用,数据流向和网页版一样。
本地部署是第三种,也是这份手册真正的重头。ollama 把模型权重下载到本机磁盘,推理跑在本机 CPU 或 GPU 上,请求不出网卡。好处是断网可用、数据不出机房;代价是硬件、磁盘和一次性的部署工时。
| 路径 | 数据流向 | 硬件门槛 | 断网可用 | 典型场景 |
|---|---|---|---|---|
| 网页版 | 请求发往公网 | 无 | 否 | 临时查资料、写文案 |
| 客户端 + 官方 API | 请求发往公网 | 无 | 否 | 日常问答、多轮长会话 |
| 本地 ollama + 客户端接入 | 全程内网 | 内存 8GB 起,按模型放大 | 是 | 内网交付、代码不外发 |
| VS Code + 插件 | 取决于插件配置的 provider | 无 | 视配置而定 | 边写边补代码 |
判断口径其实只有三个问题:这段内容能不能出内网;这台机器有多少内存和磁盘;后续谁来维护。三个问题里只要有一个答"不能出网",就直接跳到本地部署那条线,别再纠结网页版体验好不好。
2.2 API Key 的申请与保管:一次性展示,丢了只能重建
走客户端或 VS Code 插件这条路,绕不开 API Key。手册里专门附了一页获取方法,流程本身不复杂,但有几个细节值得单独拎出来说。登录官方控制台后进入密钥管理页,点创建、给个能认出用途的名字(比如按机器或按人命名),确认后页面会把完整密钥展示一次。注意,只展示这一次,关掉页面就再也看不到了,只能删掉重建。
创建之后不要直接粘进聊天窗口或提交到代码仓库。常见做法是写进本机的环境变量文件,权限设成 600,再用的时候从环境变量读。下面这段是验证密钥是否可用的最小请求,跑通说明网络和密钥都没问题:
# 把密钥放进环境变量,避免出现在命令历史里 export DEEPSEEK_API_KEY="sk-xxxxxxxxxxxxxxxx" # 发一条最小请求,只看是否返回 200 与正常 JSON curl -s https://api.deepseek.com/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${DEEPSEEK_API_KEY}" \ -d '{ "model": "deepseek-chat", "messages": [{"role": "user", "content": "回复两个字:收到"}], "stream": false }'这段请求里三个字段值得说清楚:model决定走哪个模型档位,写错会直接返回模型不存在;messages是标准的多轮结构,role 只认 system、user、assistant 三种;stream设成 false 是为了让 curl 一次拿到完整 JSON,排查时比流式输出好看得多。如果返回 401,先查密钥有没有多余空格;返回 404 基本是 model 名字写错;超时则是网络侧的问题,跟密钥无关。
密钥管理上还有一条血泪经验:一个用途一把钥匙。给 VS Code 插件单独建一把,给桌面客户端单独建一把,出事时能精确吊销,不至于一处泄露全线重建。
2.3 客户端安装与首次验证:先把"能连上"这件事确认掉
手册推荐用 Chatbox 做示例,同时提到商店里还有 NextChat、Cherry Studio 可选,这个安排挺务实——客户端只是壳,换来换去成本很低。安装走系统自带软件商店,搜索名字直接装,不用去官网下安装包,避免架构不匹配。
装完第一次启动会进设置页,需要填两样东西:模型提供方和 API Key。填完保存,随便发一句"你好",能收到回复就说明链路通了。这一步看似废话,实际上是后面排错的分界线:如果这里就不通,问题在密钥或外网;如果这里通了、换成 ollama 之后不通,问题在服务监听或端口。把这条基线先立住,后面能省掉大量来回试的时间。
另外提一句,客户端里的会话历史默认落在本机用户目录,涉及内部资料的会话建议定期清理,或者把存储路径指到加密盘上。
3. 服务器侧落本地模型:ollama 安装、服务监听与 deepseek-r1 拉取
本地部署这一段是整份手册最厚的部分,桌面版和服务器版流程一致,差别只在硬件和是否常驻。手册明确建议:要性能和算力,优先放在高级服务器操作系统上跑,桌面端只做接入。这个分工是合理的——推理吃的是内存带宽和核心数,桌面机器还要给人用,抢资源会很难受。
3.1 两条安装路径:在线脚本与离线压缩包
ollama 官方给的是在线一键脚本,适合机器能出网的情况:
# 在线安装:脚本会自动识别架构并下载对应二进制 curl -fsSL https://ollama.com/install.sh | sh # 装完确认版本,能打印出版本号说明二进制已落地 ollama --version # 看服务单元有没有被脚本一并创建 systemctl status ollama --no-pager这条命令做三件事:探测 CPU 架构(x86_64 还是 aarch64)、下载对应的二进制、把 ollama 注册成 systemd 服务。执行完不用手动启动,服务已经被拉起。
内网机器出不去,就走第二条路:在能出网的机器上下载对应架构的压缩包,拷进内网再解压。手册给的落点是/usr/local,这是对的,因为解压后二进制会落在/usr/local/bin/ollama,正好在默认 PATH 里:
# 离线包解压到 /usr/local,产物是 bin/ollama 与 lib/ 下的运行时库 tar -C /usr/local -zxvf ollama-linux-amd64.tgz # 手动确认可执行文件到位 ls -l /usr/local/bin/ollama /usr/local/bin/ollama --version这里有个容易被忽略的点:压缩包分 amd64 和 arm64 两个版本,下载时看uname -m的输出,x86_64拿 amd64,aarch64拿 arm64。拿错了不会报"架构不符",而是在运行时抛一个莫名其妙的格式错误,很容易被误判成系统问题。
3.2 让服务活得久:环境变量、监听地址与 systemd
ollama serve默认只监听127.0.0.1:11434,也就是只有本机能连。桌面端要通过局域网接进来,必须让它监听所有网卡。手册给的做法是设两个环境变量:
# 监听所有网卡,端口沿用默认 11434 export OLLAMA_HOST=0.0.0.0 # 放开跨域限制,浏览器类客户端才能直接调 export OLLAMA_ORIGINS=* # 前台启动,适合先验证 ollama serveOLLAMA_HOST决定绑定地址,只写0.0.0.0时端口默认 11434,写成0.0.0.0:11500就能改端口;OLLAMA_ORIGINS是 CORS 白名单,设成*表示任意来源都放行,内网环境图省事可以这么干,但要清楚这等于把接口完全敞开,只适合隔离网段。
前台跑的缺点是终端一关服务就没了。生产环境建议写成 systemd 单元,把环境变量固化进去:
# /etc/systemd/system/ollama.service [Unit] Description=Ollama Service After=network-online.target [Service] # 显式指定二进制路径,避免 PATH 不一致找不到 ExecStart=/usr/local/bin/ollama serve User=ollama Group=ollama Restart=always RestartSec=3 # 对外监听 + 放开跨域 + 把模型权重放到大容量数据盘 Environment="OLLAMA_HOST=0.0.0.0:11434" Environment="OLLAMA_ORIGINS=*" Environment="OLLAMA_MODELS=/data/ollama/models" [Install] WantedBy=default.target三个参数里OLLAMA_MODELS最值得改。模型权重动辄几个 GB 到几十 GB,默认落在用户目录,很容易把系统盘撑爆,指到独立数据盘之后再拉模型就不慌了。启用前记得建用户和目录:
# 建专用低权限用户,别用 root 跑推理服务 useradd -r -s /bin/false ollama mkdir -p /data/ollama/models chown -R ollama:ollama /data/ollama # 重载并开机自启 systemctl daemon-reload systemctl enable --now ollama systemctl status ollama --no-pager防火墙也要放行,否则本机 curl 通、桌面端连不上,这种"一半通"的现象最容易让人怀疑人生:
firewall-cmd --permanent --add-port=11434/tcp firewall-cmd --reload3.3 模型选型:1.5b 只是起步,别拿它当生产档
手册示例用的是deepseek-r1:1.5b,理由很直接——先把流程跑通,验证链路,再按机器配置换大模型。这个思路没问题,但很多人跑通 1.5b 就以为部署完了,结果交付现场被业务方一句"回答质量不行"问住。
拉取和运行是一条命令:
# 拉取并直接进入交互模式,首次会自动下载权重 ollama run deepseek-r1:1.5b # 只看拉取进度、不进交互 ollama pull deepseek-r1:7b # 列出本机已有模型与占用 ollama list # 查看当前加载到内存里的模型 ollama ps参数选择上给一个大致的对照,实际以机器实测为准:
| 模型规格 | 权重大小(约) | 建议内存 | 适用场景 |
|---|---|---|---|
| 1.5b | 1.1 GB | 8 GB | 流程验证、接口联调 |
| 7b / 8b | 4.7 GB | 16 GB | 日常问答、轻量代码补全 |
| 14b | 9 GB | 24 GB 以上 | 文档摘要、结构化抽取 |
| 32b | 20 GB | 32 GB 以上 | 较复杂的推理任务 |
| 70b | 40 GB | 64 GB 以上 | 高价值离线场景,需 GPU 配合 |
判断能不能跑,别看参数量,看ollama ps里加载后常驻内存有没有超过物理内存的七成。超了会开始换页,输出速度断崖式下跌,表现出来就是"卡住了",其实是内存不够在颠簸。
3.4 连通性验证:三层验证法,一层都别省
手册的做法是开一个新终端敲ollama list看服务是否起来,这个只能证明本机通。我一般按三层验:
# 第一层:服务进程在不在 systemctl is-active ollama # 第二层:本机接口有没有响应,返回 JSON 列表说明 API 正常 curl -s http://127.0.0.1:11434/api/tags # 第三层:从另一台机器用服务器 IP 打,验证监听和防火墙 curl -s http://10.0.0.21:11434/api/tags # 真正跑一次推理,确认模型能出字 curl -s http://10.0.0.21:11434/api/generate -d '{ "model": "deepseek-r1:1.5b", "prompt": "用一句话说明什么是内存泄漏", "stream": false }'第三层的 IP 换成实际服务器地址,/api/tags返回的是模型清单,只要不是连接被拒就说明监听配置对了。最后那个/api/generate才是端到端验证:stream设 false 时接口会等推理结束一次性返回,适合脚本判断;设 true 则是一条条吐 token,适合做流式界面。这一步过了,才算真正"部署完成"。
4. 桌面侧把模型接回来:Chatbox 参数配置与 VS Code 里接 cline
服务器上跑起来只是半程,用户真正接触的是桌面端。手册在这一段给的信息密度不高,但每一步都卡在关键参数上,配错一个就连不上。
4.1 Chatbox 接 ollama:四个参数逐项对
在桌面系统上从软件商店装好 Chatbox,进设置页,把"模型提供方"从默认的官方 API 改成OLLAMA。改完这一项,下面的字段会跟着变,需要填的只剩域名和端口:
| 配置项 | 填写值 | 说明 |
|---|---|---|
| 模型提供方 | OLLAMA | 切换后走本地接口协议,不再要 API Key |
| API 域名 | http://10.0.0.21 | 填服务器实际 IP,不要带端口 |
| 端口 | 11434 | ollama 默认端口,改过就跟着改 |
| 模型 | deepseek-r1:1.5b | 域名填对后自动拉取模型列表 |
填完点保存,如果"模型"下拉框是空的,说明客户端压根没连上服务器,回到 3.4 的第三层去查,别在客户端里反复重装。域名这一栏有个坑:有的版本要求带http://前缀,有的会自动补,填10.0.0.21:11434这种混合写法容易解析失败,稳妥做法是地址和端口分开填。
保存后发一句测试问题,能出字即通。这一步通了,就实现了手册说的"服务器部署、桌面接入"的内网闭环:模型权重和推理都在服务器,桌面端只负责界面,多台桌面可以同时接同一个服务。
4.2 VS Code 接 cline:走官方 API 那条线
面向开发者的部分,手册选了 VS Code 加 cline 插件。装插件这一步没难度,重点在 provider 的选择上——这里必须说清楚一个容易混淆的点:cline 里配DeepSeek作为 provider,走的是官方云端 API,需要 API Key;如果想让插件用本地的 ollama,provider 要选Ollama,然后填本机或服务器的地址。手册里演示的是前者,很多人在内网照抄,卡在"没有 Key 怎么办"上。
走官方 API 的配置顺序是:打开 cline 面板,API Provider 选 DeepSeek,把 2.2 里生成的 Key 粘进去,点确认,发一句简单对话验证。走本地 ollama 的配置则是:
// VS Code 设置里与 cline 相关的关键项,按实际插件版本字段名可能略有差异 { "cline.apiProvider": "ollama", "cline.ollamaBaseUrl": "http://10.0.0.21:11434", "cline.ollamaModelId": "deepseek-r1:7b" }三个字段分别对应:provider 决定请求发往哪儿,baseUrl 是 ollama 的监听地址(内网填服务器 IP,同机填 127.0.0.1),modelId 必须和ollama list里的名字完全一致,大小写和冒号后的 tag 都不能错。配错 modelId 的表现是插件报"模型不存在",而 ollama 日志里其实什么都没收到。
手册演示的辅助编程场景很朴素:在对话框里描述需求,插件生成代码,粘进文件执行。真正用起来要注意上下文——把当前文件或选中片段带上,比纯文字描述准确得多,尤其在国产化环境里涉及一些非主流库的时候。
4.3 桌面版直接本地部署:能做,但要知道代价
手册附录给了桌面系统上完整部署的截图,步骤和服务器版一模一样:装 ollama、起服务、拉 1.5b、验证对话。能跑通,但要清楚这条路的天花板在哪。
桌面机器的内存通常被浏览器、IDE、办公软件分掉一大半,留给模型的余量有限,1.5b 勉强,7b 就会明显拖慢整机响应。而且桌面系统默认不保证服务常驻,重启后 ollama 服务大概率不会自己起来,得手动敲一次ollama serve。所以我的建议跟手册一致:桌面端只装客户端做接入,模型跑在服务器上。除非是单机离线演示、没有第二台机器的场合,才考虑桌面本地跑。
5. 避坑与排查:ARM 库缺失、端口不通、模型拉取失败的现场记录
手册正文里只显式写了一个坑(ARM 架构的 GLIBCXX 缺失),但按这套流程实际走一遍,能踩的地方远不止一个。下面四条是按出现频率排的,每条都给出可复现的判断依据。
5.1 现象:ARM 服务器装完 ollama,一执行就报 GLIBCXX 版本缺失
报错大致是/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.25' not found,二进制直接起不来。原因是 ollama 的 arm64 构建依赖较新的 GCC 运行时,而系统自带的 libstdc++ 版本偏旧,符号表里没有这个版本号。
先确认现状,别急着替换:
# 看当前库支持的 GLIBCXX 最高版本,最后一行就是上限 strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX | sort -V | tail -5 # 看系统里是否已经有更高版本的库文件躺着没被链接 ls -l /usr/lib64/libstdc++.so.6*如果tail出来的最高版本低于报错要求的版本,就需要换库。手册的做法是从随文档附带的资源包里取libstdc++.so.6.0.28,拷进/usr/lib64,备份原软链,重建指向:
# 拷贝新版库文件到系统库目录 cp libstdc++.so.6.0.28 /usr/lib64/ # 备份原软链接,出问题能立刻回滚 cd /usr/lib64/ mv libstdc++.so.6 libstdc++.so.6.bak # 重建软链接指向新版本 ln -s libstdc++.so.6.0.28 libstdc++.so.6 # 刷新动态库缓存,让新链接立即生效 ldconfig # 复查版本号,确认已包含 GLIBCXX_3.4.25 及以上 strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX | sort -V | tail -3这套操作会动系统级库,影响的不只是 ollama,所以备份那一步不能省。替换完如果别的程序起不来,把.bak改回去、ldconfig一下就能恢复。这也是我建议先在测试机上跑一遍的原因。
5.2 现象:服务器上 curl 本机通,桌面端怎么都连不上
本机curl 127.0.0.1:11434返回正常 JSON,桌面端填 IP 之后一直转圈或者提示连接失败。原因通常是三个之一:服务只监听了回环地址、防火墙没放行、或者桌面端填的地址带了端口又被自动补了一次。
按顺序排:
# 看服务实际监听在哪个地址,出现 127.0.0.1:11434 就是没放开 ss -lntp | grep 11434 # 看防火墙放行情况 firewall-cmd --list-ports # 从桌面机器上直接打接口,绕开客户端 curl -v http://10.0.0.21:11434/api/tags第一条如果显示的是127.0.0.1,说明OLLAMA_HOST没生效——最常见的原因是改在了当前终端里,而服务是 systemd 拉起来的,两者环境变量不共享。改法是把环境变量写进 3.2 的单元文件,daemon-reload后重启服务。第二条缺端口就补 3.2 里的 firewall 命令。第三条如果 curl 报的是连接超时而不是拒绝,多半是中间有网段隔离。
5.3 现象:模型拉到一半停住,重试又从零开始
ollama pull中途断网或磁盘写满,进度卡住,Ctrl+C 之后重新拉,进度条又从 0% 走。原因是默认模型目录所在分区空间不足,或者临时文件残留。
排查顺序是先看空间再看目录:
# 看模型目录所在分区剩余空间,低于模型大小两倍就要警惕 df -h /data/ollama/models # 看目录里是否有半截文件 du -sh /data/ollama/models/blobs/* 2>/dev/null | sort -h | tail -5 # 清掉未完成的残留后重试 ollama rm deepseek-r1:7b ollama pull deepseek-r1:7b这里有个经验值:给模型目录预留的空间至少是目标模型权重的 2 倍,因为拉取过程中会同时存在临时文件和最终文件。7b 模型大概 4.7GB,目录至少留 10GB 才稳。另外OLLAMA_MODELS指向的目录权限要归 ollama 用户,权限不对的表现是拉取直接失败、日志里报写入拒绝。
5.4 现象:VS Code 插件显示连上了,但一问就报模型不存在
cline 里 provider 选了 Ollama、地址也填对了,模型下拉框却选不到东西,或者手填之后一发消息就报错。原因基本是两个:模型名和ollama list的输出不完全一致,或者 provider 选成了 DeepSeek 却填了本地地址。
判断方法很直接:
# 拿到准确的模型标识,注意冒号后的 tag ollama list # 用同名模型直接打接口,验证服务端确实有这个模型 curl -s http://10.0.0.21:11434/api/generate -d '{"model":"deepseek-r1:7b","prompt":"hi","stream":false}'第二条如果返回model not found,说明名字错了;如果返回正常文本,说明服务端没问题,问题在插件配置。另外提醒一句,deepseek-r1这类带推理过程的模型在插件里响应会偏慢,因为要先输出思考过程再给答案,遇到长时间没反应先别急着判定失败,看服务端日志有没有在持续输出。
6. 从能聊到能用:并发、上下文与一次完整的验收
部署完能对话只是及格线,交付前还需要确认几件更接近真实使用的事。我把这套流程固定成一张验收表,每次交付都照着走:
| 验收项 | 操作 | 通过标准 |
|---|---|---|
| 服务常驻 | 重启机器后直接访问接口 | 不手动启动也能返回模型列表 |
| 断网可用 | 拔掉外网网线后发一轮问答 | 正常返回,无超时 |
| 并发承载 | 三台桌面同时发请求 | 每台都能出字,无连接被拒 |
| 上下文长度 | 连续追问十轮以上 | 不出现上下文溢出报错 |
| 数据落盘 | 检查模型目录与会话存储路径 | 均在数据盘,系统盘无增长 |
并发这一项最容易被忽略。ollama 默认对同一模型串行处理请求,第二个人提问时排队等第一个人跑完,表现就是"卡"。想缓解有两条路:一是调OLLAMA_NUM_PARALLEL环境变量,让同一模型支持并行请求数,代价是内存占用成倍上涨;二是按人头准备多份模型副本,用不同 tag 分开加载,本质上还是拿内存换并发。两条路都要先算清楚物理内存够不够,别一上来就调大。
上下文长度是另一处容易翻车的地方。默认上下文窗口有限,长文档或长代码贴进去会被截断,模型看起来像"忘事"。需要长上下文时在请求里显式指定,但要注意窗口开得越大,显存和内存占用越高,响应也越慢,属于典型的用资源换效果,得按业务实际需要来定,不要一律拉满。
还有一个纯运维的小技巧:把常用的健康检查写成脚本放 crontab 里,每五分钟打一次/api/tags,连续失败就发告警。这样服务半夜挂了,第二天上班前就能知道,而不是等业务方打电话过来。
最后说个自己的教训。早几年做类似的内网部署,我在测试机上把库替换、环境变量、防火墙全配好,验证通过就收工了,结果交付到现场,对方机器是另一个架构,libstdc++那一步直接翻车,现场又没有回滚包。从那以后我每次交付前都强制走一遍"换一台干净机器从零复现",把每一步的包和命令都提前装进离线目录,一次都不省。希望帮到你。
本文还有配套的精品资源,点击获取