docs: add docker / docker-compose run examples
Document ACR multi-arch image, compose minimal YAML, docker run variants (pin version, custom port, --trusted-host), and token URL handling.
This commit is contained in:
1 parent
7444ba9ca0
commit
4be0850529
3 files changed
+292
-16
No files matched your search
@@ -38,6 +38,145 @@ dsh web: http://127.0.0.1:3081/?token=<一次性令牌>
|
||||
|
||||
> 官方 `@latest` **强制浏览器认证**,没有免 token 开关。`DSH_TRUST_ALL` 只存在于历史 fork 镜像,当前路径无效。
|
||||
|
||||
## 运行示例
|
||||
|
||||
已推送镜像(多架构 `linux/amd64` + `linux/arm64`):
|
||||
|
||||
```text
|
||||
registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest
|
||||
```
|
||||
|
||||
### 1. Docker Compose(推荐,本仓库源码构建)
|
||||
|
||||
```bash
|
||||
git clone <本仓库地址>
|
||||
cd DeepSeekHarnessDocker
|
||||
|
||||
# 国内网络:取消注释 docker-compose.yml 里的 DSH_NPM_REGISTRY
|
||||
# - DSH_NPM_REGISTRY=https://registry.npmmirror.com
|
||||
|
||||
docker compose up -d --build
|
||||
docker compose logs -f dsh
|
||||
```
|
||||
|
||||
常用 compose 子命令:
|
||||
|
||||
```bash
|
||||
docker compose ps # 状态
|
||||
docker compose logs -f dsh # 跟日志(找 token URL)
|
||||
docker compose restart dsh # 改完插件/配置后重启
|
||||
docker compose down # 停容器,保留 dsh-data 卷
|
||||
docker compose down -v # 连数据卷一起删(慎用)
|
||||
docker compose build --no-cache # 强制重建镜像
|
||||
```
|
||||
|
||||
完整 `docker-compose.yml` 可参考仓库内文件;最小可用示例:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
dsh:
|
||||
image: registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest
|
||||
# 或本地构建:build: .
|
||||
ports:
|
||||
- "3080:3080"
|
||||
volumes:
|
||||
- dsh-data:/home/dsh/.dsh
|
||||
- ./workspace:/workspace
|
||||
environment:
|
||||
- DSH_HOME=/home/dsh/.dsh
|
||||
- HOME=/workspace
|
||||
- DSH_NPM_REGISTRY=https://registry.npmmirror.com
|
||||
# 远程用 IP 访问时打开(仍需 token cookie):
|
||||
# command: ["--trusted-host", "your-server-ip"]
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
dsh-data:
|
||||
```
|
||||
|
||||
### 2. Docker Compose(直接用 ACR 预构建镜像,不 build)
|
||||
|
||||
```bash
|
||||
mkdir -p dsh-docker && cd dsh-docker
|
||||
# 把上面的 docker-compose.yml 存到当前目录后:
|
||||
docker compose up -d
|
||||
docker compose logs -f dsh
|
||||
```
|
||||
|
||||
或一行拉起(无 compose):
|
||||
|
||||
```bash
|
||||
docker pull registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest
|
||||
|
||||
docker run -d --name dsh \
|
||||
--restart unless-stopped \
|
||||
-p 3080:3080 \
|
||||
-v dsh-data:/home/dsh/.dsh \
|
||||
-v "$PWD/workspace":/workspace \
|
||||
-e DSH_HOME=/home/dsh/.dsh \
|
||||
-e HOME=/workspace \
|
||||
-e DSH_NPM_REGISTRY=https://registry.npmmirror.com \
|
||||
registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest
|
||||
|
||||
docker logs -f dsh
|
||||
```
|
||||
|
||||
打开日志中的 URL(把 `:3081` 换成 `:3080`)。
|
||||
|
||||
### 3. `docker run` 变体
|
||||
|
||||
**钉住 dsh 版本(可复现):**
|
||||
|
||||
```bash
|
||||
docker run -d --name dsh \
|
||||
-p 3080:3080 \
|
||||
-v dsh-data:/home/dsh/.dsh \
|
||||
-e DSH_DIST_TAG=0.1.5-rc.1 \
|
||||
-e DSH_NPM_REGISTRY=https://registry.npmmirror.com \
|
||||
registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest
|
||||
```
|
||||
|
||||
**改宿主机端口(例如 18080):**
|
||||
|
||||
```bash
|
||||
docker run -d --name dsh \
|
||||
-p 18080:18080 \
|
||||
-v dsh-data:/home/dsh/.dsh \
|
||||
-e DSH_FORWARD_PORT=18080 \
|
||||
registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest
|
||||
```
|
||||
|
||||
**其它机器通过服务器 IP 访问:**
|
||||
|
||||
```bash
|
||||
docker run -d --name dsh \
|
||||
-p 3080:3080 \
|
||||
-v dsh-data:/home/dsh/.dsh \
|
||||
-e DSH_NPM_REGISTRY=https://registry.npmmirror.com \
|
||||
registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest \
|
||||
--trusted-host 203.0.113.10
|
||||
```
|
||||
|
||||
浏览器仍须先用日志里带 `?token=` 的 `http://203.0.113.10:3080/?token=…` 打开一次。
|
||||
|
||||
**前台调试(不 detach):**
|
||||
|
||||
```bash
|
||||
docker run --rm -it \
|
||||
-p 3080:3080 \
|
||||
-v dsh-data:/home/dsh/.dsh \
|
||||
-e DSH_NPM_REGISTRY=https://registry.npmmirror.com \
|
||||
registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest
|
||||
```
|
||||
|
||||
### 4. 进入容器
|
||||
|
||||
```bash
|
||||
docker exec -it dsh sh
|
||||
docker exec -it dsh dsh --version
|
||||
docker exec -it dsh dsh plugin --profile web list
|
||||
```
|
||||
|
||||
## 端口拓扑
|
||||
|
||||
官方 `dsh web` 只监听 `127.0.0.1`,并拒绝 `--host 0.0.0.0`。Docker `-p` 打不到容器内 loopback,因此 entrypoint 做 L4 转发:
|
||||
|
||||
@@ -1,19 +1,62 @@
|
||||
# DeepSeek Harness Docker Deploy
|
||||
|
||||
Runtime image for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (`dsh`) Web UI.
|
||||
Runtime image wrapper for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (`dsh`) Web UI.
|
||||
|
||||
The image ships a toolchain only. On every container start, `docker/entrypoint.sh` installs official `@deepseek-ai/dsh@latest` from npm, then starts `dsh web` behind a local port forward (`0.0.0.0:3080` → `127.0.0.1:3081`).
|
||||
|
||||
## Quick start
|
||||
Prebuilt image (multi-arch `linux/amd64` + `linux/arm64`):
|
||||
|
||||
```bash
|
||||
docker compose build
|
||||
docker compose up -d
|
||||
docker logs -f dsh
|
||||
# Open the printed URL with ?token= once (30-day cookie). Use host port 3080.
|
||||
```text
|
||||
registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest
|
||||
```
|
||||
|
||||
Full guide: [DEPLOY.md](DEPLOY.md)
|
||||
## Docker Compose (recommended)
|
||||
|
||||
```bash
|
||||
git clone <this-repo>
|
||||
cd DeepSeekHarnessDocker
|
||||
docker compose up -d --build # or image: …/skymirror/dsh:latest without build
|
||||
docker compose logs -f dsh
|
||||
```
|
||||
|
||||
Minimal compose:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
dsh:
|
||||
image: registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest
|
||||
ports:
|
||||
- "3080:3080"
|
||||
volumes:
|
||||
- dsh-data:/home/dsh/.dsh
|
||||
- ./workspace:/workspace
|
||||
environment:
|
||||
- DSH_HOME=/home/dsh/.dsh
|
||||
- HOME=/workspace
|
||||
- DSH_NPM_REGISTRY=https://registry.npmmirror.com
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
dsh-data:
|
||||
```
|
||||
|
||||
## docker run
|
||||
|
||||
```bash
|
||||
docker run -d --name dsh \
|
||||
--restart unless-stopped \
|
||||
-p 3080:3080 \
|
||||
-v dsh-data:/home/dsh/.dsh \
|
||||
-v "$PWD/workspace":/workspace \
|
||||
-e DSH_HOME=/home/dsh/.dsh \
|
||||
-e HOME=/workspace \
|
||||
-e DSH_NPM_REGISTRY=https://registry.npmmirror.com \
|
||||
registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest
|
||||
|
||||
docker logs -f dsh
|
||||
```
|
||||
|
||||
Open the logged `dsh web: http://127.0.0.1:3081/?token=…` URL once with **`:3081` replaced by `:3080`** (30-day cookie). Full guide: [DEPLOY.md](DEPLOY.md) / [中文](README.zh.md).
|
||||
|
||||
## Layout
|
||||
|
||||
|
||||
+102
-8
@@ -1,19 +1,112 @@
|
||||
# DeepSeek Harness Docker 部署
|
||||
|
||||
[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(`dsh`)Web UI 的运行时镜像。
|
||||
[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(`dsh`)Web UI 的运行时镜像封装。
|
||||
|
||||
镜像只内置工具链。容器每次启动由 `docker/entrypoint.sh` 从 npm 安装官方 `@deepseek-ai/dsh@latest`,再经本地端口转发(`0.0.0.0:3080` → `127.0.0.1:3081`)启动 `dsh web`。
|
||||
|
||||
## 快速开始
|
||||
预构建镜像:
|
||||
|
||||
```bash
|
||||
docker compose build
|
||||
docker compose up -d
|
||||
docker logs -f dsh
|
||||
# 用日志里带 ?token= 的 URL 打开一次(30 天 cookie)。宿主机访问 3080。
|
||||
```text
|
||||
registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest # linux/amd64 + linux/arm64
|
||||
```
|
||||
|
||||
完整说明:[DEPLOY.md](DEPLOY.md)
|
||||
## 一、Docker Compose(推荐)
|
||||
|
||||
### 从本仓库构建并启动
|
||||
|
||||
```bash
|
||||
git clone <本仓库地址>
|
||||
cd DeepSeekHarnessDocker
|
||||
|
||||
docker compose up -d --build
|
||||
docker compose logs -f dsh
|
||||
```
|
||||
|
||||
### 直接使用 ACR 镜像
|
||||
|
||||
把仓库里的 `docker-compose.yml` 中 `build: context: .` 换成:
|
||||
|
||||
```yaml
|
||||
image: registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest
|
||||
```
|
||||
|
||||
然后:
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
docker compose logs -f dsh
|
||||
```
|
||||
|
||||
### 最小 compose 示例
|
||||
|
||||
```yaml
|
||||
services:
|
||||
dsh:
|
||||
image: registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest
|
||||
ports:
|
||||
- "3080:3080"
|
||||
volumes:
|
||||
- dsh-data:/home/dsh/.dsh
|
||||
- ./workspace:/workspace
|
||||
environment:
|
||||
- DSH_HOME=/home/dsh/.dsh
|
||||
- HOME=/workspace
|
||||
- DSH_NPM_REGISTRY=https://registry.npmmirror.com
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
dsh-data:
|
||||
```
|
||||
|
||||
### 常用 compose 命令
|
||||
|
||||
```bash
|
||||
docker compose ps
|
||||
docker compose logs -f dsh # 找带 ?token= 的访问 URL
|
||||
docker compose restart dsh
|
||||
docker compose down # 停容器,保留数据卷
|
||||
docker compose down -v # 连卷一起删(慎用)
|
||||
```
|
||||
|
||||
## 二、docker run
|
||||
|
||||
```bash
|
||||
docker run -d --name dsh \
|
||||
--restart unless-stopped \
|
||||
-p 3080:3080 \
|
||||
-v dsh-data:/home/dsh/.dsh \
|
||||
-v "$PWD/workspace":/workspace \
|
||||
-e DSH_HOME=/home/dsh/.dsh \
|
||||
-e HOME=/workspace \
|
||||
-e DSH_NPM_REGISTRY=https://registry.npmmirror.com \
|
||||
registry.cn-hangzhou.aliyuncs.com/skymirror/dsh:latest
|
||||
|
||||
docker logs -f dsh
|
||||
```
|
||||
|
||||
打开日志里的 `dsh web: http://127.0.0.1:3081/?token=…`,把 **`:3081` 改成 `:3080`** 后在浏览器打开一次(30 天 cookie),之后直接访问 `http://127.0.0.1:3080/`。
|
||||
|
||||
### 常用变体
|
||||
|
||||
```bash
|
||||
# 钉版本
|
||||
-e DSH_DIST_TAG=0.1.5-rc.1
|
||||
|
||||
# 改宿主机端口
|
||||
-p 18080:18080 -e DSH_FORWARD_PORT=18080
|
||||
|
||||
# 其它机器用 IP 访问(追加在镜像名之后)
|
||||
--trusted-host your-server-ip
|
||||
```
|
||||
|
||||
## 三、打开浏览器
|
||||
|
||||
1. `docker logs dsh` 复制带 `?token=` 的 URL
|
||||
2. 将其中的 `127.0.0.1:3081` 换成 `127.0.0.1:3080`(或 `服务器IP:3080`)
|
||||
3. 打开**一次** → 写入 30 天 cookie
|
||||
4. 之后直接访问 `http://127.0.0.1:3080/`
|
||||
|
||||
> 官方包**强制**浏览器认证,没有免 token 的开关。
|
||||
|
||||
## 目录
|
||||
|
||||
@@ -23,6 +116,7 @@ docker logs -f dsh
|
||||
| `docker-compose.yml` | 端口、`dsh-data` 卷、工作区挂载 |
|
||||
| `docker/entrypoint.sh` | 安装 `@deepseek-ai/dsh@latest` 并启动 web |
|
||||
| `docker/ensure-rust.sh` | Rust 按需安装包装器 |
|
||||
| `DEPLOY.md` | 完整部署说明(端口拓扑、环境变量、FAQ) |
|
||||
|
||||
## 许可
|
||||
|
||||
|
||||
Reference in new issue
Block a user