SSD Nodes Learn Hosting plans →
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-26

dsh web: http://127.0.0.1:3080 কেন দেখায়

dsh Web UI শুধু localhost-এ bind হওয়ায় http://127.0.0.1:3080 দেখায়। SSH tunnel দিয়ে নিরাপদে খুলুন, আর 3080 প্রকাশ করা কেন ঝুঁকিপূর্ণ জানুন।

What dsh web: http://127.0.0.1:3080 বোঝায়

VPS-এ DeepSeek Harness web profile চালু করলে এটি দুটি লাইন দেখিয়ে অপেক্ষা করে:

dsh web: http://127.0.0.1:3080
Ready.

127.0.0.1 হলো loopback address। কোনো মেশিন নিজেকেই যে address ব্যবহার করে যোগাযোগ করে, এটি সেটি। 127.0.0.1-এ bind করা socket একই মেশিনের process থেকে আসা connection গ্রহণ করে, অন্য কোথাও থেকে নয়। তাই ওই লাইনটি একই সঙ্গে দুটি বিষয় জানায়: Web UI কোথায় listening করছে এবং কারা এতে পৌঁছাতে পারবে। শুধু যে মেশিনে dsh চলছে, সেটিই এতে পৌঁছাতে পারে।

এই কারণেই আপনার laptop-এর browser-এ URL paste করলে কিছু হয় না। আপনার laptop-এর 127.0.0.1 হলো আপনার laptop। Harness যে VPS-এ চলছে, তার 127.0.0.1-এ listening করছে। এটি আলাদা loopback stack-সহ আলাদা মেশিন। কোনো কিছু নষ্ট হয়নি। আপনাকে connection-টি অন্য মেশিনে পৌঁছে দিতে হবে।

Official README-তে default বিষয়টি স্পষ্টভাবে বলা আছে: "The command starts the Web UI, served at http://127.0.0.1:3080 by default." Bind address আসে webserver host plugin, @deepseek-ai/dsh-host-webserver থেকে। এর host key-এর documentation-এ লেখা আছে: "Listen host; the two supported values are loopback and all-interfaces"। আপনি পরিবর্তন না করলে loopback-ই ব্যবহার হবে। Port আপনার কাছে নতুন হলে, Linux-এ port কীভাবে কাজ করে এই address-plus-port model ব্যাখ্যা করে, যার ওপর পুরো ব্যবস্থা নির্ভর করে।

Web UI কেন শুধু localhost-এ bind করে

dsh হলো একটি agent harness, অর্থাৎ model-কে ঘিরে চলা program। এটি loop, tool call এবং ওই call-গুলো যে permission-এর অধীনে চলে, সেগুলো নিয়ন্ত্রণ করে। Browser tab এমন একটি process-এর control surface, যা shell command চালায়, আপনার নির্ধারিত workspace directory-র file পড়ে ও লেখে এবং আপনার model API key ব্যবহার করে। যে কেউ ওই page load করতে পারলে dsh চালানো user হিসেবে এসব কাজ করতে পারবে। এই access পাওয়ার একমাত্র পথ network নয়। আপনি যে plugin install করেন, সেটিও একই process-এর ভিতরে একই permission নিয়ে চলে। তাই install করার আগে dsh plugin যাচাই করা server কোন port-এ listen করবে তা নির্ধারণের মতোই সতর্কতার দাবি রাখে।

তাই port 3080 কোনো read-only dashboard নয়। ওই page load করলে server-এ command execution-এর access পাওয়া যায়।

Web UI খুললে সরাসরি session list দেখা যায়। কোনো login prompt নেই, কারণ developer preview-তে user account বা remote authentication নেই। loopback-এ এটি সঙ্গতিপূর্ণ। সেখানে operating system-ই access control হিসেবে কাজ করে, এবং শুধু local process-গুলো access পায়। একই server-কে public IP-যুক্ত VPS-এ 0.0.0.0-এ bind করলে ওই page পুরো Internet-এর অনুরোধের জবাব দেবে, সামনে কোনো protection layer ছাড়াই। Automated scanner-গুলো নিয়মিত uncommon port scan করে। তাই প্রকাশিত 3080 port-কে ইতিমধ্যেই শনাক্ত হয়েছে বলে ধরে নিন।

