Files
appstore/apps/deepseek-harness-workstation
okxlin 182d4265b6 fix: complete DSH uninstall cleanup
Add lifecycle scripts and remove the DSH HOME volume during uninstall.
2026-08-16 14:13:06 +08:00
..
2026-08-16 14:13:06 +08:00

DeepSeek Harness Workstation

产品介绍

DeepSeek Harness Workstation 是带网页登录、持久化开发目录和完整开发工具链的 DeepSeek Harness 工作站。镜像封装 DeepSeek Harness,由 Caddy Security 提供表单登录,适合部署在 1Panel OpenResty HTTPS 反向代理之后。

工作站包含 Node.js、pnpm、Python、Go、Rust、C/C++ 工具链,以及 Docker CLI、Compose 和 Buildx,支持 amd64arm64

主要功能

  • 支持浏览器密码管理器的表单登录
  • DeepSeek Harness Web UI、终端、会话、工具与 WebSocket
  • 持久化状态、用户 HOME 和工作区
  • Docker CLI、Compose 与 Buildx,宿主 Docker 访问默认禁用

Introduction

DeepSeek Harness Workstation combines DeepSeek Harness, browser-based form authentication, persistent development directories, and a complete multi-language toolchain for deployment behind a 1Panel OpenResty HTTPS reverse proxy.

Features

  • Password-manager-compatible browser login
  • DeepSeek Harness Web UI, terminals, sessions, tools, and WebSockets
  • Persistent state, user home, and workspace directories
  • Docker CLI, Compose, and Buildx with host daemon access disabled by default

访问说明

安装时填写浏览器使用的完整 HTTPS Origin,例如 https://dsh.toolman.me。请保持 1Panel 的“端口外部访问”关闭;1Panel 会把端口绑定到宿主回环地址:

127.0.0.1:56789 -> container:8080

在 1Panel 中创建 HTTPS 网站,并反向代理到:

http://127.0.0.1:56789

反向代理需要保留 HostX-Forwarded-HostX-Forwarded-ProtoX-Forwarded-For,并支持 WebSocket Upgrade。应用内部保持 HTTPTLS 由 1Panel OpenResty 终止。

端口监听地址由 1Panel 内置控制,不由应用表单重复配置。启用“端口外部访问”后,1Panel 会改为监听所有接口或指定 IP;仅通过 OpenResty 反向代理访问时没有必要开启。

没有域名时也可以使用 IP,但外层代理仍需提供与该 IP 匹配或已被客户端信任的 HTTPS 证书,再把外部地址设置为对应的 https://<IP>:<端口>。本应用包不开放纯 HTTP 登录模式。

安装参数

参数 默认值 说明
PANEL_APP_PORT_HTTP 56789 宿主 Web 端口
TZ Asia/Shanghai 容器时区;不挂载宿主 /etc/localtime
DSH_PUBLIC_URL 必填的完整 HTTPS Origin,不支持子路径
DSH_AUTH_USERNAME admin 网页登录用户名
DSH_AUTH_PASSWORD 无(必填) 至少 12 个字符;请使用密码管理器生成并保存
DSH_AUTH_TOKEN_LIFETIME 604800 登录令牌和 Cookie 的有效期,默认 7 天,可选最长 30 天;到期后需要重新登录
DSH_TRUSTED_HOSTS 可选的附加可信主机 authority,逗号分隔
DOCKER_SOCK_PATH /dev/null Docker Socket 开关;选择 /var/run/docker.sock 后授予宿主 Docker 控制权

AUTH_MODE=caddy-securityAUTH_COOKIE_INSECURE=false、容器入口端口 8080 和遥测关闭开关由应用包固定。AUTH_COOKIE_INSECURE 不开放为表单选项,因为当前 Caddy Security 实现启用该值时会同时移除 Cookie 的 SecureHttpOnly 属性,容易造成不必要的会话暴露。

数据持久化

应用使用一个 Docker named volume 和一个应用目录 bind mount

持久化来源 容器路径 用途
dsh-home /home/node 用户安装的软件、配置、缓存,以及鉴权、Caddy 和 DeepSeek Harness 状态
./data/workspace /workspace 用户项目与工作区,便于通过 1Panel 文件管理和应用备份访问

