DSH
ghcr.io/2220545672/dsh:latest
https://github.com/2220545672/dsh-unraid/pkgs/container/dsh
bridge
bash
false
https://forums.unraid.net/topic/200908-support-dsh-deepseek-harness-ai-coding-agent-in-your-browser/
https://github.com/deepseek-ai/deepseek-harness
MIT
deepseek harness dsh coding agent ai agent cli
Docker;请保留模板自带的 Extra Parameters(两个 --security-opt),否则命令沙箱不可用 | Docker; keep the template's Extra Parameters or the command sandbox is unavailable
跟随上游 @deepseek-ai/dsh 自动重建:每次发布见 Releases 页 | Rebuilt automatically for each upstream release; see the Releases page
DSH(DeepSeek Harness)是开源 AI 编码智能体:在浏览器里与它协作,读写你的项目、执行命令、管理模型与会话历史。本镜像为 Unraid 准备——自动跟随上游发版重建,并内置命令沙箱所需的 bubblewrap,使它在没有 Landlock 的内核上也能正常执行命令。 容器内置 Caddy 反向代理与可选口令门禁(也可设为 none 交给你现有的 SSO),以 uid 1000 非特权运行。⚠️ 上游处于开发者预览阶段,未来会出现破坏兼容性的变更。 | DSH (DeepSeek Harness) is an open-source AI coding agent you drive from the browser: it works on your projects, runs commands and keeps your session history. Built for Unraid — rebuilt automatically for every upstream release, with the bubblewrap sandbox bundled so commands work even on kernels without Landlock. The container bundles its own reverse proxy and an optional password gate (or set none and delegate to your SSO), and runs unprivileged as uid 1000. ⚠️ Upstream is in developer preview: compatibility-breaking changes are coming.
Tools:
http://[IP]:[PORT:8080]
https://raw.githubusercontent.com/2220545672/dsh-unraid/main/templates/dsh.xml
https://gh-proxy.com/https://raw.githubusercontent.com/2220545672/dsh-unraid/main/README.md
https://gh-proxy.com/https://raw.githubusercontent.com/2220545672/dsh-unraid/main/templates/img/dsh.png
--security-opt seccomp=unconfined --security-opt systempaths=unconfined --restart=unless-stopped
DSH(DeepSeek Harness)是开源的编码智能体,界面就在浏览器里:它能读改你的项目文件、执行命令、管理模型与会话历史,工具与能力都通过插件扩展。
**为什么用这个镜像**
- 自动跟随上游:镜像每天检查上游版本,一有新版本就构建、冒烟测试并推送;你只要在 Docker 页点一次更新,不用改任何配置。
- 命令沙箱真的能用:Unraid 内核没有启用 Landlock,DSH 的沙箱只剩 bubblewrap 一条腿。镜像内置 bubblewrap,模板默认带上它需要的两个启动参数,因此工具不会因为缺少沙箱而拒绝执行。
- 以非 root 身份运行(uid 1000)、多架构(amd64 / arm64)、**默认开启内置口令门禁**:不填 **Password** 字段时容器会随机生成一个并打印在启动日志里(Docker 页 → 该容器 → Logs)。若前面已有反向代理 / SSO 做认证,把 **Authentication Mode** 改为 none。
**整体方案**:容器内置 Caddy 反向代理——对外只开你发布的那个端口,DSH 自身只监听回环,安全响应头、Host/Origin 校验与 `ALLOWED_CLIENTS` 白名单都在这一层完成。认证是可选的:默认 `builtin` 会像 Basic Auth 一样要一次口令(之后用 Cookie 保持,含 WebSocket 握手),设为 `none` 则交给前面的反向代理或 SSO——**不要叠两层登录**。容器以 uid 1000 非特权运行,不挂 docker socket,除你映射的两个卷外不碰宿主目录。
⚠️ **开发者预览**:DeepSeek Harness 处于 _开发者预览_ 阶段,正在快速迭代。**未来将出现破坏兼容性的变更。**(引自上游原文;本镜像会自动跟随这些发布,想自己掌握节奏可钉住版本标签)
**三步开始**
1. 安装并打开 http://<你的服务器IP>:8080 :浏览器先弹出登录框,用户名 dsh,口令是 **Password** 字段的值——**模板自带默认值 12345678,请第一时间改成只有你知道的口令**(Docker 页 → 该容器 → Edit → 改 Password → Apply)。在改掉之前,同网络里知道这个公开默认值的人都能操作你的智能体。顺带说明:用户名字段默认 dsh,也可自行修改。登录后会自动完成令牌引导。想用随机口令而不是默认值,就改用 CLI 传 `-e DSH_PASSWORD=`(口令会打印在日志里,Docker 页 → 该容器 → Logs 找 GENERATED PASSWORD)。
2. 状态与项目分别放在 /data 与 /workspace(默认映射到 appdata/dsh/...),升级容器不会丢会话。
3. 放在反向代理之后时,把 PUBLIC_URL 设为对外地址(例如 https://dsh.example.com),容器就只接受该来源的请求;纯内网可留空。**若该代理本身已经做了认证(如 SWAG + Authelia),请把 **Authentication Mode** 改成 none**,否则会连着弹两次登录框。
模型凭据在应用界面里配置,本模板不要求填写任何密钥。
**页面提示 “dsh web authentication required”**:通常**自动**恢复(DSH 对文档请求回 401 时会被自动引到 `/renew` 重放启动 token,只绕一次、不会成环);也可手动打开 `http://<你的地址>:<端口>/renew`,或清掉该站点的 Cookie。
**排障**
- docker logs <容器名> | head -30 :启动日志会写明运行模式(edge / lan)、上游版本与启动结果。
- 命令工具报 SANDBOX_UNAVAILABLE :说明模板自带的 Extra Parameters 被删掉了,恢复那两个 --security-opt 即可。
上游项目:https://github.com/deepseek-ai/deepseek-harness · 本镜像文档与排障:https://github.com/2220545672/dsh-unraid
---
DSH (DeepSeek Harness) is an open-source coding agent whose interface is a browser tab: it reads and edits your project files, runs commands, and manages models and session history, with everything extensible through plugins.
**Why this image**
- Automatic updates: a daily upstream check rebuilds, smoke-tests and publishes whenever a new version lands. You just hit update in the Docker tab.
- A command sandbox that actually works: Unraid kernels ship without Landlock, which leaves bubblewrap as the only rung for DSH's sandbox. bubblewrap is bundled and the template carries the two launch options it needs, so commands never refuse to run for lack of isolation.
- Runs as non-root (uid 1000), multi-arch (amd64 / arm64), and **serves its own password gate by default**: leave **Password** empty and the container generates one and prints it once in the startup log (Docker tab -> the container -> Logs). If a reverse proxy or SSO already authenticates, set **Authentication Mode** to none.
**How it is put together**: the container bundles Caddy as its reverse proxy — the port you publish is the only way in, DSH itself listens on loopback only, and the security headers, host/origin checks and the `ALLOWED_CLIENTS` allowlist all happen at that layer. Authentication is optional: `builtin` (the default) asks for a password once, like basic auth, and then keeps you signed in with a cookie that also covers the WebSocket handshake; `none` hands that job to your own reverse proxy or SSO — do not stack two logins. The container runs unprivileged as uid 1000, mounts no docker socket, and touches no host directory beyond the two volumes you map.
⚠️ **Developer preview**: DeepSeek Harness is in _developer preview_ and iterating rapidly. **THERE WILL BE COMPATIBILITY-BREAKING CHANGES.** (Quoted from upstream. This image follows those releases automatically; pin a version tag if you would rather move on your own schedule.)
**Get started in three steps**
1. Install, then open http://<your-server>:8080 — the browser asks for a login first: user dsh, password from the **Password** field (`DSH_PASSWORD`). **The template ships 12345678 as a default: change it to something only you know before you go further** (Docker tab -> the container -> Edit -> Password -> Apply). Until you do, anybody on your network who knows this public default can drive the agent. The user name field defaults to dsh and can be changed. The token bootstrap then completes automatically. If you prefer a random password over the default, run the container from the CLI with an explicitly empty `-e DSH_PASSWORD=` instead (it is printed once in the log: Docker tab -> the container -> Logs, look for GENERATED PASSWORD).
2. State and projects live in /data and /workspace (mapped to appdata/dsh/... by default), so upgrading the container keeps your sessions.
3. Behind a reverse proxy, set PUBLIC_URL to the public origin (for example https://dsh.example.com) so the container only answers for that authority; leave it empty on a trusted LAN. If that proxy already authenticates (SWAG + Authelia, Authentik, ...), also set **Authentication Mode** (`AUTH_MODE`) to none so the browser is not asked to log in twice.
Model credentials are configured inside the app; this template never asks for a key.
**Page says “dsh web authentication required”**: it now recovers **automatically** (a 401 on the document is redirected through `/renew`, once, without looping); you can also open `http://<your-address>:<port>/renew` yourself or clear that site's cookies.
**Troubleshooting**
- docker logs <container> | head -30 — the entrypoint prints the mode (edge / lan), the upstream version and the startup result.
- Tools reporting SANDBOX_UNAVAILABLE mean the template's Extra Parameters were removed; restore the two --security-opt values.
Upstream project: https://github.com/deepseek-ai/deepseek-harness · Documentation: https://github.com/2220545672/dsh-unraid
0.0.0.0:8080
/mnt/user/appdata/dsh/data
/mnt/user/appdata/dsh/workspace
127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,169.254.0.0/16,100.64.0.0/10,fc00::/7,fe80::/10
dsh
builtin
Asia/Shanghai