SSD Nodes Learn 🎉 VPS $5.50/माह से
गाइड Matt Connorलेखक: Matt Connor · अपडेट किया गया: 2026-08-21

dsh configuration और API key सेटअप कैसे करें

Linux पर dsh configuration फाइलें कहाँ होती हैं और DeepSeek API key या Ollama endpoint को कैसे जोड़ें। यह गाइड स्पष्ट करती है कि कौन सा डेटा आपके सर्वर से बाहर जाता है।

dsh अपनी configuration कहाँ रखता है

dsh (DeepSeek Harness) अपनी configuration को एक directory में रखता है: $DSH_HOME, जो डिफ़ॉल्ट रूप से ~/.dsh होती है। Web UI में आप जो कुछ भी सेट करते हैं, वह वहाँ plain files के रूप में लिखा जाता है। उस directory को किसी दूसरे सर्वर पर copy करें और नया सर्वर पुराने की तरह ही व्यवहार करेगा।

चार paths में वह सब कुछ होता है जिसे आप इस्तेमाल करेंगे।

  • ~/.dsh/settings.yaml में हाथ से लिखी गई और UI द्वारा लिखी गई settings होती हैं, जिसमें आपके provider और model routes शामिल हैं।
  • ~/.dsh/.credentials.yaml में secrets रखे जाते हैं। Settings में केवल credential का reference होता है, इसलिए key की वास्तविक value एक ही file में रहती है।
  • ~/.dsh/profiles/ में named profiles होती हैं, और ~/.dsh/storages/ में saved sessions होते हैं।
  • ~/.dsh/cordis.patch.yml आपकी अपनी patch layer है। इसे हर profile के लिए built-in configuration के ऊपर लागू किया जाता है।

DeepSeek ने 17 August 2026 को MIT-licensed developer preview के रूप में इस harness की घोषणा की थी, और README में कहा गया है कि इसमें compatibility तोड़ने वाले बदलाव होंगे। इस guide में field के नाम और paths, August 2026 तक की repository documentation से मेल खाते हैं। किसी भी guide से config copy करने से पहले, उसे अपने द्वारा install किए गए version की docs के साथ मिला लें, क्योंकि preview version में releases के बीच नाम बदल दिए जाते हैं।

शुरुआती आउटपुट के लिए न्यूनतम आवश्यक जानकारी

dsh को Node.js 22.19 या बाद का 22 लाइन वाला वर्ज़न, या 24 और उससे ऊपर का वर्ज़न चाहिए। Node 23 इस रेंज से बाहर है। सबसे पहले वर्ज़न की जाँच करें, क्योंकि वर्ज़न मेल न खाने पर स्टार्टअप विफल हो जाता है और एरर ऐसा दिखता है जैसे कोई पैकेज खराब हो।

node -v
npx @deepseek-ai/dsh web

npx npm रजिस्ट्री से पैकेज डाउनलोड करता है और http://127.0.0.1:3080 पर Web UI शुरू करता है। यह loopback एड्रेस पर बाइंड होता है, जिसका अर्थ है कि यदि आपका फायरवॉल अनुमति भी दे, तब भी यह पोर्ट किसी अन्य मशीन से एक्सेस नहीं किया जा सकता। VPS पर, इसे इंटरनेट के लिए 3080 खोलने के बजाय SSH के माध्यम से फॉरवर्ड करें।

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

अपने लैपटॉप पर http://127.0.0.1:3080 खोलें, फिर Settings और Models पर जाएँ। DeepSeek कार्ड में एक API key फ़ील्ड है। platform.deepseek.com से की (key) पेस्ट करें और सेव करें। मॉडल रूट तुरंत उपयोग योग्य हो जाता है, बिना किसी रीस्टार्ट के, क्योंकि चल रहा सर्वर क्रेडेंशियल को स्टोर करता है और रेफरेंस को लाइव रिज़ॉल्व करता है। रिमोट सर्वर पर dsh Web UI तक पहुँचना टनल और रिवर्स प्रॉक्सी केस को कवर करता है, और DeepSeek Harness को VPS पर इंस्टॉल करना उस सर्वर तैयारी को कवर करता है जिसे यह गाइड मानकर चलती है।

सेव करने के बाद, देखें कि ऐप ने क्या बनाया है।

