SSD Nodes Learn 🎉 VPS от $5.50/мес
Руководства Matt ConnorАвтор: Matt Connor

Установка DeepSeek Harness на VPS с доступом через SSH

Разверните DeepSeek Harness на Linux VPS с фиксацией версии npm. Узнайте, как ограничить доступ к порту 3080 через SSH-туннель и обезопасить выполнение плагинов агента.

Что такое DeepSeek Harness

DeepSeek Harness (dsh) — это среда выполнения агента на базе Node.js, которую можно запустить на VPS (виртуальном частном сервере). Безопасный способ работы с ней — привязка к 127.0.0.1 с доступом через SSH-туннель (secure shell) из вашего браузера. Она предоставляет веб-интерфейс (UI) на порту 3080 вместо работы в терминале. Этот веб-сервер не запрашивает пароль, поэтому открытый порт 3080 предоставляет любому, кто его обнаружит, доступ к агенту, который может читать ваши файлы и выполнять команды от имени вашего пользователя Linux.

Компания DeepSeek выпустила его 13 августа 2026 года под лицензией MIT в виде npm-пакета @deepseek-ai/dsh. Проект позиционируется как предварительная версия для разработчиков (developer preview), в которой ожидаются изменения, нарушающие обратную совместимость. Все номера версий, указанные ниже, актуальны на август 2026 года, поэтому проверяйте репозиторий перед тем, как копировать что-либо на важный сервер.

В основе архитектуры лежит одна идея: всё является плагином. Адаптер модели, реестр инструментов, журнал сессий, песочница, планировщик и сам цикл работы агента — это плагины, загружаемые в один общий контекст, и любой из них можно заменить. Не существует привилегированного ядра, которое лишь дополняется плагинами. Именно это делает Harness интересным для тестирования, но здесь же кроется и единственный реальный риск.

Harness — это не модель

Harness запускает цикл агента. Рассуждения происходят в модели, расположенной в другом месте, поэтому ничего не заработает, пока вы не предоставите API (application programming interface) ключ или адрес эндпоинта модели, которую вы хостите самостоятельно.

Настройка выполняется в интерфейсе в разделе Settings, а затем Models. В каталоге есть готовые карточки для крупных API-провайдеров (DeepSeek, OpenAI, Anthropic), куда нужно вставить ключ. Опция "Add a custom provider" представляет наибольший интерес: она требует ID провайдера, отображаемое имя, базовый URL, протокол API и учетные данные. Она использует протокол, совместимый с OpenAI, поэтому работает с любым шлюзом или локальным сервером, реализующим этот протокол. Пользовательские провайдеры также могут запрашивать эндпоинт GET /models, совместимый с OpenAI, чтобы автоматически заполнить список моделей.

Именно так можно направить harness на модель, работающую на том же VPS. Ollama предоставляет API, совместимый с OpenAI, по адресу http://127.0.0.1:11434/v1/. В поле API key необходимо ввести любую строку, по соглашению ollama, так как поле является обязательным, но игнорируется. Вопрос о том, достаточно ли хороша модель, которая помещается на ваш VPS, для управления агентом, является более сложным, а разница между Ollama и vLLM как локальными серверами моделей определяет, сколько оперативной памяти потребуется для работы.

Ключи, введенные в интерфейсе, доступны только для записи. Harness сохраняет их в $DSH_HOME/.credentials.yaml, а в settings.yaml оставляет только ссылку на учетные данные. $DSH_HOME по умолчанию имеет значение ~/.dsh. Относитесь к этому файлу как к файлу с паролями, потому что это он и есть: любой, кто прочитает его, сможет потратить ваш бюджет на API.

Что необходимо перед установкой

  • VPS под управлением Ubuntu 24.04 или другого актуального дистрибутива Linux с доступом по SSH.
  • Node.js версии 22.19 или новее в ветке 22.x, либо Node.js 24 и выше, так как именно на этих версиях проект собирается и тестируется.
  • Обычная учетная запись пользователя, а не root, поскольку агент выполняет shell-команды от имени того пользователя, который запустил процесс.
  • pnpm в переменной PATH, если вы планируете устанавливать плагины, так как команда плагина вызывает его через shell.
  • Порт 3080, закрытый на вашем межсетевом экране и на отдельном сетевом фаерволе вашего провайдера.

Системный пакет nodejs в Ubuntu старее, чем требуется для работы harness, поэтому устанавливайте Node через NodeSource или nvm, а не через apt install nodejs. Если VPS чистый, укрепление безопасности SSH перед любыми другими действиями стоит потраченных десяти минут, так как надежность туннеля, от которого вы будете зависеть, ограничена безопасностью SSH-сервера, на котором он работает.

