Docker 部署 DeepSeek Harness:轻松搭建本地 AI Agent 运行时平台

本文基于 runzhliu/deepseek-harness:0.1.5-rc.2-r1,跟做标签 0.1.5-rc.2-r1(上游 @deepseek-ai/dsh@0.1.5-rc.2),测试平台 Ubuntu 24.04 Linux。

想在本机试 DeepSeek 的 Agent,卡点通常不在「再下一个权重包」。你要把仓库目录交给它改、在浏览器里开会话、配 API Key、还要终端和可选的内嵌 Chromium——本机用 npx 能跑起来,重启后会话和配置却对不上号;同事想用浏览器点几下试用,又怕把能执行代码的服务直接挂到局域网。

云端对话产品更省事,但密钥、私有仓库和客户代码往往不能出域。机房或家里已经有一台 Ubuntu + Docker 时,更省事的做法是:容器装好固定版本的 @deepseek-ai/dsh,状态进命名卷,工作区挂本机目录,打开日志里的 token 链接就能进 Web UI

DeepSeek Harness上游仓库、npm @deepseek-ai/dsh)是 TypeScript 写的 AI Agent 运行时:管会话、工具、权限与 Web UI,不是推理服务器,也不带模型权重。本文用的 runzhliu/deepseek-harness镜像页容器项目)是社区镜像:不改上游源码,把指定 npm 版本装进非 root 的 Node 24,默认起 Web UI,并带 Chromium / noVNC。

部署跑通之后,你实际能做这些事:

场景部署后怎么用
浏览器用 Agent用日志中的 ?token=... 打开 Web UI,配置 API Key 后开会话
对着本地仓库干活宿主机项目挂到 /workspace,在 UI 里选该目录再跑工具
内嵌浏览器侧栏点「浏览器」,打开容器内 Chromium(6080 无登录,勿对公网)
无界面批处理同一镜像加 --profile headless 跑一次性任务

轩辕镜像 加速拉取 runzhliu/deepseek-harness:0.1.5-rc.2-r1Docker Compose 启动。实测局域网 IP 192.168.1.35,请换成你的。无 Compose 见第七节。文内附 4 张实测截图。

上手要点

  • 部署:第四节 Compose;临时试玩见第七节 docker run
  • 端口:宿主机 3080(Web)、6080(noVNC)
  • 访问http://服务器IP:3080/?token=…选择工作区若 403localhost + SSH 隧道(FAQ Q3)
  • API Key:首次弹窗或 DEEPSEEK_API_KEY;未配会 MISSING_CREDENTIAL
  • 标签:跟做 0.1.5-rc.2-r1,勿写 latest
  • 数据dsh-home/home/node/.dsh./workspace/workspace
  • 冷启动:约 1~2 分钟 等到 healthy 再取 token
  • 体积:DISK 3.65GB / CONTENT 933MB
  • 目录:Linux /www/wwwroot/deepseek-harness;macOS ~/docker/deepseek-harness
  • 注意:预发布;仅建议信任内网;升级前备份 dsh-home(会话格式 V3)

官方:DeepSeek Harness · deepseek-harness-docker · 镜像页 · 标签列表 · Docker Hub


一、runzhliu/deepseek-harness 是什么?

说明
是什么官方 @deepseek-ai/dsh 的社区容器(默认 Web,可选 Headless)
不是什么不是 DeepSeek 官方镜像;不是 LLM 推理 / 权重包
架构amd64 + arm64
跟做基线@deepseek-ai/dsh@0.1.5-rc.2 → 镜像标签 0.1.5-rc.2-r1
自带能力Web UI(token + Cookie)、Debian Chromium / noVNC、可装社区插件
本文镜像本机 npx @deepseek-ai/dsh云端 Chat SaaS
定位可复现的本地 Agent 运行时临时 CLI托管对话
持久化dsh-home + /workspace依赖本机习惯出域
适合内网试用、对着仓库联调快速试命令少运维
浏览器 ──:3080──▶  Web UI(token → Cookie)
         ──:6080──▶  noVNC / 内嵌 Chromium(无认证)
dsh-home ──▶ /home/node/.dsh
./workspace ──▶ /workspace

同站还有 smanx/deepseek-harnessmoelin/deepseek-harness 等变体(反代、登录方式不同)。本文只跟做 runzhliu/deepseek-harness:0.1.5-rc.2-r1

标签用途
0.1.5-rc.2-r1默认跟做(Debian Chromium)
…-r1-ungoogled.1隐私向 Chromium 变体
…-r1-market.1额外插件市场(显式选用)

二、环境要求

