SSD Nodes Learn 🎉 VPS vanaf $5.50/mnd
Gidsen Matt ConnorDoor Matt Connor

DeepSeek Harness veilig installeren op een Linux VPS

Installeer de DeepSeek Harness op uw eigen VPS met een vaste npm-versie. Beveilig de web-UI op poort 3080 via een SSH-tunnel om ongeautoriseerde toegang tot uw server te voorkomen.

Wat de DeepSeek Harness is

De DeepSeek Harness (dsh) is een Node.js-agent-runtime die u op een VPS (virtual private server) kunt draaien. De veilige manier om deze te gebruiken is door deze te binden aan 127.0.0.1, waarbij u de interface benadert via een SSH (secure shell)-tunnel. De software biedt een web-UI (user interface) op poort 3080 in plaats van in een terminal te draaien. Deze webserver vraagt zelf niet om een wachtwoord; een opengezet poort 3080 geeft iedereen die de server vindt toegang tot een agent die uw bestanden leest en commando's uitvoert als uw Linux-gebruiker.

DeepSeek bracht de software op 13 augustus 2026 uit onder de MIT-licentie als het npm-pakket @deepseek-ai/dsh. Het project omschrijft zichzelf als een developer preview en geeft aan dat er wijzigingen te verwachten zijn die de compatibiliteit verbreken. Elk versienummer hieronder is een momentopname van augustus 2026; controleer daarom de repository voordat u deze op een belangrijke server installeert.

Eén concept vormt de kern van het ontwerp: alles is een plugin. De modeladapter, het toolregister, het sessielogboek, de sandbox, de scheduler en de agent-loop zelf zijn plugins die in één gedeelde context worden geladen. Elk van deze onderdelen kan worden vervangen. Er is geen bevoorrechte kern die enkel door plugins wordt uitgebreid. Dat maakt de harness het proberen waard, maar daar schuilt ook het enige werkelijke risico.

Een harness is geen model

De harness voert de agent-loop uit. Het redeneren vindt elders in een model plaats, dus niets werkt totdat u een API (application programming interface) key of het adres van een door u zelf gehost model-endpoint opgeeft.

Dit configureert u in de UI onder Settings en vervolgens Models. De catalogus bevat kant-en-klare kaarten voor de grote API-providers (DeepSeek, OpenAI, Anthropic) waar u een key in plakt. "Add a custom provider" is de interessante optie: deze vraagt om een provider ID, een weergavenaam, een base URL, een API-protocol en een inloggegeven. De optie spreekt het OpenAI-compatibele protocol, waardoor elke gateway of lokale server die dit protocol implementeert, werkt. Custom providers kunnen ook het OpenAI-compatibele GET /models-endpoint bevragen om de modellijst voor u in te vullen.

Op die manier koppelt u de harness aan een model op dezelfde VPS. Ollama stelt een OpenAI-compatibele API beschikbaar op http://127.0.0.1:11434/v1/, en vereist dat het API key-veld wordt ingevuld met een willekeurige string, volgens afspraak ollama, omdat het veld verplicht is maar vervolgens wordt genegeerd. Of een model dat klein genoeg is voor uw VPS krachtig genoeg is om een agent aan te sturen, is de lastigere vraag, en het verschil tussen Ollama en vLLM als lokale modelserver bepaalt hoeveel van uw RAM dit antwoord kost.

Keys die in de UI worden ingevoerd, zijn write-only. De harness slaat deze op in $DSH_HOME/.credentials.yaml en bewaart alleen een referentie naar het inloggegeven in settings.yaml. $DSH_HOME gebruikt standaard ~/.dsh. Behandel dat bestand als een wachtwoordbestand, want dat is het ook: iedereen die het kan lezen, kan uw API-budget verbruiken.

Vereisten voor de installatie

  • een VPS met Ubuntu 24.04 of een andere actuele Linux-distributie, met SSH-toegang
  • Node.js 22.19 of nieuwer in de 22.x-reeks, of Node.js 24 en hoger, waar het project op gebouwd en getest wordt
  • een normaal gebruikersaccount, niet root, omdat de agent shell-commando's uitvoert als de gebruiker die het proces heeft gestart
  • pnpm in de PATH als u van plan bent plugins te installeren, aangezien het plugin-commando dit aanroept via de shell
  • poort 3080 gesloten op uw firewall en op de afzonderlijke netwerkfirewall van uw provider

Het eigen nodejs-pakket van Ubuntu is ouder dan wat de harness vereist, dus installeer Node via NodeSource of nvm in plaats van apt install nodejs te gebruiken. Als de VPS vers is, is het beveiligen van SSH voordat u iets anders doet tien minuten werk, omdat de tunnel waar u op gaat vertrouwen slechts zo veilig is als de SSH-server erachter.