Установка DeepSeek Harness на VPS с фиксацией версии

node --version
npx @deepseek-ai/dsh@0.1.0-rc.6 web

npx загружает пакет и запускает его бинарный файл dsh. web — это псевдоним для --profile web, который запускает браузерное приложение, после чего процесс выводит адрес, на котором он ожидает подключения. По умолчанию это http://127.0.0.1:3080.

Зафиксируйте версию. npx @deepseek-ai/dsh web разрешает тег latest в тот момент, когда вы запускаете команду, а проект уже выпустил несколько релиз-кандидатов и предупредил о грядущих критических изменениях. 0.1.0-rc.6 — это то, на что указывал latest 13 августа 2026 года. Фиксация версии гарантирует, что сервер, настроенный сегодня, будет вести себя так же в следующем месяце, поэтому обновление станет осознанным решением, а не случайным открытием.

Для ежедневного использования установите приложение один раз, вместо того чтобы выполнять разрешение зависимостей при каждом запуске.

npm install -g @deepseek-ai/dsh@0.1.0-rc.6
dsh --profile web --help

Вторую строку стоит выполнить, так как у лаунчера и веб-приложения разные наборы флагов. dsh --help показывает собственные параметры лаунчера. dsh --profile web --help показывает флаги, которые принимает веб-приложение; именно там находятся --port, --host и повторяемый --trusted-host.

Теперь проверьте, на каком адресе ожидаются подключения.

ss -tlnp | grep 3080

В столбце локального адреса должно быть указано 127.0.0.1:3080. Если там указано 0.0.0.0:3080, значит, интерфейс доступен из Интернета, и вам следует остановить процесс, прежде чем предпринимать какие-либо дальнейшие действия.

Почему нельзя открывать порт 3080

У веб-сервера отсутствует уровень аутентификации. Его конфигурация определяет только хост и порт для прослушивания, и это вся поверхность атаки. Контроль доступа для развертываний вне loopback — это отдельная настройка доверенных хостов, а не экран входа в систему.

Теперь учтите, что находится за этим портом. Агент редактирует файлы в рабочей директории и выполняет shell-команды, а ваши учетные данные провайдера хранятся на диске рядом с ним. Таким образом, открытый порт 3080 — это удаленная командная оболочка с интерфейсом чата, работающая от имени пользователя, который её запустил, с привязанным API-ключом. Для доступа к ней не нужны эксплойты. Достаточно знать номер порта, а сканеры находят открытые порты через несколько часов после появления хоста в сети.

CLI (интерфейс командной строки) придерживается этой же политики. Начиная с 0.1.0-rc.6, он намеренно не поддерживает --host 0.0.0.0 и завершает работу с ошибкой использования вместо запуска. Этот отказ — намеренная функция, поэтому не ищите патчи, которые её удаляют.

Существуют два других разумных варианта развертывания, если туннели вам не подходят. Поместите сервер в частную оверлейную сеть, чтобы он получил адрес, доступный только для ваших устройств, что обеспечивает собственный сервер управления Headscale. Либо установите перед ним reverse proxy, который будет аутентифицировать запрос до того, как он достигнет порта 3080, например, используя сервер единого входа Authentik с функцией forward auth. Reverse proxy без аутентификации перед ним не является средством защиты. Это просто более длинный URL.

Доступ к веб-интерфейсу через SSH-туннель

Выполните эту команду на своем ноутбуке, а не на сервере.

ssh -N -L 3080:127.0.0.1:3080 you@your-server

-L открывает порт 3080 на вашем ноутбуке и перенаправляет все соединения через зашифрованную SSH-сессию. Адрес 127.0.0.1:3080 разрешается на стороне сервера, поэтому соединение поступает в harness с локального интерфейса (loopback), точно так же, как если бы вы работали непосредственно за этой машиной. Флаг -N указывает не запускать удаленную оболочку, так как вам требуется только перенаправление портов.

Затем откройте http://127.0.0.1:3080 в локальном браузере. Если порт 3080 на вашем ноутбуке уже занят, измените число слева: ssh -N -L 3180:127.0.0.1:3080 you@your-server, а затем перейдите по адресу http://127.0.0.1:3180. Число слева относится к локальной машине, а число справа — к серверу, поэтому меняется только левое значение.

Сохраните команду в ~/.ssh/config, чтобы не вводить её каждый раз.

Host dsh
  HostName 203.0.113.10
  User deploy
  IdentityFile ~/.ssh/id_ed25519
  LocalForward 3080 127.0.0.1:3080

После этого ssh -N dsh запустит туннель. Если браузер сообщает об отказе в соединении, это обычно означает, что туннель активен, но на удаленной стороне ничего не запущено, так как SSH перенаправляет порт независимо от того, работает ли harness. Проверьте состояние сервера с помощью команды ss, приведенной выше.

