התקנת DeepSeek Harness על VPS בצורה מאובטחת
למדו כיצד להריץ את DeepSeek Harness על שרת Linux, לקבע גרסת npm ולגשת לממשק בפורט 3080 דרך מנהרת SSH. מנעו גישה לא מורשית לקבצי השרת שלכם על ידי חסימת הפורט לאינטרנט.
מהו ה-DeepSeek Harness
ה-DeepSeek Harness (dsh) הוא סביבת הרצה (runtime) לסוכני Node.js שניתן להריץ על גבי VPS (שרת וירטואלי פרטי). הדרך הבטוחה להריץ אותו היא בהגדרת האזנה ל-127.0.0.1 בלבד, כאשר הגישה אליו מתבצעת דרך מנהרת SSH (secure shell). הכלי מגיש ממשק משתמש (UI) מבוסס דפדפן בפורט 3080 במקום לפעול בתוך טרמינל. שרת ה-web אינו דורש סיסמה משלו; לכן, חשיפת פורט 3080 לאינטרנט מעניקה לכל מי שימצא אותו גישה לסוכן שיכול לקרוא את הקבצים שלכם ולהריץ פקודות תחת משתמש ה-Linux שלכם.
DeepSeek שחררה את הכלי ב-13 באוגוסט 2026 תחת רישיון MIT, כחבילת npm בשם @deepseek-ai/dsh. הפרויקט מגדיר את עצמו כגרסת תצוגה למפתחים (developer preview) ומציין כי צפויים שינויים שאינם תואמים לאחור. כל מספרי הגרסאות להלן הם תמונת מצב מאוגוסט 2026, לכן יש לבדוק את המאגר לפני העתקת תוכן כלשהו לשרת שחשוב לכם.
רעיון מרכזי אחד מנחה את כל התכנון: הכל הוא תוסף (plugin). מתאם המודל, מרשם הכלים, יומן הסשן, ה-sandbox, המתזמן ולולאת הסוכן עצמה – כולם תוספים הנטענים להקשר משותף אחד, וניתן להחליף כל אחד מהם. אין ליבה בעלת הרשאות יתר שהתוספים רק מעטרים. זה מה שהופך את ה-harness לכלי שכדאי לנסות, וזהו גם המקום שבו טמון הסיכון הממשי היחיד.
מערכת הניהול (harness) אינה המודל
מערכת הניהול מריצה את לולאת הסוכן. תהליך הסקת המסקנות מתבצע במודל הנמצא במקום אחר, לכן שום דבר לא יעבוד עד שתזינו מפתח API (ממשק תכנות יישומים) או את הכתובת של נקודת קצה (endpoint) של מודל שאתם מארחים בעצמכם.
מגדירים זאת בממשק המשתמש תחת Settings ולאחר מכן Models. הקטלוג כולל כרטיסים מוכנים מראש עבור ספקי ה-API הגדולים (DeepSeek, OpenAI, Anthropic), שבהם מדביקים את המפתח. האפשרות "Add a custom provider" היא המעניינת: היא דורשת מזהה ספק, שם תצוגה, כתובת בסיס (base URL), פרוטוקול API ופרטי הזדהות. היא משתמשת בפרוטוקול התואם ל-OpenAI, כך שכל gateway או שרת מקומי שמממש פרוטוקול זה יעבוד. ספקים מותאמים אישית יכולים גם לשלוח שאילתה לנקודת הקצה GET /models התואמת ל-OpenAI כדי למלא עבורכם את רשימת המודלים.
כך מכוונים את מערכת הניהול למודל הנמצא על אותו שרת VPS. Ollama חושף API תואם OpenAI בכתובת http://127.0.0.1:11434/v1/, והוא דורש ששדה מפתח ה-API יכיל מחרוזת כלשהי, נהוג להשתמש ב-ollama, כיוון שהשדה הוא חובה אך המידע בו אינו בשימוש. השאלה המורכבת יותר היא האם מודל קטן מספיק כדי להיכנס ל-VPS שלכם הוא איכותי מספיק כדי להפעיל סוכן, ו-ההבדל בין Ollama ל-vLLM כשרת מודלים מקומי קובע כמה זיכרון RAM תצטרכו להקצות לכך.
מפתחות שמוקלדים בממשק המשתמש הם לכתיבה בלבד. מערכת הניהול שומרת אותם ב-$DSH_HOME/.credentials.yaml ומחזיקה רק הפניה לפרטי ההזדהות ב-settings.yaml. ברירת המחדל של $DSH_HOME היא ~/.dsh. התייחסו לקובץ זה כאל קובץ סיסמאות, כיוון שהוא אכן כזה: כל מי שיקרא אותו יוכל לנצל את תקציב ה-API שלכם. אם ברצונכם לערוך קבצים אלו ישירות במקום להשתמש בממשק ה-Settings, המדריך לקובצי התצורה, המפתחות ונקודות הקצה של המודלים ב-dsh מפרט מה עושה כל מפתח ואיזה מידע יוצא מהשרת שלכם בכל מצב פעולה.
דרישות קדם להתקנה
- שרת VPS המריץ Ubuntu 24.04 או הפצת Linux עדכנית אחרת, עם גישת SSH.
- גרסת Node.js 22.19 ומעלה מסדרת 22.x, או Node.js 24 ומעלה, שעליהן הפרויקט נבנה ונבדק.
- חשבון משתמש רגיל, לא
root, כיוון שהסוכן מריץ פקודות shell תחת המשתמש שהפעיל את התהליך. pnpmבתוך ה-PATH אם בכוונתכם להתקין תוספים, שכן פקודת התוסף מפעילה אותו ב-shell נפרד.- פורט 3080 סגור ב-firewall של השרת וב-firewall הרשתי של ספק השרתים.
חבילת ה-nodejs של Ubuntu ישנה יותר ממה שהתשתית דורשת, לכן יש להתקין את Node דרך NodeSource או nvm במקום להשתמש ב-apt install nodejs. אם ה-VPS חדש, כדאי להקדיש עשר דקות ל-אבטחת ה-SSH לפני כל פעולה אחרת, כיוון שהמנהרה שעליה אתם עומדים להסתמך טובה בדיוק כמו שרת ה-SSH שמאחוריה.
התקנת DeepSeek Harness על שרת VPS, בגרסה נעולה
node --version
npx @deepseek-ai/dsh@0.1.0-rc.6 webnpx מוריד את החבילה ומריץ את הקובץ הבינארי dsh. web הוא כינוי (alias) ל---profile web, שמפעיל את יישום הדפדפן, והתהליך מדפיס את הכתובת שבה הוא מאזין. ברירת המחדל היא http://127.0.0.1:3080.
נעלו את הגרסה. npx @deepseek-ai/dsh web פותר את כל מה שתגית ה-latest מצביעה עליו ברגע ההרצה, והפרויקט כבר שחרר כמה גרסאות מועמדות (release candidates) והודיע על שינויים שעלולים לשבור תאימות. 0.1.0-rc.6 הוא מה ש-latest הצביע עליו ב-13 באוגוסט 2026. גרסה נעולה מבטיחה שהשרת שהגדרת היום יתנהג באותו אופן בחודש הבא, כך ששדרוג הופך להחלטה מודעת ולא לתקלה שמתגלה במקרה. כאשר פקודה נעולה עדיין מפעילה גרסה שגויה או מסרבת להתקין, שגיאות התקנה וגרסה נפוצות ב-dsh מכסות את ניקוי ה-cache של npx ובדיקה של איזה npm חבילות ה-Node שלכם משתמשות.
לשימוש יומיומי, התקינו אותו פעם אחת במקום לבצע פתרון כתובות מחדש בכל הפעלה.
npm install -g @deepseek-ai/dsh@0.1.0-rc.6
dsh --profile web --helpכדאי להריץ את השורה השנייה, כיוון שלמפעיל (launcher) ולאפליקציית האינטרנט יש קבוצות דגלים (flags) נפרדות. dsh --help מציג את האפשרויות של המפעיל עצמו. dsh --profile web --help מציג את הדגלים שאפליקציית האינטרנט מקבלת, ושם נמצאים --port, --host והדגל הניתן לחזרה --trusted-host.
כעת ודאו באיזו כתובת הוא מאזין.
ss -tlnp | grep 3080עמודת הכתובת המקומית צריכה להציג 127.0.0.1:3080. אם היא מציגה 0.0.0.0:3080, ממשק המשתמש נגיש מהאינטרנט, ועליכם לעצור את התהליך לפני שתעשו כל דבר אחר.
מדוע אסור לעולם לחשוף את פורט 3080
לשרת האינטרנט אין שכבת אימות. התצורה שלו חושפת כתובת האזנה ופורט האזנה, וזהו כל שטח הפנים שלו. בקרת גישה עבור פריסות שאינן ב-loopback היא הגדרת trusted-host נפרדת, שאינה מהווה מסך התחברות.
כעת, שקלו מה נמצא מאחורי הפורט הזה. הסוכן עורך קבצים בסביבת העבודה ומריץ פקודות shell, ופרטי ההתחברות לספק שלכם נמצאים על הדיסק בסמוך אליו. לכן, פורט 3080 פתוח הוא למעשה shell מרוחק עם ממשק צ'אט, שרץ תחת המשתמש שהפעיל אותו, עם מפתח ה-API שלכם מצורף. איש אינו זקוק ל-exploit עבור זה. הם זקוקים רק למספר הפורט, וסורקים מוצאים מספרי פורטים בתוך שעות מרגע עליית המארח לרשת.
ה-CLI (ממשק שורת הפקודה) מסכים עם גישה זו. החל מ-0.1.0-rc.6 הוא אינו תומך במכוון ב---host 0.0.0.0 ומסיים את פעולתו עם שגיאת שימוש במקום לעלות. סירוב זה הוא תכונה, לכן אל תחפשו טלאי שמסיר אותו.
קיימות שתי פריסות נוספות סבירות כאשר מנהרה (tunnel) אינה מתאימה לכם. הציבו את השרת ברשת overlay פרטית כך שהוא יחזיק כתובת שרק המכשירים שלכם יכולים לנתב אליה, וזה מה ש-שרת בקרה Headscale באירוח עצמי מספק. לחלופין, הציבו לפניו reverse proxy המאמת את הבקשה לפני שהיא מגיעה לפורט 3080, למשל שרת Authentik single sign-on המבצע forward auth. reverse proxy ללא אימות לפניו אינו בקרת אבטחה. הוא פשוט URL ארוך יותר.
גישה לממשק ה-Web דרך מנהרת SSH
הריצו פקודה זו במחשב האישי שלכם, לא בשרת.
ssh -N -L 3080:127.0.0.1:3080 you@your-serverהפקודה -L פותחת את פורט 3080 במחשב שלכם ומעבירה כל חיבור אליו דרך סשן SSH מוצפן. החלק 127.0.0.1:3080 מפוענח בצד השרת, כך שהחיבור מגיע אל ה-harness מכתובת ה-loopback, בדיוק כאילו ישבתם מול המכונה עצמה. הדגל -N מורה לא לפתוח shell מרוחק, כיוון שאתם זקוקים רק להעברת הפורטים.
לאחר מכן, פתחו את http://127.0.0.1:3080 בדפדפן המקומי שלכם. אם פורט 3080 כבר תפוס במחשב שלכם, שנו את המספר השמאלי: ssh -N -L 3180:127.0.0.1:3080 you@your-server, ואז גלשו אל http://127.0.0.1:3180. המספר משמאל הוא מקומי והמספר מימין שייך לשרת, לכן רק המספר השמאלי משתנה.
שמרו זאת ב-~/.ssh/config כדי להימנע מהקלדה חוזרת.
Host dsh
HostName 203.0.113.10
User deploy
IdentityFile ~/.ssh/id_ed25519
LocalForward 3080 127.0.0.1:3080לאחר מכן, ssh -N dsh יפעיל את המנהרה. דפדפן שמדווח על סירוב חיבור (connection refused) מעיד בדרך כלל על כך שהמנהרה פעילה אך אין שירות שמאזין בצד השני, כיוון ש-SSH מעביר את הפורט ללא קשר לשאלה אם ה-harness רץ או לא. בדקו את השרת באמצעות הפקודה ss המופיעה לעיל.
שמירה על פעילות ה-harness לאחר התנתקות
פקודת npx מסתיימת עם סגירת ה-shell שלכם. שירות משתמש (user service) של systemd ממשיך לפעול, ומחזיר את ה-harness לפעולה לאחר קריסה או אתחול. ה-unit כאן מינימלי במכוון; אם ברצונכם להריץ את ה-harness תחת חשבון ייעודי בעל הרשאות מוגבלות, עם גרסה קבועה בתוך ה-unit ולוגים שניתן לבצע בהם חיפוש, הגדרת headless systemd עבור dsh מכסה זאת במלואו.
loginctl enable-linger $USER
mkdir -p ~/.config/systemd/user
command -v dshהגדרת enable-linger חשובה מכיוון ששירותי משתמש נעצרים בדרך כלל עם סיום ה-session האחרון שלכם, לכן בלעדיה ה-harness יקרוס ברגע שתסגרו את ה-tunnel. השתמשו בנתיב המלא המוצג על ידי command -v dsh והזינו אותו ב-unit, כיוון ש-systemd אינו מחפש ב-PATH שנבנה על ידי ה-login shell שלכם.
[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 אינה קוסמטית. תהליך ה-dsh משתמש בתיקיית ההרצה שלו כמיקום ברירת המחדל במערכת הקבצים, לכן שירות שמופעל ממיקום שגוי יספק ל-agent סביבת עבודה שגויה. עדיין ניתן לבחור את סביבת העבודה ב-UI.
systemctl --user daemon-reload
systemctl --user enable --now dsh
systemctl --user status dshיחידה שמסרבת לעלות נובעת כמעט תמיד מנתיב ExecStart שגוי או מגרסת Node שה-binary דוחה, ו-journalctl --user -u dsh -n 50 מציין מהו הגורם. אותו דפוס תקף ל-שמירה על כל agent פיתוח פעיל ב-VPS, ודרכי הכשל זהות.
מה מותר לתוסף לעשות
תוסף הוא מודול התורם שירותים, אירועים מוגדרים ואפקטים הפיכים להקשר משותף. נקודות ההרחבה הן החלק שראוי לקרוא בעיון:
- רישום ספק מודל ב-
ctx.llm - הוספת כלים עבור המודל ב-
ctx.tools - אספקת ה-backend של ה-shell מאחורי
ctx.shell - אספקת גישה למערכת הקבצים או מדיניות מאחורי
ctx.fs - רישום פקודות אנושיות ב-
ctx.commands - הרצת עבודה ברקע דרך
ctx.jobs - עטיפת תהליכים שנוצרו עם backend מסוג
ctx.sandbox - יירוט בקשות וקריאות לכלים דרך האירועים
agent/*ו-tools/* - הרחבת מצב הפעלה (session state) עמיד
- הנעת ה-UI דרך
ctx.agents
קראו את הרשימה הזו כפי שתוקף היה קורא אותה. תוסף יכול לספק את שכבת מערכת הקבצים ואת שכבת ה-shell, והוא יכול להתמקם באמצע כל קריאה לכלי שהמודל מבצע. אין תיבת דו-שיח של הרשאות שעומדת בין תוסף לבין נקודות חיבור אלו, כיוון שתוסף הוא קוד Node רגיל הנטען לאותו תהליך שבו הכל רץ. התקנת תוסף משמעה הרצת קוד של זר עם ההרשאות של הסוכן (agent) שלכם, וההרשאות של הסוכן הן ההרשאות של משתמש ה-Unix שלכם.
זוהי אותה החלטת אמון שאתם מקבלים בעת חיבור שרת MCP לסוכן ב-VPS, כאשר MCP הוא פרוטוקול הקשר המודל (Model Context Protocol). זו גם הסיבה לכך ש-הרצת סוכן קידוד בצורה בטוחה ב-VPS מתחילה בחשבון שבו הוא רץ ולא במודל, וזו הסיבה ש-מתקפות שרשרת אספקה ב-npm פוגעות בשרתים בעוצמה כזו: שלב ההתקנה הוא הפריצה, ושום דבר לא מקפיץ לכם התראה.
מקור התוספים
תוספים נמצאים בתוך פרופילים. פרופיל הוא אוסף בעל שם המאוחסן תחת $DSH_HOME, שערך ברירת המחדל שלו הוא ~/.dsh, וכל ספריית פרופיל מכילה את התוספים החיצוניים (out-of-tree) שהיא מתקינה. ה-CLI מנהל אותם על ידי העברת הארגומנטים שלכם ישירות ל-pnpm, תוך שימוש בספריית הפרופיל כספריית העבודה.
dsh plugin --profile web add github:deepseek-harness/turtle-ui
dsh plugin --profile web remove turtle-uiמכיוון שהארגומנטים מגיעים ל-pnpm ללא שינוי, add, remove, update ו-why מתנהגים כפי שהם מתנהגים בכל פרויקט pnpm, ותוסף יכול להיות חבילת npm או הפניה ל-GitHub. pnpm חייב להיות קיים ב-PATH תחילה. ב-Node 22 ומעלה, corepack enable pnpm מציב אותו שם.
גילוי תוספים מתבצע באמצעות נושא (topic) ב-GitHub. מחברי תוספים מוסיפים את הנושא dsh-plugin למאגר שלהם, ועיון בנושא זה הוא הדרך למצוא מה קיים. נושא הוא תווית שמחבר מצמיד למאגר שלו. איש אינו בודק אותו ואיש אינו חותם עליו, ודף הנושא מדורג לפי כוכבים, המודדים פופולריות ולא בטיחות.
ארבעה הרגלים שומרים על המצב תחת שליטה. קראו את קוד המקור לפני ההתקנה, שכן רוב התוספים קטנים מספיק כדי לקרוא אותם בעשר דקות. קבעו (pin) את הגרסה המדויקת או את ה-commit במקום לעקוב אחר ענף (branch). הריצו את ה-harness תחת משתמש שאינו מחזיק בדבר נוסף, על גבי VPS שאתם מוכנים לבנות מחדש. תנו לסוכן (agent) מפתח API משלו עם מגבלת הוצאות משלו, נפרד מהמפתח ששירותי הייצור שלכם משתמשים בו.
אם אתם מעדיפים להשוות תכנונים לפני שתתחייבו לאחד, ה-harness מרובה-סוכנים Omnigent עונה על אותה בעיה במבנה שונה, והפשרות הופכות לברורות ברגע שהתוספים נכנסים לתמונה.
מה משתבש ראשון
גרסת Node ישנה מדי. הפרויקט מיועד ל-Node 22.19 ומעלה בסדרת 22.x, או ל-Node 24 ומעלה, ואלו הגרסאות שנבדקות ב-CI. סביבת הרצה ישנה יותר תיכשל בעת העלייה מכיוון שהקוד משתמש בתחביר וב-APIs שאינם נתמכים בה. הריצו את node --version לפני כל פעולה אחרת.
פורט 3080 כבר תפוס. ייתכן שרץ מופע שני של ה-harness, תהליך תקוע, או יישום אחר שמשתמש בפורט 3080. אתרו את התהליך באמצעות ss -tlnp | grep 3080, ולאחר מכן עצרו אותו או הפעילו את ה-harness בפורט אחר בעזרת dsh web --port 3180. --port שייך ליישום ה-web, לכן הוא מופעל לאחר web.
הדפדפן אינו מצליח להתחבר דרך ה-tunnel. ודאו שגלשתם ל-127.0.0.1 ולא לכתובת הציבורית של השרת, כיוון שהפורט המועבר קיים רק במחשב המקומי שלכם. לאחר מכן, ודאו שה-harness מאזין בשרת, שכן SSH מקים את ה-forward ללא קשר לשאלה אם יש שירות שמשיב בצד השני.
dsh plugin נכשל מיד. הפקודה היא מעטפת (wrapper) סביב pnpm, לכן חוסר בבינארי pnpm יעצור אותה לפני תחילת העבודה של כל תוסף.
ה-agent אינו מזהה את הפרויקט שלכם. ברירת המחדל של ה-workspace היא הספרייה שבה הופעל התהליך, לכן יחידה ש-WorkingDirectory שלה מוגדר לספריית הבית שלכם תעביר ל-agent את ספריית הבית. בחרו את ה-workspace בממשק המשתמש, או תקנו את היחידה וטענו אותה מחדש.
FAQ
האם בטוח לחשוף את ממשק ה-Web של DeepSeek Harness בפורט 3080?
לא. לשרת ה-Web אין מנגנון התחברות עצמאי, והסוכן שמאחוריו עורך קבצים ומריץ פקודות shell תחת המשתמש שהפעיל את התהליך, כאשר מפתח ה-API של הספק שלכם שמור על אותו דיסק. השאירו את המאזין על 127.0.0.1 וגשו אליו דרך מנהרת SSH. רשת overlay פרטית, או reverse proxy שמבצע אימות לכל בקשה לפני שהיא מגיעה לפורט, הם פתרונות תקינים גם כן. החל מגרסה 0.1.0-rc.6, ה-CLI מסרב ל---host 0.0.0.0 ומסתיים עם שגיאת שימוש, מה שמעיד על עמדת המפתחים בנושא.
האם אני זקוק למפתח API של DeepSeek, או שאפשר להשתמש במודל מקומי?
שתי האפשרויות עובדות, כיוון שה-harness הוא סביבת הרצה ולא מודל. תחת Settings ולאחר מכן Models ניתן להדביק מפתח בכרטיס ספק קטלוגי, או לבחור ב-"Add a custom provider" ולהזין כתובת base URL שתומכת בפרוטוקול התואם ל-OpenAI. שרת Ollama מקומי משיב ב-http://127.0.0.1:11434/v1/ ומקבל כל מחרוזת בשדה מפתח ה-API. מפתחות נשמרים ב-$DSH_HOME/.credentials.yaml, שברירת המחדל שלו היא ~/.dsh/.credentials.yaml.
מה מקבל תוסף (plugin) של DeepSeek Harness בעת התקנתו?
התוסף מקבל את ההרשאות של החשבון שמריץ את ה-harness. תוסף הוא קוד Node הנטען לאותו תהליך, ונקודות ההרחבה כוללות את ה-shell backend, שכבת מערכת הקבצים, מרשם הכלים (tool registry) והאירועים העוטפים כל קריאה לכלי. שום דבר לא מבודד תוסף מהממשקים הללו, אלא אם התוסף מספק את ה-sandbox בעצמו. קראו את קוד המקור לפני ההתקנה, והריצו את ה-harness תחת משתמש שאין לו גישה למידע רגיש.
איזו גרסה כדאי להתקין, והאם היא תמשיך לעבוד?
התקינו גרסה מדויקת, לדוגמה npx @deepseek-ai/dsh@0.1.0-rc.6 web. זהו המיקום אליו הצביע התג latest ב-13 באוגוסט 2026. הפרויקט מגדיר את עצמו כ-developer preview ומציין כי צפויים שינויים ששוברים תאימות, לכן פקודה ללא גרסה נעולה עלולה להתנהג אחרת מיום ליום. בדקו את ה-repository לפני שדרוג, וצפו לכך שמפתחות תצורה וממשקי תוספים ישתנו כל עוד הגרסה מתחילה ב-0.