De DeepSeek Harness installeren op een VPS, vastgezet op één versie

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

npx downloadt het pakket en voert het dsh-binary uit. web is een alias voor --profile web, die de browserapplicatie opstart; het proces toont vervolgens het adres waarop het luistert. De standaardwaarde is http://127.0.0.1:3080.

Zet de versie vast. npx @deepseek-ai/dsh web herleidt naar wat de latest-tag op het moment van uitvoering aanwijst. Het project heeft al diverse release candidates uitgebracht en geeft aan dat er ingrijpende wijzigingen aankomen. 0.1.0-rc.6 is waarnaar latest op 13 augustus 2026 verwees. Een vastgezette versie betekent dat de server die u vandaag inricht, volgende maand hetzelfde gedrag vertoont. Een upgrade wordt daarmee een bewuste keuze in plaats van een onverwachte verrassing.

Installeer het voor dagelijks gebruik eenmalig, in plaats van bij elke start opnieuw te herleiden.

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

Die tweede regel is het uitvoeren waard, omdat de launcher en de webapplicatie verschillende sets vlaggen gebruiken. dsh --help toont de opties van de launcher zelf. dsh --profile web --help toont de vlaggen die de webapplicatie accepteert; hier bevinden zich --port, --host en de herhaalbare --trusted-host.

Controleer nu waarop het luistert.

ss -tlnp | grep 3080

De kolom voor het lokale adres moet 127.0.0.1:3080 aangeven. Als er 0.0.0.0:3080 staat, is de UI bereikbaar vanaf het internet. Stop het proces in dat geval direct voordat u verdere acties onderneemt.

Waarom u poort 3080 nooit mag openstellen

De webserver bevat geen authenticatielaag. De configuratie stelt een listen host en een listen port in, en dat is het volledige oppervlak. Toegangscontrole voor implementaties die niet via localhost verlopen, is een afzonderlijke trusted-host instelling; dit is geen inlogscherm.

Denk vervolgens aan wat er achter die poort schuilgaat. De agent bewerkt bestanden in de workspace en voert shell-commando's uit, terwijl uw provider-credentials op de schijf ernaast staan. Een open poort 3080 is dus in feite een remote shell met een chat-interface, die draait onder de gebruiker die het proces heeft gestart, inclusief uw API key. Hiervoor is geen exploit nodig. Men heeft enkel het poortnummer nodig, en scanners vinden poortnummers binnen enkele uren nadat een host online komt.

De CLI (command line interface) bevestigt dit. Sinds 0.1.0-rc.6 ondersteunt deze opzettelijk geen --host 0.0.0.0 en wordt het programma afgesloten met een gebruiks-foutmelding in plaats van op te starten. Deze weigering is een functionaliteit, dus zoek niet naar een patch die dit verwijdert.

Twee andere implementaties zijn redelijk wanneer een tunnel niet volstaat. Plaats de machine op een privaat overlay-netwerk zodat deze een adres krijgt waar alleen uw eigen apparaten naartoe kunnen routeren; dit is wat een zelfgehoste Headscale control server u biedt. Of plaats er een reverse proxy voor die het verzoek authenticeert voordat het poort 3080 bereikt, bijvoorbeeld een Authentik single sign-on server die forward auth uitvoert. Een reverse proxy zonder authenticatie ervoor is geen beveiligingsmaatregel. Het is slechts een langere URL.

Toegang tot de web-UI via een SSH-tunnel

Voer dit uit op uw laptop, niet op de server.

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

-L opent poort 3080 op uw laptop en stuurt al het verkeer dat hiermee verbindt door via de versleutelde SSH-sessie. Het 127.0.0.1:3080-gedeelte wordt op de server omgezet, waardoor de verbinding bij de harness aankomt vanaf loopback, precies alsof u achter de machine zelf zit. -N geeft aan dat er geen externe shell moet worden gestart, omdat u enkel de doorsturing wilt gebruiken.

Open vervolgens http://127.0.0.1:3080 in uw lokale browser. Als poort 3080 al in gebruik is op uw laptop, wijzig dan het linkergetal: ssh -N -L 3180:127.0.0.1:3080 you@your-server, en navigeer daarna naar http://127.0.0.1:3180. Het getal aan de linkerkant is lokaal en het getal aan de rechterkant hoort bij de server, dus alleen het linkergetal verandert.

Sla dit op in ~/.ssh/config zodat u het niet telkens hoeft in te typen.

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