鉴权状态位于 /home/node/.local/share/deepseek-harness/authCaddy 状态位于 /home/node/.local/share/deepseek-harness/caddyDeepSeek Harness 状态位于 /home/node/.local/share/deepseek-harness/dsh/home/node/workspace 都是直接挂载的真实目录,不使用符号链接。

镜像以 root 启动,仅用于准备挂载目录权限和可选 Docker Socket 组,然后以 UID/GID 1000:1000 运行 DeepSeek Harness 与 Caddy。首次启动时入口会把 HOME 和 workspace 准备为该用户可写,因此通常不需要手工执行 chmodchown

1Panel 的应用备份覆盖应用安装目录,因此会包含 ./data/workspace,但不会包含独立的 HOME named volume。卸载会移除应用目录中的 workspace,并通过 docker compose down --volumes 删除 dsh-home;HOME 卷不应被当作备份。升级、卸载或迁移前,请停止应用并单独备份 dsh-home

docker run --rm --entrypoint tar \
  -v dsh-home:/source:ro \
  -v "$PWD":/backup \
  moelin/deepseek-harness:workstation \
  -C /source -czf /backup/dsh-home.tar.gz .

恢复时应保持应用停止,并优先恢复到空的 HOME 卷:

docker run --rm --entrypoint tar \
  -v dsh-home:/target \
  -v "$PWD":/backup:ro \
  moelin/deepseek-harness:workstation \
  -C /target -xzf /backup/dsh-home.tar.gz

普通 docker compose down 会保留 named volume;本应用的卸载脚本使用 docker compose down --volumes --remove-orphans 删除 dsh-home,该操作不可恢复。

沙箱与 Docker Socket

在支持 Landlock 的 Linux 内核上,默认的 no-new-privileges 配置可运行 DeepSeek Harness 沙箱,不需要 privilegedseccomp=unconfinedapparmor=unconfined。工作区写入与完全访问模式由 DSH 在应用内部切换。

Docker Socket 默认通过 /dev/null 禁用。启用 /var/run/docker.sock 后,容器内 node 用户可通过 Docker CLI、Compose 和 Buildx 操作宿主 Docker 守护进程,效果近似宿主 root 权限。只应对可信用户启用,并避免让不可信仓库、脚本或模型工具访问该工作站。

鉴权说明

访问外部地址后会跳转到 /auth/login。登录表单支持浏览器密码管理器,除 /healthz 外的应用页面和 WebSocket 都受鉴权保护。Caddy 本地账号数据库保存 bcrypt 密码哈希,JWT 签名密钥保存在 /home/node/.local/share/deepseek-harness/auth 中。为支持 1Panel 密码表单,提交的明文密码仍会存在于 1Panel 生成的 .env 和 Docker 容器配置中,宿主 root、1Panel 与 Docker 管理员可读取;镜像会在启动后从 DSH/Caddy 子进程环境中移除该值。

Caddy Security 当前不会自动刷新访问令牌。默认登录有效期为 7 天,可在安装表单中选择最长 30 天;有效期结束后需要重新登录。更长有效期也会延长被盗 Cookie 的可用窗口,公网部署应按实际需要选择尽可能短的有效期。

The local Caddy account database stores a bcrypt password hash and keeps its JWT signing key under /home/node/.local/share/deepseek-harness/auth. To support the 1Panel password form, the submitted plaintext password remains in the panel-generated .env and Docker container configuration, where host root, 1Panel, and Docker administrators can read it; the image removes the value from the DSH and Caddy child-process environments after startup.

镜像不额外内置登录限速插件。公网部署请在 Cloudflare、1Panel WAF 或外层 OpenResty 对 /auth/login/auth/sandbox/* 设置限速;使用基于客户端 IP 的规则前,请先正确配置可信真实客户端 IP 转发链。

The image does not add a separate login rate-limit plugin. For public deployments, rate-limit /auth/login and /auth/sandbox/* in Cloudflare, the 1Panel WAF, or the outer OpenResty layer, and configure the trusted real-client-IP chain before applying IP-based limits.

如果 DeepSeek Harness 后续加入原生密码鉴权,镜像保留的 dsh 模式会继续 fail-closed,待包装契约明确后再切换,不会自动叠加两套鉴权。

镜像与源码