使用DeepSeek Harness进行远程服务器运维

2026年8月15日星期六·#部署文档AI/运维/DeepSeek Harness·5107 字 26 分钟·
-浏览量
·
简介

在云服务器上部署 DeepSeek Harness 并通过远程访问让其成为服务器运维助手的完整教程。

探索未至之境:把 DeepSeek Harness 变成我的远程运维助手#

提示

本文完整记录 DeepSeek Harness 在云服务器上的部署流程:环境准备与构建、systemd 服务化、Nginx 反代与 Basic Auth 访问认证、远程访问控制,以及三次典型的「公网可访问但接口不可用」排障。重点是 Host 信任(trustedHosts)、浏览器兼容性(randomUUID)与回环信任(loopback fence)的逐层打通,文中所有命令均亲测通过。


一、背景与方案选择#

1、为什么要在博客上部署 DeepSeek Harness#

2026 年 8 月 13 日,DeepSeek Harness 正式发布,正如它的宣传语所说——探索未至之境——上手一试,确实很强:Agent 会话、评测任务管理一应俱全,本地跑起来只能「自己用」,总感觉有点浪费。

于是我就琢磨开了:既然博客就搭在云服务器上,那能不能把 DeepSeek Harness 也部署上去,让它成为我的远程「运维助手」?人在哪儿,助手就在哪儿,浏览器一开就能用。说干就干,这么做的好处其实很实在:

  • 家里、公司、出差路上,只要有浏览器就能访问,不用背着开发机跑;
  • Agent 长任务(评测、批量跑实验)可以 7×24 小时挂在服务器上跑,不占本地资源;
  • 多台设备共享同一个会话历史(session.history),工作记录不丢。

2、踩坑记录:三次典型排障#

建议

从「公网能打开页面」到「特权 API 全部可用」,一共踩了三个典型的坑。这三个坑的本质是一条信任链的逐层打通:第一层是 Host 信任(trustedHosts),第二层是浏览器兼容性(randomUUID),第三层是回环信任(loopback fence)。排障时按这个思路逐层排查,能少走很多弯路。每个坑按下述结构整理,方便复现排查。