Поддержание работы harness после выхода из системы

Команда npx завершается вместе с вашей оболочкой. Пользовательский сервис systemd продолжает работать, а также автоматически перезапускает harness после сбоя или перезагрузки.

loginctl enable-linger $USER
mkdir -p ~/.config/systemd/user
command -v dsh

Параметр enable-linger важен, так как пользовательские сервисы обычно останавливаются при завершении последнего сеанса. Без него harness завершится в момент закрытия туннеля. Используйте абсолютный путь, выведенный командой command -v dsh, и укажите его в юните, поскольку systemd не выполняет поиск по переменной PATH, которую формирует ваша оболочка входа.

[Unit]
Description=DeepSeek Harness web UI
After=network-online.target

[Service]
Type=simple
WorkingDirectory=%h/projects/site
ExecStart=/usr/local/bin/dsh web
Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target

Параметр WorkingDirectory не является декоративным. Процесс dsh использует директорию, из которой он был вызван, в качестве расположения файловой системы по умолчанию. Если сервис запущен не в той директории, агент получит неверную рабочую область по умолчанию. Вы по-прежнему сможете выбрать рабочую область в интерфейсе.

systemctl --user daemon-reload
systemctl --user enable --now dsh
systemctl --user status dsh

Если юнит отказывается запускаться, причиной почти всегда является неверный путь ExecStart или версия Node, которую отклоняет бинарный файл. Команда journalctl --user -u dsh -n 50 указывает, в чем именно заключается проблема. Тот же шаблон применим для поддержания любого агента разработки в активном состоянии на VPS, и типы ошибок в этих случаях идентичны.

Что разрешено делать плагину