ls -la ~/.dsh
stat -c '%a %n' ~/.dsh/.credentials.yaml

आपको settings.yaml, .credentials.yaml और profiles/ दिखाई देना चाहिए। यदि stat, 600 के अलावा कोई अन्य मोड प्रिंट करता है, तो chmod 600 ~/.dsh/.credentials.yaml चलाएँ। ग्रुप-रीडेबल या वर्ल्ड-रीडेबल क्रेडेंशियल फ़ाइल आपकी की (key) को बॉक्स पर मौजूद अन्य सभी अकाउंट्स को दे देती है।

बिना ब्राउज़र के पहली बार चलाने के लिए, एक कमांड पर्याप्त है।

npx @deepseek-ai/dsh --profile headless "summarise the files in this directory"

हेडलेस प्रोफाइल एक सिंगल सेशन चलाता है और अंतिम उत्तर प्रिंट करता है।

Environment variables या config file

dsh को key देने के दो तरीके हैं, और वे एक-दूसरे के स्थान पर इस्तेमाल नहीं किए जा सकते।

एक catalog provider (DeepSeek, Anthropic, OpenAI, और बाकी built-in list) अपनी key Models page के माध्यम से लेता है। मान ~/.dsh/.credentials.yaml में जाता है, और आपकी settings में केवल उसका reference रहता है। Web UI इसे save करने के बाद key को दोबारा कभी नहीं दिखाता।

एक custom provider इसके बजाय एक environment variable का नाम दे सकता है, apiKeyEnv के साथ। यह वह प्रारूप है जो documentation ~/.dsh/settings.yaml के लिए देता है।

llm-pi-ai:
  providers:
    my-gateway:
      apiKeyEnv: GATEWAY_API_KEY
      api: openai-completions
      baseURL: https://gateway.example/v1
      models:
        - id: legacy-chat
        - id: vision-preview
          input: [text, image]

पहले Web UI के माध्यम से एक provider जोड़ें, फिर ~/.dsh/settings.yaml खोलें और उसके द्वारा लिखी गई संरचना (structure) को copy करें। Developer preview के दौरान nesting वह हिस्सा है जिसके बदलने की सबसे अधिक संभावना है, और app द्वारा अभी लिखी गई file हमेशा current होती है।

apiKeyEnv को dsh process के environment से पढ़ा जाता है, न कि आपके login shell से। Interactive session में export की गई key एक systemd unit के लिए अदृश्य होती है, इसलिए वही config जो हाथ से dsh web टाइप करने पर काम करती है, service के अंतर्गत MISSING_CREDENTIAL error देती है। Unit को उसकी अपनी file दें।

[Service]
EnvironmentFile=/etc/dsh/dsh.env

उस file को mode 600 पर रखें, जिसका owner वही user हो जिसके अंतर्गत service चलती है।

मॉडल का चयन, और वह ID जिसे आप रीनेम नहीं कर सकते

प्रत्येक कॉन्फ़िगर किया गया provider मॉडल पिकर में दिखाई देता है। किसी मॉडल को चुनने पर वह नए सत्रों (sessions) के लिए डिफ़ॉल्ट बन जाता है। जो सत्र पहले से मौजूद हैं, उनमें वही मॉडल रिकॉर्ड रहता है, इसलिए मॉडल बदलने से पुरानी बातचीत दोबारा नहीं लिखी जाती।

Provider ID स्थायी होती है। अनुरोध, सहेजे गए सत्र, मॉडल डिफ़ॉल्ट और क्रेडेंशियल संदर्भ सभी इसी की ओर इशारा करते हैं, इसलिए इसमें रीनेम करने का कोई बटन नहीं है। इसे बदलने का अर्थ है एक नया provider बनाना और पुराने को हटाना। ऐसा नाम चुनें जिसे आप लंबे समय तक रख सकें: local-ollama न कि test2

जब तक आप अन्यथा घोषित न करें, मॉडल केवल टेक्स्ट-ओनली होते हैं। इमेज सपोर्ट घोषित करने के लिए मॉडल प्रविष्टि में input: [text, image] जोड़ें, या उन मॉडलों के लिए जो कैटलॉग में वर्णित नहीं हैं, रूट स्तर पर defaultInput सेट करें। DeepSeek का अपना chat-completions रूट टेक्स्ट-ओनली है और इसे अन्यथा कॉन्फ़िगर नहीं किया जा सकता, इसलिए उस रूट से जुड़ी किसी भी इमेज को कुछ भी भेजने से पहले ही अस्वीकार कर दिया जाता है।

