# ════════════════════════════════════════════════════════════════════════════ # 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/archeon/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