Как безопасно запустить DeepSeek Harness на VPS
Узнайте, как развернуть DeepSeek Harness на Linux VPS с защитой через SSH-туннель. Мы разберем фиксацию версии npm, настройку порта 3080 и риски плагинов для вашей системы.
Что такое 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 года, поэтому проверяйте репозиторий перед копированием данных на важные серверы.
Одна идея проходит через всю архитектуру: всё является плагином. Адаптер модели, реестр инструментов, журнал сессии, sandbox, планировщик и сам цикл агента — это плагины, загружаемые в один общий контекст, и любой из них можно заменить. Привилегированного ядра, которое плагины лишь дополняют, нет. Именно поэтому harness стоит попробовать, но здесь же находится единственный реальный риск. Правильность такого компромисса зависит от того, с чем вы его сравниваете. В разделе сравнение с Claude Code и Omnigent архитектура, в которой всё является плагином, сопоставляется с двумя другими вариантами по связанности с моделью, лицензии и объёму ресурсов VPS, который требуется каждому из них.
Harness — это не модель
Harness запускает цикл агента. Рассуждения происходят в модели, расположенной в другом месте, поэтому ничего не заработает, пока вы не предоставите API (application programming interface) ключ или адрес эндпоинта модели, которую вы хостите самостоятельно. Всё, что описано в этой статье, относится к настройке harness, а не к поведению модели, и границу между ними стоит прояснить до того, как вы потратите вторую половину дня на отладку того, с какой стороны возникла проблема.
Вы настраиваете это в UI в разделе 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 как локальными серверами моделей определяет, сколько оперативной памяти будет стоить ответ на него.
Ключи, введенные в UI, доступны только для записи. Harness хранит их в $DSH_HOME/.credentials.yaml и сохраняет только ссылку на учетные данные в settings.yaml. $DSH_HOME по умолчанию имеет значение ~/.dsh. Относитесь к этому файлу как к файлу паролей, потому что это он и есть: любой, кто прочитает его, сможет потратить ваш бюджет на API. Если вы хотите редактировать эти файлы напрямую, а не через меню Settings, пошаговое руководство по конфигурационным файлам dsh, ключам и эндпоинтам моделей показывает, за что отвечает каждый ключ и что покидает ваш сервер в каждом режиме.
Предварительные требования для установки
- 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 webnpx загружает пакет и запускает его бинарный файл dsh. web — это псевдоним для --profile web, который запускает браузерное приложение, после чего процесс выводит адрес, на котором он ожидает подключения. По умолчанию используется http://127.0.0.1:3080. Эти цифры определяют привязку к интерфейсу, а не просто являются формальностью. В разделе почему dsh выводит адрес loopback описано, на какие запросы будет и не будет отвечать harness, прежде чем вы попытаетесь подключиться к нему со своего ноутбука.
Зафиксируйте версию. npx @deepseek-ai/dsh web разрешает тег latest в тот момент, когда вы запускаете команду. Проект уже выпустил несколько релиз-кандидатов, и разработчики предупреждают о возможных критических изменениях. 0.1.0-rc.6 — это то, на что указывал latest 13 августа 2026 года. Фиксация версии гарантирует, что сервер, настроенный сегодня, будет вести себя так же и в следующем месяце. Таким образом, обновление становится осознанным решением, а не случайным событием. Если при использовании зафиксированной команды запускается не та сборка или установка завершается ошибкой, в разделе типичные ошибки установки и версий dsh описаны способы очистки кэша npx и проверки того, какой npm использует ваш Node.
Для ежедневного использования установите пакет один раз, вместо того чтобы разрешать зависимости при каждом запуске.
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
У веб-сервера отсутствует уровень аутентификации. Его конфигурация определяет только хост и порт для прослушивания, и это вся поверхность атаки. Контроль доступа для развертываний вне localhost — это отдельная настройка доверенных хостов, которая не является экраном входа в систему.
Теперь учтите, что находится за этим портом. Агент редактирует файлы в рабочей директории и выполняет 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 после сбоя или перезагрузки. Представленный здесь юнит намеренно упрощен; если вы хотите, чтобы harness работал под собственной учетной записью с ограниченными правами, с зафиксированной версией внутри юнита и логами, которые удобно искать, в настройке headless systemd для dsh это описано полностью.
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
Прочитайте этот список так, как его прочитал бы злоумышленник. Плагин может предоставлять уровень файловой системы и уровень оболочки, а также находиться в центре любого вызова инструмента, который делает модель. Между плагином и этими точками интеграции нет диалоговых окон с запросом разрешений, так как плагин — это обычный код Node, загружаемый в тот же процесс, что и всё остальное. Установка плагина означает запуск чужого кода с правами вашего агента, а права вашего агента — это права вашего пользователя Unix.
Это то же самое решение о доверии, которое вы принимаете при подключении MCP-сервера к агенту на 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 к своему репозиторию, и просмотр этой метки позволяет найти доступные решения. Тематическая метка — это ярлык, который автор присваивает своему репозиторию самостоятельно. Никто не проверяет и не подписывает эти репозитории, а страница с меткой сортирует их по количеству звезд, что отражает популярность, а не безопасность.
Четыре правила помогут сохранить контроль над ситуацией. Читайте исходный код перед установкой: большинство плагинов достаточно малы, чтобы изучить их за десять минут. Фиксируйте точную версию или коммит вместо отслеживания ветки. Запускайте среду выполнения от имени пользователя, у которого нет прав доступа к другим данным, на VPS, который вы готовы переустановить с нуля. Выдайте агенту отдельный API-ключ с собственным лимитом расходов, отличный от ключа, который используют ваши продуктовые сервисы. Если вы хотите изучить плагин и понять, какие файлы несут риски, пошаговое руководство по проверке плагинов dsh подробно описывает манифест, точку входа и точки расширения, которые регистрирует плагин.
Если вы хотите сначала сравнить варианты архитектуры, а уже потом выбрать один из них, многоагентный harness Omnigent решает ту же задачу по-другому. Разница между вариантами становится очевидной после подключения плагинов. Если вместо выбора одного варианта вы оставите два или три на одном сервере, размещение всех harness за одним self-hosted API избавит вас от необходимости создавать отдельный туннель для каждого порта. Но появится ещё один сервис, который нужно привязать к loopback и сразу защитить надёжным паролем.
Что ломается в первую очередь
Версия Node слишком старая. Проект рассчитан на Node 22.19 и новее в ветке 22.x, либо на Node 24 и выше; именно в этих средах проходят CI-тесты. Устаревшая среда выполнения завершается с ошибкой при запуске, так как код использует синтаксис и API, которые в ней отсутствуют. Выполните node --version перед любыми другими действиями.
Порт 3080 уже занят. Это может быть второй экземпляр harness, зависший процесс или другое приложение, использующее 3080. Найдите его с помощью 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-туннель. Также подойдут частная оверлейная сеть или обратный прокси-сервер, который проверяет подлинность каждого запроса перед тем, как он достигнет порта. Начиная с версии 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-backend, уровень файловой системы, реестр инструментов и события, оборачивающие каждый вызов инструмента. Никакие механизмы не изолируют плагин от этих компонентов, если только сам плагин не предоставляет изолированную среду (песочницу). Изучите исходный код перед установкой и запускайте harness от имени пользователя, который не имеет доступа к важным для вас данным.
Какую версию следует установить и будет ли она продолжать работать?
Устанавливайте конкретную версию, например npx @deepseek-ai/dsh@0.1.0-rc.6 web. Именно на неё указывал тег latest по состоянию на 13 августа 2026 года. Проект позиционируется как версия для разработчиков (developer preview), в которой ожидаются изменения, нарушающие обратную совместимость. Поэтому нефиксированная команда может вести себя по-разному в разные дни. Проверяйте репозиторий перед обновлением и будьте готовы к тому, что ключи конфигурации и интерфейсы плагинов будут меняться, пока версия начинается с 0.