1. 动手之前,先弄明白 dsh-market 到底解决的是什么问题
最近不少人在折腾 DeepSeek Harness 的本地化部署。工具本身装好只是第一步,真正让智能体平台具备实用价值的,是它背后的插件体系。dsh-market 就是 DeepSeek Harness 的插件市场组件,你可以把它理解成一个专门为 Harness 生态服务的应用商店,负责插件的浏览、下载、安装、升级和卸载。
很多人一开始没想明白这件事,以为把 DeepSeek Harness 主程序跑起来就万事大吉了。等真正用到多智能体编排、接入外部工具链、给 Workflow 挂自定义能力的时候才发现,主程序只是个骨架,血肉全靠插件往上填。dsh-market 解决的正是这个痛点:它让插件管理从“手动往目录里扔文件”升级成了“像用应用商店一样点几下就完成”,同时提供了版本管理、依赖声明和状态追踪,这在智能体项目复杂化之后几乎是刚需。
为什么我会强调在腾讯云环境下搭建?原因有三。第一,插件市场里的插件资源往往体积不小,而且 Harness 主程序在运行时会频繁读写插件元数据和索引文件,本地机器跑容易受网络波动影响,放云服务器上则常年稳定在线。第二,腾讯云在国内的访问速度有天然优势,特别是你后续要配合 FastGPT、知识库或其他云端服务做集成的时候,地域之间的内网互通和低延迟非常关键。第三,云服务器本身就是“随时可重建”的,装坏了、配置搞乱了,快照一恢复就重来,试错成本极低。
这篇文章的目标读者,是那种已经把 DeepSeek Harness 跑起来、但还停留在“裸奔”状态,或者尝试装插件市场却总在某个环节卡住的朋友。我会从腾讯云的环境准备一直讲到最后的排错思路,尽量把每一步背后的原因也讲清楚,不搞“照着敲完就行”的那种教程。
2. 腾讯云环境准备:服务器选型与系统初始化
2.1 实例规格怎么选,别浪费钱也别掉链子
安装 dsh-market 本身对硬件的要求其实不高,它本质上是一个管理插件元数据和文件的服务,CPU 和内存消耗都很有限。但你要考虑的是“它和谁一起跑”。绝大多数情况下,dsh-market 不是单独部署的,它要配合 DeepSeek Harness 主程序,尤其是带 WebUI 的桌面版或服务版,再加上本地模型的推理进程,资源占用就上去了。
我的建议是:如果你只是轻量试用,2核4G起。如果你要接本地模型跑推理,尤其是 7B 以上参数的量化模型,4核8G 是最低可用的门槛,16G 才谈得上流畅。腾讯云现在的标准型 S5、S6 系列都够用,没必要上高主频的计算型,硬盘倒是建议直接上 SSD 云硬盘,插件文件多是小文件,随机读写性能直接影响插件列表的加载速度。
提示:地域选择上,如果你主要面向国内访问,选腾讯云北京、上海、广州这几个节点都行。后续要和其他腾讯云产品内网互通的话,比如对象存储 COS 或者云数据库,尽量选同一个地域,内网流量免费,延迟也低得多。
2.2 系统镜像与登录方式
系统镜像我推荐 Ubuntu 22.04 LTS,兼容性最省心。CentOS 7 虽好但已经进入维护末期,新装机器没必要再用它给自己找麻烦。Ubuntu 的 apt 源里的 Node.js 版本可能偏旧,后面我会讲怎么处理,先按下不表。
创建实例的时候,有两个细节常常被忽略。第一个是登录方式,建议直接设置密钥登录,不要用密码。一方面是安全性考虑,另一方面是后续你要通过 scp 或者 rsync 传插件包,密钥登录能省掉每次输密码的麻烦。第二个是安全组规则,默认的安全组通常只放行了 22 端口(SSH),而 dsh-market 和 Harness 主程序都需要 Web 端口,这个务必要在创建实例之后立即配置,不然后面服务起了一看浏览器访问不了,容易误判是安装出了问题。
安全组配置其实很简单,在腾讯云控制台找到“安全组”入口,对当前实例绑定的安全组添加放行规则。具体端口我放到后面说,因为不同的启动方式端口还不一样,你只需要记住这个操作路径就行。
2.3 基础依赖安装:Node.js 环境与版本管理
dsh-market 基于 Node.js 生态,所以安装 Node.js 是第一步。千万别用系统自带的 apt 直接安装,版本通常很老,装完大概率会碰上依赖兼容性问题。我更推荐用 nvm 来做 Node.js 的版本管理,好处是以后切换版本只需要一条命令。
# 在服务器执行,安装 nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 重新加载 shell 环境 source ~/.bashrc # 查看可用的 Node.js 版本 nvm list-remote # 安装 LTS 版本 nvm install 20.18.0 nvm use 20.18.0 nvm alias default 20.18.0 # 验证安装 node -v npm -v选择 Node.js 20 LTS 的理由很简单:dsh-market 的依赖树里有不少包在新版本 V8 引擎下有更好的性能表现,而且 20 系已经进入维护期,稳定性经过了足够长时间的验证。18 也能跑,但没必要刻意降级。
3. 从拉取代码到跑通服务:dsh-market 完整安装流程
3.1 获取 dsh-market 源码包的正确姿势
dsh-market 的代码托管在 GitHub 上,和 DeepSeek Harness 主项目是独立的仓库。核心技术栈是 TypeScript + Express(服务端渲染),接口风格沿用了 Harness 生态一贯的 RESTful 规范。
获取源码的方式有两个。第一种方式,也是最推荐的,是直接克隆 GitHub 仓库:
# 克隆 dsh-market 仓库 git clone https://github.com/deepseek-harness/dsh-market.git cd dsh-market注意:如果你所在的网络环境访问 GitHub 不稳定,你可以用代理镜像站,或者尝试先在本地下载 zip 压缩包,再通过腾讯云控制台的“文件上传”功能传上去,这个功能在轻量应用服务器的控制台里尤其好用,支持直接从本机拖拽上传文件。
第二种方式是下载 Release 版本的离线包。GitHub 的 Release 页面会提供打包好的 tarball,好处是代码经过作者整理,去掉了开发目录的冗余文件,体积更小。无论哪种方式,拿到源码之后先检查一下目录结构,确认有package.json和src目录,别下错成别的项目了。
3.2 配置环境变量与基础参数
dsh-market 和其他 Node.js 服务一样,通过环境变量控制运行参数。项目根目录下通常会有.env.example文件,第一次安装时先复制再修改:
cp .env.example .env vim .env几个关键环境变量的含义我解释一下,这几项几乎决定了服务能不能被外部正常访问:
| 环境变量 | 默认值 | 说明 |
|---|---|---|
PORT | 5868 | dsh-market 服务监听端口 |
HOST | 0.0.0.0 | 监听地址,务必保持为 0.0.0.0,否则外网无法访问 |
MARKET_PLUGIN_DIR | ./plugins | 插件存放目录,建议改为绝对路径 |
ALLOW_PUBLISH | true | 是否允许上传新插件,个人部署一般保持开启 |
特别注意HOST这个变量。很多人装完发现服务在本机能开,但浏览器访问不了,八成的可能性是这里写成了127.0.0.1。写0.0.0.0的意思是监听服务器上所有网络接口,另一个 IP 是只监听本机回环地址,等于自断外网访问路径。
MARKET_PLUGIN_DIR我也建议改成绝对路径,比如/root/dsh-market/plugins。因为如果用相对路径,当你通过 systemd 或者nohup等方式以后台模式启动服务时,工作目录的变化会导致插件目录丢失,这是个非常隐蔽的坑。
3.3 安装依赖并启动服务
配置完成后,安装依赖并启动服务:
npm install # 开发模式启动(适合调试) npm run dev # 生产模式启动(适合长期运行) npm run build npm run start第一次npm install会花一些时间,因为 dsh-market 的依赖项不少。如果你在安装过程中出现网络超时,可以用腾讯云镜像源的 npm 加速:
npm config set registry https://mirrors.cloud.tencent.com/npm/ npm install启动命令的执行结果里,如果能看到类似Market serve at http://0.0.0.0:5868的日志输出,说明服务已经起来了。但我建议你不要直接退出终端,先按 Ctrl+C 停掉,然后用 systemd 把它注册成系统服务,这样即使你关闭 SSH 窗口,服务也能常驻运行。
下面是一个最小可用的 systemd 服务配置:
[Unit] Description=dsh-market After=network.target [Service] Type=simple WorkingDirectory=/root/dsh-market ExecStart=/usr/bin/npm run start Restart=always RestartSec=3 Environment=NODE_ENV=production [Install] WantedBy=multi-user.target写入配置文件后:
sudo vi /etc/systemd/system/dsh-market.service sudo systemctl daemon-reload sudo systemctl enable dsh-market sudo systemctl start dsh-market3.4 验证插件市场已经上线
服务跑起来之后,验证工作要分三层,层层递进地确认没有隐患。
第一层,本地验证。在服务器上执行curl http://127.0.0.1:5868/api/health,正常会返回一个 JSON 对象,里面包含服务状态和版本号。这一步验证的是“服务本身是否健康”。
第二层,公网访问验证。在你本地电脑的浏览器打开http://你的服务器公网IP:5868,能看到插件市场页面,说明服务监听地址和安全组规则都没问题了。这一步验证的是“网络通路是否打通”。
第三层,接入 Harness 主程序验证。在 DeepSeek Harness 的配置文件里,找到插件市场相关的配置项,把地址指向 dsh-market 的 URL。这一步才是真正的目的——让 Harness 主程序能识别并拉取插件市场的插件列表。
三层验证都过了,安装才算真正完成。
4. 让插件市场接入 DeepSeek Harness 主程序
4.1 Harness 侧的配置调整
dsh-market 单独跑起来只是半边活,更重要的是让它和 DeepSeek Harness 主程序产生联动。DeepSeek Harness 的插件机制设计得有点像 VS Code 的扩展体系,主程序启动时会扫描已配置的插件市场源,获取可用的插件列表,并在界面的插件面板中展示。
在 Harness 主程序中,你需要在启动参数或配置文件中指定 dsh-market 的地址。以 CLI 启动为例,通常会有一个--plugin-market或类似的参数:
# 启动 DeepSeek Harness 并指定插件市场地址 deepseek-harness --plugin-market http://your-server-ip:5868如果你用的是桌面版或 WebUI 版本,通常在“设置 -> 插件/扩展”面板里,会有一个“添加插件市场源”的输入框,填上地址后保存即可。
这里有一个关键细节:如果 Harness 主程序和 dsh-market 不在同一台机器上,你需要在 dsh-market 的.env文件里设置跨域相关的配置(CORS_ALLOWED_ORIGINS),否则 Harness 从页面端发起的请求会被浏览器的同源策略拦截。具体允许的域名列表要看你的 Harness 服务部署在哪个地址,填进去后重启 dsh-market 生效。
4.2 插件的上传、安装与版本管理
dsh-market 的上传界面支持两种方式:一种是从本地上传插件压缩包,另一种是直接填入 GitHub 仓库地址远程拉取。我个人的经验是,在阿里云或 GitHub 上找插件的时候优先用远程拉取方式,它能保证拉到的是仓库的最新代码;而本地打包上传更适合你二次开发过的插件。
上传插件之后,dsh-market 会自动解析插件目录下的manifest.json文件,读取插件的名称、版本号、描述、入口文件和依赖列表等信息。这里建议所有插件作者都养成一个习惯:manifest.json里的version字段要严格遵循 semver 语义化版本规范,即“主版本号.次版本号.修订号”,不然插件市场无法正确判断版本新旧,升级逻辑会乱套。
在 Harness 主程序的插件面板里点击安装时,首先会向 dsh-market 请求插件包列表,然后根据当前 Harness 的版本筛选出兼容的插件版本,最后将插件包下载解压到本地插件目录。整个链路里任何一环的地址配置错误,都会导致安装失败,这也是第二节里为什么反复强调网络验证的原因。
4.3 多个智能体场景下的插件编排思路
插件市场装好了,最常见的使用场景就是多智能体编排。DeepSeek Harness 本身支持创建多个智能体,每个智能体可以配置不同的插件组合。比如一个“代码审查智能体”可以挂载代码分析插件和 GitHub 集成插件,而一个“文档撰写智能体”只需要挂载 Markdown 工具插件。
dsh-market 在这种情况下扮演的就是“插件资源池”的角色。你不用在每台机器上手动复制插件包,只要服务器上的市场源管理好了,任何一台连接了该市场源的 Harness 实例都能随时拉取到最新版本。对于团队协作的场景,这种做法能大幅降低维护成本。
我之前在知乎上看到有人问“dsh-market 能不能离线使用”,答案是可以。只要你在服务器上把所有需要的插件都上传到市场里,后续所有 Harness 实例只从这个市场源拉取插件,即使服务器本身没有外网访问能力,插件分发依然可以正常工作。这个特性在私有化部署场景下非常实用。
5. 安装过程中最容易踩的五个坑,以及完整的排查链路
5.1 端口被占用导致服务秒退
现象:执行npm run start后,终端弹出Error: listen EADDRINUSE: address already in use :::5868。
原因:端口 5868 已经被其他进程占用。腾讯云服务器上这种情况不算罕见,有些云监控组件或宝塔面板可能会占用某些高位端口。
排查链路:
# 第一步:检查端口占用 lsof -i :5868 # 或者 netstat -tlnp | grep 5868 # 第二步:确认占用进程是什么,如果不是必要进程,可以结束它 kill -9 <PID> # 第三步:如果端口被某个核心服务占用,那就换个端口,修改 .env 里的 PORT我个人的习惯是不跟系统进程抢端口,直接改.env里的PORT换成 8080 或 8868 这类不太敏感的高位端口,一劳永逸。
5.2 Node.js 版本太低导致依赖编译失败
现象:npm install时出现node-gyp相关的编译错误,报错信息里有gyp ERR!字样。
原因:dsh-market 的部分依赖包(尤其是文件监听和加密相关的库)在安装时需要编译原生模块,而旧版本的 Node.js 不包含这些编译所需的头文件工具链。
排查链路:
# 第一步:检查当前 Node.js 版本 node -v # 第二步:如果低于 20,用 nvm 升级 nvm install 20.18.0 nvm use 20.18.0 # 第三步:清理旧的依赖和缓存,重新安装 rm -rf node_modules package-lock.json npm cache clean --force npm install这里特别提醒:不要一看到编译报错就去装 Python 或 Visual Studio,先想想 Node.js 版本是否满足要求。腾讯云服务器的默认镜像里 Node.js 如果走 apt 安装,大概率是 18 以下的旧版本,直接固定用 nvm 装新版本能省掉后面无数麻烦。
5.3 安全组没有放行端口
现象:服务器本机curl能通,但本地浏览器访问超时或拒绝连接。
原因:腾讯云安全组默认只放行 SSH 端口,不会自动放行你在服务器上开启的 Web 服务端口。
排查链路:
# 第一步:在服务器上确认服务正常监听 curl http://127.0.0.1:5868 # 第二步:检查监听的 IP 地址,把 HOST 变量确认了一遍 cat .env | grep HOST # 第三步:在腾讯云控制台检查安全组规则,添加入站规则 # 协议:TCP,端口:5868,来源:0.0.0.0/0(或限定特定 IP)安全组配置看似简单,但它是新手最常犯的错误。很多人在本地开发环境习惯了防火墙全开,到云服务器上就忘了这回事。建议养成一个习惯:每换一个端口,先看安全组。
5.4 插件列表加载空白
现象:Harness 主程序的插件面板能打开,但列表是空的,没有报错。
原因:这是最隐蔽的问题之一。dsh-market 虽然没有报错,但 Harness 主程序请求插件列表时,dsh-market 返回了空数组。通常是因为插件存储目录中没有可用的插件元数据,或者市场源在启动时没找到plugins目录下的索引文件。
排查链路:
# 第一步:检查插件目录是否为空 ls -la /root/dsh-market/plugins/ # 第二步:如果目录为空,先去上传几个插件,市场不是“自带插件”的 # 第三步:检查 dsh-market 的运行日志,看启动时是否提示找不到索引文件 journalctl -u dsh-market —no-pager | tail -100很多人刚装好 dsh-market,打开一看列表空白,第一反应是“程序坏了”,其实不是。默认的插件仓库就是空的,需要你自己上传插件或者从 GitHub 索引源拉取插件列表。这一步要提前有心理准备。
5.5 访问页面异常:JS 资源加载失败
现象:浏览器打开 dsh-market 页面,样式全丢,或者控制台报一堆Failed to load resource: net::ERR_CONNECTION_REFUSED。
原因:dsh-market 的前端资源是打包后由服务端托管的,如果你通过反向代理(比如 Nginx)来暴露端口,但没有正确配置 WebSocket 或静态资源路径,页面就会加载异常。
排查链路:
# 第一步:确认有没有用反向代理。如果你没用 Nginx,跳过这个坑 # 第二步:在 Nginx 配置文件里确认 proxy_pass 是否正确 # 第三步:检查是否配置了静态资源目录,dsh-market 的静态文件在 dist/ 或 public/ 下如果只是个人使用,其实不太建议上 Nginx,直接暴露端口访问最简单。等以后要绑域名、配 HTTPS 的时候再引入 Nginx 反向代理也不迟。如果已经用了 Nginx,遇到样式丢失的问题,优先检查location块里的proxy_pass和root路径有没有配错。
6. 进阶玩法:离线部署、备份迁移与团队共享
6.1 离线安装 dsh-market 的完整思路
有些腾讯云服务器出于合规或安全考虑,不允许出方向访问外网。这种情况下,git clone和npm install都会失败。解决方案分三步。
第一步,在你本地电脑上,先克隆 dsh-market 仓库,执行npm install,完成依赖安装。第二步,将整个目录打包(包括node_modules),通过腾讯云控制台的“文件上传”功能上传到服务器,或者用scp命令传输:
tar -zcvf dsh-market-full.tar.gz dsh-market/ scp dsh-market-full.tar.gz user@your-server-ip:/root/第三步,在服务器上解压,直接执行npm run start。因为依赖已经装好了,跳过npm install这个网络敏感步骤,整个过程可以实现完全离线。
提示:本地环境和服务器环境如果要保持 Node.js 版本一致,打包前先确认本地版本和服务器 nvm 安装的版本匹配,避免出现“本地编译的原生模块在服务器上加载失败”的问题。
6.2 插件数据备份与服务器迁移
插件的价值在于积累。辛辛苦苦收集和开发的几十个插件,如果服务器到期或者误操作导致数据丢失,重新找回来极其痛苦。dsh-market 的数据备份比数据库备份简单得多,只需要备份两个东西。
一个是plugins目录,里面是所有插件的原始文件。另一个是.env配置文件里的自定义项,主要是端口、目录路径和跨域设置。ynop
备份命令很简单:
# 导出插件目录 tar -zcvf dsh-market-plugins-backup.tar.gz /root/dsh-market/plugins/ # 备份配置文件 cp /root/dsh-market/.env /root/dsh-market.env.backup迁移到新服务器时,先按标准流程把 dsh-market 跑起来,然后把备份的plugins目录解压覆盖到新环境,重启 dsh-market 即可。
6.3 多个开发者共享一个插件市场
如果你是团队使用,多个开发者各自在自己的机器上跑 DeepSeek Harness,那么 dsh-market 完全可以作为团队内部的公共基础设施。每个人不需要再单独搭建插件市场,只要把 Harness 主程序的插件市场源配置指向这台腾讯云服务器即可。
团队共享场景要注意权限控制。dsh-market 的ALLOW_PUBLISH环境变量如果设为true,那么任何能访问到该服务的人都可以上传插件,这在公网环境下有安全隐患。建议在安全组里限制 5868 端口的访问来源,只允许团队的公网 IP 访问,或者使用 Nginx 配置 Basic Auth 认证。
7. 写在安装之后的一些个人经验
最后聊点实际操作的感受。我自己第一次装 dsh-market 的时候,也是抱着“照葫芦画瓢”的心态,结果被安全组和 HOST 两个问题折腾了大半天。回头来看,这类开源组件安装的本质就是一个“服务能起、外网能通、主程序能连”的三段式链路,每一步都有对应的验证方法,毛҉病往往出在配置项和网络策略上,而不是代码本身。
两个小的建议送给准备动手的朋友。
第一,配置过程中每一步改动都记录下来。我建议直接在服务器的.env文件旁边写个NOTES.md,记录修改了哪些参数、为什么改、改了之后验证结果是什么。时间一长你会发现,这份笔记比多数教程都值钱。
第二,先跑通最小链路,再做复杂配置。不要一上来就配置 Nginx、域名、HTTPS、多智能体编排,先把curl 127.0.0.1通了,再开安全组端口,再让 Harness 主程序连上,一层一层叠加。每加一层就验证一次,出问题的时候你很清楚问题出在哪一层,排错速度快得不是一星半点。
万一读到这篇文章的时候版本已经更新,某些命令对不上了,不要慌,去 GitHub 仓库看 README 和 Release Notes,思路不变。框架会变,但这套“服务能起、外网能通、主程序能连”的验证思维,换哪个工具都适用。