问题① 外部可访问但 /api 返回 403 → 添加 --trusted-host#

  • 现象:公网访问 DeepSeek Harness Web UI 页面正常(HTML 加载正常),但页面里的 /api 相关请求全部返回 403,功能不可用。浏览器开发者工具(Network 标签)可见大量 /api/* 请求返回 403。

  • 根因:DeepSeek Harness 的 trustedHosts(Host 信任)机制会校验请求 Host。公网 Host 是 服务器公网地址:对外端口,不在默认信任列表里,非特权 API 方法被拒绝。

  • 修复:

    1. 在 systemd 服务 ExecStart 中追加两个 --trusted-host(带端口与不带端口双形态):

      Terminal window
      dsh web --trusted-host 服务器公网地址:对外端口 --trusted-host 服务器公网地址
    2. 同时 location / 里必须用 proxy_set_header Host $http_host; 保留端口,不能用 $host(会丢弃端口)。因为后端 browser-trust fence 校验 Host 与 Origin 一致性,浏览器 Origin 带端口(服务器公网地址:对外端口),若 Host 无端口仍会 403。

    proxy_set_header Host $http_host; # ✅ 保留端口
    # proxy_set_header Host $host; # ❌ $host 不含端口,会丢端口
    1. 改完 service 文件后 systemctl daemon-reload && systemctl restart dsh-web;改完 nginx 配置后 nginx -t && nginx -s reload。
  • 验证:非特权 API 请求恢复 200,页面基础功能可用。

问题② 控制台报 crypto.randomUUID is not a function → sub_filter 注入 polyfill#

  • 现象:前端控制台(Console)报 Uncaught TypeError: crypto.randomUUID is not a function,页面部分功能(依赖随机 UUID 的逻辑)不可用。

  • 根因:部分浏览器环境未实现 crypto.randomUUID,调用即抛 TypeError。

  • 修复:用 nginx sub_filter 在返回的 HTML </head> 前注入一个基于 crypto.getRandomValues 的 UUID v4 polyfill(完整代码见第四节 location /):

    proxy_set_header Accept-Encoding ""; # 必须:让后端返回未压缩 HTML,sub_filter 才能匹配
    sub_filter '</head>' '</head><script>(function(){...})();</script>';
    sub_filter_once on;
    • proxy_set_header Accept-Encoding ""; 是必须的:否则后端返回 gzip 压缩的 HTML,sub_filter 无法匹配到 </head>,注入不生效;
    • sub_filter_once on;:只在第一个 </head> 处注入一次;
    • 不要显式声明 sub_filter_types text/html:会与全局 mime.types 重复定义,产生 nginx -t 警告。
  • 验证:polyfill 注入生效,页面无 JS 报错,Console 干净。

问题③ /api/settings.describe 等特权方法仍返回 403 → location /api 伪造回环 Host/Origin#

  • 现象:已配置 --trusted-host 后,非特权 API 已恢复 200,但 settings.describe、settings.update、credentials.set 等特权方法仍返回 403,即使带认证凭据访问也一样。

  • 根因:DeepSeek Harness 将 settings.describe、settings.update、credentials.set 等敏感 API 注册在 loopback 信任通道(authority: 'loopback',见 packages/client/connection/src/rpc-host.ts)上,强制要求请求来自回环地址(loopback fence),这是 DeepSeek Harness 的故意安全设计——--trusted-host 只是防止 DNS-rebinding 的 Host 校验,并非认证层,因此无法放行特权方法。要让公网请求通过,必须让后端「以为」请求来自回环。

  • 修复:新增独立的 location /api,转发时伪造回环 Host/Origin:

    location /api {
    proxy_pass http://127.0.0.1:后端端口;
    # 伪造回环 Host/Origin,使特权方法通过 DeepSeek Harness 回环 fence
    proxy_set_header Host 127.0.0.1:后端端口;
    proxy_set_header Origin http://127.0.0.1:后端端口;
    # ... 其余反代头与 WebSocket 配置同 location /
    }
    • Origin 必须硬编码为 http://127.0.0.1:后端端口 与 Host 保持一致;若用 $http_origin 携带公网原始 Origin,仍会因与 Host 不一致而 403;
    • /api/events.mux、/api/events.host 等 WebSocket 端点也走本 location,loopback 为最高信任,升级握手仍能通过 fence;
    • 权衡:这一步等于绕过了 DeepSeek Harness 内置的回环保护,真实的访问认证完全由 server 级 Basic Auth 承担——即「Basic Auth 是替代认证方案」。安全权衡必须明确记录:一旦凭据泄露,任何通过认证的请求都可调用特权方法,凭据强度就是最后一道防线。
  • 验证:浏览器访问 settings.describe、session.history 等请求全部返回 200,页面完整功能可用。

建议

排障时按「信任链」逐层排查:先看 Host 信任(trustedHosts),再看浏览器兼容性(randomUUID),最后看回环信任(loopback fence)。每层打通后验证一次,能少走很多弯路。

3、方案选择:Nginx 反代 + Basic Auth#

公网 IP + 对外端口 + Basic Auth,由 Nginx 反代到仅监听回环地址的后端 DeepSeek Harness 的 web 服务。

整体架构如下:

浏览器 ──► Nginx(服务器公网地址:对外端口) ──反代──► DeepSeek Harness web(127.0.0.1:后端端口)
│ │
└── Basic Auth └── --trusted-host

方案要点:

  • 对内:DeepSeek Harness 的 web 服务默认只监听 127.0.0.1:后端端口(有意不支持 --host 0.0.0.0),后端不直接暴露网卡,对外统一交给 Nginx,这个设计其实更安全;
  • 对外:Nginx 监听 对外端口,叠加 Basic Auth 做访问认证;

二、环境准备#

1、克隆官方仓库并固定 commit#

克隆 DeepSeek Harness 官方仓库,并固定到一个已知正常的提交,避免上游漂移导致构建问题:

Terminal window
# 克隆自 deepseek-harness 官方仓库,固定提交
git clone https://github.com/deepseek-ai/deepseek-harness.git 部署目录/deepseek-harness
cd 部署目录/deepseek-harness
git checkout 47f943859b # Merge pull request #2519 from deepseek-harness/feat/npm-public
建议

固定 commit 是个好习惯。仓库主分支每天都在变,今天能构建、下周可能就挂了。锁定一个验证过的提交,后续升级再手动解锁,可控性高很多。

2、Node 与 pnpm 工具链#

仓库根目录 package.json 声明了 "packageManager": "pnpm@11.7.0",而系统预装的 pnpm 是 10.9.0。执行 pnpm install 时 pnpm 检测到版本与声明不符,会触发「自动切换到声明版本」的流程,但该流程依赖 corepack,而这个环境里 corepack 不可用,于是安装流程直接卡死。

解法:直接把全局 pnpm 升级到仓库声明的版本(旧版备份保留,可随时回退):

Terminal window
# 1) 升级全局 pnpm 至 11.7.0(旧版 10.9.0 已备份为 pnpm.bak-10.9.0,未删除,可随时回退)
npm install -g pnpm@11.7.0
pnpm -v # 输出 v11.7.0 ✅
# 2) registry 切换为 npmmirror 国内镜像(加速依赖下载)
npm config set registry https://registry.npmmirror.com/
npm config get registry # 输出 https://registry.npmmirror.com/ ✅
建议

升级前把旧版 pnpm 二进制备份一份(改名保留即可,别删),万一新版本有问题还能秒回退。真出问题的时候,你会发现这个备份有多香。

3、依赖安装与构建(小内存服务器务必限制堆内存)#

Terminal window
cd 部署目录/deepseek-harness
pnpm install # 使用 pnpm-lock.yaml 锁定版本,安装成功
# 构建:服务器内存紧张,必须限制 Node 堆内存,避免 OOM
NODE_OPTIONS="--max-old-space-size=2048" pnpm run build
注意

build 会执行 host + client 两套 tsc -b、tsdown 打包以及前端 Vite 构建,全是内存密集型的 Node 进程,对内存非常敏感。直接裸跑大概率看到 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory,严重时系统 OOM Killer 直接杀进程。若仍报内存不足,可以降到 --max-old-space-size=1536(代价是构建时间变长),不建议超过 2048,不然容易把整台机器 OOM。


三、systemd 服务化#

用 systemd 托管 DeepSeek Harness 的 web 进程,支持开机自启与异常自动拉起,比裸跑 nohup 省心。

1、服务文件:dsh-web.service#

在 systemd 服务目录(/etc/systemd/system/ 是 systemd 服务的标准存放位置)创建 dsh-web.service:

[Unit]
Description=DeepSeek Harness Web UI
After=network.target
[Service]
Type=simple
WorkingDirectory=部署目录/deepseek-harness
Environment=NODE_OPTIONS=--max-old-space-size=2048
# 同时信任带端口与无端口两种 Host 形态:
# - nginx 的 $host 变量不含端口,实际转发 Host 为 服务器公网地址
# - 浏览器/直连可能携带 Host: 服务器公网地址:对外端口
ExecStart=pnpm dsh web --trusted-host 服务器公网地址:对外端口 --trusted-host 服务器公网地址
Restart=on-failure
RestartSec=5
User=root
# 日志追加写入 /var/log/dsh-web.log
StandardOutput=append:/var/log/dsh-web.log
StandardError=append:/var/log/dsh-web.log
[Install]
WantedBy=multi-user.target

加载并启动:

Terminal window
systemctl daemon-reload
systemctl enable dsh-web # 开机自启
systemctl start dsh-web
systemctl status dsh-web # active (running) ✅

2、关键点说明#

  • 监听地址:DeepSeek Harness 的 web 服务默认只监听 127.0.0.1:后端端口(有意不支持 --host 0.0.0.0),对外统一交给 Nginx 反代,这个设计其实更安全——后端不直接暴露网卡。
  • --trusted-host 参数(解决 /api 403):同时传入带端口(服务器公网地址:对外端口)与不带端口(服务器公网地址)两种形态,确保 nginx 的 $host 转发头与浏览器直连 Host 都能通过 DeepSeek Harness 的 Host 信任校验(trustedHosts),避免非特权 API 因 Host 不符返回 403。具体原理见第一节「2、踩坑记录」问题①。
  • 开机自启:systemctl enable dsh-web 后状态为 enabled。
注意

改完 service 文件记得 daemon-reload!改完记得 daemon-reload!改完记得 daemon-reload!这个忘了,改十遍配置都不会生效。


四、Nginx 反代配置#

配置文件:dsh.conf,放在 Nginx 站点配置目录下(即 Nginx 会 include 进来的站点配置目录,比如 /etc/nginx/conf.d/ 这类标准位置)。

1、对外端口块(核心对外入口)#

server {
listen 对外端口;
server_name _;
# DeepSeek Harness 应用访问日志(通用日志目录,可自行调整)
access_log /var/log/nginx/dsh-access.log;
error_log /var/log/nginx/dsh-error.log;
# Basic Auth 访问认证(仅对外入口端口生效,后端监听地址不受影响)
# 注意: 密码文件必须放在 nginx worker 可读的路径下
#(Nginx 站点配置目录权限通常是 700 root,nginx worker 进程读不到)
auth_basic "DeepSeek Harness Restricted Access";
auth_basic_user_file 部署目录/dsh-auth/dsh-htpasswd;
# DeepSeek Harness 可能上传文件 / Agent 任务产物,放宽请求体大小
client_max_body_size 20m;
# ---- location / :反代 + WebSocket + sub_filter 注入 polyfill ----
location / {
proxy_pass http://127.0.0.1:后端端口;
# 让后端返回未压缩的 HTML,确保 sub_filter 能注入 polyfill
proxy_set_header Accept-Encoding "";
# 兼容部分浏览器对 crypto.randomUUID 的支持差异
# (部分环境未实现 crypto.randomUUID,改用 getRandomValues 模拟)
sub_filter '</head>' '</head><script>(function(){try{if(typeof crypto!=="undefined"&&crypto&&!crypto.randomUUID){crypto.randomUUID=(function(){function b(a){return a.toString(16).padStart(2,"0")}return function(){var c=new Uint8Array(16);crypto.getRandomValues(c);c[6]=(c[6]&0x0f)|0x40;c[8]=(c[8]&0x3f)|0x80;var h="";for(var i=0;i<16;i++){h+=b(c[i]);if(i===3||i===5||i===7||i===9){h+="-"}}return h}})()}}catch(e){}})();</script>';
sub_filter_once on;
# 必须用 $http_host(保留端口),不能用 $host(会丢弃端口)。
# 后端 DeepSeek Harness 的 browser-trust fence 校验 Host 与 Origin 一致性,
# 浏览器 Origin 带端口(服务器公网地址:对外端口),若 Host 无端口会 403。
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 支持(DeepSeek Harness 前端实时通信/事件推送)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 长连接/超时设置(Agent 任务长时运行,务必给足)
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_connect_timeout 30s;
}
# ---- location /api :伪造回环 Host/Origin(特权方法信任)----
location /api {
proxy_pass http://127.0.0.1:后端端口;
# 伪造回环 Host/Origin,使特权方法通过 DeepSeek Harness 回环 fence
proxy_set_header Host 127.0.0.1:后端端口;
proxy_set_header Origin http://127.0.0.1:后端端口;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket 支持(/api/events.* 升级握手)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_connect_timeout 30s;
}
}

2、Basic Auth 凭据#

  • 账号:admin
  • 密码:you_passwd(占位,部署时务必替换为自设的强密码,不要沿用任何示例密码)
  • 密码文件:dsh-htpasswd,放在「Nginx worker 可读的目录」下(如 部署目录/dsh-auth/dsh-htpasswd)

生成密码文件:

Terminal window
mkdir -p 部署目录/dsh-auth
# 生成 Basic Auth 密码文件(账号 admin,密码 you_passwd,htpasswd 加密格式)
htpasswd -bc 部署目录/dsh-auth/dsh-htpasswd admin you_passwd
# 调整属主与权限:root:nginx,nginx worker 可读
chown root:nginx 部署目录/dsh-auth/dsh-htpasswd
chmod 640 部署目录/dsh-auth/dsh-htpasswd
ls -l 部署目录/dsh-auth/dsh-htpasswd
# 期望:-rw-r----- root nginx dsh-htpasswd(nginx worker 可读 ✅)
注意

密码文件路径是第一个坑:dsh-htpasswd 必须放在 nginx worker 可读的目录下,不能放在 Nginx 站点配置目录里。因为站点配置目录权限通常是 700 root,nginx worker 进程(以 nginx 用户运行)读不到,会导致所有请求直接 500,Nginx 错误日志里会看到 open() "...dsh-htpasswd" failed (13: Permission denied)。

3、location /api 为什么要伪造回环 Host/Origin(原理与权衡,务必理解)#

  • DeepSeek Harness 有意设计了一个回环信任围栏(loopback fence):settings.describe、settings.update、credentials.set 等敏感 API 注册在 loopback 信任通道(authority: 'loopback',见 packages/client/connection/src/rpc-host.ts),强制要求请求来自回环地址(127.0.0.1 / localhost)。这是 DeepSeek Harness 的故意安全设计——即使 --trusted-host 也只是防止 DNS-rebinding 的 Host 校验,并非认证层,无法放行特权方法。
  • 因此 nginx 在 location /api 中把转发请求的 Host 与 Origin 伪造为 127.0.0.1:后端端口,让特权方法误以为请求来自回环,从而通过 fence。
  • 权衡:这一步等于绕过了 DeepSeek Harness 内置的回环保护,真实的访问认证由 server 级 Basic Auth 承担——即「Basic Auth 是替代认证方案」。
  • 注意 /api/events.mux、/api/events.host 等 WebSocket 端点也走本 location,升级握手依然能通过 fence。
  • Origin 必须硬编码为 http://127.0.0.1:后端端口 与 Host 保持一致;若用 $http_origin 携带公网原始 Origin,反而会 403。
注意

这一步绕过了 DeepSeek Harness 内置的回环保护,属于安全权衡手段。仅建议在受控环境使用,实际认证完全依赖 Basic Auth。一旦放开,任何通过认证的请求都可以调用特权方法,所以 Basic Auth 的凭据强度就是最后一道防线。

4、生效确认#

Terminal window
nginx -t && nginx -s reload # 语法校验通过后重载
注意

改完 nginx 配置一定要先 nginx -t 再 reload!语法错了直接全站 502 的教训,谁踩谁知道。另外,如果显式写了 sub_filter_types text/html;,nginx -t 会报「duplicate MIME type “text/html”」警告——sub_filter 默认只处理 text/html,不要显式声明这一行。


五、远程访问控制#

1、浏览器访问入口#

在任意设备(笔记本、手机、公司电脑)的浏览器打开:

服务器公网地址:对外端口

浏览器会弹出 Basic Auth 登录框,输入:

  • 账号:admin
  • 密码:you_passwd(你部署时设置的真实密码)

登录成功后进入 DeepSeek Harness Web UI,即可远程操作。

2、验证链路(命令与预期输出)#

Terminal window
# 无凭据访问 → 401(认证生效)
curl -I 服务器公网地址:对外端口
# HTTP/1.1 401 Unauthorized ✅
# 带凭据访问 → 200
curl -I -u admin:you_passwd 服务器公网地址:对外端口
# HTTP/1.1 200 OK ✅

3、WebSocket 实时通信#

DeepSeek Harness 前端与后端通过 WebSocket 保持长连接,用于任务进度实时推送、Agent 执行日志流式输出、前端事件总线。这依赖 Nginx 正确转发升级握手:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

如果漏掉这两行,页面能打开但实时数据不更新,任务跑起来看不到进度,表现为「页面死了一样」。排障时优先检查这个。

4、页面主要功能如何远程操作#

功能说明远程操作方式
Agent 会话与 Agent 对话、下发任务指令新建/切换会话 → 输入指令 → Agent 执行过程实时回流到页面
评测任务创建并运行评测,查看结果配置评测参数 → 触发运行 → 通过 WebSocket 实时看进度 → 完成后查看结果
session.history会话历史记录查询页面内直接浏览历史会话,跨设备共享,工作记录不丢
文件/产物Agent 任务产物、上传文件页面内上传/下载(依赖 client_max_body_size 20m 放宽请求体)
建议

远程操作的核心体验差异就是「实时性」:WebSocket 断流 → 进度卡住;Host 头不对 → 接口 403;浏览器兼容性 → 前端 JS 报错。把这三点提前想明白,远程使用基本就顺畅了。


六、管理 deepseek-harness#

1、管理脚本:dsh-manage.sh#

四合一管理脚本,基于 systemd,提供 start / stop / restart / status 四个操作。放在项目目录下即可:

#!/bin/bash
# 用法:
# bash dsh-manage.sh start 开启 DeepSeek Harness
# bash dsh-manage.sh stop 关闭 DeepSeek Harness
# bash dsh-manage.sh restart 重启 DeepSeek Harness
# bash dsh-manage.sh status 查看运行状态
SERVICE="dsh-web" # DeepSeek Harness 的 systemd 服务名
WAIT_SECONDS=5 # 操作后等待秒数
URL="服务器公网地址:对外端口"
case "$1" in
start)
echo ">>> 正在开启 DeepSeek Harness ..."
systemctl daemon-reload
systemctl start "$SERVICE"
sleep "$WAIT_SECONDS"
if systemctl is-active --quiet "$SERVICE"; then
echo "[OK] 已开启,访问地址: $URL"
else
echo "[ERROR] 开启失败,最近日志:"
journalctl -u "$SERVICE" -n 20 --no-pager
exit 1
fi
;;
stop)
echo ">>> 正在关闭 DeepSeek Harness ..."
systemctl stop "$SERVICE"
sleep 2
if systemctl is-active --quiet "$SERVICE"; then
echo "[ERROR] 正常停止失败,强制终止..."
systemctl kill "$SERVICE"
sleep 2
fi
if systemctl is-active --quiet "$SERVICE"; then
echo "[ERROR] 关闭失败,请手动检查: journalctl -u $SERVICE"
exit 1
else
echo "[OK] 已关闭"
fi
;;
restart)
echo ">>> 正在重启 DeepSeek Harness ..."
systemctl daemon-reload
systemctl restart "$SERVICE"
sleep "$WAIT_SECONDS"
if systemctl is-active --quiet "$SERVICE"; then
echo "[OK] 已重启,访问地址: $URL"
else
echo "[ERROR] 重启失败,最近日志:"
journalctl -u "$SERVICE" -n 20 --no-pager
exit 1
fi
;;
status)
systemctl status "$SERVICE" --no-pager
;;
*)
echo "用法: bash $0 {start|stop|restart|status}"
exit 1
;;
esac
exit 0

使用与验证:

Terminal window
bash -n 部署目录/dsh-manage.sh # 语法检查通过(无输出)
chmod +x 部署目录/dsh-manage.sh
bash 部署目录/dsh-manage.sh start # 开启
bash 部署目录/dsh-manage.sh restart # 重启验证
bash 部署目录/dsh-manage.sh status # 状态
提示

赋予执行权限后即可用 bash dsh-manage.sh {start|stop|restart|status} 调用;也可在**系统定时任务(cron)**中配置 Shell 脚本定时调用,实现巡检 / 守护。

例如在任务调度系统中配置如下定时任务:

DeepSeek Harness 与 Nginx 的定时任务调度列表
DeepSeek Harness 与 Nginx 的定时任务调度列表

2、日志位置速查#

日志位置说明
DeepSeek Harness 应用日志/var/log/dsh-web.logsystemd 服务的 stdout/stderr(追加写入)
Nginx 访问日志/var/log/nginx/dsh-access.log对外端口全部请求
Nginx 错误日志/var/log/nginx/dsh-error.logNginx 层错误(含代理 / 认证问题)
systemd 日志journalctl -u dsh-websystemd 托管日志(管理脚本报错时使用)
Terminal window
tail -f /var/log/nginx/dsh-access.log # 实时看访问
tail -f /var/log/dsh-web.log # 实时看应用日志
journalctl -u dsh-web -n 50 --no-pager # 看 systemd 日志

3、常见操作速查#

操作命令
修改 DeepSeek Harness 服务配置编辑 dsh-web.service → systemctl daemon-reload → systemctl restart dsh-web
修改 Nginx 配置编辑 dsh.conf → nginx -t → nginx -s reload
修改 Basic Auth 密码htpasswd -B 部署目录/dsh-auth/dsh-htpasswd admin → nginx -s reload(保持权限 -rw-r----- root nginx)
查看端口占用ss -lntp
查看内存free -h

记住两件事:改 systemd 必须 daemon-reload;改 Nginx 必须先 nginx -t 再 reload。


七、总结#

这次云部署 DeepSeek Harness 的最终方案可以概括为三句话:

  • 对外:Nginx + 对外端口 + Basic Auth 访问认证;
  • 对内:DeepSeek Harness 的 web 服务只监听回环地址,由 Nginx 反代,systemd 托管守护;
  • 排障:三次典型问题(Host 信任、randomUUID 兼容性、回环 fence)本质是一条信任链的逐层打通。

整套方案的关键文件如下,方便日后速查:

类型位置 / 值
仓库目录部署目录/deepseek-harness(固定提交 47f943859b)
Nginx 配置Nginx 站点配置目录下的 dsh.conf
Basic Auth 密码文件部署目录/dsh-auth/dsh-htpasswd(账号 admin)
systemd 服务/etc/systemd/system/dsh-web.service(服务名 dsh-web)
管理脚本部署目录/dsh-manage.sh
应用日志/var/log/dsh-web.log
Nginx 日志/var/log/nginx/dsh-access.log、/var/log/nginx/dsh-error.log
后端监听127.0.0.1:后端端口
对外访问服务器公网地址:对外端口(Basic Auth:admin / 自设强密码)

八、最终效果#

部署完成后,浏览器打开 服务器公网地址:对外端口,输入 Basic Auth 凭据登录,即可进入 DeepSeek Harness Web UI 远程操控 Agent:

DeepSeek Harness Web UI 对话界面:Agent 执行系统检查与工具调用
DeepSeek Harness Web UI 对话界面:Agent 执行系统检查与工具调用

使用DeepSeek Harness进行远程服务器运维
https://www.hellorx.site/posts/ai/ai-deepseek-harness-deployment/
作者
RanXian
发布于
2026-08-15
许可协议
CC BY-NC-SA 4.0

评论区

公告
友链互换友链

正在招募技术类博客友链,要求原创、稳定更新。点击了解更多。

查看详情
音乐音乐功能提示

音乐功能第一首歌曲源出现一定问题暂时无法播放,跳过第一首歌曲即可

维护服务器升级

每周末凌晨 2:00-4:00 进行服务器维护,期间站点可能短暂无法访问。

欢迎关于我的介绍

欢迎来到我的博客,我是深耕云计算、网络安全和人工智能技术开发。热爱技术、持续学习,欢迎同好交流探讨,也欢迎大佬互换友链。

查看详情
音乐
封面

音乐

暂未播放

0:00
0:00
暂无歌词
标签
# 运维5# Linux4# 大学3# 信创3# 竞赛1# 组织1# 基础1# AI1# DeepSeek Harness1# 具身智能1# IsaacLab1# 强化学习1# Robotics1
目录
工具

隐私政策

更新日期: 2026 年 7 月 15 日
生效日期: 2026 年 7 月 15 日

适用范围#

本政策适用于 RanXian 的博客(以下简称“本站”)。本站是个人博客,用于发布和分享内容;不提供账户注册、支付、定位或广告投放服务。访问本站、发表文章评论或在留言板留言前,请阅读本政策。

信息收集与使用#

本站只在提供内容、评论和留言功能,以及维护站点安全所需的范围内处理信息。

  • 访问与统计信息:访问页面时,统计服务可能处理访问时间、页面地址、来源页、浏览器和设备相关信息,用于了解内容访问情况、排查故障和改进站点。
  • 评论信息:使用文章评论功能时,Waline 可能处理您主动提交的昵称、邮箱、站点链接和评论内容;还可能处理 IP 地址等必要信息,用于防止垃圾评论、滥用和维护服务安全。评论内容、昵称和站点链接(如填写)可能公开展示在文章下方;邮箱不会公开展示。
  • 留言信息:留言板使用 Waline /guestbook/ 频道。Waline 可能处理您主动提交的昵称、可选邮箱、站点链接、留言内容和图片,以及浏览器、操作系统、IP 地址等必要的反滥用信息。默认情况下,留言图片以内嵌数据随留言提交;如站点维护者配置了远程图片上传接口,图片会先发送至该接口并在留言中保存返回的图片地址。留言内容、昵称、图片和站点链接(如填写)可能公开展示;邮箱和 IP 地址不会在留言板公开展示。
  • AI 对话信息:使用 AI 搜索时,本站会处理您提交的问题以及最近 6 条对话历史,用于检索博客内容并生成回答。问题和对话历史会发送至 ModelScope,或在第三方接口不可用时由 Cloudflare Workers AI 处理。请勿在 AI 对话中提交密码、Token、身份证件、联系方式或其他敏感信息。

请不要在评论或留言中提交身份证件、银行卡、住址、密码或其他不必要的敏感个人信息。

第三方服务#

为实现本站功能,以下第三方会在各自服务范围内处理相关数据:

  • Umami:用于匿名化的网站访问统计和出站链接点击统计,帮助我了解本站的使用情况。
  • Waline:用于文章评论、留言板及访问量统计。服务会按照其自身规则处理您在评论或留言时提交的信息及必要的反滥用信息。
  • Cloudflare:为本站提供静态资源分发、AI Worker、Vectorize 和相关基础设施。留言板不使用项目 Worker 或 KV 存储。
  • ModelScope:为 AI 搜索提供文本向量和对话模型服务,会处理您提交的问题及发送给模型的最近对话历史。
  • Cloudflare Workers AI:在未配置第三方 AI 接口时提供文本向量和对话模型服务,并处理相同的 AI 请求数据。
  • unpkg:用于加载 Waline 的前端脚本、样式和表情资源;请求这些资源时,您的浏览器会与该服务建立连接。

第三方服务可能有独立的隐私政策和数据保存规则。请在使用相关功能前查阅其规则;本站无法控制其独立的数据处理活动。

本站主要使用浏览器本地存储(Local Storage 或 Session Storage)保存使用偏好,例如主题颜色、明暗模式、文章列表视图和音乐播放设置。留言板会在本地保存匿名资料、未发送草稿和登录状态,以便恢复输入与会话;管理员登录状态仅保存在当前会话。AI 搜索的会话标题和完整对话也会保存在当前浏览器的 Local Storage 中,最长保存 7 天;您可以在 AI 面板中使用“清空全部会话”立即删除这些数据。

本站不主动设置用于广告定向的第一方 Cookie。评论、统计或资源服务可能按照其自身规则使用 Cookie 或类似技术。您可以通过浏览器设置查看、删除或限制 Cookie 和本地存储;清除后,部分偏好或互动状态可能会恢复为默认值,评论功能也可能受到影响。

信息公开、保存与安全#

评论和留言属于公开互动内容,提交后可能被搜索引擎收录、被他人引用或在缓存中短暂保留。请谨慎决定发布内容。除非您提出删除请求、内容违反规则或法律法规另有要求,公开内容会持续保留以维持讨论上下文。

本站会采取合理措施保护数据安全,包括使用 HTTPS、输入校验、内容转义和访问频率限制。但互联网传输和第三方服务均无法保证绝对安全,请理解并自行承担公开发布信息的相应风险。

你的权利#

你可以通过 2639840766@qq.com 联系我,申请查询、更正或删除由本站直接保存的评论、留言或相关公开内容。为保护他人权益,请在请求中提供足以定位内容的信息,并说明你与该内容的关系;必要时可能需要进行合理核验。

对于由 Waline、Umami、Cloudflare 或 unpkg 独立处理的数据,你也可以直接向对应服务提供方行使相关权利。删除公开评论或留言后,第三方缓存、搜索引擎索引或他人转载的副本可能无法立即同步删除。

未成年人条款#

未满 14 周岁的未成年人应在监护人同意和指导下使用本站的评论、留言等互动功能。监护人如发现未成年人未经同意提交了个人信息,可通过上述联系方式与我联系,我会在合理范围内协助处理。

政策更新与联系#

我可能因本站功能或适用规则变化更新本政策,更新后的版本将在本站公布并标明日期。继续使用相关功能即表示你已阅读并理解更新后的政策。

如对本政策或数据处理有疑问,请联系 2639840766@qq.com。

用户协议

更新日期: 2026 年 5 月 19 日
生效日期: 2026 年 5 月 19 日

适用范围#

本协议适用于你访问 RanXian 的博客,以及使用文章评论、留言板等互动功能的行为。继续浏览本站或提交评论、留言,即表示你已阅读、理解并同意遵守本协议及本站的隐私政策。

评论及留言规则#

请在交流中保持友善、理性和尊重。你不得利用本站发布、传播或实施以下行为:

  • 发布任何违反中华人民共和国法律法规的内容。
  • 发布任何侵犯他人合法权益的内容,包括但不限于隐私、名誉、肖像、著作权、商标权和其他知识产权。
  • 恶意攻击、辱骂、骚扰、威胁、歧视其他用户或任何第三方。
  • 发布垃圾广告、恶意推广、刷屏、灌水,或与讨论主题明显无关的重复内容。
  • 利用本站进行网络诈骗、钓鱼、传播恶意软件,或发布可能危害网络和信息安全的内容。
  • 绕越或试图绕越本站的审核、限流、封禁等管理措施。
  • 冒充他人、伪造身份,或收集、公开他人的个人信息。

内容与访问管理#

你应对自己发布的评论和留言负责,并保证拥有发布该等内容所需的合法权利。论坛管理员有权在不另行通知的情况下删除违规内容、限制或封禁违规账号,或限制其继续使用本站互动功能。

如发现涉嫌违法犯罪、严重侵权或危及本站安全的内容,本站可保留相关记录,并在法律法规要求或必要时向有关部门提供协助。对管理措施有疑问时,可通过文末联系方式说明情况;本站会结合实际情况处理,但不承诺恢复已删除内容或访问权限。

知识产权与内容授权#

本站原创文章、页面设计和其他受保护内容的权利归作者或权利人所有。未经授权,请勿复制、转载、镜像或用于商业用途;法律法规允许的合理使用除外。

你发布评论或留言时,授予本站为展示、存储、备份、审核、删除和维护互动功能所必需的非独占、免费的使用许可。该许可不改变你对原创内容依法享有的权利。

免责声明#

本站内容仅用于个人记录、学习交流和一般信息参考,不构成任何专业意见、承诺或担保。你应结合自身情况独立判断,并对据此采取的行动负责。

评论、留言和外部链接中的内容由其发布者或运营者负责,不代表本站立场。本站会在合理范围内处理明显违规内容,但不保证所有内容均及时发现,也不对第三方网站的可用性、内容、安全性或隐私实践承担责任。

因网络故障、不可抗力、第三方服务异常、维护升级或超出合理控制范围的原因导致本站暂时无法访问、内容延迟或数据丢失的,本站会尽力恢复,但不承担由此产生的间接损失。

未成年人条款#

未满 14 周岁的未成年人应在监护人同意和指导下使用评论、留言等互动功能。监护人应协助未成年人理解本协议,并对其使用行为进行必要的引导。

其他条款#

我可以根据本站功能、管理需要或法律法规变化更新本协议,更新后的版本将在本站公布并标明日期。继续使用本站即视为接受更新后的协议。

本协议的订立、执行和解释适用中华人民共和国法律。因本协议或使用本站产生争议时,双方应先友好协商;协商不成的,依法向有管辖权的人民法院解决。

如对本协议或内容管理有疑问,请联系 2639840766@qq.com。