SSD Nodes Learn 🎉 VPS dari $5.50/bln
Panduan Matt ConnorOleh Matt Connor

Cara Pasang DeepSeek Harness di VPS Secara Selamat

Ketahui cara memasang DeepSeek Harness pada VPS Linux dengan selamat. Panduan ini merangkumi penetapan versi npm, konfigurasi plugin, dan akses port 3080 melalui tunnel SSH.

Apakah DeepSeek Harness itu

DeepSeek Harness (dsh) ialah runtime ejen Node.js yang boleh anda jalankan pada VPS (virtual private server). Cara paling selamat untuk menjalankannya adalah dengan mengikatnya pada 127.0.0.1 dan mengaksesnya melalui tunnel SSH (secure shell) daripada pelayar web anda. Ia menyediakan UI web (user interface) pada port 3080 dan bukannya berjalan di dalam terminal. Pelayan web tersebut tidak meminta kata laluan sendiri, jadi port 3080 yang didedahkan kepada umum akan memberikan akses kepada sesiapa sahaja untuk menggunakan ejen yang boleh membaca fail anda serta menjalankan arahan sebagai pengguna Linux anda.

DeepSeek melancarkannya pada 13 Ogos 2026 di bawah lesen MIT, sebagai pakej npm @deepseek-ai/dsh. Projek ini menyifatkan dirinya sebagai pratonton pembangun dan menyatakan bahawa perubahan yang menjejaskan keserasian mungkin berlaku. Setiap nombor versi di bawah adalah snapshot bagi Ogos 2026, jadi semak repositori sebelum anda menyalin sebarang bahagian ke dalam pelayan yang penting.

Satu idea utama mendasari keseluruhan reka bentuknya: segala-galanya adalah plugin. Adapter model, pendaftaran alatan, log sesi, sandbox, penjadual dan gelung ejen itu sendiri merupakan plugin yang dimuatkan ke dalam satu konteks kongsi, dan mana-mana daripadanya boleh diganti. Tiada teras berkeistimewaan yang hanya dihiasi oleh plugin. Itulah sebabnya harness ini berbaloi untuk dicuba, dan di situlah juga terletaknya satu-satunya risiko sebenar.

Harness bukanlah model

Harness menjalankan gelung ejen. Proses penaakulan berlaku dalam model di tempat lain, jadi tiada apa-apa yang akan berfungsi sehingga anda memberikan sama ada kunci API (application programming interface) atau alamat endpoint model yang anda hoskan sendiri.

Anda mengkonfigurasinya dalam UI di bawah Settings dan kemudian Models. Katalog tersebut mempunyai kad sedia guna untuk penyedia API utama (DeepSeek, OpenAI, Anthropic) di mana anda menampal kunci. "Add a custom provider" ialah pilihan yang menarik: ia memerlukan ID penyedia, nama paparan, URL asas, protokol API dan kelayakan, serta menggunakan protokol yang serasi dengan OpenAI, jadi mana-mana get laluan atau pelayan tempatan yang melaksanakan protokol tersebut akan berfungsi. Penyedia tersuai juga boleh membuat pertanyaan kepada endpoint GET /models yang serasi dengan OpenAI untuk mengisi senarai model bagi pihak anda.

Begitulah cara anda menghalakan harness kepada model pada VPS yang sama. Ollama mendedahkan API yang serasi dengan OpenAI pada http://127.0.0.1:11434/v1/, dan ia memerlukan medan kunci API diisi dengan sebarang rentetan, secara konvensyennya ollama, kerana medan tersebut wajib diisi namun kemudiannya diabaikan. Sama ada model yang cukup kecil untuk dimuatkan dalam VPS anda cukup baik untuk memacu ejen adalah soalan yang lebih sukar, dan perbezaan antara Ollama dan vLLM sebagai pelayan model tempatan menentukan berapa banyak RAM anda yang diperlukan untuk jawapan tersebut.

Kunci yang ditaip ke dalam UI adalah jenis tulis-sahaja (write-only). Harness menyimpannya dalam $DSH_HOME/.credentials.yaml dan hanya menyimpan rujukan kelayakan dalam settings.yaml. $DSH_HOME secara lalai ditetapkan kepada ~/.dsh. Anggap fail tersebut sebagai fail kata laluan, kerana ia memang begitu: sesiapa yang membacanya boleh menghabiskan bajet API anda.