Daarna start ssh -N dsh de tunnel. Als een browser meldt dat de verbinding is geweigerd, betekent dit meestal dat de tunnel actief is, maar dat er aan de andere kant niets luistert; SSH stuurt de poort namelijk door ongeacht of de harness draait. Controleer de server met het bovenstaande ss-commando.

De harness actief houden na het uitloggen

Een npx-commando wordt beëindigd zodra uw shell sluit. Een systemd-userservice blijft actief en herstelt de harness na een crash of een herstart.

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

enable-linger is van belang omdat userservices normaal gesproken stoppen wanneer uw laatste sessie eindigt; zonder deze instelling stopt de harness zodra u de tunnel sluit. Gebruik het absolute pad dat door command -v dsh wordt getoond en plaats dit in de unit, aangezien systemd niet zoekt in het PATH dat uw login-shell opbouwt.

[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 is niet louter cosmetisch. Het dsh-proces gebruikt de map van waaruit het wordt aangeroepen als standaardlocatie voor het bestandssysteem; een service die op de verkeerde plek wordt gestart, geeft de agent dus de verkeerde standaardwerkruimte. U kunt de werkruimte nog steeds selecteren in de UI.

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

Een unit die niet wil starten, heeft bijna altijd een onjuist ExecStart-pad of een Node-versie die door het binaire bestand wordt geweigerd; journalctl --user -u dsh -n 50 geeft aan welke dit is. Hetzelfde patroon is van toepassing op het actief houden van elke willekeurige coding agent op een VPS, en de foutmodi zijn identiek.

Wat een plugin mag doen

Een plugin is een module die services, getypeerde events en omkeerbare effecten toevoegt aan een gedeelde context. De extensiepunten zijn de onderdelen die nauwkeurige bestudering vereisen:

  • registreer een modelprovider op ctx.llm
  • voeg modelgerichte tools toe op ctx.tools
  • lever de shell-backend achter ctx.shell
  • lever bestandssysteemtoegang of beleid achter ctx.fs
  • registreer menselijke commando's op ctx.commands
  • voer achtergrondtaken uit via ctx.jobs
  • verpak gestarte processen met een ctx.sandbox-backend
  • onderschep verzoeken en tool-aanroepen via de agent/*- en tools/*-events
  • breid de duurzame sessiestatus uit
  • stuur de UI aan via ctx.agents

Lees deze lijst zoals een aanvaller dat zou doen. Een plugin kan de bestandssysteemlaag en de shell-laag leveren, en kan zich tussen elke tool-aanroep nestelen die het model doet. Er staat geen toestemmingsdialoogvenster tussen een plugin en deze koppelpunten, omdat een plugin gewone Node-code is die in hetzelfde proces wordt geladen als al het andere. Het installeren van een plugin staat gelijk aan het uitvoeren van code van een onbekende met de rechten van uw agent, en de rechten van uw agent zijn de rechten van uw Unix-gebruiker.

Dit is dezelfde vertrouwensbeslissing die u neemt bij het koppelen van een MCP server aan een agent op een VPS, waarbij MCP staat voor het model context protocol. Dit is ook de reden waarom het veilig draaien van een coding agent op een VPS begint bij het account waaronder deze draait in plaats van bij het model, en waarom npm supply chain attacks zo'n grote impact hebben op servers: de installatiestap is het moment van de inbreuk, en er verschijnt geen enkele waarschuwing.

Herkomst van plugins

Plugins bevinden zich in profielen. Een profiel is een benoemde samenstelling die wordt opgeslagen onder $DSH_HOME, met ~/.dsh als standaardlocatie. Elke profielmap bevat de out-of-tree plugins die erin worden geïnstalleerd. De CLI beheert deze door uw argumenten direct door te sturen naar pnpm, waarbij de profielmap als werkmap wordt gebruikt.

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

Omdat de argumenten ongewijzigd bij pnpm aankomen, gedragen add, remove, update en why zich zoals in elk pnpm-project. Een plugin kan een npm-pakket of een GitHub-referentie zijn. pnpm moet eerst aanwezig zijn in de PATH. Op Node 22 en later plaatst corepack enable pnpm deze daar.

Ontdekking verloopt via een GitHub-topic. Plugin-auteurs voegen het dsh-plugin-topic toe aan hun repository; door dit topic te doorzoeken, vindt u welke plugins er bestaan. Een topic is een label dat een auteur aan zijn eigen repository toekent. Niemand controleert of ondertekent dit, en de topic-pagina rangschikt op basis van sterren, wat populariteit meet in plaats van veiligheid.

Vier gewoonten houden dit beheerbaar. Lees de broncode voordat u installeert, aangezien de meeste plugins klein genoeg zijn om in tien minuten door te nemen. Pin de exacte versie of commit in plaats van een branch te volgen. Draai de harness onder een gebruiker die geen andere rechten heeft, op een VPS die u zonder problemen opnieuw zou opbouwen. Geef de agent een eigen API-sleutel met een eigen bestedingslimiet, gescheiden van de sleutel die uw productieservices gebruiken.

Als u liever ontwerpen vergelijkt voordat u zich vastlegt, beantwoordt de Omnigent multi-agent harness hetzelfde probleem met een andere structuur. De afwegingen worden duidelijk zodra er plugins in het spel zijn.

Wat gaat er als eerste kapot

Node is te oud. Het project vereist Node 22.19 en nieuwer in de 22.x-reeks, of Node 24 en hoger, en de CI test deze versies. Een oudere runtime faalt bij het opstarten omdat de code syntaxis en API's gebruikt die niet aanwezig zijn. Voer node --version uit voordat u iets anders doet.

Poort 3080 is al in gebruik. Een tweede harness, een verouderd proces of een niet-gerelateerde applicatie gebruikt ook poort 3080. Zoek dit proces met ss -tlnp | grep 3080 en stop het, of start de harness elders met dsh web --port 3180. --port hoort bij de web-app, dus deze komt na web.

De browser kan geen verbinding maken via de tunnel. Controleer of u naar 127.0.0.1 bent genavigeerd en niet naar het publieke adres van de server, aangezien de doorgestuurde poort alleen op uw laptop bestaat. Controleer vervolgens of de harness op de server luistert, aangezien SSH de forward opzet ongeacht of er aan de andere kant een antwoord komt.

dsh plugin faalt onmiddellijk. Het commando is een wrapper rond pnpm, dus een ontbrekend pnpm-binary stopt het proces voordat er enige plugin-activiteit plaatsvindt.

De agent kan uw project niet zien. De workspace is standaard de map waarin het proces is gestart, dus een unit waarvan de WorkingDirectory uw home-directory is, geeft de agent toegang tot uw home-directory. Kies de workspace in de UI, of corrigeer de unit en herlaad deze.

FAQ

Is het veilig om de DeepSeek Harness web-UI bloot te stellen op poort 3080?

Nee. De webserver heeft geen eigen inlogprocedure. De agent erachter bewerkt bestanden en voert shell-commando's uit als de gebruiker die het proces heeft gestart, terwijl uw API-sleutel van de provider op dezelfde schijf staat. Laat de listener op 127.0.0.1 staan en benader deze via een SSH-tunnel. Een privaat overlay-netwerk of een reverse proxy die elk verzoek authenticeert voordat het de poort bereikt, werkt ook. Sinds versie 0.1.0-rc.6 weigert de CLI --host 0.0.0.0 en sluit af met een gebruiks-foutmelding; dit geeft aan hoe de auteurs over dit idee denken.

Heb ik een DeepSeek API-sleutel nodig, of kan ik een lokaal model gebruiken?

Beide opties werken, omdat de harness een runtime is en geen model. Onder Settings en vervolgens Models kunt u een sleutel plakken in een kaart van een catalogusprovider, of kiezen voor "Add a custom provider" en een base URL opgeven die het OpenAI-compatibele protocol spreekt. Een lokale Ollama-server antwoordt op http://127.0.0.1:11434/v1/ en accepteert elke willekeurige tekenreeks in het veld voor de API-sleutel. Sleutels worden opgeslagen in $DSH_HOME/.credentials.yaml, wat standaard ~/.dsh/.credentials.yaml is.

Welke rechten krijgt een DeepSeek Harness-plugin precies?

De rechten van het account dat de harness uitvoert. Een plugin is Node-code die in hetzelfde proces wordt geladen, en de extensiepunten omvatten de shell-backend, de bestandssysteemlaag, het tool-register en de events die elke tool-aanroep omvatten. Niets isoleert een plugin van deze onderdelen, tenzij de plugin zelf een sandbox levert. Lees de broncode voordat u iets installeert en voer de harness uit als een gebruiker die geen toegang heeft tot gegevens die voor u van belang zijn.

Welke versie moet ik installeren en blijft deze werken?

Installeer een specifieke versie, bijvoorbeeld npx @deepseek-ai/dsh@0.1.0-rc.6 web. Dat is waar de latest-tag op 13 augustus 2026 naar verwees. Het project noemt zichzelf een developer preview en geeft aan dat er wijzigingen verwacht worden die de compatibiliteit verbreken. Een niet-gefixeerd commando kan daarom van de ene op de andere dag anders reageren. Controleer de repository voordat u een upgrade uitvoert en houd er rekening mee dat configuratiesleutels en plugin-interfaces kunnen wijzigen zolang de versie met 0 begint.

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