Firewall-এ port 3080 খুলবেন না এবং public VPS-এ webserver-এর host-কে 0.0.0.0 সেট করবেন না। এই সমন্বয় server-এ command execution-এর access প্রথমে connect করা ব্যক্তির হাতে তুলে দেয়।

Server-এ চালানো প্রতিটি agent runtime-এর ক্ষেত্রেই একই যুক্তি প্রযোজ্য। তাই VPS-এ coding agent নিরাপদে চালানো একই নিয়ম দিয়ে শুরু হয়: agent-এর control port private থাকবে, এবং আপনার বিশ্বস্ত কোনো ব্যবস্থা আপনাকে সেখানে পৌঁছে দেবে।

ল্যাপটপ থেকে dsh Web UI কীভাবে খুলব?

এর 3টি নিরাপদ ও বাস্তবসম্মত উপায় আছে। প্রতিটি উপায়েই harness loopback-এ bound থাকে।

  • একটি SSH tunnel। Public interface-এ নতুন কোনো listening service চালু হয় না, এবং আপনার কাছে আগে থেকেই credentials আছে। এই পদ্ধতিই ব্যবহার করুন।
  • একটি private overlay network। এতে UI শুধু আপনার নিজের device-গুলো থেকে reachable থাকে এবং অন্য সবার কাছ থেকে অদৃশ্য থাকে।
  • এমন একটি reverse proxy, যা TLS (transport layer security) termination করে এবং কোনো request forward করার আগে password চায়।

পার্থক্য হলো, কোন উপায়ে আপনার browser loopback-এ পৌঁছায়। কোনো পদ্ধতিতেই harness-কে loopback থেকে সরানো উচিত নয়।

SSH tunnel ব্যবহার করে এতে পৌঁছান

এটি আপনার laptop-এ চালান, VPS-এ নয়:

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

এটি চালু রাখুন। এরপর আপনার local browser-এ http://127.0.0.1:3080 খুলুন। Web UI লোড হবে।

-L argument-এ colon দিয়ে আলাদা করা তিনটি field থাকে। প্রথমটি আপনার laptop-এ খোলার port। দ্বিতীয় এবং তৃতীয়টি হলো প্রতিটি connection যে address ও port-এ forward হবে। গুরুত্বপূর্ণ বিষয় হলো, মাঝের field-এর 127.0.0.1 VPS-এর SSH server দ্বারা resolve হয়, আপনার traffic সেখানে পৌঁছানোর পরে। এটি আপনার laptop-এর loopback নয়, VPS-এর loopback। dsh যে address দেখিয়েছে, সেটিই সেই address। তাই সরাসরি browser connection ব্যর্থ হলেও tunnel কাজ করে।

-N SSH-কে remote command না চালাতে বলে। ফলে shell না খুলে শুধু forwarder পাওয়া যায়। কোনো background tunnel নীরবে ব্যর্থ না হয়ে স্পষ্টভাবে ব্যর্থ হওয়ার জন্য:

ssh -N -f -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 -L 3080:127.0.0.1:3080 you@your-vps

-f authentication-এর পরে এটিকে background-এ পাঠায়। ExitOnForwardFailure=yes-এর গুরুত্ব প্রথমে যতটা মনে হয়, তার চেয়ে বেশি। এটি না থাকলে forward সেট up না হলেও SSH সফলভাবে connect করে। ফলে session চালু থাকে, কিন্তু tunnel মৃত থাকে এবং কোনো সতর্কতা দেখা যায় না। ServerAliveInterval=30 প্রতি 30 সেকেন্ডে keepalive পাঠায়। এতে café ও hotel router-এর NAT (network address translation) timeout-এর পরও idle tunnel চালু থাকে।

আপনার যা দেখা উচিত

VPS-এ সত্যিই কী listening করছে, তা যাচাই করুন:

ss -ltnp | grep 3080

সুস্থ অবস্থার output-এ loopback address দেখা যায়:

LISTEN 0  511  127.0.0.1:3080  0.0.0.0:*  users:(("node",pid=1042,fd=21))

local address column-এ যদি 0.0.0.0:3080 থাকে, তাহলে Web UI সব interface-এ চলছে, public interface-সহ। অন্য কিছু করার আগে এটি বন্ধ করুন এবং bind address ঠিক করুন। ss socket দেখালেও users: field খালি রাখলে sudo দিয়ে চালান। অন্য user-এর মালিকানাধীন socket-এর process name না হলে লুকানো থাকে।

Tunnel চালু হতে না চাইলে

SSH এই বার্তা দেখিয়ে বন্ধ হয়ে যায়:

bind [127.0.0.1]:3080: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 3080

এটি server-এর সমস্যা নয়, আপনার laptop-এর সমস্যা। কোনো local process ইতিমধ্যে port 3080 ব্যবহার করছে। প্রায়ই এটি আগের কোনো ভুলে যাওয়া tunnel হয়। একটি খালি local port বেছে নিন:

ssh -N -L 3081:127.0.0.1:3080 you@your-vps

শুধু প্রথম field পরিবর্তন হয়েছে। তাই এখন http://127.0.0.1:3081-এ browse করবেন, আর harness 3080-এ listening চালিয়ে যাবে। দুটি সংখ্যার এক হওয়ার দরকার নেই।

Tunnel চালু হলেও browser যদি refused connection বা empty reply দেখায়, তাহলে traffic VPS-এ পৌঁছেছে, কিন্তু remote প্রান্তে কিছু listening পায়নি। হয় dsh বন্ধ হয়ে গেছে, অথবা এটি অন্য port-এ bind করেছে। server-এ ss -ltnp | grep 3080 দিয়ে পরীক্ষা করুন।

এখানে আরেকটি বিষয় সমস্যা তৈরি করে। foreground npx @deepseek-ai/dsh web-এর shell বন্ধ হলে সেটিও বন্ধ হয়ে যায়। ফলে আপনি logout করার সঙ্গে সঙ্গে harness থেমে যায়। এটি tmux-এর ভিতরে অথবা systemd user service হিসেবে চালু করুন। VPS-এ coding agent চালু রাখার পদ্ধতিতে একই সমস্যার সমাধান করা হয়েছে। SSH নিয়ে কাজ করার সময় আপনার VPS-এর SSH শক্তিশালী করা আগে করা ভালো, কারণ tunnel-এর ফলে আপনার SSH login-ই agent-এ পৌঁছানোর একমাত্র প্রবেশপথ হয়ে যায়।

এটি private overlay network-এর মাধ্যমে ব্যবহার করুন

একটি overlay network আপনার VPS এবং laptop-কে এমন একটি private network-এ address দেয়, যেখানে শুধু আপনার ডিভাইসগুলো যুক্ত হয়। Tailscale এ ক্ষেত্রে সাধারণ পছন্দ, এবং এর serve command এই ব্যবহারের জন্য উপযুক্ত: tailscaled VPS-এ চলে এবং নিজেই localhost:3080-এর সঙ্গে সংযুক্ত হয়। ফলে harness loopback-এ থাকে এবং dsh কীভাবে configured আছে, তা পরিবর্তন করতে হয় না।

tailscale serve --bg localhost:3080
tailscale serve status

এরপর public interface-এ কোনো port খোলা না রেখেই আপনার tailnet-এর ভেতরে মেশিনের name ব্যবহার করে HTTPS-এর মাধ্যমে UI-তে পৌঁছানো যায়। এর জন্য tailnet-এর জন্য HTTPS certificate enabled থাকতে হবে। তা না হলে serve দেখানোর মতো কোনো certificate পাবে না। আবার বন্ধ করতে off দিয়ে command-টি চালান:

tailscale serve --https=443 off

