数据不出内网:基于Ollama+OneAPI构建企业专属DeepSeek智能中台
1. 内网部署 DeepSeek 的真实困境与破局思路很多企业想把大模型用起来第一反应是调云端 API但真到落地阶段安全部门一句数据不能出内网就把方案打回去了。尤其是金融、医疗、制造业的研发团队代码、工单、客户资料这些内容一旦离开内网合规上根本过不去。我接触过几个团队他们的诉求非常一致模型要能跑在自己的服务器上接口要统一最好还能像调 OpenAI 那样一行代码切换模型。这就是企业专属 DeepSeek 智能中台要解决的问题。核心思路其实不复杂用 Ollama 在内网服务器上把 DeepSeek 跑起来再用 OneAPI 做一层统一网关把 Ollama 的本地模型、以及未来可能接入的其他模型全部包装成标准的 OpenAI 兼容接口。这样上层业务系统只需要认一个 Base URL 和一个 Key底层换模型、加模型都不用改业务代码。为什么选 DeepSeek因为它在中文推理、代码生成上的表现确实能打而且开源权重可以本地部署32B 量化版本在单张 24G 显存的卡上就能跑起来对中小企业来说门槛可控。为什么选 Ollama它把模型加载、显存管理、API 暴露这些脏活都封装好了一条ollama serve就能对外提供 HTTP 接口。为什么还要 OneAPI因为 Ollama 原生接口虽然能用但格式和 OpenAI 不完全一致而且多模型、多 Key、用量统计这些企业级需求它不管OneAPI 正好补上这块。整个链路是这样的业务系统 → OneAPI统一网关端口 3000→ Ollama本地推理端口 11434→ DeepSeek 模型。数据全程在内网流转不出网卡。下面我把这套中台的搭建过程拆成可复制的步骤包括离线环境下的模型导入、OneAPI 的渠道配置、以及连通性验证。2. 前置准备Ollama 离线安装与 DeepSeek 模型导入内网服务器最大的坑就是装不了东西。Ollama 官方的一键脚本curl -fsSL https://ollama.com/install.sh | sh在内网直接歇菜因为脚本本身要联网下载二进制包。所以必须走离线路线在有网的机器上下载好安装包和模型文件再通过 U 盘或跳板机传进内网。先说 Ollama 的离线安装。根据服务器架构一般是 linux-amd64在有网机器上执行curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz下载完通过 scp 或堡垒机传到内网服务器比如放到/tmp目录。然后解压安装sudo tar -C /usr -xzf /tmp/ollama-linux-amd64.tgz解压后/usr/bin/ollama就有了直接执行ollama serve能跑起来。但为了让它开机自启、方便管理建议注册成 systemd 服务。先创建专用用户sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama sudo usermod -a -G ollama $(whoami)然后在/etc/systemd/system/ollama.service写入[Unit] DescriptionOllama Service Afternetwork-online.target [Service] ExecStart/usr/bin/ollama serve Userollama Groupollama Restartalways RestartSec3 EnvironmentPATH$PATH EnvironmentOLLAMA_HOST0.0.0.0:11434 [Install] WantedBydefault.target注意这里加了OLLAMA_HOST0.0.0.0:11434否则 Ollama 默认只监听 127.0.0.1OneAPI 容器访问不到。改完执行sudo systemctl daemon-reload sudo systemctl enable --now ollama接下来是模型导入这是内网部署最绕的一步。内网没法ollama pull得先在本地机器上把模型拉下来找到模型文件再传进去。本地执行ollama pull deepseek-r1:32b ollama show deepseek-r1:32b --modelfile输出里会有一行FROM C:\Users\xxx\.ollama\models\blobs\sha256-96c415...这个路径就是模型权重文件。同时把 Modelfile 导出ollama show deepseek-r1:32b --modelfile Modelfile把权重文件和 Modelfile 一起传到内网服务器同一目录比如/opt/models/deepseek。进去后重命名权重文件方便识别mv sha256-96c415656d377afbff962f6cdb2394ab092ccbcbaab4b82525bc4ca800fe8a49 deepseek-r1_32b.gguf然后编辑 Modelfile把FROM那行改成相对路径FROM ./deepseek-r1_32b.gguf最后导入ollama create deepseek-r1:32b -f Modelfile ollama list看到deepseek-r1:32b出现在列表里模型这步就成了。这里有个细节Modelfile 里的 TEMPLATE 和 PARAMETER 不要动那是 DeepSeek 的对话模板改了会导致输出格式错乱。3. OneAPI 网关部署与渠道配置可复制片段模型跑起来只是第一步要让业务系统方便调用还得有 OneAPI 这层网关。OneAPI 是开源的 LLM API 管理与分发系统能把 Ollama、OpenAI、Claude 等各种后端统一成 OpenAI 格式。内网部署同样用 Docker先写docker-compose.yamlservices: db: image: mysql:8.1.0 container_name: mysql restart: always environment: MYSQL_ROOT_PASSWORD: mysql-password volumes: - ./data:/var/lib/mysql one-api: image: justsong/one-api container_name: one-api restart: always ports: - 3000:3000 depends_on: - db environment: - SQL_DSNroot:mysql-passwordtcp(db:3306)/one_api - TZAsia/Shanghai - TIKTOKEN_CACHE_DIR/TIKTOKEN_CACHE_DIR volumes: - ./data:/data - ./TIKTOKEN_CACHE_DIR:/TIKTOKEN_CACHE_DIR networks: default: name: one-api这里有个内网必踩的坑OneAPI 依赖 tiktoken 做 token 计数而 tiktoken 启动时会去openaipublic.blob.core.windows.net下载编码文件内网直接超时。报错长这样[FATAL] failed to get gpt-3.5-turbo token encoder: dial tcp ... i/o timeout, if you are using in offline environment, please set TIKTOKEN_CACHE_DIR to use exsited files解决办法是手动把编码文件放进去。tiktoken 认的是 URL 的 SHA-1 作为文件名先算哈希echo -n https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken | sha1sum | head -c 40输出是9b5ad71b2ce5302211f9c61530b329a4922fc6a4。在有网机器上下载cl100k_base.tiktoken重命名为这个哈希值放进./TIKTOKEN_CACHE_DIR目录。如果日志里还报别的 encoder 缺失重复这个操作直到启动不再报错。启动服务docker compose up -d docker compose logs -f one-api看到监听 3000 端口就 OK。浏览器访问http://内网IP:3000默认账号root密码123456首次登录务必改掉。接下来配置 Ollama 渠道。进后台「渠道」→「添加新的渠道」关键字段这样填字段值说明类型Ollama下拉选择名称deepseek-local自定义分组default默认分组模型deepseek-r1:32b与 ollama list 一致代理留空内网直连密钥任意填Ollama 不校验最容易卡住的是「代理」地址。OneAPI 跑在容器里容器内的localhost指向容器自己不是宿主机。所以不能填http://localhost:11434。两种解法一是让 OneAPI 容器用 host 网络模式network_mode: host然后填http://127.0.0.1:11434二是保持 bridge 网络填http://host.docker.internal:11434但 Linux 下需要在 compose 里加extra_hosts: - host.docker.internal:host-gateway。我一般用第一种省事。渠道建好后去「令牌」页面新建一个令牌这就是业务系统要用的统一 Key。到这里网关层就通了。4. 内网调用验证与连通性排查动作配置完不验证等于没配。验证要分两层先确认 Ollama 本身能出结果再确认通过 OneAPI 能出结果。第一层直接在服务器上打 Ollama 原生接口curl http://127.0.0.1:11434/api/generate -d { model: deepseek-r1:32b, prompt: 用一句话解释什么是向量数据库, stream: false }如果返回 JSON 里有response字段且内容是中文说明模型加载正常。如果卡住不动多半是显存不够去看nvidia-smi或者journalctl -u ollama -f的日志。第二层走 OneAPI 的 OpenAI 兼容接口。假设 OneAPI 在内网 IP192.168.1.100令牌是sk-xxxxxxxxcurl http://192.168.1.100:3000/v1/chat/completions \ -H Authorization: Bearer sk-xxxxxxxx \ -H Content-Type: application/json \ -d { model: deepseek-r1:32b, messages: [{role: user, content: 写一个 Python 快速排序}], stream: false }返回结构里choices[0].message.content就是模型输出。这一步通了说明整条链路打通请求进 OneAPIOneAPI 转发给 OllamaOllama 推理后原路返回。Python 业务侧调用更简单用 openai 官方 SDK 改个 base_url 就行from openai import OpenAI client OpenAI( base_urlhttp://192.168.1.100:3000/v1, api_keysk-xxxxxxxx ) resp client.chat.completions.create( modeldeepseek-r1:32b, messages[{role: user, content: 帮我审查这段 SQL 有没有注入风险}] ) print(resp.choices[0].message.content)这样业务代码完全不用感知底层是 Ollama 还是别的未来要加模型只在 OneAPI 后台加渠道业务侧改个 model 名即可。连通性排查我整理了一个顺序先在服务器上curl 127.0.0.1:11434确认 Ollama 活着再curl 127.0.0.1:3000确认 OneAPI 活着然后从另一台内网机器curl 192.168.1.100:3000确认端口没被防火墙拦最后带上 Key 打完整请求。哪一步断问题就锁定在哪一层。5. 常见报错排查401、local proxy failed 与 reading choices内网搭这套东西报错基本集中在几个固定位置。我把踩过的坑按现象列出来对照着查能省不少时间。401 Unauthorized。这个最常见八成是 Key 的问题。先确认请求头里Authorization: Bearer sk-xxx格式对不对Bearer 后面有空格。再确认令牌在 OneAPI 后台是不是被禁用或额度耗尽。还有一种情况是令牌绑定的分组和渠道分组不匹配比如令牌是 default 分组渠道却建在 vip 分组请求就会 401。去「令牌」页面看分组设置和渠道保持一致。local proxy failed / dial tcp 127.0.0.1:11434 connection refused。这是 OneAPI 连不上 Ollama 的典型报错。原因就一个容器网络隔离。OneAPI 容器里的 127.0.0.1 不是宿主机。解决方式前面提过要么把 OneAPI 改成 host 网络要么用host.docker.internal并配extra_hosts。改完记得docker compose down docker compose up -d重建容器光 restart 不生效。reading choices: unexpected end of JSON input。这个报错说明 OneAPI 收到了 Ollama 的响应但解析失败。常见原因是 Ollama 返回了非标准格式或者模型名对不上。先确认渠道里填的模型名和ollama list输出完全一致大小写、冒号都不能差。再确认 Modelfile 导入时没改坏 TEMPLATE模板错了会导致输出结构异常。如果还不行去 OneAPI 日志里看原始响应docker compose logs -f one-api | grep -i choicesOAuth / 登录相关报错。如果你用的是 OneAPI 的 OAuth 登录比如接企业 SSO内网环境下回调地址配错会一直跳转失败。检查后台「系统设置」里的服务器地址必须填内网可访问的地址不能填 localhost。另外首次部署如果没改默认密码有些版本会强制要求改密按提示操作即可。模型加载超时或 OOM。这不是 OneAPI 的问题是 Ollama 侧显存不够。32B 模型量化后大概需要 20G 左右显存如果卡是 16G 就会加载失败。换 14B 或 7B 版本或者用ollama ps看当前加载状态。日志里出现CUDA out of memory就是显存爆了。排查这类问题有个通用心法先分层定位再逐层缩小。Ollama 层、网络层、OneAPI 层、业务层每层单独验证不要一上来就怀疑最上层。6. 从本地中台到统一接入长期编码场景的延伸内网中台搭好之后日常的模型调用就统一走 OneAPI 这一个入口了。但实际用起来你会发现团队里不同角色的需求差异挺大有人只是偶尔问问问题有人要长期跑 Agent 做代码审查还有人需要把模型接进 IDE 做补全。这时候光有一个内网网关还不够得考虑怎么把内网模型和外部能力做统一调度。我的做法是保留内网 OneAPI 作为主入口同时用 TaoToken 这类统一接入层来管理多来源的模型调用。它的价值在于把不同后端本地 Ollama、云端模型的 Key 和 Base URL 收敛成一套配置业务侧不用为每个来源写一套适配代码。对于需要长期跑编码任务的场景可以直接用 Coding Plan 把模型调用额度管起来避免某个 Agent 把额度跑爆。具体接入时Base URL 填https://taotoken.net/apiKey 在控制台的 API Keys 页面生成Model ID 按你实际要用的模型填。这三件套配好无论是 Cline、Codex 还是自己写的脚本都能用同一套凭证。如果你还在选模型阶段可以先去模型对话页面实测一下不同模型在代码任务上的表现再决定长期用哪个。需要说明的是内网中台和统一接入层不是替代关系。内网中台解决的是数据不出内网的合规底线统一接入层解决的是多模型调度和额度管理的效率问题。两者配合才能既守住安全又不牺牲开发体验。对于刚开始搭中台的团队建议先把 Ollama OneAPI 这条链路跑通验证模型效果和性能再考虑接入层的扩展。