项目建议
系统Linux(建议 Ubuntu 24.04);macOS + Docker Desktop 亦可
DockerEngine + Compose V2
内存建议 ≥ 2 GB(开 Chromium 宜更宽裕)
磁盘DISK 约 3.65GB + 会话 / 工作区增长
端口宿主机 30806080
账号无预置密码;靠日志里的 launch token
docker --version
docker compose version

Linux 未装 Docker 可使用轩辕镜像一键安装脚本:

bash <(wget -qO- https://get.xuanyuan.cloud/docker.sh)

备用地址:

bash <(wget -qO- https://get.xuanyuan.me/docker.sh)

更多见 轩辕镜像使用手册


三、拉取镜像

轩辕镜像 加速拉取:

docker pull docker.xuanyuan.run/runzhliu/deepseek-harness:0.1.5-rc.2-r1

Ubuntu 24.04 实测:

0.1.5-rc.2-r1: Pulling from runzhliu/deepseek-harness
44136fa355b3: Download complete
0987ade87869: Pull complete
1332a02f1607: Pull complete
733e36e3853e: Pull complete
27ee9a825048: Pull complete
681e9b650ca4: Pull complete
00f78834a2fe: Pull complete
74db55ccb683: Pull complete
a331acdbc7d3: Pull complete
31845e895b6f: Pull complete
05b3cd6b8b7e: Pull complete
4f4fb700ef54: Pull complete
cdd351ebf10e: Pull complete
d87179d4fd3e: Pull complete
c7a65875615d: Pull complete
a6f7147c6449: Pull complete
1f13eee2a50b: Pull complete
1be2c0a2f1ad: Pull complete
f4242c76c3aa: Pull complete
1ee9fbecc064: Pull complete
b59989d6a0c5: Pull complete
cbc19164244e: Pull complete
44fed46b68cf: Pull complete
999ea1f77fcd: Pull complete
3d30ea67d8ab: Download complete
Digest: sha256:b19cbd870ddf8333cba9039c85ec89e7620894bfa77fcff2dfb4b5e0b8fa958c
Status: Downloaded newer image for docker.xuanyuan.run/runzhliu/deepseek-harness:0.1.5-rc.2-r1
docker.xuanyuan.run/runzhliu/deepseek-harness:0.1.5-rc.2-r1
docker images docker.xuanyuan.run/runzhliu/deepseek-harness:0.1.5-rc.2-r1
IMAGE                                                         ID             DISK USAGE   CONTENT SIZE
docker.xuanyuan.run/runzhliu/deepseek-harness:0.1.5-rc.2-r1   b19cbd870ddf       3.65GB          933MB

完整标签见 tags。升级时改 Compose / docker run 中的标签,并核对上游 Release


四、Docker Compose 部署(推荐)

工作目录:Linux /www/wwwroot/deepseek-harness;macOS 用 ~/docker/deepseek-harness

下文 Compose 直接拉镜像(不必 clone 上游仓库构建),并加上 read_onlycap_dropshm_size 等常用加固项。

4.1 创建目录

sudo mkdir -p /www/wwwroot/deepseek-harness/workspace
sudo chown -R 1000:1000 /www/wwwroot/deepseek-harness/workspace
cd /www/wwwroot/deepseek-harness
# macOS:mkdir -p ~/docker/deepseek-harness/workspace && cd ~/docker/deepseek-harness

需要 Agent 改的代码可先放进 workspace/,或启动前设置 DSH_WORKSPACE 指向已有项目(绝对路径)。

4.2 编写 compose.yml

cat > compose.yml <<'EOF'
services:
  deepseek-harness:
    image: docker.xuanyuan.run/runzhliu/deepseek-harness:0.1.5-rc.2-r1
    container_name: deepseek-harness
    ports:
      - "3080:3080"
      - "6080:6080"
    environment:
      DSH_TELEMETRY_DISABLED: "1"
      DSH_DESKTOP_ENABLED: "1"
      DSH_DESKTOP_PUBLIC_PORT: "6080"
      HOME: /workspace
      TZ: Asia/Shanghai
      # DEEPSEEK_API_KEY: "你的密钥"   # 可选;也可在 Web 弹窗里填
    volumes:
      - dsh-home:/home/node/.dsh
      - ${DSH_WORKSPACE:-./workspace}:/workspace
    read_only: true
    tmpfs:
      - /tmp:rw,noexec,nosuid,nodev,size=512m
    shm_size: "1gb"
    cap_drop:
      - ALL
    security_opt:
      - no-new-privileges:true
    pids_limit: 512
    restart: unless-stopped
    healthcheck:
      test:
        [
          "CMD",
          "node",
          "-e",
          "Promise.all([fetch('http://127.0.0.1:3080/'), fetch('http://127.0.0.1:6080/vnc.html')]).then(([web, desktop]) => { if (web.status !== 401 || !desktop.ok) process.exit(1) }).catch(() => process.exit(1))",
        ]
      interval: 15s
      timeout: 5s
      start_period: 90s
      retries: 5

volumes:
  dsh-home:
EOF
  • 3080:3080 / 6080:6080:局域网可访问;勿映射到公网(Web 无 TLS,6080 无认证)
  • dsh-home:配置、凭证、会话;./workspace:代码与文件

4.3 启动与取 token

# 可选:export DSH_WORKSPACE=/绝对路径/到/你的项目

docker compose up -d
docker compose ps

刚启动多为 health: starting(实测):

[+] up 3/3
 ✔ Network deepseek-harness_default Created
 ✔ Volume deepseek-harness_dsh-home Created
 ✔ Container deepseek-harness       Started

NAME               IMAGE                                                         STATUS
deepseek-harness   docker.xuanyuan.run/runzhliu/deepseek-harness:0.1.5-rc.2-r1   Up … (health: starting)

Web + Chromium 冷启动常见 1~2 分钟。等到 healthy 再取 token:

docker compose ps
docker compose logs -f --no-color deepseek-harness
# Ctrl+C 后:
docker compose logs --no-color deepseek-harness | grep 'dsh web:'
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:3080/

就绪实测:

dsh web: http://127.0.0.1:3080/?token=<启动token>

NAME               IMAGE                                                         STATUS          PORTS
deepseek-harness   docker.xuanyuan.run/runzhliu/deepseek-harness:0.1.5-rc.2-r1   Up … (healthy)  0.0.0.0:3080->3080/tcp, 0.0.0.0:6080->6080/tcp

401

curl401 表示服务已起、且未带 token(符合预期)。grep 为空或 curl000 时继续等,不要立刻判定失败。

浏览器打开(把 IP、token 换成你的):

http://192.168.1.35:3080/?token=<启动token>

访问怎么选

  • 看界面、配 API Key、开会话:用上面的 局域网 IP 即可。
  • 选择工作区 若报 directoryPicker … 403:上游把目录选择钉在 loopback;请用 SSH 隧道打开 http://localhost:3080/?token=…(见 FAQ Q3)。Chrome 上请用 localhost,不要用 127.0.0.1
  • 日志里的 LAN: 192.168.96.x 是容器网桥地址,不要当宿主机 IP。

重建容器后 token 会变,以最新日志为准。


五、浏览器首次初始化

5.1 内测声明

带 token 进入后先出现 内测声明(0.1 开发者预览),点 继续

picture.image

5.2 添加 API Key

接着弹出 添加一个 API Key 开始使用。填 DeepSeek 官方密钥后点 保存并继续,或点 稍后配置。密钥只放 Web 凭证、环境变量或 Secrets,不要写进镜像。

picture.image

5.3 选择工作区

主界面标题为 探索未至之境 预览版;左侧有 + 新会话工作区,底部有 浏览器 / 设置。必须先 选择工作区 才能输入。

picture.image

工作区对应容器 /workspace(宿主机 ./workspace)。若目录选择器 403,按 §4.3 / FAQ Q3 改用 localhost 隧道后再选。

5.4 发消息与模型

选好工作区后即可发消息,底部可切换模型(如 DeepSeek-V4.1-Flash)。未配密钥时会出现 本轮运行失败 / MISSING_CREDENTIAL

picture.image

在弹窗或 设置 里补上 DEEPSEEK_API_KEY 后重试。侧栏 浏览器 可开内嵌 Chromium;独立 noVNC(无认证)一般不必直开:

http://192.168.1.35:6080/novnc-debian-1.6.0-2/vnc.html?autoconnect=1

六、安全与升级

建议
网络3080 / 6080 仅建议信任内网;勿对公网裸暴露
挂载只挂需要的工作区;勿挂宿主机根、~/.ssh、云凭证或 Docker socket
权限镜像 UID 1000;工作区 chown 1000:1000,不要改成 root 跑
插件勿装未审核插件;多租户不要共用同一实例
升级改标签 → docker compose pull && up -d;先备份 dsh-home
会话0.1.5 系列为 Session Format V3;旧版 DSH 读不了已迁移会话
停服docker compose down 保留卷;down --volumes 会清空状态,慎用

公网场景须自行加反向代理、TLS 与认证,并单独评估 noVNC。


七、备选:docker run

docker volume create dsh-home

docker run -d \
  --name deepseek-harness \
  --restart unless-stopped \
  -p 3080:3080 \
  -p 6080:6080 \
  --shm-size 1g \
  --read-only \
  --tmpfs /tmp:rw,noexec,nosuid,nodev,size=512m \
  --cap-drop ALL \
  --security-opt no-new-privileges:true \
  --pids-limit 512 \
  -e DSH_TELEMETRY_DISABLED=1 \
  -e DSH_DESKTOP_ENABLED=1 \
  -e DSH_DESKTOP_PUBLIC_PORT=6080 \
  -e HOME=/workspace \
  -e TZ=Asia/Shanghai \
  --mount type=volume,src=dsh-home,dst=/home/node/.dsh \
  --mount type=bind,src=/www/wwwroot/deepseek-harness/workspace,dst=/workspace \
  docker.xuanyuan.run/runzhliu/deepseek-harness:0.1.5-rc.2-r1
docker logs deepseek-harness 2>&1 | grep 'dsh web:'

浏览器:http://服务器IP:3080/?token=…

Headless(可选)

docker run --rm \
  --env DEEPSEEK_API_KEY \
  --mount type=volume,src=dsh-home,dst=/home/node/.dsh \
  --mount type=bind,src=/www/wwwroot/deepseek-harness/workspace,dst=/workspace \
  docker.xuanyuan.run/runzhliu/deepseek-harness:0.1.5-rc.2-r1 \
  --profile headless "summarize this repository"

八、常见问题 FAQ

Q1:打开 http://服务器IP:3080/ 返回 401?
正常。必须带日志里的 ?token=...

Q2:curl000,或 grep 'dsh web:' 为空?
仍在冷启动。看 docker compose ps 是否 health: starting,跟日志等到 dsh web:。数分钟后仍失败再查内存、工作区权限、端口占用。

Q3:选择工作区报 directoryPicker/list HTTP 403?
上游特权接口只认 loopback。局域网 IP 打开页面时选目录会 403;127.0.0.1 在部分 Chrome 也会因 Origin 校验失败。

ssh -L 3080:127.0.0.1:3080 -L 6080:127.0.0.1:6080 用户名@192.168.1.35

本机浏览器打开:

http://localhost:3080/?token=<启动token>

再选 /workspace。若 SSH 密码被拒,多半是 root 禁止密码登录,请换有权限的用户或改用密钥。

Q4:发消息报 MISSING_CREDENTIAL
未写入 DeepSeek API Key。在首次弹窗或 设置 中保存,或在 Compose 增加 DEEPSEEK_API_KEY 后重建。

Q5:工作区 EACCES / 只读?
确认目录属主 UID 1000,且 HOME=/workspace。用本文标签重建容器。

Q6:该用 latest 吗?镜像页还写着 alpha.1
不要用 latest(上游也不发)。跟做 0.1.5-rc.2-r1;介绍文案滞后时以 标签列表 与容器 README 为准。

Q7:要插件市场吗?
默认镜像不含。需要时显式换 0.1.5-rc.2-r1-market.1,并阅读上游说明;第三方插件未经 DeepSeek / 本镜像项目审计。


九、命令速查

docker pull docker.xuanyuan.run/runzhliu/deepseek-harness:0.1.5-rc.2-r1

cd /www/wwwroot/deepseek-harness
docker compose up -d
docker compose ps
docker compose logs --no-color deepseek-harness | grep 'dsh web:'
docker compose logs -f deepseek-harness
docker compose down

curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:3080/

十、延伸阅读

资源链接
runzhliu/deepseek-harness 镜像页https://xuanyuan.cloud/zh/r/runzhliu/deepseek-harness
镜像标签列表https://xuanyuan.cloud/r/runzhliu/deepseek-harness/tags
deepseek-harness-dockerhttps://github.com/runzhliu/deepseek-harness-docker
DeepSeek Harness 上游https://github.com/deepseek-ai/deepseek-harness
Docker Hub · runzhliu/deepseek-harnesshttps://hub.docker.com/r/runzhliu/deepseek-harness
轩辕镜像使用手册https://xuanyuan.cloud/usage

总结

  • DeepSeek Harness 是 Agent 运行时 + Web UI,不是推理镜像;跟做 runzhliu/deepseek-harness:0.1.5-rc.2-r1
  • Compose 主路径:状态进 dsh-home,代码进 /workspace,端口 3080 / 6080
  • 用日志 token 打开 http://服务器IP:3080/?token=…;选工作区若 403,改用 localhost + SSH 隧道
  • 配好 API Key 再发消息;仅建议信任内网,勿对公网裸暴露。

阅读原文

0
0
0
0
评论
未登录
暂无评论