serve ব্যবহার করুন, funnel নয়। Funnel একই target public internet-এ প্রকাশ করে। এতে আপনি আবার open port-এ unauthenticated agent runtime-এর অবস্থায় ফিরে যাবেন। দুটি command দেখতে প্রায় একই হলেও কাজ সম্পূর্ণ বিপরীত। তাই যেকোনো একটি type করার আগে Tailscale Serve এবং Funnel-এর পার্থক্য পড়ুন। সেটআপের জন্য private network হিসেবে Tailscale দেখুন।

পাসওয়ার্ড যাচাই করে এমন reverse proxy-এর মাধ্যমে অ্যাক্সেস করুন

এই বিকল্পে সত্যিই একটি port Internet-এ প্রকাশ করা হয়। তাই authentication-ই আপনার server-এ কোনো অপরিচিত ব্যক্তির command execution-এর পথে একমাত্র বাধা। একাধিক ব্যক্তির UI ব্যবহার করার প্রয়োজন হলে এবং প্রত্যেকের জন্য আলাদা tunnel চালানো বাস্তবসম্মত না হলে এটি বেছে নিন।

harness 127.0.0.1:3080-এ চলছে। nginx একই box-এ চলছে, তাই এটি loopback-এ পৌঁছাতে পারে। এটি certificate এবং password file সহ 443 port-এ listening করছে।

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;
    }
}

password file তৈরি করে reload করুন:

sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/dsh.htpasswd you
sudo nginx -t && sudo systemctl reload nginx

nginx -t-এর আউটপুটে syntax is ok-এর পরে test is successful দেখা উচিত। file নষ্ট থাকলে reload ব্যর্থ হয় এবং চলমান configuration অপরিবর্তিত থাকে। তাই অন্ধভাবে restart না করে error পড়ুন।

proxy-এর ওই তিনটি line শুধু দেখানোর জন্য নয়। Upgrade এবং Connection header WebSocket handshake চলতে দেয়। এগুলো না থাকলে page load হয়, কিন্তু আর update হয় না। proxy_read_timeout 3600s 60 second-এর default timeout প্রতিস্থাপন করে। অন্যথায় দীর্ঘ agent run মাঝপথে response বন্ধ করে দেয় এবং UI-কে স্থির দেখায়। proxy_buffering off model output response সম্পূর্ণ হওয়া পর্যন্ত ধরে না রেখে আসার সঙ্গে সঙ্গে browser-এ পাঠায়। nginx reverse proxy configuration, line by line বাকি বিষয়টি ব্যাখ্যা করে। nginx, Caddy এবং Traefik-এর মধ্যে বেছে নেওয়া automatic certificate ব্যবহার করে একই কাজ করার পদ্ধতি দেখায়।

আপনি যে proxy-ই বেছে নিন, firewall-এ 3080 বন্ধ রাখুন, যাতে প্রবেশের একমাত্র পথ authenticated proxy-এর মাধ্যমে হয়। ufw firewall-এর প্রাথমিক বিষয় rule-গুলো ব্যাখ্যা করে। TLS-এর ওপর Basic authentication একটি ন্যূনতম সুরক্ষা, সম্পূর্ণ security model নয়। যে ব্যক্তির কাছে ওই password আছে, তার কাছে আপনার server-এর shell-ও আছে। সম্ভব হলে tunnel ব্যবহার করুন।

dsh যে port-এ web server চালায়, সেটি কীভাবে পরিবর্তন করব?

--port web application-এর অন্তর্ভুক্ত, launcher-এর নয়। CLI documentation-এ এর সরাসরি উদাহরণ দেওয়া আছে:

dsh --profile web --port 8080

dsh web হলো --profile web-এর alias, তাই dsh web --port 8080 একই command। launcher শুধু নিজের flags parse করে এবং এরপরের সবকিছু boot করা profile-এর কাছে পাঠায়। তাই launcher flags আগে দিতে হবে, এবং launcher যে প্রথম token চিনতে পারে না, সেখান থেকেই application-এর arguments শুরু হয়। --port profile-এর পরে দিন, আগে নয়।

command যে URL print করে, সেটি পড়ুন। অনুমান করবেন না। ওই line-এ server যে address-এ সত্যিই bind করেছে, সেটি দেখানো হয়। এরপর tunnel-এর শেষ field-টি সেই address অনুযায়ী update করুন:

ssh -N -L 3080:127.0.0.1:8080 you@your-vps

স্থায়ীভাবে পরিবর্তন করতে হলে port command line-এ নয়, profile configuration-এ নির্ধারণ করতে হবে। web এবং headless profile প্রথমবার ব্যবহারের সময় ~/.dsh-এর অধীনে shipped template থেকে স্বয়ংক্রিয়ভাবে initialised হয়। আপনার API key এবং model endpoint-এর settings-ও একই directory-তে থাকে। তাই এই files edit করার সময় dsh key, model ও endpoint configure করা companion হিসেবে পড়ুন। সব layer একত্রে প্রয়োগ হওয়ার পরে কার্যকর configuration দেখতে:

dsh --dump-config

webserver plugin ঠিক দুটি key প্রকাশ করে: host এবং portport-কে 0 সেট করলে operating system-এর কাছে একটি free port চাওয়া হয়। Documentation-এ এটিকে বলা হয়েছে, "zero requests an OS-assigned port"। এতে port conflict এড়ানো যায়। তবে tunnel-এর জন্য এটি উপযুক্ত নয়, কারণ প্রতিটি restart-এ port number পরিবর্তিত হয়।

dsh কেন “address already in use” ত্রুটি দেখায়?

কারণ অন্য একটি process ইতিমধ্যে ওই address ও port দখল করে আছে। তাই kernel দ্বিতীয় bind প্রত্যাখ্যান করে। Node এটি এভাবে দেখায়:

Error: listen EADDRINUSE: address already in use 127.0.0.1:3080

কিছু পরিবর্তন করার আগে কোন process এটি ব্যবহার করছে তা শনাক্ত করুন:

sudo ss -ltnp | grep 3080

users:(("node",pid=1042,fd=21)) field-এ process-এর নাম ও PID থাকে। সাধারণত কারণটি হয় আগের একটি dsh, যেটি বন্ধ হয়েছে বলে আপনি ভেবেছিলেন, কিন্তু detached tmux window-তে সেটি এখনও চলমান। kill 1042 দিয়ে সেটি বন্ধ করুন, অথবা নতুন instance-টি অন্য port-এ চালু করুন। মনে রাখবেন, 127.0.0.1:3080 এবং 0.0.0.0:3080 একে অপরের সঙ্গেও conflict করে, কারণ সব interface-এ bind করলে loopback-ও অন্তর্ভুক্ত হয়।

সংস্করণ নির্দিষ্ট করুন, কারণ এটি একটি developer preview

README-তে বিষয়টি স্পষ্টভাবে বলা আছে: DeepSeek Harness এখন developer preview পর্যায়ে রয়েছে এবং দ্রুত পরিবর্তন হচ্ছে। সামঞ্জস্য নষ্ট করতে পারে এমন পরিবর্তনও আসবে। এই গতিই যদি আপনার দ্বিধার কারণ হয়, তাহলে dsh, Claude Code এবং Omnigent-এর তুলনা একই পরিবর্তনধারার ভিন্ন পর্যায়ে থাকা দুটি harness-এর সঙ্গে এটি তুলনা করে।

প্রতিবার চালানোর সময় npx @deepseek-ai/dsh web সর্বশেষ প্রকাশিত সংস্করণে resolve হয়। এক সপ্তাহ ধরে অপরিবর্তিত থাকা কোনো server পরবর্তীবার চালু হলে ভিন্ন flag-সহ অন্য একটি CLI চালু করতে পারে। Restart যেন upgrade না হয়ে যায়, তাই সংস্করণ নির্দিষ্ট করুন:

npx @deepseek-ai/dsh@0.1.0-rc.7 web

August 2026 অনুযায়ী প্রকাশিত package-এর সংস্করণ 0.1.0-rc.7। গ্রহণ করার আগে bare npx কী আনবে, তা পরীক্ষা করুন:

npm view @deepseek-ai/dsh version

