简介:面向政企单位IT运维人员与技术爱好者的DeepSeek内网离线部署指南,专门解决无互联网接入环境下建设私有AI知识库的痛点,覆盖离线资源准备、环境部署、数据投喂到权限管理全流程,并突出国产化操作系统、CPU架构与硬件兼容适配。资源包为单份PDF文档,大小5.28MB,图文步骤清晰,适合边读边操作;部署部分涵盖Windows Server、Linux及macOS多平台,兼顾国产系统环境要求。内容详细列出模型离线包、Ollama安装包、客户端及RAG依赖包的获取途径,包括完整性校验与导入方法,并给出两种RAG实现方式,其中通过Cherry Studio客户端喂数据的方式对新手非常友好。安全加固章节专门讲解Ollama API访问控制、Lobe Chat权限设置、宝塔面板防护操作,可有效规避未授权访问风险,满足内网严格的安全合规要求。资源已有1372人学习浏览,适合需要在内网快速落地私有AI知识库的运维人员与爱好者作为操作参考。
1. 内网部署DeepSeek:先弄清离线环境的四个硬约束
DeepSeek离线部署真正卡住内网用户的,往往不是模型本身,而是四件被在线教程默认忽略的事:模型文件怎么进内网、Ollama服务怎么在内网跑起来、RAG数据怎么喂进去、API怎么防裸奔。政企单位的内网环境无法执行pip install和git clone,几百GB的模型文件也不能靠一条命令拉取,装完之后的国产化适配与安全加固更是硬需求。这篇文章要解决的就是这四件事,覆盖离线资源准备、Windows/Linux/macOS 多平台部署、两种RAG数据投喂路线,以及访问控制与高频翻车点排查。适合政企网管、IT运维和有基础的技术爱好者照着复现。
2. 离线资源准备:模型选型、完整性校验与Modelfile导入
2.1 模型离线包:先定参数量,再找GGUF
选型的第一步不是下载,而是算清楚内网机器能扛多大的模型。DeepSeek R1 系列常见有 7b、8b、14b、32b、70b 等版本,参数量直接决定内存和显存占用。我的经验是:16GB 内存的机器跑 7b 或 8b 的量化版比较稳,32GB 内存可以尝试 14b,32b 以上就要考虑多卡或者纯 CPU 硬扛,速度会明显下降。量化版本(文件名里带 q4、q8 这类标识)占用更小、推理更快,精度略有损失,但对知识库问答场景影响不大。
获取渠道有三个:一是在有外网的机器上装好 Ollama 客户端,直接执行ollama run deepseek-r1:7b,下载完成后再从模型目录里把文件拷贝出来;二是在 Hugging Face 上搜索deepseek GGUF,选择对应参数量的文件;三是在 ModelScope 上搜GGUF deepseek,国内网络下载速度通常更友好。社区还有一些基于 DeepSeek 的微调版本,导出格式同样是 GGUF,导入方式完全一致,按需选择即可。这里注意:GGUF 是 Ollama 能直接识别的模型文件格式,下载时优先选这个后缀,避免拿到其他格式还要做转换。
# 有外网机器上在线拉取模型,随后把模型文件整体拷入内网 ollama pull deepseek-r1:7b参数说明:deepseek-r1:7b是模型名加标签,标签里有参数量,也可以指定量化版本比如deepseek-r1:7b-q4_K_M。拉到本地后,模型文件默认存在~/.ollama/models目录,把整个模型目录或单独的 GGUF 文件拷贝到内网机器即可。
2.2 完整性校验与导入:SHA256 和 Modelfile 缺一不可
模型文件动辄几个 GB 到几十 GB,拷贝中断、U盘损坏、网闸传输丢包都可能导致文件损坏。下载完成后不校验就导入,大概率会在ollama create阶段报错。Linux 和 macOS 用sha256sum,Windows 用 PowerShell 的Get-FileHash,把计算出的哈希值和官方页面提供的值逐字符对比。
# Linux / macOS sha256sum /data/models/deepseek-r1-7b-q4_K_M.gguf # Windows PowerShell Get-FileHash -Algorithm SHA256 D:\models\deepseek-r1-7b-q4_K_M.gguf校验通过后进入内网传输。小文件直接用U盘或移动硬盘,大文件优先走内网共享文件夹;安全性要求极高的环境会用安全网闸,这时候文件通常要分割传输。Linux 上用split分割、cat合并,Windows 上用 7-Zip 做分卷压缩,到内网后再解压合并。
导入 Ollama 需要写一个 Modelfile 文件,放在和 GGUF 模型文件同级目录下,内容很简单:
FROM ./deepseek-r1-7b-q4_K_M.ggufFROM指向当前目录下的模型文件,文件名必须和实际一致。然后执行导入命令:
cd /data/models ollama create deepseek-r1-7b -f Modelfile ollama list逻辑说明:ollama create会基于 Modelfile 构建一个 Ollama 可识别的模型条目,-f指定 Modelfile 路径。ollama list用来确认导入是否成功,能看到模型名和大小就说明导入正常。如果ollama list里没有出现模型,检查 Modelfile 的FROM路径是不是写错,或者 GGUF 文件是否损坏。
2.3 Ollama、客户端与 RAG 依赖的离线包准备
Ollama 本体也要离线准备。Windows 直接下载官方安装包拷入内网;Linux 在有外网的机器上执行安装脚本后,把/usr/local/bin/ollama二进制文件单独拷贝出来,内网机器放到同路径并加执行权限;macOS 与 Linux 做法类似,可以直接拷贝应用或二进制。
Web 客户端 Lobe Chat 走 Docker 镜像分发。在有外网的机器上先拉镜像,然后导出为 tar 包:
docker pull lobehub/lobe-chat docker save -o lobe-chat.tar lobehub/lobe-chat把lobe-chat.tar拷贝到内网服务器后加载:
docker load -i lobe-chat.tar如果要用 RAG 网页版(rag-web-ui),同样用docker save导出镜像再导入内网。至于桌面客户端 Cherry Studio、Chatbox 这类,直接下载对应平台的离线安装包就好。RAG 需要的文本向量模型,比如nomic-embed-text、bge-m3,走的是和主模型一样的 GGUF 导入流程,别忘了单独准备。
| 资源项 | 获取渠道 | 内网落地动作 |
|---|---|---|
| DeepSeek GGUF 模型 | Ollama库 / Hugging Face / ModelScope | SHA256校验,U盘或共享存储拷入,Modelfile导入 |
| Ollama 本体 | 官网安装包 / 二进制文件 | 按平台安装或拷贝至/usr/local/bin |
| Lobe Chat 镜像 | 有外网机器 docker pull | docker save 导出,内网 docker load |
| Cherry Studio | 官方离线安装包 | 内网直接安装,配置 Ollama 地址 |
| 文本向量模型 | Ollama库(nomic-embed-text 等) | 与主模型同样走 Modelfile 导入 |
3. 多平台部署:Windows/Linux/macOS的Ollama服务与Lobe Chat接入
3.1 Windows Server 部署:环境变量、服务重启与防火墙放行
Windows Server 上部署 Ollama 最直接的路径是双击安装包完成安装,然后立刻做两件事:配环境变量、放防火墙。右键“此电脑”进入高级系统设置,新建系统变量OLLAMA_HOST,值设为0.0.0.0:11434,这样内网其他机器才能访问;如果只在本机用,设为localhost:11434。模型存放路径有特殊要求的,再建一个OLLAMA_MODELS指向实际目录。
# 以管理员身份运行 PowerShell [Environment]::SetEnvironmentVariable("OLLAMA_HOST", "0.0.0.0:11434", "Machine") Restart-Service Ollama参数说明:"Machine"表示写入系统级环境变量,对所有用户生效;改完必须重启 Ollama 服务,否则环境变量不会加载。状态排查用Get-Service Ollama和Get-Process -Name ollama两个命令,前者看服务是否在运行,后者看进程是否存在。如果进程在但服务显示停止,多半是环境变量写错或模型目录权限不足。
防火墙是 Windows 上最常见的访问失败原因。Ollama 监听 11434 端口,Web 客户端 Lobe Chat 监听 3010 端口,需要放行入站规则:
netsh advfirewall firewall add rule name="Ollama-API" dir=in action=allow protocol=TCP localport=11434 netsh advfirewall firewall add rule name="LobeChat-Web" dir=in action=allow protocol=TCP localport=3010逻辑说明:dir=in表示入站规则,action=allow放行,localport指定端口。这两条规则不加,内网其他机器即使能 ping 通服务器,也连不上 Ollama 和 Web 界面。Windows Server 2019 和 2022 上这套流程验证过没问题,更早版本要留意 Docker 和系统依赖库的兼容性。
3.2 Linux Server 部署:systemd 管服务,防火墙开端口
Linux 部署我先说结论:不要用nohup ollama serve这种裸办法,开机自启、崩溃恢复、日志查看全都依赖 systemd。把从有外网机器拷贝来的ollama二进制放到/usr/local/bin并赋执行权限,然后写服务单元文件:
sudo cp ollama /usr/local/bin/ sudo chmod +x /usr/local/bin/ollamasudo tee /etc/systemd/system/ollama.service > /dev/null <<'EOF' [Unit] Description=Ollama Service After=network.target [Service] User=ollamauser WorkingDirectory=/home/ollamauser ExecStart=/usr/local/bin/ollama serve Environment="OLLAMA_HOST=0.0.0.0:11434" Environment="OLLAMA_MODELS=/data/ollama/models" Restart=always [Install] WantedBy=multi-user.target EOF关键字段说明:User指定运行用户,别用 root 跑模型服务;ExecStart指向 ollama 二进制,serve是启动服务子命令;Environment里OLLAMA_HOST=0.0.0.0:11434让服务监听所有网卡,OLLAMA_MODELS指定模型目录;Restart=always保证进程意外退出后自动拉起。然后执行:
sudo systemctl daemon-reload sudo systemctl enable ollama sudo systemctl start ollama systemctl status ollamaenable设置开机自启,start立即启动,status查看运行状态和最近日志。日志排查用journalctl -u ollama -f实时跟踪输出,起不来的时候这里会直接告诉你是端口被占、模型路径错误还是权限问题。
防火墙按发行版区分。CentOS/RHEL 系用 firewalld,Ubuntu/Debian 用 ufw:
# CentOS / RHEL sudo firewall-cmd --permanent --add-port=11434/tcp sudo firewall-cmd --reload # Ubuntu / Debian sudo ufw allow 11434/tcp高并发场景下可以调大文件描述符限制,ulimit -n 65535,否则连接数一多 Ollama 会拒绝新请求。部署完成后用ss -lntp | grep 11434确认端口处于 LISTEN 状态。
3.3 macOS 部署与 Lobe Chat Web 接入
macOS 上 Ollama 建议直接装官方安装包,环境变量写到~/.zshrc:
export OLLAMA_HOST="0.0.0.0:11434" export OLLAMA_MODELS="/Users/yourname/ollama/models" source ~/.zshrcmacOS 的 Gatekeeper 会在首次安装时弹权限提示,按提示授权即可,不建议关 SIP。开机自启用 LaunchAgents 配置,但单机使用场景直接手动启动 Ollama 应用就够了。
Lobe Chat 接入 Ollama 是内网 Web 化的核心步骤。离线环境先docker load -i lobe-chat.tar加载镜像,再执行:
docker run -d -p 3010:3210 \ -e OPENAI_API_KEY=ollama \ -e OLLAMA_BASE_URL=http://<Ollama主机IP>:11434 \ -e OLLAMA_API_MODEL=deepseek-r1:7b \ -e ACCESS_CODE=my-secret-code \ --name lobe-chat \ lobehub/lobe-chat参数说明:-p 3010:3210把宿主机 3010 端口映射到容器内 3210;OPENAI_API_KEY对接 Ollama 时填占位符即可,真正生效的是OLLAMA_BASE_URL和OLLAMA_API_MODEL两个变量,前者指向内网 Ollama 服务地址,后者指定默认模型名;ACCESS_CODE是全局访问口令,不设的话任何人打开 Web 页面都能直接用。首次启动后浏览器访问http://<服务器IP>:3010,输入访问码即可进入对话界面。
4. 离线数据投喂与RAG:从文本分块到Cherry Studio的落地
4.1 文档准备与文本提取:先让知识库能“读”文件
RAG 的第一步是把企业内部文档变成纯文本。常见格式有 txt、pdf、docx、md,其中 docx 和 pdf 不能直接拿来分块,要先提取正文。离线环境用pip download在有外网机器上把依赖包下载好,再拷入内网安装:
# 有外网机器上提前拉取离线依赖 pip download python-docx pdfminer.six jieba -d /packages # 内网机器安装 pip install --no-index --find-links=/packages python-docx pdfminer.six jieba# 提取 docx 段落文本 from docx import Document document = Document("knowledge.docx") text = "\n".join([p.text for p in document.paragraphs if p.text.strip()])代码逻辑:Document()打开本地 docx 文件,遍历paragraphs取每段文字,strip()过滤空白段落。pdf 提取用pdfminer.six自带的命令行工具pdf2txt.py,输出为纯文本文件后再进入分块步骤。
4.2 分块、清洗与中文分词:决定检索精度的关键环节
文本不能整篇丢给向量模型,一是 embedding 模型有长度上限,二是长文本向量化后主题被稀释,检索时命中率下降。我的做法是按 500 字符一块、相邻块重叠 50 字符,既保证语义完整,又不让段落过长:
def chunk_text(text, chunk_size=500, overlap=50): chunks = [] start = 0 while start < len(text): chunks.append(text[start:start + chunk_size]) start += chunk_size - overlap return chunks逻辑说明:chunk_size控制每块长度,overlap让相邻块有重叠区域,避免一句话被拦腰切断导致语义丢失。清洗环节要去掉特殊符号、HTML 标签、多余换行。中文场景下分词用 jieba:
import jieba text = "这是内网知识库的一段测试文本" seg_list = jieba.cut(text, cut_all=False) print(" / ".join(seg_list))cut_all=False是精确模式,适合 RAG 场景;cut_all=True是全模式,召回高但噪声大,一般不用。
4.3 向量化与 ChromaDB 入库:Python 直建的完整路线
向量化需要 embedding 模型。离线环境里推荐两个选择:一是用 Ollama 里导入的nomic-embed-text,通过 Ollama 的 embedding 接口调用;二是用sentence-transformers加载本地模型文件。前者省事,后者方便二次开发。入库用 ChromaDB:
import chromadb from sentence_transformers import SentenceTransformer model = SentenceTransformer("/data/models/bge-large-zh-v1.5") sentences = ["第一段知识库文本", "第二段知识库文本"] embeddings = model.encode(sentences).tolist() client = chromadb.PersistentClient(path="./kb_db") collection = client.get_or_create_collection("internal_kb") collection.add( embeddings=embeddings, documents=sentences, metadatas=[{"source": "doc1"}, {"source": "doc2"}], ids=["id1", "id2"] )参数说明:SentenceTransformer直接传本地模型路径,离线可用;PersistentClient会把数据持久化到磁盘,比默认的临时内存客户端更符合生产需求;collection.add里embeddings、documents、metadatas、ids四个参数长度必须一一对应,metadatas用来存来源文件等附加信息,检索结果里会一并返回。
4.4 Cherry Studio 直接喂数据:新手推荐的 RAG 路线
如果不想写 Python 代码,Cherry Studio 是更快的路线。先在设置里的模型服务中添加 Ollama 供应商,API 地址填http://内网OllamaIP:11434,然后添加文本向量模型,比如nomic-embed-text或bge-m3。这两个模型要先在 Ollama 里导入成功,Cherry Studio 才会在下拉列表里出现。接着新建知识库,把准备好的 txt、pdf、docx 直接上传,客户端会自己完成分块、向量化、入库。对话时在输入框上方关联该知识库,回答会自动引用文档内容。
| 对比项 | Python 直建路线 | Cherry Studio 喂数据路线 |
|---|---|---|
| 适合人群 | 有基础、要做二次开发 | 新手、快速上线 |
| 分块与清洗 | 自己写代码控制 | 客户端内置流程 |
| 向量化 | sentence-transformers 离线模型 | Ollama 内嵌向量模型 |
| 知识库维护 | ChromaDB 手动管理 | 客户端界面化管理 |
| 主要风险 | 依赖多、离线装包麻烦 | 出问题不好定位内部逻辑 |
两种路线可以同时存在:先用 Cherry Studio 验证知识库效果,确认分块策略和文档格式没问题,再迁到 Python 流程做自动化更新。
5. 内网部署常见问题与排查:五个高频翻车现场
5.1 Ollama 服务起不来或端口无监听
现象:执行ollama list提示无法连接,ss -lntp | grep 11434没有任何输出。
原因:最常见的是环境变量没生效就启动服务,或者之前跑过旧版本 Ollama 进程占住了端口。Windows 上改了环境变量忘记重启服务,Linux 上改了~/.bashrc没有source,也会出现同样结果。
解决:Windows 执行Restart-Service Ollama后重新检查进程;Linux 先source ~/.bashrc再重启 systemd 服务。端口被占用时找到旧进程并清理,然后确认监听地址是0.0.0.0:11434而不是127.0.0.1。用curl http://127.0.0.1:11434/api/tags验证接口是否正常返回 JSON。
5.2 内网其他机器访问不了模型服务
现象:服务器本机能访问,局域网另一台机器浏览器打不开,或者客户端填了服务器 IP 依然报连接超时。
原因:OLLAMA_HOST没有设为0.0.0.0,服务只监听回环地址;或者防火墙没放行端口。这是内网部署翻车最多的一步。
解决:先确认环境变量值,然后检查防火墙。Windows 加netsh advfirewall入站规则,Linux 按发行版用 firewalld 或 ufw 放行 11434 端口。排查时在内网另一台机器上telnet <服务器IP> 11434,能通就说明网络层没问题,问题在服务监听地址。
5.3 Modelfile 导入报错或模型列表为空
现象:ollama create执行后提示文件找不到或格式错误,ollama list结果为空。
原因:GGUF 文件在传输过程中损坏,或者 Modelfile 的FROM路径和实际文件名不一致。我见过用网闸传输后哈希值对不上的情况,纯靠校验能发现。
解决:重新执行 SHA256 校验,和官方哈希值逐位对比;确认 Modelfile 里的文件名包含路径,并且模型文件在同一个目录下。如果文件是从分卷压缩包里合并出来的,先确认合并后文件大小和原始文件一致。
5.4 部署后响应慢、内存持续上涨
现象:第一次对话要等很久才输出,free -h看到内存几乎占满,多轮对话后越来越卡。
原因:模型参数量超出机器物理内存,或者同时加载了多个模型没有释放。Ollama 默认会缓存已经加载的模型,切换模型时旧模型不一定立刻卸载。
解决:换更小参数量的模型或更低精度的量化版;调整OLLAMA_MAX_LOADED_MODELS=1限制同时加载的模型数量;设置OLLAMA_NUM_THREAD限制 CPU 线程数,避免和业务系统抢资源。改完环境变量后重启服务。
5.5 RAG 回答不引用上传的文档
现象:知识库上传了文件,对话时回答仍然不带文档内容,和普通聊天没区别。
原因:要么知识库没有在对话中被选中,要么文本向量模型没有正确配置。Cherry Studio 里上传文件后,还需要在对话界面手动关联对应的知识库,这一步漏掉等于白传。
解决:确认向量模型已经在 Ollama 中导入并在客户端中选中;新建一轮对话,在输入框上方选择知识库再提问。如果仍然不引用,检查文档格式是否被客户端支持,txt 和 md 最稳,复杂排版的 pdf 容易提取出乱码。
6. 访问控制与国产化适配:从OLLAMA_HOST到宝塔面板的验证习惯
Ollama 默认没有认证机制,API 裸暴露在内网里,任何能访问 11434 端口的人都能调用模型、读取列表,这是内网部署里最容易被忽视的安全隐患。我的习惯是让 Ollama 只听本机回环地址,对外访问统一走宝塔面板的 Nginx 反向代理。systemd 配置里改Environment="OLLAMA_HOST=127.0.0.1:11434",然后在宝塔面板新建站点,反向代理到本机 11434,再加一层访问控制,只允许指定内网 IP 段访问,同时给 Web 界面设置复杂的访问码。Lobe Chat 的ACCESS_CODE是最后一道防线,不要让用户直接用空口令登录。如果 Ollama 必须对多个内网机器开放,至少设置OLLAMA_ORIGINS限制跨域来源,防止其他站点的恶意请求。
国产化适配这块,操作系统层面优先确认 CPU 架构。x86_64 的机器直接用官方二进制包,ARM64 架构(比如飞腾、鲲鹏芯片)要下载对应的 ARM 版本,装错架构会直接提示无法执行。国产 Linux 发行版多数基于 CentOS 或 Debian,部署流程和主流 Linux 一致,重点检查内核版本和 glibc 版本是否满足 Ollama 的要求。GPU 方面,NVIDIA 显卡需要装好驱动和 CUDA,Ollama 才能走 GPU 推理;使用国产加速卡的机器需要确认厂商是否提供了针对 Ollama 的适配层,如果没有,就退回到 CPU 模式跑小参数模型,保证功能可用性优先。
从那以后,我每次给内网装完 Ollama,不管多急都会强制走一遍四步验证:本机 curl 接口、内网第二台机器 telnet 端口、检查 OLLAMA_HOST 是否真的监听了所有网卡、确认 Web 界面访问码不是默认值。这四步全部通过,我才会把交付文档发给对方。这套习惯帮我挡掉了不少后续的远程排障请求,也希望帮到你。
本文还有配套的精品资源,点击获取