ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

服务器部署DeepSeek Harness:Docker编排与Ollama共享AI服务实践

服务器部署DeepSeek Harness:Docker编排与Ollama共享AI服务实践 1. 为什么非要上服务器单机玩与共享部署的根本区别1.1 从“各自为战”到“算力共享”的真实痛点先说我们团队最初的状态。做研究、写代码的同事对 AI 工具的需求非常旺盛不说人手一个本地推理客户端吧至少也是各显神通有在笔记本上装各种桌面应用的有折腾命令行工具的还有图省事直接开网页版外部服务的。表面上大家都在用实际上问题一大堆。最直接的问题就是笔记本扛不住。本地跑小模型效果一般回答问题经常抓不住重点上下文一长就开始胡说。想换一个大一点的模型吧笔记本内存告急风扇转得跟飞机起飞一样键盘区域烫到没法摸。那一阵子谁的电脑在编译代码谁在跑模型整个办公室都听得一清二楚。于是我做了个决定把 DeepSeek Harness 部署到服务器的共享环境里。服务器是机房那台一直跑内部服务的 32G 内存机器搭配 Docker 把推理引擎和 Harness 编排起来局域网内同事打开浏览器输入一个地址就能用。整理完这套部署后团队的使用方式彻底变了研究、研发、产品几个角色都开始在上面找自己的用法。为什么服务器部署能解决单机的问题关键在于三点。第一算力统一调度模型推理不再挤占个人电脑的资源而是集中在一台服务器上统一管理第二模型规格可以上一个台阶同样的内存预算下服务器比笔记本更容易跑大参数模型输出的质量和上下文能力肉眼可见地提升第三数据流转边界变清晰了内部文档和代码片段都在内网环境里流转不再需要为了临时问答把内容粘到外部平台。1.2 服务器部署的两种主流形态你得先分清把 DeepSeek Harness 这类工具部署到服务器从落地形态上看大体分两种。一种是纯 API 服务形态。服务器上装好 Harness 和推理引擎对外暴露 HTTP API 接口同事通过脚本或自己的客户端调用。这种方案适合开发者群体灵活度高想怎么封装都行缺点是对非技术同事不太友好他们并不会去写 curl 命令。另一种是 Web 界面形态。服务器上架设一个带 WebUI 的入口浏览器访问一个地址打开就是聊天框和工具面板。这种方案几乎零学习成本谁都能上手。DeepSeek Harness 生态里本身就有 Web 交互层再配合反向代理做一个统一入口体验就跟使用一个内部网站一样。我这次选择的是“Ollama 做推理引擎 DeepSeek Harness 做智能体业务层 Nginx 做统一入口”的组合方案。选择这个组合而不是更重的方案核心原因是这一套架构每层职责都很单一Ollama 只管模型推理提供 OpenAI 兼容 APIHarness 负责智能体逻辑、工具调用和会话管理Nginx 负责路由、日志和访问入口的收敛。哪一层出了问题单独排查单独重启就行不用一锅端。1.3 部署前没想清楚这几件事后面容易返工在动手敲命令之前有几个问题必须冷静评估我因为没提前想透后面确实走了弯路。第一个是内存和模型大小的匹配问题。很多人只算模型文件本身的大小却忽略了运行时额外开销。以 14B 量化模型为例模型文件大约 9GB但推理过程中 KV Cache、上下文缓存和系统内部数据结构还会额外吃内存实际占用往往是模型文件的一倍以上。32G 内存的机器跑 14B 量化模型是可行的但留给系统的余量不会太多不要再在上面跑一堆重型任务。第二个是并发用户数预估。两三个人偶尔用一用和十几个同事同时高频使用对资源规划的要求完全不是一个量级。并发一高CPU 推理的瓶颈会非常明显这不是靠调优能完全解决的得从并发限制上做文章。第三个是是否需要 GPU。有 GPU 当然舒服推理速度快几倍都不止。但没有 GPU 也不是不能玩CPU 推理照样能跑只是响应时间会慢一些团队使用预期要管理好。我们这台是纯 CPU 的双路 E5 服务器实测下来日常问答和分析类任务完全可用只是长文本生成确实需要等。第四个是远程访问的需求。如果人不在局域网内比如出差或居家有没有安全可控的访问通道这个必须在架构设计时就考虑进去不然后面再补会非常被动。2. 部署选型的关键决策Docker编排、模型外挂与资源规划2.1 为什么不用裸机而用 Docker Compose如果只是一个人在一台服务器上玩裸机安装确实更直接依赖一个个装服务一个个起简单粗暴。但团队共享场景下我强烈建议用 Docker Compose 做编排。原因主要有四个。第一依赖隔离。DeepSeek Harness 跑起来不只有它自己还有推理引擎、向量库、可能的检索组件。这些组件不同版本之间的依赖冲突在裸机环境下经常出现今天装一个库把另一个顶掉明天升级一个组件又带崩另一个模块。容器化之后每个服务在自己的镜像里待着互不干扰。第二升级回滚方便。改动 docker-compose.yml 里的镜像版本号简单执行重建命令就能完成版本切换。裸机卸载重装的成本就高多了。第三团队运维友好。任何一台新服务器要复现这套环境只需要拷贝 compose 文件和挂载目录执行docker compose up -d就能起来不再需要看着十几页的手工安装文档逐步操作。第四日志和监控统一。容器化之后可以统一接入日志平台出了问题查日志比裸机翻 distro 自带的日志文件快得多。当然容器化需要你理解镜像和卷这两个基本概念。镜像可以理解成一份只读的安装包卷则是容器内数据在宿主机上的存放位置。只要数据落在卷里容器随便重建数据都不会丢。2.2 模型外挂目录必须做这是最重要的边界这算是我这次部署中最深的一个教训。一开始图省事想让模型直接放在容器内部默认位置想着反正容器也不怎么重建。结果有一次因为升级配置误操作触发了容器重建模型文件全部丢失9 个多 G 的模型重新拉了一遍损失的时间让人崩溃。正确的姿势是把所有需要持久化的数据都外挂出来。我整理的标准目录结构是这样的/opt/ai-stack/ ├── ollama/ │ ├── models/ # 模型权重挂载目录 │ └── logs/ # 推理引擎日志 ├── harness/ │ ├── config/ # Harness 配置文件 │ └── data/ # 会话记录、检索索引、知识库数据 └── docker-compose.yml这样做的收益是实打实的备份只需要打包 /opt/ai-stack 整个目录迁移服务器直接把这个目录拷贝过去重新拉起容器就能无缝恢复清理日志也更安全不会误删容器内部文件。2.3 资源规划里的小九九内存、CPU并发和延迟的平衡我用的这台服务器双路 E5-2680 v4总共 28 核 56 线程内存 32G无 GPU。跑 14B 量化模型的时候我给 Ollama 的容器内存上限设置为 20G系统和其他容器保留 12G。实际运行状态比较平稳单个请求的响应速度在可接受范围内说明这个资源划分是合理的。CPU 并发是关键调优点。Ollama 的默认并发参数对 CPU 推理场景来说太激进多人同时提交任务时所有请求一起抢 CPU结果就是每个请求都在龟速运行。我把 OLLAMA_NUM_PARALLEL 调低为 2同时设置了容器 CPU 上限为 12 核效果立竿见影单个用户的响应明显更快团队整体体验反而更好了。这就是“拆东墙补西墙”的反面教材。在共享资源的场景里限制并发不是削弱性能而是保证每个任务都能在合理时间内完成。同时提交五个任务不如串行排队处理两个这是我调整之后最大的感悟。2.4 模型来源与接入协议别把 Harness 当成模型仓库这里必须纠正一个可能误导新手的认知DeepSeek Harness 本身不生产模型它是一个智能体工具箱负责把模型连接起来做任务编排比如深挖研究、通用智能体、文档问答、电脑操控等。所以部署 Harness 之前你得先想好模型从哪里来。模型来源主要有两条路线。一条是接入云厂商的 OpenAI 兼容 API配置简单质量稳定但数据要经过外部服务另一条是本地推理引擎比如 Ollama、vLLM 等模型权重完全本地化。考虑到团队内部数据敏感性我选了 Ollama 这条路。接入方式上Ollama 启动后默认提供 OpenAI 兼容的 /v1 接口只要你配置 Harness 的 base_url 指向 Ollama 服务的对应端点模型名指定为你拉取的模型标签api_key 填任意占位符即可。这个设计让本地推理引擎对接上层应用变得非常顺滑不需要各写各的协议。3. 部署全过程实录从空白服务器到全员能访问的入口3.1 系统初始化与基础组件准备我们服务器上装的是 Ubuntu 22.04 LTS这算是目前兼容性最稳妥的选择Docker 和 Ollama 都提供了完善的安装支持。基础环境准备命令如下sudo apt update sudo apt upgrade -y sudo apt install -y curl git vim curl -fsSL https://get.docker.com | bash sudo usermod -aG docker $(whoami)注意最后一条命令执行完以后最好重新登录一次会话或者执行newgrp docker让用户组权限立即生效。如果不做这一步后面执行 docker 命令大概率会遇到 permission denied。Docker 装好后建议顺手把开机自启打开sudo systemctl enable docker sudo systemctl start docker3.2 编写 docker-compose.yml一栈拉起两个核心服务在 /opt/ai-stack 目录下创建 docker-compose.yml。这里给出一个可以直接套用的骨架services: ollama: image: ollama/ollama:latest container_name: ollama restart: unless-stopped ports: - 11434:11434 volumes: - /opt/ai-stack/ollama/models:/root/.ollama/models - /opt/ai-stack/ollama/logs:/root/.ollama/logs environment: - OLLAMA_HOST0.0.0.0 - OLLAMA_NUM_PARALLEL2 harness: image: your-harness-image-name container_name: deepseek-harness restart: unless-stopped depends_on: - ollama ports: - 8080:8080 volumes: - /opt/ai-stack/harness/config:/app/config - /opt/ai-stack/harness/data:/app/data environment: - MODEL_BASE_URLhttp://ollama:11434/v1 - MODEL_NAMEdeepseek-r1:14b - APP_PORT8080提示我这里不写死具体镜像名和配置项因为 DeepSeek Harness 的发布渠道和镜像仓库经常更新不同版本的字段命名可能不一样。重点是理解架构实际部署时以官方文档为准。这里有个关键的细节harness 容器通过depends_on声明了对 ollama 的依赖环境变量里MODEL_BASE_URL用的是服务名ollama而不是 IP 或 localhost。这是 Docker Compose 内置 DNS 解析的用法容器之间通过服务名互相访问。3.3 启动容器并拉取模型验证推理链路配置写好后执行cd /opt/ai-stack docker compose up -d docker compose ps两个服务状态正常后进入 ollama 容器拉取模型docker exec -it ollama ollama pull deepseek-r1:14b14B 量化模型大概是 9GB 左右拉取速度取决于网络情况。内网环境通常在 20 分钟到 1 小时之间如果网络不好可能需要更长时间。拉完后先在容器里直接测试一次推理docker exec -it ollama ollama run deepseek-r1:14b 用一句话解释什么是量子纠缠如果模型能正常回复说明推理引擎本身没问题。接下来验证 Harness 到 Ollama 的链路方法是打开浏览器访问服务器的 8080 端口看 Harness 的 WebUI 是否正常加载然后发一条消息测试完整链路。3.4 Nginx反向代理把端口号藏起来团队访问不能让他们记端口号这不现实。我用 Nginx 做了一层反向代理统一入口地址。配置如下server { listen 80; server_name ai.internal.example.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }内网环境下server_name 可以直接写局域网 IP也可以配合内网 DNS 解析成一个好记的域名。如果服务器启用了防火墙或云安全组记得放行 80 和 8080 端口。做完这一步同事访问 http://ai.internal.example.com 就能进入 Harness 界面全程不需要感知后端服务怎么部署。4. 坑位报告模型调度卡顿、端口冲突与容器网络的典型问题4.1 界面能打开但问答一直没反应容器网络的经典陷阱第一次完整启动后我兴冲冲打开浏览器Harness 界面加载正常但发消息过去就一直转圈没有任何输出。第一反应是看 Harness 的日志发现它连不上模型服务报错信息指向连接失败。检查后发现根因是我在环境变量里把MODEL_BASE_URL写成了http://localhost:11434/v1。当时的直觉是模型和 Harness 都在同一台服务器上写 localhost 总没错吧问题在于Compose 编排的每个容器都是独立的网络命名空间Harness 容器里的 localhost 指的是它自己根本不指向宿主机更不指向 Ollama 容器。正确的写法是用服务名http://ollama:11434/v1。Compose 会在内部网络上做 DNS 解析把服务名解析为对应容器的 IP 地址。改成这个之后Harness 和 Ollama 之间的通信马上恢复正常。这个坑非常有代表性凡是刚接触容器网络的人几乎都会踩一遍。共享内存地址、回环地址、服务名这三者在容器环境下指向完全不同的地方写配置时一定要分清楚。4.2 模型下载中断后的“二遍苦”大文件拉取的优化办法Ollama 拉取大模型时如果网络不稳定拉一半断了再次执行 pull 很可能会从头开始。我第一次拉 9GB 模型就遇到了下载到 72% 时网络闪断重试之后眼睁睁看着它从 0% 又开始跑心态直接崩了。这件事之后我总结了两种优化办法。第一种是在网络状况好的时段集中拉取或者用代理加速工具调整下载通道。第二种更可控直接用下载工具从模型仓库把权重文件下载到宿主机放到 Ollama 挂载目录的对应位置然后重启 Ollama 容器让它重新识别。具体路径要看模型的存放结构需要对照官方文档确认。4.3 CPU 推理热爆了并发调优才是共享部署的正确姿势团队开始多人使用后我收到反馈说系统变慢了。进服务器一看CPU 利用率直接跑满风扇转速高到隔着机房门都能听见。三个同事同时在分析长文档Ollama 默认的并发配置把所有请求同时塞给 CPU结果就是每个请求都在缓慢执行。解决办法是给 Ollama 的容器资源加上限同时调低并发数deploy: resources: limits: cpus: 12 memory: 20G环境变量里把OLLAMA_NUM_PARALLEL设置为 2意思是最多同时处理两个请求其余的排队等待。调整之后整个系统的响应时间明显稳定了。这个经验说明CPU 推理场景下限制并发不是降低性能而是保障单次请求的质量和最终吞吐。4.4 目录挂载后的权限怪象权限问题排查思路还有一次遇到 Harness 容器无法写入配置目录的问题。现象是服务能启动但保存配置时一直报错日志里提示 permission denied。排查了很久才发现容器内运行进程的 UID 和宿主机目录的属主不一致导致容器进程没有写权限。排查思路其实不复杂先docker exec进容器看当前用户是谁再回宿主机看目录属主对比 UID 和 GID。发现问题后直接在宿主机上 chown 就行chown -R 1000:1000 /opt/ai-stack/harness这个问题在手动部署时更容易被忽略因为容器文件系统是隔离的宿主机的权限问题不会直接显示只有容器内程序真正尝试读写时才暴露出来。5. 同事们玩出花来了典型使用场景与后续扩展方向5.1 研究同事把 Harness 当成自动调研员最先把这套系统玩明白的是做行业研究的同事。以前一份竞品分析报告光搜集资料就要花大半天打开十几个网页慢慢翻再手工整理成框架。现在他直接把需求描述给 Harness让它基于本地检索能力和智能体编排去做信息收集、归纳和初稿生成自己只需要在最后做事实核查和风格调整。这个用法本质上把 Harness 变成了一个自动化的研究助手而不仅仅是聊天机器人。它可以把散落在团队 wiki、内部文档、历史邮件里的信息统一索引起来以问答方式输出结构化的整理结果。对研究岗来说节省的是最枯燥的信息汇总时间留下的是更需要判断力的分析环节。5.2 开发同事代码检索、报错排查和知识库问答开发组的同事用起来就更野了。他们先做了一件事把内部核心代码库的文档和关键模块说明灌进 Harness 的检索索引里然后日常遇到问题直接问。比如“之前那个订单超时功能的处理逻辑在哪几个文件里”或者把一个长长的报错日志粘进去让它结合代码上下文分析可能的原因。这相当于给团队配了一个“对项目历史了如指掌的数字老员工”。那些记在某个老同事脑子里的模块知识、写在某个犄角旮旯文档里的技术决策现在都能通过检索问答快速触达降低了团队知识的隐性流失风险。5.3 非技术同事打开浏览器就会用说实话当时我最担心的是非技术同事能不能接受。结果恰恰相反他们对 WebUI 形态的接受度非常高因为使用路径和上网浏览网页几乎一样打开浏览器点收藏夹里的地址看到一个输入框就能问问题。对他们来说不存在“安装客户端”、“配置环境变量”这些门槛。给非技术同事准备一页纸的使用指南能省掉很多低质量沟通访问地址、能问什么类型的问题、哪些信息它给不了、有问题找谁。尤其要写清楚边界比如你不能让它直接访问外部系统做操作它只能基于已有知识和配置好的工具做应答。5.4 从能用走向好用下一步扩展的几个方向目前这套架构跑得很稳下一步的扩展方向我也想清楚了。第一个是接多模型路由。现在固定用 14B 模型简单问题用大模型有点浪费复杂问题又可能不够强。可以接入一个路由层根据任务类型和复杂度自动分配到不同规格的模型上成本更低响应更快。第二个是增加定时任务。比如让 Harness 每天早上自动抓取指定数据源生成日报摘要推送到团队 IM。Harness 具备智能体任务编排能力这一步在现有架构上做扩展并不难。第三个是完善权限体系。目前是全员共同使用同一个入口后续可以按角色区分权限管理员可以管理模型和工具配置分析师可以使用完整的数据检索能力普通用户只保留基础问答和文档处理功能。第四个是评估加 GPU。服务器运作一段时间后如果团队使用频率持续走高加一块消费级或专业级 GPU 的收益会非常明显推理速度快数倍能承载的并发数也大幅提升。注意以上扩展方向都基于当前“Ollama Harness Nginx”这套稳定运行的架构每新增一个能力都要先确认不会影响既有服务的稳定性再逐步灰度上线。服务器资源有限宁可小步快走也不要一次性把架构搞得过于复杂。6. 最后分享两个真实体会这套系统上线到现在团队使用频率一直居高不下。我在运维过程中最真实的感受是服务器的部署并不难难的是对用户需求的预判和资源分配的平衡。你在配置并发参数时是激进还是保守直接决定同事是顺畅地用完还是看着加载转圈骂骂咧咧。另一个体会是模型选择和场景的匹配很重要。一开始我什么都让 14B 模型干包括复杂的多文档对比分析效果其实一般。后来根据任务类型做区分简单问答用 7B 模型快速响应复杂分析任务切到 14B 模型慢慢推理。虽然只调整了一行配置但整体体验提升非常明显。如果这篇文章能帮到你大概就是让你少踩几个我已经踩过的坑。按这个架构一步步搭耐心做完资源规划你的同事应该也会很快玩起来。
返回列表