dsh को एक local endpoint पर point करें ताकि आपका code box पर ही रहे

Ollama, http://127.0.0.1:11434/v1 पर एक OpenAI-compatible API serve करता है। dsh एक custom provider के माध्यम से किसी भी OpenAI-compatible base URL से बात करता है, इसलिए दोनों के बीच कुछ भी रखे बिना वे आपस में जुड़ जाते हैं। पहले model server set up करें: Ollama के साथ VPS पर LLM को self-host करना में install और model pull करने की जानकारी दी गई है।

dsh को छूने से पहले confirm करें कि endpoint जवाब दे रहा है।

ollama list
curl -s http://127.0.0.1:11434/v1/models

ollama list आपके द्वारा pull किए गए हर model का exact tag print करता है। उस string को copy करें। curl उन्हीं models को JSON के रूप में return करता है। खाली list का मतलब है कि Ollama चल रहा है लेकिन कोई model pull नहीं किया गया है। Connection refused का मतलब है कि Ollama नहीं चल रहा है, या 11434 port पर listen नहीं कर रहा है।

अब provider जोड़ें। Ollama को एक API key field की आवश्यकता होती है और यह उसकी value को ignore करता है, इसलिए कोई भी non-empty string काम करेगी।

llm-pi-ai:
  providers:
    local-ollama:
      apiKeyEnv: OLLAMA_API_KEY
      api: openai-completions
      baseURL: http://127.0.0.1:11434/v1
      models:
        - id: <the exact tag printed by ollama list>

उस variable को export करें जहाँ dsh process उसे देख सके।

sudo install -d -m 700 /etc/dsh
printf 'OLLAMA_API_KEY=ollama\n' | sudo tee /etc/dsh/dsh.env
sudo chmod 600 /etc/dsh/dsh.env

इस प्रयास में होने वाली लगभग हर समस्या तीन failures में से एक होती है। MISSING_CREDENTIAL का मतलब है कि dsh, apiKeyEnv द्वारा नामित variable को पढ़ नहीं सका, इसलिए अपने terminal के environment के बजाय process के environment की जाँच करें। UNKNOWN_MODEL का मतलब है कि id किसी configured model से मेल नहीं खाता, इसलिए colon के बाद के tag सहित, ollama list के साथ character-by-character मिलान करें। उपलब्ध models को fetch करते समय 401 error model discovery से आता है, जो आपके base URL पर GET /models को call करता है; जो endpoints उस path को serve नहीं करते, उनके models को हाथ से type करना पड़ता है।

एक और trap base URL है। इसे /v1 के बिना छोड़ने पर requests उन paths पर पहुँचती हैं जिन्हें Ollama serve नहीं करता, इसलिए call 404 के रूप में वापस आती है और model कभी run नहीं होता। यह suffix OpenAI-compatible surface का हिस्सा है, न कि कोई सजावट।

यदि Ollama किसी दूसरी machine पर चलता है, तो उस machine का address base URL बन जाता है, और आपके prompts plain HTTP पर cleartext में network से होकर गुजरते हैं। इसे उसी host पर रखें, या TLS (transport layer security) और authentication के पीछे रखें: exposed Ollama endpoint को secure करना

प्रत्येक मोड में मशीन से क्या बाहर जाता है

DeepSeek key के साथ, प्रत्येक request DeepSeek के API पर जाती है। उस request में आपका prompt, उन फाइलों की सामग्री जिन्हें agent ने उत्तर देने के लिए पढ़ा, उसके द्वारा चलाए गए commands का output, और कोई भी tool result शामिल होता है जिसे उसने जोड़ने का निर्णय लिया। जब भी agent ने कोई फाइल खोली है, आपका source code उस payload के भीतर होता है। एक hosted model इसी तरह काम करता है, और यही कारण है कि आपको यह सोचना चाहिए कि आप किस directory में agent को start करते हैं।

किसी अन्य catalog provider या company gateway के साथ, वही payload उस vendor के पास जाता है। Base URL आपको ठीक-ठीक बताता है कि वह कहाँ है।

