diff --git a/DEPLOY.md b/DEPLOY.md index 15c5f3d..da1928c 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -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 转发: diff --git a/README.md b/README.md index 78684ea..e1e5606 100644 --- a/README.md +++ b/README.md @@ -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 +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 diff --git a/README.zh.md b/README.zh.md index 3edec25..8b6edc9 100644 --- a/README.zh.md +++ b/README.zh.md @@ -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) | ## 许可