106 lines
6.0 KiB
YAML
106 lines
6.0 KiB
YAML
# ════════════════════════════════════════════════════════════════════════════
|
|
# DeepSeek Harness (dsh) + вложенный dind для песочниц агента
|
|
# ════════════════════════════════════════════════════════════════════════════
|
|
# Path/user-агностично: ВСЕ пути хоста — относительные (рядом с этим файлом)
|
|
# и переопределяются через .env. Работает у любого пользователя на любом хосте.
|
|
#
|
|
# Быстрый старт:
|
|
# cp .env.example .env # и вписать DEEPSEEK_API_KEY
|
|
# docker compose -p dsh up -d
|
|
# docker compose -p dsh exec dsh dsh-platform access generate-key # ключ первого входа
|
|
# UI: http://127.0.0.1:${DSH_PORT:-3080}
|
|
#
|
|
# Обновление dsh изнутри контейнера (как плагины):
|
|
# scripts/update-dsh.sh # до npm latest, с пробацией и откатом
|
|
# Management Console: /_dsh_platform/console/
|
|
#
|
|
# Права на каталогах данных: контейнер работает под uid 1000 (node).
|
|
# Если ваш uid ≠ 1000: docker compose -p dsh --profile fix-perms run --rm fixperms
|
|
# ════════════════════════════════════════════════════════════════════════════
|
|
|
|
services:
|
|
dsh:
|
|
image: ${DSH_IMAGE:-gitea.archeon.io/hermes/dsh:latest}
|
|
# build: альтернатива — собрать прямо из этого репо:
|
|
# docker build --build-arg DSH_VERSION=<версия|latest> -t dsh-local upstream/
|
|
# # затем DSH_IMAGE=dsh-local в .env
|
|
container_name: ${DSH_CONTAINER_NAME:-dsh}
|
|
restart: unless-stopped
|
|
depends_on:
|
|
dind:
|
|
condition: service_started
|
|
ports:
|
|
- "${DSH_LISTEN_ADDRESS:-127.0.0.1}:${DSH_PORT:-3080}:3080" # web UI + management console
|
|
- "${DSH_LISTEN_ADDRESS:-127.0.0.1}:${DSH_EDITOR_PORT:-18500}:18500" # code-server редактора
|
|
environment:
|
|
DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}
|
|
DSH_HOME: /data/dsh
|
|
DSH_PLATFORM_DATA: /data/platform
|
|
DSH_DEFAULT_WORKSPACE: ${DSH_DEFAULT_WORKSPACE:-/workspace}
|
|
DSH_TRUSTED_HOSTS: ${DSH_TRUSTED_HOSTS:-}
|
|
DSH_TELEMETRY_DISABLED: ${DSH_TELEMETRY_DISABLED:-true}
|
|
DSH_EXPERIMENTAL_PROBATION_SECONDS: ${DSH_EXPERIMENTAL_PROBATION_SECONDS:-120}
|
|
DOCKER_HOST: tcp://dind:2375 # песочницы агента — во вложенный dind
|
|
# Опциональная память агентов (раскомментировать при необходимости):
|
|
# OPENVIKING_URL: ${OPENVIKING_URL}
|
|
# OPENVIKING_API_KEY: ${OPENVIKING_API_KEY}
|
|
group_add:
|
|
- "dsh-sudo-${DSH_SUDO_ENABLED:-false}"
|
|
volumes:
|
|
# Данные — относительные каталоги рядом с compose-файлом (переопределяются .env):
|
|
- ${DSH_DATA_DIR:-./data}/home:/home/node # HOME: .dsh-editor, кэши, user-data
|
|
- ${DSH_DATA_DIR:-./data}/dsh:/data/dsh # DSH_HOME: профили, ПЛАГИНЫ, settings.yaml
|
|
- ${DSH_DATA_DIR:-./data}/platform:/data/platform # состояние платформы: ОБНОВЛЕНИЯ, откаты
|
|
- ${DSH_WORKSPACE_DIR:-./workspace}:/workspace # проекты (= DSH_DEFAULT_WORKSPACE)
|
|
# Глобальные правила агента (опционально): раскомментировать и положить AGENTS.md
|
|
# рядом с compose-файлом:
|
|
# - ./AGENTS.md:/data/dsh/AGENTS.md:ro
|
|
networks: [dshnet]
|
|
healthcheck:
|
|
test: ["CMD", "curl", "--fail", "--silent", "--noproxy", "*", "http://127.0.0.1:3080/_dsh_gateway/health"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
start_period: 60s
|
|
retries: 3
|
|
|
|
# Вложенный docker-демон: контейнеры, которые запускает агент dsh.
|
|
dind:
|
|
image: docker:29-dind
|
|
container_name: ${DSH_DIND_NAME:-dsh-dind}
|
|
restart: unless-stopped
|
|
privileged: true
|
|
environment:
|
|
DOCKER_TLS_CERTDIR: "" # plain tcp://2375 — только внутри сети dshnet
|
|
command:
|
|
- --host=tcp://0.0.0.0:2375
|
|
- --default-address-pool=base=10.200.0.0/16,size=24
|
|
volumes:
|
|
- ${DSH_DATA_DIR:-./data}/dind:/var/lib/docker # образы/тома песочниц — персистентны
|
|
- ${DSH_WORKSPACE_DIR:-./workspace}:/workspace # ТЕ ЖЕ проекты под ТЕМ ЖЕ путём:
|
|
# агент монтирует /workspace/... в песочницы
|
|
networks: [dshnet]
|
|
|
|
# Разовый помощник: чинит владельца каталогов данных под uid 1000 (контейнерный node).
|
|
# Запуск: docker compose -p dsh --profile fix-perms run --rm fixperms
|
|
fixperms:
|
|
image: alpine:3.20
|
|
profiles: ["fix-perms"]
|
|
user: "0:0"
|
|
entrypoint: ["sh", "-c"]
|
|
command:
|
|
- |
|
|
echo "Fixing ownership of data dirs to uid 1000 (container user 'node')...";
|
|
chown -R 1000:1000 /fix/home /fix/dsh /fix/platform /fix/workspace /fix/dind 2>/dev/null || true;
|
|
chgrp -R 1000 /fix/home /fix/dsh /fix/platform /fix/workspace /fix/dind 2>/dev/null || true;
|
|
echo "Done."
|
|
volumes:
|
|
- ${DSH_DATA_DIR:-./data}/home:/fix/home
|
|
- ${DSH_DATA_DIR:-./data}/dsh:/fix/dsh
|
|
- ${DSH_DATA_DIR:-./data}/platform:/fix/platform
|
|
- ${DSH_DATA_DIR:-./data}/dind:/fix/dind
|
|
- ${DSH_WORKSPACE_DIR:-./workspace}:/fix/workspace
|
|
|
|
networks:
|
|
dshnet:
|
|
driver: bridge
|