Pin করা সংস্করণ install হতে না চাইলে, অথবা নতুন সংস্করণ pin করার পরও npx পুরোনো build চালু করতে থাকলে, এতে দেখা install ও version error-এ npx cache পরিষ্কার করা এবং Node-এর সঙ্গে bundled npm কোনটি ব্যবহৃত হচ্ছে তা পরীক্ষা করার পদ্ধতি আছে।

Preview release-গুলোর মধ্যে flag launcher এবং web application-এর মধ্যে স্থানান্তরিত হতে পারে। --port এই guide-এ বর্ণিতভাবে কাজ করা বন্ধ করলে অনুমান না করে application-এর নিজস্ব flag list দেখুন:

dsh --profile web --help

শুধু install, workspace setup এবং model key-এর জন্য VPS-এ DeepSeek Harness install করা দেখুন। শুধু access ধাপটির সংক্ষিপ্ত নির্দেশনার জন্য VPS-এ dsh Web UI-তে প্রবেশ করা tunnel ব্যবহারের পদ্ধতি দেখায়, তবে reasoning ছাড়া।

FAQ

আমি আমার laptop browser-এ http://127.0.0.1:3080 খুলতে পারছি না কেন?

কারণ 127.0.0.1 বলতে আপনি যে মেশিনে কমান্ড লিখছেন সেটিকে বোঝায়। DeepSeek Harness Web UI VPS-এর loopback address-এ bind করা আছে, তাই শুধু VPS-এর process-গুলো এতে connect করতে পারে। আপনার laptop-এর loopback আলাদা, এবং সেখানে port 3080-এ কিছু listening করছে না। ssh -N -L 3080:127.0.0.1:3080 you@your-vps ব্যবহার করে SSH-এর মাধ্যমে port forward করুন, তারপর localভাবে http://127.0.0.1:3080 খুলুন। -L argument-এর মাঝের field server side-এ resolve হয়। এ কারণেই এটি harness-কে নির্দেশ করে।

Public VPS-এ dsh Web UI-কে 0.0.0.0-এ bind করা কি নিরাপদ?

না। Web UI এমন একটি agent-এর control surface, যা dsh হিসেবে shell command চালায় এবং file সম্পাদনা করে। Developer preview-তে কোনো login screen-ও নেই। Public IP-এর সব interface-এ bind করলে port 3080-এ পৌঁছাতে পারে এমন যে কেউ আপনার server-এ command execute করতে পারবে। Bind 127.0.0.1-এ রাখুন, firewall-এ 3080 বন্ধ রাখুন, এবং password প্রয়োজন এমন একটি SSH tunnel, private overlay network অথবা reverse proxy ব্যবহার করুন।

SSH session বন্ধ করার পর dsh Web UI কীভাবে চালু রাখব?

Foreground npx @deepseek-ai/dsh web আপনার login shell-এর child process। তাই shell exit করলে এটি killed হয়। এটি একটি tmux session-এর ভিতরে চালু করে Ctrl-b d দিয়ে detach করুন, অথবা lingering enabled থাকা অবস্থায় systemd user service হিসেবে চালান। Tunnel এবং harness স্বাধীনভাবে কাজ করে। Harness চালু থাকা অবস্থায় যতবার ইচ্ছা SSH tunnel বন্ধ করে আবার তৈরি করতে পারেন, যদি harness নিজে এমন একটি parent process-এর অধীনে থাকে যা আপনার login-এর চেয়ে বেশি সময় চালু থাকে।

nginx-এর পেছনে দীর্ঘ agent run চলার সময় dsh Web UI মাঝপথে freeze করে কেন?

কারণ nginx-এর default proxy_read_timeout হলো 60 seconds। তাই এক মিনিট কোনো data না এলে এটি connection বন্ধ করে দেয়। দীর্ঘ agent step-এ এমনটি সহজেই ঘটতে পারে। proxy_read_timeout 3600s;-কে location block-এ সেট করুন। Output browser-এ আসার সঙ্গে সঙ্গে stream করার জন্য proxy_buffering off; যোগ করুন। WebSocket handshake সফল করতে proxy_http_version 1.1; দিয়ে Upgrade এবং Connection header পাঠান। এই header-গুলো না থাকলে page load হয়, কিন্তু কোনো update পায় না।