# 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 # тегирует :<версия> + :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`.