DeepSeek Harness на Linux и сервере

На своём компьютере с Linux DSH ставится так же, как везде: Node.js и одна команда. Интереснее сервер: агент работает на VPS рядом с репозиторием, а интерфейс вы открываете у себя через SSH-туннель. Ниже оба варианта, плюс режим headless для задач по cron.

Шаг 1. Node.js

Node.js из репозиториев дистрибутива часто отстаёт, а DSH нужна свежая версия: в репозитории проекта заявлен node ^22.19.0 || >=24.0.0. Самый безболезненный способ — менеджер версий nvm: работает на любом дистрибутиве, не просит root и не дерётся с системными пакетами. Скрипт установки берите из README nvm, он меняется от версии к версии, поэтому сюда я его не копирую. Затем:

nvm install --lts
nvm use --lts
node -v

Для Debian и Ubuntu есть ещё репозитории NodeSource с системным пакетом nodejs. На сервере, где Node.js нужен всем пользователям, а не одному, они удобнее nvm.

Шаг 2. Запуск на своём компьютере

Перейдите в папку проекта (она станет рабочей папкой агента) и выполните:

bash · npx $ npx @deepseek-ai/dsh web

При первом запуске npx предложит скачать пакет, ответьте y. В терминале появится строка dsh web: с адресом http://127.0.0.1:3080/… (в нём одноразовый токен), и откроется браузер по умолчанию. Дальше в интерфейсе: Settings → Models → ключ DeepSeek API, потом Choose workspace → папка проекта, потом первая задача. Подробнее в быстром старте.

npx @deepseek-ai/dsh web --port 8080    # другой порт
npx @deepseek-ai/dsh web --no-open      # не открывать браузер

Команды агент выполняет через bash в песочнице. Режим по умолчанию workspace-write: писать можно только в рабочую папку и временные каталоги. На Linux песочница строится на bwrap или Landlock. bwrap вдобавок прячет от команд процессы хоста, Landlock этого не делает. Сеть не ограничивает ни тот ни другой.

Шаг 3. Запуск на сервере по SSH

Сервер DSH слушает только 127.0.0.1, и открыть его наружу через --host 0.0.0.0 нельзя: CLI отвергает этот флаг намеренно. Логика понятная: у сервера нет ни TLS, ни авторизации по паролю, а агент выполняет команды, так что выставлять его в интернет было бы плохой идеей. Поэтому с DSH на VPS работают через SSH-туннель: порт сервера пробрасывается на ваш компьютер, и для браузера всё выглядит как локальный запуск.

  1. Подключитесь с пробросом порта На своём компьютере:
    ssh -L 3080:127.0.0.1:3080 user@ваш-сервер
    Флаг -L связывает локальный порт 3080 с портом 3080 на сервере (с точки зрения сервера — его же loopback).
  2. Запустите DSH на сервере В SSH-сессии перейдите в папку проекта и выполните:
    npx @deepseek-ai/dsh web --no-open
    По SSH DSH и сам не полезет открывать браузер: он видит переменные SSH_CONNECTION/SSH_TTY и только печатает адрес. --no-open здесь скорее для порядка.
  3. Откройте напечатанный адрес у себя Скопируйте строку dsh web: целиком, вместе с токеном, в браузер на своём компьютере. Адрес http://127.0.0.1:3080/… через туннель уйдёт на сервер. Рабочую папку (Choose workspace) выбираете на сервере: агент видит файлы той машины, где запущен, а не вашей.
  4. Не дайте процессу умереть вместе с сессией Закроете SSH, и DSH остановится вместе с ним. Запускайте его внутри tmux или screen: сервер переживёт разрыв соединения, а туннель вы поднимете заново той же командой ssh -L.

Ключ модели, введённый через интерфейс, сохраняется на сервере в $DSH_HOME/.credentials.yaml (по умолчанию ~/.dsh/). Если сервер ходит в интернет через прокси, задайте HTTPS_PROXY в окружении или в $DSH_HOME/.env, DSH прочитает их при запуске (см. руководство, англ.).

Режим headless: задачи без интерфейса

Для скриптов и расписаний есть профиль headless. DSH создаёт одну сессию, выполняет задачу из аргумента, печатает итоговый ответ в stdout и завершается. Порт не слушает, браузер не нужен. Рассуждения модели, если они есть, уходят в stderr. Код выхода 0 значит, что задача завершена, 1 — что нет.

npx @deepseek-ai/dsh --profile headless "прогони тесты и опиши, что упало"

Рабочая папка та, из которой запущена команда. Ключ берётся из того же $DSH_HOME/.credentials.yaml, что и у веб-профиля, так что достаточно один раз ввести его в интерфейсе. Пример строки cron с ежедневным отчётом по репозиторию в 9:00. Путь к npx обязательно полный: у cron короткий PATH, и на этом легко споткнуться:

0 9 * * * cd /srv/project && /home/user/.nvm/versions/node/v22.19.0/bin/npx @deepseek-ai/dsh --profile headless "кратко опиши изменения за сутки по git log" >> /var/log/dsh-daily.log 2>&1

Свой путь к npx покажет команда which npx. И помните, что каждый такой запуск тратит токены: если задача крутится каждый день, поглядывайте на баланс у провайдера.

Какой сервер брать

Сам DSH к серверу нетребователен: тяжёлые вычисления идут у провайдера модели. Нагрузку создаёт ваш проект, то есть сборка, тесты и линтеры, которые агент будет запускать. Для типичного репозитория хватает 2 ГБ памяти и пары ядер. Если агент будет гонять тяжёлые сборки, берите больше. Свои серверы я держу на timeweb.cloud, тариф с 2 ГБ памяти там от 882 ₽/мес. Ссылка партнёрская: если зарегистрируетесь по ней, я получу отчисление, на цену для вас это не влияет. Сравнение хостеров и калькулятор на странице серверы.

Дальше