相关新闻

从零搭建开放代码审查流程:Git分支模型与CI自动化门禁实战

从零搭建开放代码审查流程:Git分支模型与CI自动化门禁实战

开头“open-code-review”这个名字起得其实挺妙,两个层面都讲到了:代码审查这件事本身是开放的——任何人的改动都可以被团队里的同伴审阅、讨论、修订,再合入主线;与此同时,工具链也应该开放——不依赖某一家商业平台…

2026/10/12 20:16:30 阅读更多 →
赛博极客的链上日记:从 Gitcoin 捐赠到二次方融资,开源协议如何实现自给自足

赛博极客的链上日记:从 Gitcoin 捐赠到二次方融资,开源协议如何实现自给自足

在整个现代信息科技文明的宏伟大厦之下,深埋着一个令人尴尬而心酸的底层事实:支撑着全人类万亿美元数字经济帝国的核心开源软件,往往长期依靠几个无名工程师在业余时间“靠爱发电”苦苦支撑。 2021 年底席卷全球服务器的 Log4j “核弹级”漏洞…

2026/10/12 20:15:29 阅读更多 →
网络流最大流算法详解:从EK到Dinic的实战指南

网络流最大流算法详解:从EK到Dinic的实战指南

1. 网络流到底在解决什么问题第一次接触网络流的人,脑子里蹦出来的画面通常是水管。这个直觉其实相当准确。把一张有向图想象成一套管道系统,每条边就是一根管子,管子有粗细,也就是容量,单位时间内能通过的水量有上限。…