Perkara yang anda perlukan sebelum memasang

  • VPS yang menjalankan Ubuntu 24.04 atau Linux semasa yang lain, dengan akses SSH
  • Node.js 22.19 atau lebih baharu dalam siri 22.x, atau Node.js 24 ke atas, iaitu versi yang digunakan oleh projek ini untuk binaan dan ujian
  • akaun pengguna biasa, bukan root, kerana ejen menjalankan arahan shell sebagai pengguna yang memulakan proses tersebut
  • pnpm dalam PATH jika anda bercadang untuk memasang pemalam, kerana arahan pemalam akan memanggilnya melalui shell
  • port 3080 ditutup pada firewall anda dan pada firewall rangkaian berasingan pembekal anda

Pakej nodejs milik Ubuntu adalah lebih lama daripada yang diperlukan oleh harness, jadi pasang Node daripada NodeSource atau nvm dan bukannya menggunakan apt install nodejs. Jika VPS tersebut masih baharu, mengukuhkan SSH sebelum melakukan perkara lain adalah berbaloi untuk dilakukan dalam masa sepuluh minit, kerana terowong yang bakal anda gunakan bergantung sepenuhnya pada kualiti pelayan SSH di sebaliknya.

Memasang DeepSeek Harness pada VPS, dikunci pada satu versi

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

npx memuat turun pakej dan menjalankan binari dsh miliknya. web ialah alias untuk --profile web, yang memulakan aplikasi pelayar, dan proses tersebut memaparkan alamat yang sedang didengarinya. Nilai lalai ialah http://127.0.0.1:3080.

Kunci versi tersebut. npx @deepseek-ai/dsh web menyelesaikan apa sahaja yang ditunjuk oleh tag latest pada minit anda menjalankannya, dan projek ini telah mengeluarkan beberapa calon keluaran (release candidate) serta menyatakan bahawa perubahan yang memecahkan keserasian (breaking changes) akan berlaku. 0.1.0-rc.6 ialah versi yang ditunjuk oleh latest pada 13 Ogos 2026. Versi yang dikunci bermakna pelayan yang anda sediakan hari ini akan berkelakuan sama pada bulan hadapan, jadi naik taraf menjadi keputusan yang anda buat dan bukannya kemalangan yang anda temui.

Untuk kegunaan harian, pasang sekali sahaja dan bukannya menyelesaikan semula pada setiap permulaan.

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

Baris kedua itu wajar dijalankan, kerana pelancar dan aplikasi web membawa set flag yang berasingan. dsh --help menunjukkan pilihan pelancar itu sendiri. dsh --profile web --help menunjukkan flag yang diterima oleh aplikasi web, iaitu tempat --port, --host dan --trusted-host yang boleh diulang berada.

Sekarang, sahkan alamat yang sedang didengarinya.

ss -tlnp | grep 3080

Lajur alamat tempatan sepatutnya memaparkan 127.0.0.1:3080. Jika ia memaparkan 0.0.0.0:3080, UI tersebut boleh dicapai dari internet, dan anda harus menghentikan proses itu sebelum melakukan perkara lain.

Mengapa anda tidak boleh mendedahkan port 3080

Pelayan web ini tidak mempunyai lapisan pengesahan. Konfigurasinya hanya mendedahkan hos pendengar (listen host) dan port pendengar (listen port), dan itulah keseluruhan permukaan serangannya. Kawalan akses untuk penggunaan bukan-loopback adalah tetapan hos dipercayai yang berasingan, yang bukanlah skrin log masuk.

Sekarang, pertimbangkan apa yang berada di sebalik port tersebut. Ejen ini menyunting fail dalam ruang kerja dan menjalankan arahan shell, manakala kelayakan pembekal anda tersimpan pada cakera di sebelahnya. Jadi, port 3080 yang terbuka adalah shell jauh dengan antara muka sembang, yang berjalan sebagai pengguna yang memulakannya, dengan kunci API anda dilampirkan. Sesiapa pun tidak memerlukan eksploit untuk perkara itu. Mereka hanya perlukan nombor port, dan pengimbas akan menemui nombor port dalam masa beberapa jam selepas hos mula dalam talian.

