Arti dsh web: http://127.0.0.1:3080
dsh menampilkan http://127.0.0.1:3080 karena Web UI hanya terikat ke localhost. Akses aman lewat SSH tunnel dan pahami risiko membuka port 3080.
Apa arti dsh web: http://127.0.0.1:3080
Saat Anda memulai profil web DeepSeek Harness pada VPS, profil tersebut mencetak dua baris lalu menunggu:
dsh web: http://127.0.0.1:3080
Ready.127.0.0.1 adalah alamat loopback. Alamat ini digunakan mesin untuk berkomunikasi dengan dirinya sendiri. Socket yang terikat ke 127.0.0.1 menerima koneksi dari proses pada mesin yang sama, dan dari tempat lain tidak. Jadi, baris tersebut memberi tahu dua hal sekaligus: tempat Web UI mendengarkan dan pihak yang diizinkan untuk mengaksesnya. Hanya mesin tempat dsh berjalan yang dapat mengaksesnya.
Itulah sebabnya URL tersebut tidak melakukan apa pun saat Anda menempelkannya ke browser pada laptop. 127.0.0.1 milik laptop Anda adalah laptop Anda sendiri. Harness mendengarkan pada 127.0.0.1 milik VPS, yaitu mesin lain dengan stack loopback yang berbeda. Tidak ada yang rusak. Anda perlu meneruskan koneksi tersebut.
README resmi menyatakan nilai defaultnya dengan jelas: "Perintah tersebut memulai Web UI, yang secara default disajikan pada http://127.0.0.1:3080." Alamat bind berasal dari plugin host webserver, @deepseek-ai/dsh-host-webserver. Kunci host pada plugin tersebut didokumentasikan sebagai "Host untuk mendengarkan; dua nilai yang didukung adalah loopback dan all-interfaces". Anda mendapatkan loopback kecuali mengubahnya. Jika port masih baru bagi Anda, cara kerja port di Linux membahas model alamat dan port yang menjadi dasar semua ini.
Mengapa Web UI hanya terikat ke localhost
dsh adalah harness agen, yaitu program yang membungkus model: harness ini mengelola loop, pemanggilan tool, dan izin yang digunakan untuk menjalankan pemanggilan tersebut. Tab browser adalah antarmuka kontrol untuk proses yang menjalankan perintah shell, membaca dan menulis file di direktori workspace yang Anda pilih, serta menggunakan API key model Anda. Siapa pun yang dapat memuat halaman tersebut dapat melakukan semua tindakan itu sebagai user yang menjalankan dsh. Jaringan juga bukan satu-satunya jalur untuk memperoleh akses tersebut: plugin yang Anda instal berjalan di dalam proses yang sama dengan izin yang sama. Karena itu, memeriksa plugin dsh sebelum menginstalnya memerlukan kehati-hatian yang sama seperti saat menentukan alamat yang digunakan server untuk listening.
Jadi, port 3080 bukan dashboard read-only. Memuat halaman tersebut memberikan kemampuan mengeksekusi perintah di server.
Buka Web UI dan Anda langsung masuk ke daftar sesi. Tidak ada prompt login karena developer preview ini tidak menyediakan akun user maupun autentikasi remote. Pada loopback, kondisi ini konsisten: sistem operasi menjadi kontrol akses, dan hanya proses lokal yang dapat terhubung. Jika server yang sama di-bind ke 0.0.0.0 pada VPS dengan IP publik, halaman tersebut akan merespons seluruh Internet tanpa lapisan perlindungan apa pun di depannya. Pemindai otomatis terus memindai port yang tidak umum, jadi anggap port 3080 yang dipublikasikan akan segera ditemukan.
Jangan membuka port 3080 di firewall, dan jangan mengaturhostwebserver ke0.0.0.0pada VPS publik. Kombinasi tersebut memberikan kemampuan mengeksekusi perintah di server Anda kepada siapa pun yang terhubung lebih dahulu.
Pertimbangan yang sama berlaku untuk setiap runtime agen yang Anda jalankan di server. Karena itu, menjalankan coding agent dengan aman di VPS harus dimulai dari aturan yang sama: port kontrol agen tetap privat, dan komponen tepercaya digunakan untuk mengaksesnya.
Bagaimana cara membuka Web UI dsh dari laptop?
Ada tiga cara yang aman, dan semuanya membuat harness tetap terikat ke loopback.
- Tunnel SSH. Tidak ada layanan baru yang mendengarkan pada antarmuka publik, dan kredensialnya sudah Anda miliki. Gunakan cara ini.
- Jaringan overlay privat, sehingga UI dapat diakses dari perangkat Anda sendiri dan tidak terlihat oleh pihak lain.
- Reverse proxy yang melakukan terminasi TLS (transport layer security) dan meminta kata sandi sebelum meneruskan koneksi apa pun.
Perbedaannya terletak pada jalur yang menghubungkan browser Anda ke loopback. Tidak satu pun cara tersebut boleh memindahkan harness dari loopback.
Akses dengan tunnel SSH
Jalankan ini di laptop Anda, bukan di VPS:
ssh -N -L 3080:127.0.0.1:3080 you@your-vpsBiarkan tetap berjalan, lalu buka http://127.0.0.1:3080 di browser lokal Anda. Web UI akan dimuat.
Argumen -L berisi tiga bidang yang dipisahkan dengan titik dua. Bidang pertama adalah port yang dibuka di laptop Anda. Bidang kedua dan ketiga adalah alamat dan port tujuan penerusan setiap koneksi. Hal pentingnya: 127.0.0.1 pada bidang tengah di-resolve oleh server SSH di VPS, setelah trafik Anda tiba di sana. Alamat tersebut adalah loopback VPS, bukan loopback laptop Anda. Itulah alamat yang dicetak oleh dsh, sehingga tunnel berfungsi saat koneksi langsung dari browser tidak berfungsi.
-N memberi tahu SSH agar tidak menjalankan perintah remote. Dengan demikian, Anda mendapatkan penerus koneksi tanpa shell. Untuk tunnel latar belakang yang menampilkan kegagalan secara jelas:
ssh -N -f -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 -L 3080:127.0.0.1:3080 you@your-vps-f menjalankannya di latar belakang setelah autentikasi. ExitOnForwardFailure=yes lebih penting daripada yang terlihat: tanpa opsi ini, SSH tetap terhubung meskipun penerusan gagal disiapkan. Akibatnya, sesi tampak berfungsi, tetapi tunnel mati tanpa peringatan. ServerAliveInterval=30 mengirim keepalive setiap 30 detik agar tunnel tetap bertahan saat router di kafe dan hotel memutus koneksi NAT (network address translation) yang tidak aktif.
Hasil yang seharusnya terlihat
Di VPS, pastikan apa yang benar-benar sedang listen:
ss -ltnp | grep 3080Hasil yang benar mencantumkan alamat loopback:
LISTEN 0 511 127.0.0.1:3080 0.0.0.0:* users:(("node",pid=1042,fd=21))Jika kolom alamat lokal berisi 0.0.0.0:3080, Web UI tersedia pada semua interface, termasuk interface publik. Hentikan layanan tersebut dan perbaiki bind sebelum melakukan hal lain. Jika ss mencetak socket tetapi kolom users: kosong, jalankan perintah tersebut dengan sudo. Tanpa opsi ini, nama proses untuk socket yang dimiliki pengguna lain disembunyikan.
Saat tunnel gagal dimulai
SSH mencetak pesan berikut lalu keluar:
bind [127.0.0.1]:3080: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 3080Masalah ini terjadi di laptop Anda, bukan di server. Sesuatu di laptop sudah menggunakan port 3080, biasanya tunnel sebelumnya yang terlupa dihentikan. Pilih port lokal yang masih bebas:
ssh -N -L 3081:127.0.0.1:3080 you@your-vpsHanya bidang pertama yang berubah. Sekarang buka http://127.0.0.1:3081 di browser, sedangkan harness tetap listen pada port 3080. Kedua angka tersebut tidak harus sama.
Jika tunnel berhasil dimulai tetapi browser melaporkan koneksi ditolak atau respons kosong, trafik sudah diteruskan ke VPS tetapi tidak menemukan apa pun di sisi tujuan. Kemungkinan dsh sudah keluar atau melakukan bind pada port lain. Periksa dengan ss -ltnp | grep 3080 di server.
Ada satu hal lain yang sering menyebabkan masalah. Proses npx @deepseek-ai/dsh web di foreground berhenti saat shell ditutup, sehingga harness berhenti segera setelah Anda logout. Jalankan di dalam tmux atau gunakan systemd user service. Ini adalah masalah yang sama seperti yang dibahas dalam menjaga coding agent tetap berjalan di VPS. Saat mengerjakan sisi SSH, memperkuat keamanan SSH di VPS sebaiknya dilakukan terlebih dahulu karena tunnel menjadikan login SSH Anda sebagai satu-satunya akses ke agent.
Akses melalui jaringan overlay privat
Jaringan overlay memberi VPS dan laptop Anda alamat pada jaringan privat yang hanya dapat diikuti oleh perangkat Anda. Tailscale merupakan pilihan umum, dan perintah serve tepat untuk kasus ini: tailscaled dijalankan pada VPS dan terhubung ke localhost:3080 itu sendiri, sehingga harness tetap berjalan pada loopback dan Anda tidak perlu mengubah konfigurasi dsh.
tailscale serve --bg localhost:3080
tailscale serve statusUI kemudian dapat diakses melalui nama mesin Anda di dalam tailnet, menggunakan HTTPS, tanpa membuka port pada antarmuka publik. Sertifikat HTTPS untuk tailnet harus diaktifkan. Jika tidak, serve tidak memiliki sertifikat untuk ditampilkan. Untuk menonaktifkannya, jalankan kembali perintah tersebut dengan off:
tailscale serve --https=443 offGunakan serve, bukan funnel. Funnel memublikasikan target yang sama ke Internet publik. Akibatnya, runtime agent kembali tidak terautentikasi pada port terbuka. Kedua perintah tersebut hampir identik, tetapi fungsinya berlawanan. Karena itu, baca perbedaan antara Tailscale Serve dan Funnel sebelum menjalankan salah satunya. Tailscale sebagai jaringan privat menjelaskan proses penyiapannya.
Akses melalui reverse proxy yang memeriksa password
Ini adalah opsi yang benar-benar membuka port ke Internet. Dengan demikian, autentikasi menjadi satu-satunya penghalang antara orang asing dan eksekusi perintah di server Anda. Pilih opsi ini jika beberapa orang memerlukan UI dan tunnel untuk setiap orang tidak praktis.
Harness tetap berjalan pada 127.0.0.1:3080. nginx berjalan pada server yang sama, sehingga dapat mengakses loopback. nginx mendengarkan pada port 443 dengan sertifikat dan password file.
server {
listen 443 ssl;
server_name dsh.example.com;
ssl_certificate /etc/letsencrypt/live/dsh.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dsh.example.com/privkey.pem;
auth_basic "dsh";
auth_basic_user_file /etc/nginx/dsh.htpasswd;
location / {
proxy_pass http://127.0.0.1:3080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 3600s;
proxy_buffering off;
}
}Buat password file lalu lakukan reload:
sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/dsh.htpasswd you
sudo nginx -t && sudo systemctl reload nginxnginx -t seharusnya menampilkan syntax is ok, diikuti test is successful. Reload dengan file yang rusak akan gagal dan mempertahankan konfigurasi yang sedang berjalan. Karena itu, baca pesan error alih-alih melakukan restart secara membabi buta.
Tiga baris proxy tersebut bukan sekadar dekorasi. Header Upgrade dan Connection memungkinkan WebSocket handshake berlangsung. Tanpa header tersebut, halaman akan dimuat tetapi tidak pernah diperbarui. proxy_read_timeout 3600s menggantikan nilai default 60 detik. Tanpanya, eksekusi agent yang berlangsung lama akan terputus di tengah respons dan UI tampak macet. proxy_buffering off mengirim output model ke browser saat output tersebut tersedia, bukan menahannya sampai respons selesai. Konfigurasi reverse proxy nginx, baris demi baris menjelaskan bagian lainnya, sedangkan memilih antara nginx, Caddy, dan Traefik membahas cara melakukan hal yang sama dengan sertifikat otomatis.
Tutup port 3080 pada firewall, apa pun proxy yang Anda pilih, sehingga satu-satunya jalur masuk adalah melalui proxy yang sudah diautentikasi. Dasar-dasar firewall ufw menjelaskan aturan tersebut. Basic authentication melalui TLS adalah batas minimum, bukan model keamanan yang lengkap. Siapa pun yang memegang password tersebut memiliki shell pada server Anda. Jika memungkinkan, gunakan tunnel.
Bagaimana cara mengubah port yang digunakan web dsh?
--port adalah milik aplikasi web, bukan launcher. Dokumentasi CLI memberikan contoh secara langsung:
dsh --profile web --port 8080dsh web adalah alias untuk --profile web, sehingga dsh web --port 8080 adalah perintah yang sama. Launcher hanya memproses flag miliknya sendiri dan meneruskan semua argumen setelahnya ke profile yang dijalankan. Karena itu, flag launcher harus ditulis lebih dahulu. Token pertama yang tidak dikenali launcher menandai awal argumen aplikasi. Letakkan --port setelah profile, bukan sebelumnya.
Baca URL yang dicetak oleh perintah tersebut, bukan dengan mengasumsikannya. Baris itu menunjukkan alamat yang benar-benar digunakan server untuk listen. Kemudian, ubah field terakhir pada tunnel agar sesuai:
ssh -N -L 3080:127.0.0.1:8080 you@your-vpsUntuk perubahan permanen, port disimpan dalam konfigurasi profile, bukan pada command line. Profile web dan headless melakukan inisialisasi otomatis saat pertama kali digunakan dari template yang disertakan, di bawah ~/.dsh. Direktori yang sama juga menyimpan pengaturan API key dan endpoint model. Karena itu, mengonfigurasi key, model, dan endpoint dsh adalah bacaan pendamping yang perlu dibaca saat Anda mengedit file-file ini. Untuk melihat konfigurasi yang benar-benar berlaku setelah semua lapisan digabungkan:
dsh --dump-configPlugin webserver hanya menyediakan dua key, yaitu host dan port. Menetapkan port ke 0 meminta sistem operasi memilih port yang tersedia, sebagaimana didokumentasikan: "zero requests an OS-assigned port". Cara ini menjamin tidak terjadi konflik port, tetapi tidak cocok untuk tunnel karena nomornya berubah setiap kali server dijalankan ulang.
Mengapa dsh gagal dengan pesan address already in use?
Karena proses lain sudah menggunakan alamat dan port tersebut, sehingga kernel menolak bind kedua. Node melaporkannya seperti ini:
Error: listen EADDRINUSE: address already in use 127.0.0.1:3080Cari proses yang menggunakannya sebelum mengubah apa pun:
sudo ss -ltnp | grep 3080Kolom users:(("node",pid=1042,fd=21)) menunjukkan nama proses dan PID-nya. Biasanya, proses tersebut adalah instance dsh sebelumnya yang Anda kira sudah berhenti, tetapi masih berjalan di jendela tmux yang detached. Hentikan proses tersebut dengan kill 1042, atau jalankan instance baru pada port lain. Perhatikan bahwa 127.0.0.1:3080 dan 0.0.0.0:3080 juga saling bertabrakan karena binding ke semua interface sudah mencakup loopback.
Tetapkan versi karena ini masih pratinjau untuk pengembang
README menjelaskannya secara langsung: DeepSeek Harness masih dalam pratinjau untuk pengembang dan dikembangkan dengan cepat. Perubahan yang memutus kompatibilitas akan terjadi. Jika laju perubahan tersebut membuat Anda ragu, perbandingan dsh dengan Claude Code dan Omnigent membandingkannya dengan dua harness lain yang berada pada tahap berbeda dalam kurva yang sama.
npx @deepseek-ai/dsh web selalu mengarah ke versi terbaru yang dipublikasikan setiap kali Anda menjalankannya. Server yang tidak Anda sentuh selama seminggu dapat menjalankan CLI yang berbeda saat diluncurkan berikutnya, dengan flag yang berbeda. Tetapkan versinya agar restart tidak menjadi upgrade:
npx @deepseek-ai/dsh@0.1.0-rc.7 webPer Agustus 2026, paket yang dipublikasikan adalah versi 0.1.0-rc.7. Periksa paket yang akan diambil oleh npx tanpa penetapan versi sebelum Anda menerimanya:
npm view @deepseek-ai/dsh versionJika versi yang ditetapkan menolak untuk diinstal, atau npx tetap menjalankan build lama setelah Anda menetapkan versi baru, kesalahan instalasi dan versi yang ditimbulkannya membahas cara menghapus cache npx dan memeriksa npm yang disertakan oleh Node Anda.
Flag berpindah antara launcher dan aplikasi web pada setiap rilis pratinjau. Jika --port tidak lagi berperilaku seperti yang dijelaskan dalam panduan ini, minta aplikasi menampilkan daftar flag-nya sendiri. Jangan menebak:
dsh --profile web --helpUntuk instalasi, penyiapan workspace, dan kunci model, lihat menginstal DeepSeek Harness pada VPS. Untuk panduan singkat yang hanya membahas langkah akses, mengakses Web UI dsh pada VPS menjelaskan tunnel tanpa bagian penalarannya.
FAQ
Mengapa saya tidak dapat membuka http://127.0.0.1:3080 di browser laptop?
Karena 127.0.0.1 merujuk pada mesin tempat Anda mengetik. Web UI DeepSeek Harness terikat pada alamat loopback VPS, sehingga hanya proses di VPS yang dapat terhubung ke sana. Laptop Anda memiliki loopback terpisah, dan tidak ada proses yang mendengarkan pada port 3080 di sana. Teruskan port melalui SSH dengan ssh -N -L 3080:127.0.0.1:3080 you@your-vps, lalu buka http://127.0.0.1:3080 secara lokal. Kolom tengah pada argumen -L diselesaikan di sisi server. Karena itu, argumen tersebut mengarah ke harness.
Apakah aman mengikat Web UI dsh ke 0.0.0.0 pada VPS publik?
Tidak. Web UI adalah antarmuka kontrol untuk agent yang menjalankan perintah shell dan mengedit file sebagai pengguna yang menjalankan dsh. Pratinjau developer tidak menyediakan layar login sama sekali. Mengikatnya ke semua interface pada IP publik berarti siapa pun yang dapat menjangkau port 3080 dapat menjalankan perintah pada server Anda. Pertahankan binding pada 127.0.0.1, tutup port 3080 di firewall, dan gunakan tunnel SSH, jaringan overlay privat, atau reverse proxy yang memerlukan password.
Bagaimana agar Web UI dsh tetap berjalan setelah saya menutup sesi SSH?
npx @deepseek-ai/dsh web foreground merupakan child dari login shell Anda, sehingga proses tersebut dihentikan ketika shell itu keluar. Jalankan di dalam sesi tmux lalu detach dengan Ctrl-b d, atau jalankan sebagai systemd user service dengan lingering yang diaktifkan. Tunnel dan harness tidak saling bergantung. Anda dapat menghentikan dan membuat ulang tunnel SSH sesering yang diperlukan tanpa memengaruhi harness yang sedang berjalan, selama harness itu sendiri memiliki parent yang tetap berjalan lebih lama daripada login Anda.
Mengapa Web UI dsh berhenti merespons di tengah agent run yang panjang di belakang nginx?
Karena default proxy_read_timeout nginx adalah 60 detik. Nginx akan menutup koneksi yang tidak menghasilkan data selama satu menit, padahal agent step yang panjang dapat dengan mudah mengalami kondisi tersebut. Atur proxy_read_timeout 3600s; di blok location. Tambahkan proxy_buffering off; agar output dialirkan ke browser saat tersedia, lalu teruskan header Upgrade dan Connection dengan proxy_http_version 1.1; agar WebSocket handshake berhasil. Tanpa header tersebut, halaman dapat dimuat, tetapi tidak pernah menerima pembaruan.