2026/10/12 20:15:29 阅读更多 →

最新新闻

C++图像分割实战:大津法、连通域分析与区域合并

C++图像分割实战:大津法、连通域分析与区域合并

1. 项目概述与题目拆解1.1 这道题到底在考什么拿到"1013 Image Segmentation (35分)(C)"这个题目时,我第一反应是:这是一道典型的综合性算法题——不是单纯让你调库跑个模型,而是要求你从底层理解图像分割的…

2026/10/12 21:11:54 阅读更多 →
给大模型补上长期记忆:从上下文窗口到外部记忆层的工程实践

给大模型补上长期记忆:从上下文窗口到外部记忆层的工程实践

1. 从“对话”到“记忆”:先搞清楚AI记忆到底缺什么做AI应用开发的朋友应该都有这种体验:跟模型聊得正high,上下文窗口一滚,前面说的关键约定直接“失忆”了。更尴尬的是,你昨天让助手记住的偏好、项目背景、代码规范&…

2026/10/12 21:11:54 阅读更多 →
算法复杂度实战指南:从LeetCode刷题到性能直觉养成

算法复杂度实战指南:从LeetCode刷题到性能直觉养成

1. 这不是“背公式”的速成课,而是帮你把算法复杂度刻进肌肉记忆的实战路径你是不是也经历过这样的场景:看到LeetCode上一道题,脑子里立刻蹦出几个解法,但一到分析时间空间复杂度,就卡在“这个for循环嵌套了三层&#…