CLI (antara muka baris arahan) bersetuju dengan perkara ini. Bermula dari 0.1.0-rc.6, ia secara sengaja tidak menyokong --host 0.0.0.0 dan akan keluar dengan ralat penggunaan dan bukannya bermula. Penolakan itu adalah satu ciri, jadi jangan cari tampalan (patch) yang membuangnya.

Dua kaedah penggunaan lain adalah munasabah apabila terowong tidak sesuai untuk anda. Letakkan kotak tersebut pada rangkaian tindihan (overlay network) peribadi supaya ia memegang alamat yang hanya boleh dihalakan oleh peranti anda sendiri, iaitu apa yang diberikan oleh pelayan kawalan Headscale yang dihoskan sendiri. Atau letakkan reverse proxy di hadapannya yang mengesahkan permintaan sebelum ia sampai ke port 3080, contohnya pelayan daftar masuk tunggal Authentik yang melakukan pengesahan hadapan (forward auth). Reverse proxy tanpa pengesahan di hadapannya bukanlah kawalan keselamatan. Ia hanyalah URL yang lebih panjang.

Capai UI web melalui terowong SSH

Jalankan arahan ini pada komputer riba anda, bukan pada pelayan.

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

-L membuka port 3080 pada komputer riba anda dan memajukan sebarang sambungan kepadanya melalui sesi SSH yang disulitkan. Bahagian 127.0.0.1:3080 diselesaikan pada pelayan, jadi sambungan sampai ke harness daripada loopback, sama seperti anda sedang duduk di hadapan mesin tersebut. -N menyatakan supaya tidak memulakan shell jauh, kerana anda hanya mahukan pemajuan port dan tiada yang lain.

Kemudian, buka http://127.0.0.1:3080 dalam pelayar web tempatan anda. Jika port 3080 sudah digunakan pada komputer riba anda, tukar nombor di sebelah kiri: ssh -N -L 3180:127.0.0.1:3080 you@your-server, kemudian layari http://127.0.0.1:3180. Nombor di sebelah kiri adalah untuk port tempatan dan nombor di sebelah kanan adalah milik pelayan, jadi hanya nombor di sebelah kiri yang perlu diubah.

Simpan arahan tersebut dalam ~/.ssh/config supaya anda tidak perlu menaipnya berulang kali.

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

Selepas itu, ssh -N dsh akan memulakan terowong tersebut. Pelayar yang melaporkan bahawa sambungan ditolak biasanya bermaksud terowong sudah aktif tetapi tiada apa-apa yang mendengar di bahagian hujung sana, kerana SSH akan memajukan port tersebut sama ada harness sedang berjalan atau tidak. Periksa pelayan dengan arahan ss di atas.

Memastikan harness terus berjalan selepas anda log keluar

Arahan npx akan tamat apabila shell anda ditutup. Servis pengguna systemd akan terus berjalan, dan ia akan menghidupkan semula harness selepas berlaku kegagalan atau but semula.

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

enable-linger penting kerana servis pengguna biasanya berhenti apabila sesi terakhir anda berakhir, jadi tanpanya harness akan mati sebaik sahaja anda menutup tunnel. Gunakan laluan mutlak (absolute path) yang dipaparkan oleh command -v dsh dan masukkan ke dalam unit tersebut, kerana systemd tidak mencari PATH yang dibina oleh shell log masuk 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.target

WorkingDirectory bukan sekadar kosmetik. Proses dsh menggunakan direktori pemanggilnya sebagai lokasi sistem fail lalai, jadi servis yang dimulakan di tempat yang salah akan memberikan ejen ruang kerja lalai yang salah. Anda masih boleh memilih ruang kerja tersebut dalam UI.

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

Unit yang enggan bermula hampir selalunya disebabkan oleh laluan ExecStart yang salah atau versi Node yang ditolak oleh binari tersebut, dan journalctl --user -u dsh -n 50 akan menamakan punca masalahnya. Corak yang sama merangkumi mengekalkan mana-mana ejen pengekodan agar terus hidup pada VPS, dan mod kegagalannya adalah sama.

Perkara yang dibenarkan untuk dilakukan oleh pemalam