Local endpoint के साथ, model request 127.0.0.1:11434 पर जाती है और मशीन पर ही रहती है। आपके code का कोई भी हिस्सा model vendor तक नहीं पहुँचता है। फिर भी तीन चीजें network से होकर गुजरती हैं। npx npm registry से package download करता है। Agent द्वारा चलाया गया कोई भी tool अपने आप internet तक पहुँच सकता है, जिसमें आपके द्वारा connect किए गए MCP (model context protocol) servers भी शामिल हैं, जिसे running MCP servers on a VPS विस्तार से कवर करता है। और telemetry, यदि आप इसे चालू करते हैं।

Telemetry तब तक बंद रहती है जब तक आप opt in नहीं करते। DSH_TELEMETRY_MODE सहमति स्विच है, और unset, empty या unrecognised values का परिणाम DISABLED होता है। उस स्थिति में dsh कोई OpenTelemetry (OTel) provider, processor या exporter नहीं बनाता है, इसलिए एक नया profile कोई telemetry network request नहीं करता है। FEEDBACK_ONLY feedback-triggered session log sharing के लिए opt in करता है। FULL launcher reporting की भी अनुमति देता है। Session feed session content, tool data, prompts और workspace paths को export कर सकता है, इसलिए FULL को DeepSeek को अपना काम भेजने के समान मानें।

एक hard stop के लिए जो mode string को सही करने पर निर्भर नहीं है, DSH_TELEMETRY_DISABLED=1 सेट करें। कोई भी non-empty value एक आधिकारिक opt-out है, और इसे run शुरू होने से पहले पढ़ा जाता है, इसलिए project code session के बीच में इसे वापस चालू नहीं कर सकता है। Default collector address harness-telemetry.deepseeksvc.com है, जो आपके firewall logs को पढ़ते समय जानने के लिए एक उपयोगी नाम है।

सेटिंग पर भरोसा करने के बजाय उसे verify करें। Task चलते समय, उन outbound connections की सूची देखें जो process ने बना रखे हैं।

sudo ss -tnp | grep -i node

Local-model mode में आपको 11434 पर loopback connection दिखना चाहिए और किसी public address पर कोई connection नहीं दिखना चाहिए। आगे बढ़ने से पहले किसी भी अन्य चीज़ की पहचान करना उचित है। What a coding agent sends home अन्य harnesses के खिलाफ वही जाँच चलाता है और परिणाम को पढ़ने का तरीका बताता है।

जहाँ secrets नहीं होने चाहिए

  • Shell history. export DEEPSEEK_API_KEY=sk-... को ~/.bash_history में cleartext के रूप में लिखा जाता है, और key rotate करने के बाद भी यह काफी समय तक वहीं रहता है। जब HISTCONTROL=ignorespace set हो, तो command के आगे एक space लगाएँ, या shell का उपयोग न करें और मान को सीधे mode 600 वाली file में लिखें।
  • Committed dotfiles. यदि आप dotfiles को git में रखते हैं, तो ~/.bashrc या ~/.zshrc में मौजूद key एक git add की दूरी पर public repository में जा सकती है। push करने से पहले उस repository में git grep -I -n 'sk-' चलाएँ।
  • settings.yaml. Custom providers के लिए apiKeyEnv का उपयोग करें ताकि file में secret के बजाय variable का नाम रहे। Config files को issue reports और support chats में paste किया जाता है। Credentials files को नहीं।
  • env का output और terminal screenshots. जो कुछ भी पूरे environment को print करता है, वह key को भी उसके साथ print कर देता है।
  • Backups. ~/.dsh का backup लेना जरूरी है, और इसके अंदर मौजूद .credentials.yaml एक live secret है। उस file को exclude करें, या archive को encrypt करें।

ये नियम केवल dsh तक सीमित नहीं हैं, और Compose env files से secrets को बाहर रखना उसी सर्वर के container side पर भी इसी समस्या को कवर करता है।

Developer preview के साथ काम करना

जिस version का आपने परीक्षण किया है, उसे pin करें। ऐसा इसलिए है क्योंकि एक preview, patch release में configuration key बदल सकता है, जिससे आपका provider load होने में विफल हो जाएगा। settings.yaml और cordis.patch.yml को version control में रखें और credentials file को बाहर रखें, ताकि आप upgrade के बाद हुए बदलावों को देख सकें।