Плагин — это модуль, который предоставляет сервисы, типизированные события и обратимые эффекты в общий контекст. Точки расширения требуют внимательного изучения:

  • регистрация провайдера модели через ctx.llm
  • добавление инструментов для модели через ctx.tools
  • предоставление shell-бэкенда через ctx.shell
  • предоставление доступа к файловой системе или политик через ctx.fs
  • регистрация команд для пользователя через ctx.commands
  • выполнение фоновых задач через ctx.jobs
  • обертывание запущенных процессов с помощью бэкенда ctx.sandbox
  • перехват запросов и вызовов инструментов через события agent/* и tools/*
  • расширение состояния постоянной сессии
  • управление интерфейсом через ctx.agents

Прочитайте этот список глазами злоумышленника. Плагин может предоставлять уровень файловой системы и уровень shell, а также находиться в центре любого вызова инструмента, который делает модель. Между плагином и этими точками интеграции нет никаких диалоговых окон с запросом разрешений, так как плагин — это обычный код Node, загружаемый в тот же процесс, что и всё остальное. Установка плагина означает запуск чужого кода с правами вашего агента, а права агента — это права вашего Unix-пользователя.

Это то же самое решение о доверии, которое вы принимаете при подключении MCP server к агенту на VPS, где MCP — это протокол контекста модели (Model Context Protocol). Именно поэтому безопасный запуск агента для программирования на VPS начинается с настройки учетной записи, под которой он работает, а не с самой модели, и именно поэтому атаки на цепочку поставок npm так опасны для серверов: этап установки является моментом компрометации, и никаких предупреждений при этом не выводится.

Откуда берутся плагины

Плагины находятся в профилях. Профиль — это именованная конфигурация, хранящаяся в $DSH_HOME (по умолчанию ~/.dsh). В директории каждого профиля содержатся внешние плагины, которые он устанавливает. CLI управляет ими, передавая ваши аргументы напрямую в pnpm, используя директорию профиля в качестве рабочей.

dsh plugin --profile web add github:deepseek-harness/turtle-ui
dsh plugin --profile web remove turtle-ui

Поскольку аргументы передаются в pnpm без изменений, add, remove, update и why работают так же, как в любом проекте pnpm, а плагином может быть npm-пакет или ссылка на GitHub. pnpm должен присутствовать в PATH. В Node 22 и более поздних версиях corepack enable pnpm добавляет его туда автоматически.

Обнаружение плагинов происходит через тематические метки (topics) на GitHub. Авторы плагинов добавляют метку dsh-plugin в свой репозиторий, и просмотр этой метки позволяет найти доступные решения. Тематическая метка — это ярлык, который автор присваивает своему репозиторию самостоятельно. Никто не проверяет и не подписывает эти репозитории, а страница с меткой сортирует их по количеству звезд, что отражает популярность, а не безопасность.

Четыре правила помогут сохранить контроль над ситуацией. Изучите исходный код перед установкой: большинство плагинов достаточно малы, чтобы прочитать их за 10 минут. Фиксируйте конкретную версию или коммит вместо отслеживания ветки. Запускайте среду выполнения под пользователем, у которого нет прав доступа к другим данным, на VPS, который вы готовы переустановить с нуля. Выделите агенту собственный API-ключ с лимитом расходов, отдельный от ключа, который используют ваши продуктовые сервисы.

Если вы хотите сравнить архитектуры перед выбором, мультиагентная среда Omnigent решает ту же задачу с другой структурой, и компромиссы становятся очевидны, как только в дело вступают плагины.

Что ломается в первую очередь

Версия Node слишком старая. Проект ориентирован на Node 22.19 и более новые версии в ветке 22.x, либо на Node 24 и выше; именно в этих средах проходят CI-тесты. Устаревшая среда выполнения завершается с ошибкой при запуске, так как код использует синтаксис и API, которые в ней отсутствуют. Прежде всего выполните node --version.

Порт 3080 уже занят. Его может использовать второй экземпляр harness, зависший процесс или другое приложение, работающее на этом же порту. Найдите процесс с помощью ss -tlnp | grep 3080, затем остановите его или запустите harness в другом месте с помощью dsh web --port 3180. --port относится к веб-приложению, поэтому его следует запускать после web.

Браузер не может подключиться через туннель. Убедитесь, что вы перешли по адресу 127.0.0.1, а не по публичному IP-адресу сервера, так как проброшенный порт существует только на вашем локальном компьютере. Затем проверьте, что harness действительно слушает порт на сервере, поскольку SSH устанавливает перенаправление независимо от того, отвечает ли что-либо на удаленной стороне.

dsh plugin завершается с ошибкой сразу после запуска. Эта команда является оберткой для pnpm, поэтому отсутствие бинарного файла pnpm останавливает выполнение до начала работы любых плагинов.

Агент не видит ваш проект. Рабочей директорией по умолчанию становится та, из которой был запущен процесс. Если в юните параметр WorkingDirectory указывает на вашу домашнюю директорию, агент получит доступ именно к ней. Выберите рабочую область в интерфейсе или исправьте юнит и перезагрузите его.

FAQ

Безопасно ли открывать веб-интерфейс DeepSeek Harness на порту 3080?

Нет. У веб-сервера нет собственной системы авторизации, а агент, работающий в фоновом режиме, редактирует файлы и выполняет shell-команды от имени пользователя, запустившего процесс. При этом API-ключ вашего провайдера хранится на том же диске. Оставьте слушающий порт на 127.0.0.1 и подключайтесь через SSH-туннель. Также подойдут частная оверлейная сеть или reverse proxy, который аутентифицирует каждый запрос до того, как он достигнет порта. Начиная с версии 0.1.0-rc.6, CLI отклоняет --host 0.0.0.0 и завершает работу с ошибкой использования, что наглядно демонстрирует отношение авторов к этой идее.

Нужен ли мне API-ключ DeepSeek или можно использовать локальную модель?

Подходит любой вариант, так как harness — это среда выполнения, а не модель. В разделе Settings, а затем Models, вы можете вставить ключ в карточку провайдера из каталога или выбрать "Add a custom provider" и указать базовый URL, поддерживающий протокол, совместимый с OpenAI. Локальный сервер Ollama отвечает по адресу http://127.0.0.1:11434/v1/ и принимает любую строку в поле API-ключа. Ключи сохраняются в $DSH_HOME/.credentials.yaml, путь по умолчанию — ~/.dsh/.credentials.yaml.

Какие права получает плагин при установке в DeepSeek Harness?

Те же, что и учетная запись, от имени которой запущен harness. Плагин — это Node-код, загружаемый в тот же процесс. Точки расширения включают shell-бэкенд, уровень файловой системы, реестр инструментов и события, обертывающие каждый вызов инструмента. Никакие механизмы не изолируют плагин от этих компонентов, если только сам плагин не предоставляет песочницу. Изучите исходный код перед установкой и запускайте harness от имени пользователя, у которого нет доступа к важным для вас данным.

Какую версию следует установить и будет ли она продолжать работать?

Устанавливайте конкретную версию, например npx @deepseek-ai/dsh@0.1.0-rc.6 web. Именно на нее указывал тег latest по состоянию на 13 августа 2026 года. Проект позиционируется как developer preview, поэтому ожидаются изменения, нарушающие обратную совместимость. Нефиксированная команда может вести себя по-разному изо дня в день. Проверяйте репозиторий перед обновлением и будьте готовы к тому, что ключи конфигурации и интерфейсы плагинов будут меняться, пока версия начинается с 0.

#deepseek#agent-harness#self-hosting#nodejs#plugins