dsh 0.2.0-rc.2: in-container update (experimental channel), path-agnostic compose, upstream patches adapted to 0.1.x/0.2.x

This commit is contained in:
hermes committed 2026-10-01 19:21:19 +00:00
commit e6dcef9bf5
302 files changed
+75178

No files matched your search

+83
View File
@@ -0,0 +1,83 @@
# dsh (DeepSeek Harness) — сборка archeon
Самодостаточный репозиторий: Docker-образ [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)
(`@deepseek-ai/dsh`) + **обновление кода dsh прямо из работающего контейнера**
(как плагины, без пересборки) + **path/user-агностичный docker-compose** как
пример для разработчиков.
## Что внутри
| Путь | Что это |
|---|---|
| `upstream/` | вендоренный исходник Docker-образа ([yjrszcq/dsh-docker](https://github.com/yjrszcq/dsh-docker), MIT; см. `upstream/PROVENANCE.md`) |
| `docker-compose.yml` | path/user-агностичный стенд: dsh + вложенный dind + воркспейс |
| `.env.example` | все настройки в одном месте (пути, порты, ключи) |
| `scripts/update-dsh.sh` | **обновление dsh изнутри контейнера** до npm latest (пробация + автокат) |
| `scripts/update-plugins.sh` | установка/обновление плагинов профиля web + фикс code-server |
| `scripts/build-image.sh` | пересборка образа под конкретную версию dsh |
| `docs/UPDATE-MECHANISM.md` | как работает обновление изнутри (анатомия платформы) |
## Быстрый старт
```sh
cp .env.example .env # вписать DEEPSEEK_API_KEY
docker compose -p dsh up -d
docker compose -p dsh exec dsh dsh-platform access generate-key # одноразовый ключ админа
xdg-open http://127.0.0.1:3080
```
Все пути по умолчанию относительные: данные — `./data/`, проекты — `./workspace/`
(рядом с compose-файлом). Перенос на другой хост/пользователя: `cp -r` всего
каталога (или переопределите `DSH_DATA_DIR`/`DSH_WORKSPACE_DIR` в `.env`).
Контейнер работает под uid 1000; если ваш uid другой:
`docker compose -p dsh --profile fix-perms run --rm fixperms`.
## Обновление dsh «как плагины» (главная фича)
```sh
scripts/update-dsh.sh # до npm latest: download → probation → commit
scripts/update-dsh.sh check # только посмотреть installed / available
```
- Ставится в персистентный volume `/data/platform` → переживает `down/up` и
пересоздание контейнера.
- **Важно**: механизм обновления живёт в stage0/management из **образа**, поэтому
работает только у живого контейнера (обновлять «выключенный» контейнер нельзя —
сначала `up -d`). При переходе на существенно новый образ заново проверьте
патчи окружения (`upstream/container/environment/resources/patches/`) против
новой версии dsh: образ собирается с dev-патчами, которые якорятся на
внутренности `bin.js`/`profile-boot` (в upstream пин версий стоит именно
поэтому). Наши патчи толерантны к 0.1.x и 0.2.x — проверены на обеих ветках.
- Experimental-канал платформы качает **официальный tarball с npm** (canonical
URL, sha256, без редиректов) и активирует новую версию с **пробацией**
(`DSH_EXPERIMENTAL_PROBATION_SECONDS`, по умолчанию 120 c) и **автооткатом**
при провале здоровья.
- Тот же механизм в UI: Management Console `/_dsh_platform/console/`
(Update → channel experimental → Update).
- Плагины профиля web живут в `/data/dsh` и обновляются отдельно
(`scripts/update-plugins.sh`).
### Пересборка образа под конкретную версию
Community-пин `latestSupportedDsh` (в upstream-исходнике = `0.1.5-rc.2`) в
dev-режиме сборки не проверяется — версию можно задать напрямую:
```sh
scripts/build-image.sh 0.2.0-rc.2 --push # тегирует <repo>:<версия> + :latest и пушит
```
## Почему не официальный образ
Официального образа у DeepSeek Harness нет; community-образ `szcq/deepseek-harness`
застрял на 0.1.5-rc.2 (пин автора). Этот репозиторий собирает свой образ из
того же исходника с актуальной версией и держит механизм обновления изнутри,
не дожидаясь пересборки.
## Изоляция песочниц агента
Контейнеры, которые запускает агент dsh, живут во **вложенном dind**
(`DOCKER_HOST=tcp://dind:2375`) — отдельный демон, отдельные образы/тома
(`./data/dind/`). Каталог проектов смонтирован в dind под тем же путём
`/workspace`, поэтому агент может бинд-маунтить свои песочницы на файлы
воркспейса. Порт web UI по умолчанию слушает только `127.0.0.1` — для доступа
из LAN настройте `DSH_LISTEN_ADDRESS` + `DSH_TRUSTED_HOSTS`.