जब कोई profile सही ढंग से काम न करे, तो दो flags मददगार होते हैं। --dump-default-config बिना boot किए composed default configuration को print करता है, और --dump-config आपकी profile के लिए composed configuration को उसी तरह print करता है। दोनों की तुलना करने से पता चलता है कि आपकी patch layer ने वास्तव में क्या बदला है, जो layers को मैन्युअल रूप से पढ़ने की तुलना में अधिक तेज़ है।

dsh --profile web --dump-config

जब upgrade के बाद कुछ खराब हो जाए, तो सबसे पहले इसे चलाएं। जो key releases के बीच स्थानांतरित हुई है, वह dump में missing branch के रूप में दिखाई देगी, और इसका समाधान reinstall करने के बजाय एक लाइन का संपादन करना है।

FAQ

dsh मेरी DeepSeek API key कहाँ store करता है?

यह $DSH_HOME/.credentials.yaml में store होती है, जो कि ~/.dsh/.credentials.yaml होती है, जब तक कि आप स्वयं DSH_HOME सेट न करें। Models पेज key को वहीं लिखता है, और आपकी settings में केवल उसका reference होता है, इसलिए secret एक ही file में रहता है। stat -c '%a %n' ~/.dsh/.credentials.yaml के साथ mode की जाँच करें और यदि यह 600 से अधिक ढीला है, तो इसे 600 पर सेट करें। एक custom provider apiKeyEnv के साथ environment variable का नाम देकर file के उपयोग से पूरी तरह बच सकता है।

मैं dsh को DeepSeek API के बजाय local model का उपयोग करने के लिए कैसे कहूँ?

एक custom provider जोड़ें जिसका base URL आपका local OpenAI-compatible endpoint हो। Ollama के लिए यह http://127.0.0.1:11434/v1 है, जिसमें api: openai-completions और model id का उपयोग करें जिसे ollama list से बिल्कुल वैसा ही copy किया गया हो। Ollama को एक API key value की आवश्यकता होती है और वह इसे ignore कर देता है, इसलिए कोई भी non-empty string काम करेगी। किसी भी dsh config को edit करने से पहले curl -s http://127.0.0.1:11434/v1/models के साथ पुष्टि करें कि endpoint जवाब दे रहा है, क्योंकि एक dead endpoint और गलत config समान error उत्पन्न करते हैं।

क्या dsh डिफ़ॉल्ट रूप से मेरा code कहीं भेजता है?

Hosted model के साथ, हाँ। आपका prompt और उन files की सामग्री जिन्हें agent ने पढ़ा है, उस vendor को भेजे गए API request में शामिल होते हैं। Local endpoint के साथ, वह request loopback पर जाती है और machine पर ही रहती है। Telemetry एक अलग feed है और यह डिफ़ॉल्ट रूप से बंद है: DSH_TELEMETRY_MODE unset होने पर DISABLED पर resolve होता है, और उस स्थिति में कोई exporter नहीं बनाया जाता है। रन शुरू होने से पहले opt-out के लिए DSH_TELEMETRY_DISABLED=1 सेट करें।

जब मेरा variable सेट होता है, तो dsh MISSING_CREDENTIAL क्यों report करता है?

क्योंकि dsh apiKeyEnv द्वारा नामित variable को अपनी process environment से पढ़ता है। आपके shell में export किया गया variable किसी systemd service, किसी अन्य user के session, या आपके द्वारा export करने से पहले शुरू की गई process तक नहीं पहुँचता है। unit के लिए mode 600 वाली EnvironmentFile में value रखें, या उसी shell में इसे export करें जो dsh को शुरू करता है। sudo tr '\0' '\n' < /proc/$(pgrep -f dsh | head -1)/environ के साथ पुष्टि करें कि चल रही process में वास्तव में क्या है।

dsh को Node.js के किस version की आवश्यकता है?

Node.js 22.19 या 22 line का बाद का version, या 24 और उससे ऊपर। Node 23 समर्थित range से बाहर है। किसी भी अन्य कार्य से पहले node -v चलाएँ, क्योंकि unsupported runtime से startup failure होने पर ऐसा लगता है कि install broken है और लोग runtime के बजाय package को फिर से install करने लगते हैं।