内网DeepSeek离线部署实战:从Ollama模型导入到RAG知识库与安全加固
简介面向政企单位内网环境的一份DeepSeek离线部署实战指南聚焦无互联网条件下AI知识库的快速搭建兼顾国产化适配与安全加固。文档系统梳理了离线资源准备环节包括大模型文件、Ollama运行环境、客户端及可选依赖包的获取途径、完整性校验与离线导入方式针对Windows Server、Linux及macOS三大系统给出多平台部署步骤同时介绍两种检索增强生成RAG数据投喂实现其中通过Cherry Studio客户端进行配置的方式对新手更为友好。安全层面覆盖模型服务接口访问控制、宝塔面板加固等权限管理措施并专门讨论国产操作系统、处理器架构与硬件兼容性方便政企环境落地。从资源准备到权限管理形成完整闭环可显著降低内网部署试错成本。资源为单个PDF文档共1个文件压缩包约5.28MB内容精炼便于内网传阅。目前已有1372人学习下载适合运维人员及有技术基础爱好者作为操作手册与排错参考。1. 内网DeepSeek离线部署教程里那套pip install在内网根本跑不通如果你在政企内网里部署过DeepSeek一定经历过这种窒息感网上教程清一色从pip install和git clone起步到了模型下载直接甩一个Hugging Face链接你这边却是物理隔离的网络环境连接外网要用专门流程下载靠U盘拷贝连个curl都出不去。更扎心的是模型文件动辄几十上百GU盘来回折腾几趟拷进来发现文件校验不对又得重来。这套内网离线部署方案就是围绕真实内网环境写的离线资源怎么备、Windows/Linux多平台怎么装、RAG数据怎么喂、Ollama API怎么防未授权访问全程不依赖任何在线链接照着走就能把DeepSeek变成自家内网可用的AI知识库。适合政企IT运维、有内网隔离需求的技术人员也适合想绕过在线依赖、彻底掌控模型数据的开发者。2. 离线资源准备模型、Ollama、客户端镜像一次带全2.1 模型离线包认准GGUF格式量化档位先算内存账DeepSeek的模型离线物料首推GGUF格式这是Ollama原生支持的模型格式拷进内网直接用ollama create导入就行。找货渠道没那么多花样一个是Hugging Face上官方仓库另一个是国内访问更稳的ModelScope搜索“GGUF deepseek-r1”就能筛出对应文件。官方模型可选范围从1.5b到70bb是参数量单位数值越大能力越强对硬件要求也水涨船高。我一般建议内网机器先算一笔账模型加载所需内存约等于“参数量×量化位宽÷8”。拿7b模型Q4量化来说大约需要7×4÷83.5GB加上上下文窗口开销16GB内存的机器跑起来才不憋屈。32b模型哪怕Q4量化也要16GB起步CPU推理会非常吃力更推荐有GPU的环境。除了对话模型还建议一并准备embedding向量模型。RAG知识库要靠它把文档切成向量再检索常见选择是nomic-embed-text以及中文场景表现更好的bge-large-zh-v1.5、bge-reranker-v2-m3-FP16.gguf。下载完千万别急着往内网塞先做完整性校验确保文件没在半路损坏。Linux/macOS下用sha256sumWindows下用PowerShell的Get-FileHashsha256sum /path/to/your/model/fileGet-FileHash -Algorithm SHA256 /path/to/your/model/file参数说明SHA256是哈希算法输出一串64位十六进制字符串和官方页面公布的哈希值逐字符比对一致才说明文件完好。这一步是内网部署最容易被跳过的环节文件拷一半U盘拔了、网络传输丢包导入时才发现模型加载不出来回头排查极其耗费时间。传输进内网的方式按安全等级选常规环境用U盘或移动硬盘文件特别大就走内网共享文件夹涉及敏感数据的环境走安全网闸物理隔离最彻底。模型文件超过单盘容量时Linux用split分割、cat合并Windows用7-Zip分卷压缩解压。把GGUF模型文件和同级目录下的Modelfile放好后进入该目录执行导入ollama create bge-m3-q8_0-bert_cpp -f Modelfile ollama list参数说明ollama create的模型名可以自定义-f Modelfile指定模型描述文件Modelfile里写的FROM字段必须指向同目录的GGUF文件。导入成功后ollama list能看到刚导入的模型这条命令也是后面所有验证动作的基础。2.2 Ollama安装包三种系统的离线准备方式Ollama运行环境本身也是要离线准备的。Windows最简单在有网的机器上从Ollama官网下载exe安装包拷进内网双击即可。Linux的做法稍绕一步在有网的机器上执行curl -fsSL https://ollama.com/install.sh | sh脚本会把Ollama二进制装到/usr/bin或/usr/local/bin找到这个ollama可执行文件整个拷进内网。macOS同理也可以在有网机器上用brew install ollama装好后从Cellar路径把二进制和依赖一起扒出来。这里有个容易栽跟头的细节拷二进制务必注意CPU架构x86机器拷ARM版本chmod x后一执行就是Exec format error。动手前先确认内网服务器的uname -m。2.3 客户端与RAG依赖离线化Docker镜像的save/load流程Lobe Chat这类Web客户端走Docker部署离线迁移靠的是docker save和docker load这对组合拳。在有网的机器上先拉镜像docker pull lobehub/lobe-chat docker save -o lobe-chat.tar lobehub/lobe-chat参数说明docker save的-o指定导出文件路径后面跟镜像名。这个tar包就是你要带进内网的完整镜像。到内网服务器上执行docker load -i lobe-chat.tar参数说明-i指定导入的tar文件加载完用docker images就能看到镜像。rag-web-ui这类RAG管理界面同理先docker pull再docker save -o rag-web-ui.tar。要注意save时把tag写全比如lobehub/lobe-chat:latest否则load进来镜像名是none后面compose引用时会翻车。2.4 离线Python依赖pip download一次打包如果要走Python方式手动构建RAG链路需要准备python-docx解析Word、pdfminer.six解析PDF、jieba中文分词、sentence-transformers向量化、chromadb向量数据库。这些库也可以在有网机器上一次打包pip download -r requirements.txt -d ./packages参数说明-d指定依赖包下载目录requirements.txt里写明库名即可。内网机器安装时不需要联网pip install --no-index --find-links./packages -r requirements.txt参数说明--no-index禁止pip访问PyPI--find-links强制从本地目录找包。embedding模型同样提前下载好后面用本地路径加载。3. 三平台部署OllamaWindows Server、Linux Server与国产化适配3.1 Windows Server 2019/2022安装包、环境变量与防火墙Windows Server部署走的是图形界面为主、命令行为辅的路线。双击Ollama安装包装完后Win键搜“环境变量”打开系统属性里的环境变量编辑界面在“系统变量”里新建OLLAMA_HOST值为0.0.0.0:11434这是让Ollama监听所有网卡内网其他机器才能访问如果只本机用改成localhost:11434。再建一个OLLAMA_MODELS指向你打算存放模型文件的绝对路径这个变量可选但建议设上否则模型存到C盘系统盘磁盘空间告急时你连后悔药都没得吃。改完环境变量必须重启Ollama服务用PowerShell执行Get-Service Ollama Restart-Service Ollama Get-Process -Name ollama参数说明Get-Service查看服务状态Restart-Service让新环境变量生效Get-Process确认进程在跑。Windows Server的坑集中在防火墙默认入站规则不会放行11434内网其他机器访问时会直接超时。用管理员PowerShell执行netsh advfirewall firewall add rule nameOllama dirin actionallow protocolTCP localport11434参数说明dirin是入站方向actionallow放行localport11434指定端口。如果还要部署Lobe Chat同理放行3210或3010端口。这一套在Windows Server 2019和2022上验证过再老的版本比如2016需要额外确认Docker版本兼容性。3.2 Linux Server二进制部署与systemd托管Linux这边我倾向二进制加systemd的组合。先把从有网机器拷贝来的ollama放进系统路径sudo cp ollama /usr/local/bin/ sudo chmod x /usr/local/bin/ollama参数说明/usr/local/bin是Linux放用户级可执行文件的标准路径已在PATH里执行ollama命令不用写全路径。接下来配置systemd服务让Ollama开机自启、崩溃自动拉起sudo cat /etc/systemd/system/ollama.service EOF [Unit] DescriptionOllama Service Afternetwork.target [Service] Useryouruser WorkingDirectory/path/to/ollama ExecStart/usr/local/bin/ollama serve EnvironmentOLLAMA_HOST0.0.0.0:11434 EnvironmentOLLAMA_MODELS/path/to/your/models Restartalways [Install] WantedBymulti-user.target EOF参数说明User换成实际运行用户建议建一个专用系统账户别用root跑ExecStart里的ollama serve是启动服务端进程Restartalways意味着进程意外退出立即拉起这是生产环境的基本要求。然后执行sudo systemctl daemon-reload sudo systemctl enable ollama sudo systemctl start ollama sudo systemctl status ollama参数说明daemon-reload让systemd重新读取刚写的配置文件enable设置开机自启start启动服务status查看运行状态。环境变量也可以在~/.bashrc里用export OLLAMA_HOST0.0.0.0:11434设置但跟systemd托管方式二选一即可混用容易混乱。Linux防火墙CentOS系用firewall-cmdUbuntu/Debian系用ufwsudo firewall-cmd --permanent --add-port11434/tcp sudo firewall-cmd --reload参数说明--permanent永久生效--reload重载规则。高并发场景还可以顺手把ulimit -n调高比如写到ulimit -n 65535增加Ollama可打开的文件描述符数量避免连接数一多就报Too many open files。3.3 macOS部署Gatekeeper与launchctl管理macOS部署适合个人开发机或小团队内网。安装走curl -fsSL https://ollama.com/install.sh | sh或brew install ollama环境变量编辑~/.zshrcexport OLLAMA_HOST0.0.0.0:11434 export OLLAMA_MODELS/path/to/your/models source ~/.zshrc参数说明macOS默认shell是zsh所以写~/.zshrc而非bashrc。OLLAMA_HOST同样按需决定是否暴露到局域网。macOS安全机制方面Gatekeeper可能会拦截未签名组件遇到授权提示放行即可SIP不建议关闭非必要情况下关掉SIP等于拆了系统安全防线。想要开机自启用LaunchAgent写plist文件加载命令是launchctl load ~/Library/LaunchAgents/com.ollama.plist。macOS上性能监控用活动监视器看内存压力模型加载策略不合适时调整OLLAMA_NUM_THREAD线程数。这套流程在Monterey、Ventura、Sonoma上都跑过。3.4 国产化适配操作系统、CPU架构与硬件兼容性国产化适配是政企内网绕不开的话题主要体现在三块操作系统、CPU架构、硬件加速。操作系统层面Ollama官方在Ubuntu、CentOS、Debian上验证充分但国产操作系统如麒麟、统信UOS大多是Linux内核加自研包管理体系的组合Ollama的二进制能否直接跑取决于内核和glibc版本。常见做法是先在目标机器上执行ollama --version验证可执行文件能否运行跑不起来就先解决兼容库问题而不是急着配服务。CPU架构层面x86有完整的AVX指令集加速Ollama对x86-64支持最好ARM架构如鲲鹏、飞腾的处理器Ollama有ARM版本但部分推理优化不生效实际表现会打折扣。Intel和AMD的x86 CPU老款不支持AVX2指令集时模型加载会报illegal instruction需要在下载模型时留意官方标注的CPU要求。硬件加速层面NVIDIA GPU走CUDA最顺畅AMD卡走ROCm但国产GPU如昇腾、寒武纪Ollama原生支持有限。实践经验是国产化场景先用CPU跑小尺寸模型验证链路再考虑外接加速卡走兼容层适配一步到位反而容易卡死在驱动上。4. 数据投喂实现RAGPython手工方案与Cherry Studio新手方案4.1 文档预处理把txt/pdf/docx/md统一切成小块RAG知识库的第一步是把五花八门的文档变成模型能用的检索块。原始文档格式杂txt、pdf、docx、md都有得先统一提取文本。docx用python-docx按段落抽取pdf用pdfminer.six提取md本身是纯文本可以直接读。常用提取逻辑from docx import Document document Document(your_document.docx) text \n.join([paragraph.text for paragraph in document.paragraphs])参数说明Document加载docx文件paragraphs遍历所有段落对象paragraph.text拿段落文本最终拼成一个完整字符串。提取完的文本要分块原则是每块500个字符左右相邻块可以重叠50个字符防止语义被切断。接着清洗去掉特殊符号、HTML标签、多余空白行。中文场景还要分词内网环境用jieba离线包import jieba text 这是内网知识库的一段测试文本 seg_list jieba.cut(text, cut_allFalse) print(/.join(seg_list))参数说明cut_allFalse是精确模式把句子切成词粒度向量化时中文按词而非整句处理检索效果更准。分块和清洗看似不起眼实际决定RAG检索质量的50%块太大检索不精准块太小语义碎片化我一般先用500字跑一轮测试再调。4.2 方式一用Python手动构建向量库手工方案适合想精细控制全流程的人。核心步骤是用sentence-transformers加载离线embedding模型把文本块向量化再写入ChromaDB。完整链路from sentence_transformers import SentenceTransformer import chromadb model SentenceTransformer(/path/to/your/embedding/model) sentences [这是第一段文本, 这是第二段文本] embeddings model.encode(sentences).tolist() client chromadb.Client() collection client.create_collection(my_collection) collection.add( embeddingsembeddings, documents[这是第一段文本, 这是第二段文本], metadatas[{source: doc1}, {source: doc2}], ids[id1, id2] )参数说明SentenceTransformer的入参是embedding模型的本地路径不联网也能加载model.encode把文本list转向量listchromadb.Client()默认本地存储create_collection建集合add时embeddings、documents、ids三个参数必须长度一致。这个方案的优点是每一步都可控缺点是代码量和排错成本高embedding模型加载失败、向量维度不匹配、ChromaDB版本兼容问题都够折腾一阵。4.3 方式二Cherry Studio直连Ollama新手推荐如果不写代码就能实现RAG我推荐Cherry Studio。这客户端的思路是把Ollama当模型后端本地向量模型也走Ollama接口喂数据全程图形界面操作。具体流程安装Cherry Studio打开设置里的“模型服务”添加Ollama服务地址填http://127.0.0.1:11434或内网Ollama服务器IP。然后添加模型在Ollama模型列表里填对话模型名deepseek-r1再添加一个embedding向量模型比如nomic-embed-text这个模型要提前用ollama run nomic-embed-text拉下来或者用上一章的方式离线导入。喂数据时在Cherry Studio的“知识库”里新建库导入本地文件客户端会调用向量模型把内容切片向量化。之后正常对话在输入框上方打开知识库开关提问时就能召回相关片段。整个链路不需要写一行Python代码对不熟悉编程的运维人员极友好。唯一要留意的坑对话模型和向量模型必须都配置好少一个知识库就用不了。4.4 向量化与重排模型选型中文场景建议embedding模型选型直接决定检索效果。英文资料多选nomic-embed-text轻量好用中文资料多的场景我踩过几次坑nomic-embed-text对中文语义理解明显偏弱召回结果经常跑偏。换成bge-large-zh-v1.5中文长文本的向量表达稳得多。重排阶段用bge-reranker-v2-m3-FP16.gguf它是个rerank模型把向量召回的前N个结果再精排一遍过滤掉不相关的段落。整套离线物料进入内网后embedding模型可以挂到Ollama上通过API走也可以直接用sentence-transformers本地路径加载取决于你选哪条RAG路线。论文档、规章制度这类正式文本rerank环节基本是刚需不加重排的知识库命中率会肉眼可见地下降。5. 安全加固与排查Ollama API别裸奔访问控制这样做5.1 Ollama API访问控制绑定网卡是第一道闸Ollama的API监听地址一旦设成0.0.0.0:11434意味着内网任何机器都能直接调它的接口。默认情况下Ollama没有认证机制别人只要知道你IPcurl http://你的IP:11434/api/tags就能看到你有哪些模型/api/generate还能直接调用模型跑推理这在政企内网是不可接受的裸奔状态。先确认暴露面curl http://127.0.0.1:11434/api/tags参数说明这条命令从本机视角看API是否存活。然后从另一台内网机器执行同样命令验证是否真的全网可访问。第一条闸是绑定精确网卡Ollama服务器的OLLAMA_HOST不要写0.0.0.0改成业务网段的实际IP比如OLLAMA_HOST192.168.30.10:11434这样只有能路由到该IP的机器才能访问。第二条闸是防火墙只放行内网源IP段Windows用netsh高级规则限制RemoteIPLinux用firewall-cmd的--add-rich-rule指定source地址段。5.2 Lobe Chat的ACCESS_CODE与用户管理Web界面侧Lobe Chat支持用户管理和权限划分落地方式是设置访问码。用之前离线导入的镜像启动容器时把访问码写进环境变量docker run -d -p 3210:3210 \ -e OLLAMA_BASE_URLhttp://内网OllamaIP:11434/v1 \ -e ACCESS_CODE你的访问码 \ --name lobe-chat \ lobehub/lobe-chat参数说明内网部署的关键在OLLAMA_BASE_URL它指向Ollama的OpenAI兼容地址格式是http://IP:11434/v1注意路径末尾必须带/v1我见过不少人在这里漏掉导致连不上模型。ACCESS_CODE是访问入口的通行码没填的人进不了聊天页面。Lobe Chat还支持多用户体系有独立的用户表做登录注册适合给不同部门分配账号。到这里API层绑定内网IP应用层设访问码双重防护基本能挡住大多数误操作。5.3 宝塔面板对Ollama API的安全设置用了宝塔面板的环境可以利用面板做一层反代控制。思路是让Nginx监听一个内网端口转发到Ollama的11434同时在Nginx层加Basic Auth认证这样外部请求必须先过账号密码。宝塔的配置文件精简后大致是这样server { listen 8080; location / { auth_basic Restricted; auth_basic_user_file /www/server/panel/vhost/bt_auth/ollama.passwd; proxy_pass http://127.0.0.1:11434; proxy_set_header Host $host; } }参数说明auth_basic开启基础认证auth_basic_user_file指向存放账号密码哈希的文件密码用htpasswd工具生成proxy_pass反代到本机Ollama服务。这样即使内网有人扫到8080端口没有账密也调不了模型接口。宝塔防火墙侧再补一条只放行业务网段访问8080双重保险。不少团队的Ollama就是吃了没加认证的亏被同事或者内网扫描工具顺手调用了API一个月电费和算力全跑在别人请求上。5.4 常见问题与排查记录实践里翻车场景集中在下面这几类按“现象→原因→解决”的方式记录如下。现象内网任意机器都能直接访问Ollama API甚至外网也能通。原因OLLAMA_HOST配成了0.0.0.0:11434且防火墙未限制源IP。解决把OLLAMA_HOST改为内网业务IP防火墙放行规则里限定来源IP段API层再加Basic Auth或token校验。现象Ollama加载模型极慢或直接OOM进程被杀。原因模型量化档位过高超出物理内存或容器部署时内存限制太小。解决换成Q4_K_M等低量化档位用小一号模型物理机部署时查看free -h确保可用内存是模型需求的1.2倍以上。现象Linux下systemd启动Ollama失败systemctl status ollama显示红色错误。原因EnvironmentOLLAMA_MODELS/path/to/your/models指向的目录不存在或User对模型目录没有写权限。解决journalctl -u ollama看日志先mkdir -p创建目录再chown -R youruser赋权重新加载服务。现象docker load导入镜像后docker images看不到或者镜像名是none。原因save时没写完整tagload进来丢了仓库名标签。解决save时用docker save -o lobe-chat.tar lobehub/lobe-chat:latestload后手动docker tag补标签compose文件引用的名字要和tag完全一致。现象Windows Server重启后Ollama服务没起来客户端连不上。原因Ollama服务启动类型被改成了手动或环境变量改动后没重启服务。解决服务管理器里把OllamaService启动类型设为自动改完环境变量后执行Restart-Service Ollama确认Get-Service Ollama状态是Running。6. 装完验证跑通给内网部署做一次验收部署完最后一公里是验证不能装完就算完事。我每次内网部署完都强制走一遍下面这套动作花十分钟换后面少熬夜。第一确认模型就位。在Ollama服务器执行ollama list curl http://127.0.0.1:11434/api/tags预期结果ollama list列出所有模型/api/tags返回JSON格式的模型列表验证API进程正常监听。第二验证真实推理。执行一条简单对话请求curl http://127.0.0.1:11434/api/chat -d { model: deepseek-r1:7b, messages: [{role: user, content: 你好回复OK}], stream: false }参数说明model替换成你导入的模型名stream设false表示等完整响应返回避免验证时刷屏。如果返回带content字段的JSON说明推理链路通了。第三跨机器访问测试。换一台内网机器浏览器或客户端里把服务地址设为http://Ollama服务器IP:11434分别测API和对话确认防火墙放行生效。第四Web客户端联通测试。Lobe Chat打开后能正常登录、选择模型并对话说明OLLAMA_BASE_URL配置无误。第五RAG链路实测。在Cherry Studio或rag-web-ui里建一个测试知识库传两份固定内容的文档问一个答案明显在文档里的问题能引用到原文片段才算数。第六重启恢复测试。有意重启Ollama服务所在机器确认systemd或Windows服务把进程自动拉起来再走一遍对话请求。从那以后我每次给内网环境部署DeepSeek都强制自己走一遍“模型列表—API推理—跨机访问—客户端对话—RAG命中—重启恢复”的验收流程宁可多花十分钟也不等业务方报告“连不上”再去查日志。这套验证动作用熟了内网部署的翻车率能压到很低希望帮到你。本文还有配套的精品资源点击获取