Pemalam ialah modul yang menyumbang perkhidmatan, acara bertaip dan kesan boleh balik kepada konteks yang dikongsi. Titik sambungan (extension points) adalah bahagian yang perlu diteliti dengan rapi:

  • mendaftarkan penyedia model pada ctx.llm
  • menambah alatan yang menghadap model pada ctx.tools
  • menyediakan backend shell di sebalik ctx.shell
  • menyediakan akses sistem fail atau polisi di sebalik ctx.fs
  • mendaftarkan arahan manusia pada ctx.commands
  • menjalankan kerja latar belakang melalui ctx.jobs
  • membalut proses yang dijana dengan backend ctx.sandbox
  • memintas permintaan dan panggilan alatan melalui acara agent/* dan tools/*
  • melanjutkan keadaan sesi yang tahan lama
  • memacu UI melalui ctx.agents

Baca senarai tersebut seperti cara penyerang membacanya. Pemalam boleh membekalkan lapisan sistem fail dan lapisan shell, serta boleh berada di tengah-tengah setiap panggilan alatan yang dibuat oleh model. Tiada dialog kebenaran yang menghalang antara pemalam dan titik sambungan tersebut, kerana pemalam hanyalah kod Node biasa yang dimuatkan ke dalam proses yang sama seperti segala-galanya. Memasang pemalam bermakna menjalankan kod orang asing dengan kebenaran ejen anda, dan kebenaran ejen anda adalah kebenaran pengguna Unix anda.

Ini adalah keputusan kepercayaan yang sama yang anda buat apabila menyambungkan pelayan MCP kepada ejen pada VPS, di mana MCP ialah protokol konteks model. Inilah juga sebab mengapa menjalankan ejen pengekodan dengan selamat pada VPS bermula dengan akaun yang menjalankannya dan bukannya dengan model, dan mengapa serangan rantaian bekalan npm memberi kesan yang sangat buruk pada pelayan: langkah pemasangan adalah titik kompromi, dan tiada apa-apa yang memberi amaran kepada anda.

Asal usul pemalam

Pemalam disimpan dalam profil. Profil ialah komposisi bernama yang disimpan di bawah $DSH_HOME, yang secara lalai ditetapkan kepada ~/.dsh, dan setiap direktori profil menyimpan pemalam luar (out-of-tree) yang dipasangnya. CLI menguruskan pemalam ini dengan menghantar argumen anda terus ke pnpm, menggunakan direktori profil sebagai direktori kerja.

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

Oleh kerana argumen sampai ke pnpm tanpa diubah, add, remove, update dan why berfungsi seperti dalam mana-mana projek pnpm, dan pemalam boleh berupa pakej npm atau rujukan GitHub. pnpm mesti wujud pada PATH terlebih dahulu. Pada Node 22 dan versi seterusnya, corepack enable pnpm meletakkannya di sana.

Penemuan dilakukan melalui topik GitHub. Pengarang pemalam menambah topik dsh-plugin pada repositori mereka, dan melayari topik tersebut adalah cara anda mencari apa yang tersedia. Topik ialah label yang diletakkan oleh pengarang pada repositori mereka sendiri. Tiada sesiapa yang menyemak atau menandatanganinya, dan halaman topik disusun mengikut bilangan bintang, yang mengukur populariti dan bukannya keselamatan.

Empat tabiat menjadikan perkara ini boleh dikawal. Baca kod sumber sebelum memasang, kerana kebanyakan pemalam cukup kecil untuk dibaca dalam masa sepuluh minit. Tetapkan versi atau commit yang tepat dan bukannya menjejaki cawangan (branch). Jalankan harness di bawah pengguna yang tidak memiliki apa-apa aset lain, pada VPS yang anda sanggup bina semula. Berikan ejen kunci API sendiri dengan had perbelanjaan sendiri, berasingan daripada kunci yang digunakan oleh servis pengeluaran anda.

Jika anda lebih suka membandingkan reka bentuk sebelum memilih satu, harness berbilang ejen Omnigent menjawab masalah yang sama dengan struktur yang berbeza, dan pertukaran (trade-offs) menjadi jelas sebaik sahaja pemalam digunakan.

Perkara yang sering gagal dahulu

Node terlalu lama. Projek ini menyasarkan Node 22.19 dan versi lebih baharu dalam siri 22.x, atau Node 24 ke atas, dan CI kami mengujinya pada versi tersebut. Runtime yang lebih lama akan gagal semasa permulaan kerana kod menggunakan sintaks dan API yang tidak disokong. Jalankan node --version sebelum melakukan apa-apa perkara lain.

Port 3080 sudah digunakan. Mungkin terdapat harness kedua, proses yang tergantung, atau aplikasi lain yang tidak berkaitan yang turut menggunakan port 3080. Cari proses tersebut dengan ss -tlnp | grep 3080, kemudian hentikan proses itu atau mulakan harness di tempat lain dengan dsh web --port 3180. --port adalah milik aplikasi web, jadi ia diletakkan selepas web.

Pelayar tidak dapat menyambung melalui tunnel. Pastikan anda melayari 127.0.0.1 dan bukan alamat awam pelayan, kerana port yang diforward hanya wujud pada komputer riba anda. Kemudian, pastikan harness sedang mendengar pada pelayan, kerana SSH akan menyediakan forward tersebut tidak kira sama ada terdapat respons pada hujung sana atau tidak.

dsh plugin gagal serta-merta. Perintah ini merupakan wrapper kepada pnpm, jadi ketiadaan binari pnpm akan menghentikannya sebelum sebarang kerja pemalam bermula.

Ejen tidak dapat melihat projek anda. Workspace ditetapkan secara lalai kepada direktori tempat proses dimulakan, jadi unit yang WorkingDirectory-nya adalah direktori home anda akan memberikan direktori home anda kepada ejen. Pilih workspace dalam UI, atau betulkan unit tersebut dan muat semula.

FAQ

Adakah selamat untuk mendedahkan UI web DeepSeek Harness pada port 3080?

Tidak. Pelayan web tersebut tidak mempunyai sistem log masuk sendiri, dan ejen di sebaliknya boleh menyunting fail serta menjalankan arahan shell sebagai pengguna yang memulakan proses tersebut, dengan kunci API pembekal anda disimpan pada cakera yang sama. Pastikan pendengar kekal pada 127.0.0.1 dan aksesnya melalui terowong SSH. Rangkaian overlay peribadi, atau reverse proxy yang mengesahkan setiap permintaan sebelum ia sampai ke port tersebut, juga boleh digunakan. Bermula versi 0.1.0-rc.6, CLI akan menolak --host 0.0.0.0 dan keluar dengan ralat penggunaan, yang menunjukkan pandangan pembangun terhadap tindakan tersebut.

Adakah saya memerlukan kunci API DeepSeek, atau bolehkah saya menggunakan model tempatan?

Kedua-duanya boleh digunakan, kerana harness ini merupakan runtime dan bukannya model. Di bawah Settings kemudian Models, anda boleh menampal kunci ke dalam kad pembekal katalog, atau pilih "Add a custom provider" dan berikan URL asas yang menggunakan protokol serasi OpenAI. Pelayan Ollama tempatan menjawab pada http://127.0.0.1:11434/v1/ dan menerima sebarang rentetan dalam medan kunci API. Kunci disimpan dalam $DSH_HOME/.credentials.yaml, yang secara lalai berada pada ~/.dsh/.credentials.yaml.

Apakah yang diperoleh oleh plugin DeepSeek Harness apabila ia dipasang?

Kebenaran akaun yang menjalankan harness tersebut. Plugin ialah kod Node yang dimuatkan ke dalam proses yang sama, dan titik sambungan termasuk backend shell, lapisan sistem fail, pendaftaran alat dan acara yang membungkus setiap panggilan alat. Tiada apa-apa yang menyekat plugin daripada bahagian tersebut melainkan plugin itu sendiri menyediakan sandbox. Baca kod sumber sebelum anda memasang, dan jalankan harness sebagai pengguna yang tidak memiliki sebarang data penting.

Versi manakah yang perlu saya pasang, dan adakah ia akan terus berfungsi?

Pasang versi yang tepat, contohnya npx @deepseek-ai/dsh@0.1.0-rc.6 web. Itulah yang ditunjukkan oleh tag latest pada 13 Ogos 2026. Projek ini menggelarkan dirinya sebagai pratonton pembangun dan menyatakan bahawa perubahan yang memecahkan keserasian dijangka berlaku, jadi arahan yang tidak dikunci versinya boleh berkelakuan berbeza dari satu hari ke hari berikutnya. Semak repositori sebelum menaik taraf, dan jangkakan kunci konfigurasi serta antara muka plugin akan berubah selagi versi masih bermula dengan 0.

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