Cara Menjalankan DeepSeek Harness Secara Privat di VPS
Instal DeepSeek Harness di VPS Linux, kunci versi npm, pahami kemampuan plugin, lalu akses UI web port 3080 secara aman melalui tunnel SSH tanpa membuka port publik.
Apa itu DeepSeek Harness
DeepSeek Harness (dsh) adalah runtime agen Node.js yang dapat dijalankan pada VPS (virtual private server). Cara yang aman untuk menjalankannya adalah dengan mengikatnya ke 127.0.0.1, lalu mengaksesnya dari browser melalui tunnel SSH (secure shell). Harness ini menyediakan UI web (user interface) pada port 3080, bukan berjalan di terminal. Server web tersebut tidak meminta kata sandi sendiri. Karena itu, port 3080 yang dipublikasikan dapat memberikan akses kepada siapa pun yang menemukannya untuk menggunakan agen yang dapat membaca file Anda dan menjalankan perintah sebagai pengguna Linux Anda.
DeepSeek merilisnya pada 13 August 2026 di bawah lisensi MIT sebagai paket npm @deepseek-ai/dsh. Proyek ini menyebut dirinya sebagai pratinjau untuk developer dan menyatakan bahwa perubahan yang memutus kompatibilitas dapat terjadi. Setiap nomor versi di bawah ini merupakan snapshot dari August 2026. Periksa repositori sebelum menyalin apa pun ke server yang penting.
Satu gagasan menjadi dasar seluruh desainnya: semuanya adalah plugin. Adapter model, registri tool, log sesi, sandbox, scheduler, dan loop agen itu sendiri merupakan plugin yang dimuat ke dalam satu konteks bersama. Semua komponen tersebut dapat diganti. Tidak ada core dengan hak istimewa yang hanya dihias oleh plugin. Inilah yang membuat harness ini layak dicoba. Namun, di sinilah juga terdapat satu risiko nyata.
Harness bukan model
Harness menjalankan loop agen. Penalaran berlangsung di dalam model di tempat lain. Karena itu, semuanya tidak akan berfungsi sampai Anda memberikan API (application programming interface) key atau alamat endpoint model yang Anda host sendiri.
Konfigurasikan ini di UI melalui Settings, lalu Models. Katalog tersebut menyediakan kartu siap pakai untuk penyedia API besar (DeepSeek, OpenAI, Anthropic) yang memungkinkan Anda menempelkan key. Opsi "Add a custom provider" lebih menarik. Opsi ini meminta provider ID, nama tampilan, base URL, protokol API, dan kredensial. Opsi ini menggunakan protokol yang kompatibel dengan OpenAI, sehingga gateway atau server lokal apa pun yang menerapkan protokol tersebut dapat digunakan. Custom provider juga dapat meminta endpoint OpenAI-compatible GET /models untuk mengisi daftar model secara otomatis.
Dengan cara ini, Anda dapat mengarahkan harness ke model pada VPS yang sama. Ollama menyediakan API yang kompatibel dengan OpenAI pada http://127.0.0.1:11434/v1/. Ollama mengharuskan kolom API key diisi dengan string apa pun, secara konvensional ollama, karena kolom tersebut wajib diisi lalu diabaikan. Pertanyaan yang lebih sulit adalah apakah model yang cukup kecil untuk dijalankan pada VPS Anda mampu menjalankan agen dengan baik. Perbedaan antara Ollama dan vLLM sebagai server model lokal menentukan seberapa besar RAM yang diperlukan.
Key yang dimasukkan melalui UI hanya dapat ditulis. Harness menyimpannya di $DSH_HOME/.credentials.yaml dan hanya menyimpan referensi kredensial di settings.yaml. $DSH_HOME secara default bernilai ~/.dsh. Perlakukan file tersebut sebagai file kata sandi karena memang demikian: siapa pun yang dapat membacanya dapat menggunakan anggaran API Anda.
Yang perlu disiapkan sebelum instalasi
- VPS yang menjalankan Ubuntu 24.04 atau Linux versi terbaru lainnya, dengan akses SSH
- Node.js 22.19 atau yang lebih baru dalam rangkaian 22.x, atau Node.js 24 dan yang lebih baru, karena itulah versi yang digunakan project untuk build dan pengujian
- akun pengguna biasa, bukan
root, karena agent menjalankan perintah shell sebagai pengguna yang memulai proses pnpmpada PATH jika Anda berencana menginstal plugin, karena perintah plugin menjalankan perintah tersebut melalui shell- port 3080 ditutup pada firewall Anda dan firewall jaringan terpisah milik provider
Paket nodejs bawaan Ubuntu lebih lama daripada yang dibutuhkan harness. Karena itu, instal Node dari NodeSource atau nvm, bukan menggunakan apt install nodejs. Jika VPS masih baru, lakukan hardening SSH terlebih dahulu selama sepuluh menit. Tunnel yang akan Anda andalkan hanya seaman server SSH di belakangnya.
Instal DeepSeek Harness pada VPS dengan satu versi yang dikunci
node --version
npx @deepseek-ai/dsh@0.1.0-rc.6 webnpx mengunduh paket dan menjalankan biner dsh. web adalah alias untuk --profile web, yang menjalankan aplikasi browser, lalu proses tersebut mencetak alamat tempatnya menerima koneksi. Nilai defaultnya adalah http://127.0.0.1:3080.
Kunci versinya. npx @deepseek-ai/dsh web akan menentukan tag yang ditunjuk latest pada saat perintah dijalankan, dan proyek ini telah merilis beberapa release candidate serta menyatakan bahwa perubahan yang tidak kompatibel akan datang. 0.1.0-rc.6 adalah nilai yang ditunjuk latest pada 13 August 2026. Versi yang dikunci berarti mesin yang Anda siapkan hari ini akan berperilaku sama bulan depan. Dengan demikian, upgrade menjadi keputusan yang Anda buat, bukan perubahan tidak sengaja yang baru Anda sadari.
Untuk penggunaan sehari-hari, instal sekali agar versi tidak ditentukan ulang setiap kali dijalankan.
npm install -g @deepseek-ai/dsh@0.1.0-rc.6
dsh --profile web --helpBaris kedua layak dijalankan karena launcher dan aplikasi web memiliki kumpulan flag yang terpisah. dsh --help menampilkan opsi milik launcher. dsh --profile web --help menampilkan flag yang diterima aplikasi web. Di situlah --port, --host, dan --trusted-host yang dapat diulang tersedia.
Sekarang, pastikan alamat tempat proses menerima koneksi.
ss -tlnp | grep 3080Kolom alamat lokal harus berisi 127.0.0.1:3080. Jika berisi 0.0.0.0:3080, UI dapat diakses dari Internet. Hentikan proses tersebut sebelum melakukan hal lain.
Mengapa port 3080 tidak boleh dipublikasikan
Web server ini tidak memiliki lapisan autentikasi. Konfigurasinya mengekspos host dan port untuk listening, dan hanya itu permukaannya. Kontrol akses untuk deployment non-loopback merupakan pengaturan trusted-host terpisah, bukan halaman login.
Sekarang perhatikan apa yang berada di balik port tersebut. Agent mengedit file di workspace dan menjalankan perintah shell, sedangkan kredensial provider Anda tersimpan di disk di dekatnya. Jadi, port 3080 yang terbuka merupakan remote shell dengan antarmuka chat, yang berjalan sebagai user yang memulainya dan memiliki API key Anda. Tidak diperlukan exploit untuk mengaksesnya. Penyerang hanya memerlukan nomor port, dan scanner menemukan nomor port dalam hitungan jam setelah host online.
CLI (command line interface) juga menerapkan hal ini. Sejak 0.1.0-rc.6, CLI sengaja tidak mendukung --host 0.0.0.0 dan keluar dengan usage error, bukan memulai layanan. Penolakan tersebut merupakan fitur. Karena itu, jangan mencari patch untuk menghapusnya.
Ada 2 deployment lain yang wajar ketika tunnel tidak sesuai kebutuhan. Tempatkan box pada private overlay network agar box tersebut hanya memiliki alamat yang dapat dirutekan oleh perangkat Anda sendiri. Inilah yang diberikan oleh server kontrol Headscale yang di-host sendiri. Atau, tempatkan reverse proxy di depannya untuk mengautentikasi request sebelum request mencapai port 3080, misalnya server single sign-on Authentik yang menjalankan forward auth. Reverse proxy tanpa autentikasi di depannya bukan kontrol keamanan. Itu hanya URL yang lebih panjang.
Akses UI web melalui tunnel SSH
Jalankan ini di laptop Anda, bukan di server.
ssh -N -L 3080:127.0.0.1:3080 you@your-server-L membuka port 3080 di laptop Anda dan meneruskan setiap koneksi yang masuk ke port tersebut melalui sesi SSH terenkripsi. Bagian 127.0.0.1:3080 diselesaikan di server, sehingga koneksi tiba di harness dari loopback, persis seperti jika Anda berada di mesin tersebut. -N berarti jangan memulai remote shell, karena Anda hanya memerlukan penerusan port.
Kemudian buka http://127.0.0.1:3080 di browser lokal Anda. Jika port 3080 sudah digunakan di laptop, ubah angka di sebelah kiri: ssh -N -L 3180:127.0.0.1:3080 you@your-server, lalu buka http://127.0.0.1:3180. Angka di sebelah kiri adalah port lokal, sedangkan angka di sebelah kanan adalah port milik server. Jadi, hanya angka di sebelah kiri yang diubah.
Simpan di ~/.ssh/config dan jangan mengetikkannya lagi.
Host dsh
HostName 203.0.113.10
User deploy
IdentityFile ~/.ssh/id_ed25519
LocalForward 3080 127.0.0.1:3080Setelah itu, ssh -N dsh memulai tunnel. Jika browser melaporkan bahwa koneksi ditolak, biasanya tunnel sudah aktif, tetapi tidak ada yang sedang listening di sisi tujuan. SSH tetap meneruskan port tersebut, terlepas dari apakah harness sedang berjalan. Periksa server menggunakan perintah ss di atas.
Pertahankan harness tetap berjalan setelah logout
Perintah npx berhenti bersama shell Anda. Service pengguna systemd tetap berjalan dan memulai kembali harness setelah crash atau reboot.
loginctl enable-linger $USER
mkdir -p ~/.config/systemd/user
command -v dshenable-linger penting karena service pengguna biasanya berhenti saat sesi terakhir Anda berakhir. Tanpa opsi ini, harness berhenti begitu Anda menutup tunnel. Ambil path absolut yang dicetak oleh command -v dsh dan masukkan path tersebut ke dalam unit. systemd tidak mencari executable pada PATH yang dibuat oleh shell login Anda.
[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.targetWorkingDirectory bukan sekadar kosmetik. Proses dsh menggunakan direktori tempat proses tersebut dijalankan sebagai lokasi filesystem default. Karena itu, service yang dimulai dari lokasi yang salah akan memberikan workspace default yang salah kepada agent. Anda tetap dapat memilih workspace melalui UI.
systemctl --user daemon-reload
systemctl --user enable --now dsh
systemctl --user status dshUnit yang menolak untuk start hampir selalu disebabkan oleh path ExecStart yang salah atau versi Node yang ditolak oleh binary. journalctl --user -u dsh -n 50 menunjukkan penyebabnya. Pola yang sama berlaku untuk mempertahankan coding agent apa pun tetap berjalan pada VPS, dan mode kegagalannya identik.
Apa yang dapat dilakukan plugin
Plugin adalah modul yang menambahkan layanan, event bertipe, dan efek yang dapat dibatalkan ke dalam konteks bersama. Titik ekstensi berikut perlu dibaca dengan saksama:
- mendaftarkan penyedia model pada
ctx.llm - menambahkan tool yang digunakan model pada
ctx.tools - menyediakan backend shell di balik
ctx.shell - menyediakan akses filesystem atau kebijakan di balik
ctx.fs - mendaftarkan perintah manusia pada
ctx.commands - menjalankan pekerjaan latar belakang melalui
ctx.jobs - membungkus proses yang dijalankan dengan backend
ctx.sandbox - mencegat request dan pemanggilan tool melalui event
agent/*dantools/* - memperluas state sesi yang persisten
- mengendalikan UI melalui
ctx.agents
Baca daftar tersebut dari sudut pandang penyerang. Plugin dapat menyediakan layer filesystem dan layer shell. Plugin juga dapat berada di tengah setiap pemanggilan tool yang dilakukan model. Tidak ada dialog izin yang memisahkan plugin dari titik-titik tersebut, karena plugin adalah kode Node biasa yang dimuat ke dalam proses yang sama dengan komponen lainnya. Menginstal plugin berarti menjalankan kode pihak lain dengan permission agent Anda. Permission agent Anda adalah permission pengguna Unix Anda.
Ini adalah keputusan kepercayaan yang sama seperti ketika Anda menghubungkan server MCP ke agent pada VPS, dengan MCP sebagai singkatan dari model context protocol. Hal ini juga menjelaskan mengapa menjalankan coding agent dengan aman pada VPS dimulai dari akun yang digunakan agent, bukan dari model, serta mengapa serangan supply chain npm berdampak besar pada server: langkah instalasi adalah titik komprominya, dan tidak ada prompt yang meminta persetujuan Anda.
Asal plugin
Plugin disimpan dalam profile. Profile adalah komposisi bernama yang disimpan di $DSH_HOME, yang secara default adalah ~/.dsh, dan setiap direktori profile menyimpan plugin out-of-tree yang diinstalnya. CLI mengelolanya dengan meneruskan argumen Anda langsung ke pnpm, menggunakan direktori profile sebagai direktori kerja.
dsh plugin --profile web add github:deepseek-harness/turtle-ui
dsh plugin --profile web remove turtle-uiKarena argumen diteruskan ke pnpm tanpa perubahan, add, remove, update, dan why berfungsi seperti pada project pnpm lainnya, dan plugin dapat berupa package npm atau referensi GitHub. pnpm harus tersedia lebih dahulu di PATH. Pada Node 22 dan versi yang lebih baru, corepack enable pnpm menempatkannya di sana.
Discovery dilakukan melalui topic GitHub. Pembuat plugin menambahkan topic dsh-plugin ke repository mereka, dan Anda dapat menemukan plugin yang tersedia dengan menelusuri topic tersebut. Topic adalah label yang diterapkan pembuat pada repository mereka sendiri. Tidak ada pihak yang meninjau atau menandatanganinya, dan halaman topic mengurutkan repository berdasarkan jumlah star, yang mengukur popularitas, bukan keamanan.
Empat kebiasaan berikut membantu menjaga pengelolaan tetap terkendali. Baca source sebelum menginstal karena sebagian besar plugin cukup kecil untuk dibaca dalam sepuluh menit. Tetapkan versi atau commit yang tepat, bukan mengikuti branch. Jalankan harness dengan user yang tidak memiliki resource lain, pada VPS yang siap Anda bangun ulang. Berikan agent API key sendiri dengan batas pengeluaran sendiri, terpisah dari key yang digunakan service production Anda.
Jika Anda ingin membandingkan desain sebelum memilih salah satunya, harness multi-agent Omnigent menangani masalah yang sama dengan struktur berbeda, dan trade-off-nya menjadi jelas setelah plugin digunakan.
Apa yang gagal terlebih dahulu
Node terlalu lama. Proyek ini menargetkan Node 22.19 dan versi yang lebih baru dalam lini 22.x, atau Node 24 dan versi di atasnya, dan CI proyek menguji versi tersebut. Runtime yang lebih lama gagal saat startup karena kode menggunakan sintaks dan API yang tidak tersedia di dalamnya. Jalankan node --version sebelum melakukan hal lain.
Port 3080 sudah digunakan. Penyebabnya dapat berupa harness kedua, proses lama yang masih berjalan, atau aplikasi lain yang juga menggunakan 3080. Cari proses tersebut dengan ss -tlnp | grep 3080, lalu hentikan atau jalankan harness di tempat lain dengan dsh web --port 3180. --port adalah milik aplikasi web, jadi jalankan setelah web.
Browser tidak dapat terhubung melalui tunnel. Pastikan Anda membuka 127.0.0.1, bukan alamat publik server, karena port yang diteruskan hanya tersedia di laptop Anda. Kemudian pastikan harness sedang listen pada server, karena SSH membuat penerusan tersebut terlepas dari ada atau tidaknya proses yang merespons di sisi tujuan.
dsh plugin langsung gagal. Perintah ini merupakan wrapper untuk pnpm, sehingga binary pnpm yang tidak tersedia akan menghentikannya sebelum pekerjaan plugin dimulai.
Agent tidak dapat melihat proyek Anda. Workspace secara default menggunakan direktori tempat proses dimulai. Karena itu, unit yang WorkingDirectory-nya merupakan direktori home Anda akan memberikan direktori home tersebut kepada agent. Pilih workspace di UI, atau perbaiki unit lalu muat ulang konfigurasinya.
FAQ
Apakah aman mengekspos UI web DeepSeek Harness pada port 3080?
Tidak. Server web tersebut tidak memiliki login bawaan, dan agent di belakangnya mengedit file serta menjalankan perintah shell sebagai pengguna yang memulai proses, sementara API key provider Anda disimpan pada disk yang sama. Pertahankan listener pada 127.0.0.1 dan akses melalui SSH tunnel. Private overlay network, atau reverse proxy yang mengautentikasi setiap request sebelum request tersebut mencapai port, juga dapat digunakan. Pada versi 0.1.0-rc.6, CLI menolak --host 0.0.0.0 dan keluar dengan usage error. Hal ini menunjukkan pandangan pembuatnya terhadap penggunaan tersebut.
Apakah saya memerlukan DeepSeek API key, atau dapat menggunakan model lokal?
Keduanya dapat digunakan karena harness adalah runtime, bukan model. Pada Settings, lalu Models, Anda dapat menempelkan key ke provider card dalam katalog, atau memilih "Add a custom provider" dan memberikan base URL yang menggunakan protokol yang kompatibel dengan OpenAI. Server Ollama lokal merespons pada http://127.0.0.1:11434/v1/ dan menerima string apa pun pada kolom API key. Key disimpan di $DSH_HOME/.credentials.yaml, yang secara default adalah ~/.dsh/.credentials.yaml.
Apa yang sebenarnya diperoleh plugin setelah menginstal plugin DeepSeek Harness?
Plugin memperoleh izin dari akun yang menjalankan harness. Plugin adalah kode Node yang dimuat ke dalam proses yang sama. Extension point mencakup shell backend, filesystem layer, tool registry, dan event yang membungkus setiap pemanggilan tool. Tidak ada mekanisme sandbox yang memisahkan plugin dari komponen tersebut, kecuali plugin menyediakan sandbox itu sendiri. Baca source code sebelum menginstal, dan jalankan harness sebagai pengguna yang tidak memiliki akses ke apa pun yang penting bagi Anda.
Versi mana yang sebaiknya saya instal, dan apakah versi tersebut akan tetap berfungsi?
Instal versi yang tepat, misalnya npx @deepseek-ai/dsh@0.1.0-rc.6 web. Itulah versi yang ditunjuk oleh tag latest pada 13 Agustus 2026. Project ini menyebut dirinya sebagai developer preview dan menyatakan bahwa perubahan yang memutus kompatibilitas dapat terjadi. Karena itu, perintah yang tidak menetapkan versi dapat berperilaku berbeda dari satu hari ke hari berikutnya. Periksa repository sebelum melakukan upgrade, dan perkirakan bahwa config key serta interface plugin dapat berubah selama versi masih diawali dengan 0.