2026/10/12 21:11:54 阅读更多 →
Tesseract OCR离线安装与批量识别实战:中文语言包配置与预处理技巧

Tesseract OCR离线安装与批量识别实战:中文语言包配置与预处理技巧

简介:Tesseract OCR 安装包与中文语言包面向需要在本地或 Python 项目中实现文字识别的开发者、测试人员及自动化办公用户,解决图片文字提取、批量文档数字化等场景下的环境搭建与中文识别问题。压缩包共 723 个文件,约 36.01MB,以…

2026/10/12 21:11:54 阅读更多 →
Python教务系统源码解析:数据库设计与选课功能实现

Python教务系统源码解析:数据库设计与选课功能实现

简介:这份资源是面向Python Web开发初学者与课程设计学习者的学校教务系统完整项目包,围绕学生信息管理、课程安排、成绩录入与查询等教务场景,提供一套可运行、可参考的实践方案。压缩包共9个文件,约467KB,以7个sql数…

2026/10/12 21:11:54 阅读更多 →
网申简历附件太大,先换模板还是压缩 PDF?

网申简历附件太大,先换模板还是压缩 PDF?

网申简历附件太大,先换模板还是压缩 PDF? 先看“大”从哪里来,再决定怎么改。模板里塞了整页照片、复杂背景,和一份扫描成图片的简历,处理方法不一样。别一上来就把 PDF 压到字也看不清;能减少装饰图片时&a…

2026/10/12 21:10:53 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →