
به اشتراک بگذارید

به اشتراک بگذارید
خطای «Downloading VS Code Server» که روی سرور ایران تمام نمیشود، تقصیر VS Code Remote SSH نیست؛ افزونه فقط نمیتواند بسته سمت سرور را دانلود کند. مستندات رسمی دو مسیر برای همین حالت دارد: دانلود بسته روی سیستم خودتان و انتقال آن با SSH، یا گذاشتن دستی همان بسته با commit id همنسخه در پوشه مورد انتظار.
| پرسش | پاسخ کوتاه |
|---|---|
| سرور چه چیزی را اجرا میکند؟ | بستهای به نام VS Code Server که افزونه خودش روی سیستمعامل سرور نصب میکند. |
| ریشه خطای دانلود کجاست؟ | نصب این بسته به دسترسی HTTPS روی پورت 443 به update.code.visualstudio.com و vscode.download.prss.microsoft.com نیاز دارد. |
| راهحل مستندشده اول | تنظیم remote.SSH.localServerDownload تا بسته روی سیستم شما دانلود و با SSH منتقل شود. |
| راهحل مستندشده دوم | گذاشتن بسته همنسخه در ~/.vscode-server/bin/COMMIT روی خود سرور. |
| حداقل منابع سرور | یک گیگابایت رم، با bash و tar و curl یا wget. |
💡 نکته کلیدی
افزونه Remote – SSH دو تکه دارد: ویرایشگر روی سیستم شما و یک بسته سرور روی ماشین مقصد؛ خطای دانلود تقریباً همیشه مربوط به تکه دوم است.
✅ اگر همین حالا وسط خطای دانلود گیر کردهاید، از بخش رفع خطای دانلود شروع کنید و commit id نسخه ویرایشگرتان را کنار دستتان بگذارید.
بیشتر راهنماهای این موضوع از نصب افزونه شروع میکنند و همانجا هم تمام میشوند، چون روی یک لپتاپ با اینترنت باز همهچیز در چند ثانیه کار میکند. شروع ما جای دیگری است: همان لحظهای که نوار پیشرفت دانلود روی سرور تهران میایستد. اول معماری، بعد کلید و فایل config، و در پایان سه راه مستندشده برای رد کردن مرحله دانلود.
📌 آنچه در این مقاله میخوانید
◀️ معماری اتصال و پیشنیازهای سرور
◀️ نصب افزونه، ساخت کلید SSH و فایل config
◀️ رفع خطای دانلود VS Code Server روی سرور داخلی
◀️ اجرای پروژه، ارسال پورت و محدودیتهای واقعی

افزونه، بستهای به نام VS Code Server را روی سیستمعامل سرور نصب میکند و مستندات تصریح میکند این بسته از هر نصب دیگری از ویرایشگر روی آن ماشین مستقل است. فایلها، ترمینال و افزونههای زبانی روی سرور اجرا میشوند و لپتاپ فقط رابط کاربری را نشان میدهد.
این تفکیک علت خطای دانلود را هم توضیح میدهد:
سرعت باز شدن فایل به پینگ شما تا سرور بستگی دارد، نه به پهنای باند بینالملل. برای تیمی که داخل ایران کار میکند، یک سرور مجازی ایرانی همین فاصله شبکه را کوتاه نگه میدارد.
مستندات رسمی حداقلها را دقیق نوشته و همین جدول بیشتر خطاهای «اتصال برقرار نشد» را قبل از وقوع حل میکند. اعداد ستون دوم از همان مستندات است.
| مورد | حداقل اعلامشده | توضیح |
|---|---|---|
| رم | 1 گیگابایت | پیشنهاد مستندات: دو گیگابایت و دو هسته. |
| ابزارهای پایه | ابزار bash و tar و curl یا wget | مسیر /bin/bash باید وجود داشته باشد. |
| کرنل و کتابخانهها | کرنل 4.18، glibc 2.28، libstdc++ 3.4.25 | برای 1.99.x و جدیدتر binutils 2.29 هم لازم است. |
| توزیع | توزیعهای مبتنی بر glibc | توزیع Alpine Linux پشتیبانی نمیشود. |
| معماری | معماری x86_64 یا ARM64 | ARM سیودو بیتی تا نسخه 1.122. |
| سرویس SSH | سرویس sshd فعال | پورت عمومی دیگری لازم نیست. |
🔸 نکته فنی
بسته سرور در پوشه ~/.vscode-server کاربر مقصد مینشیند و افزونههای سمت سرور در ~/.vscode-server/extensions. در نسخههای قدیمیتر نام این پوشه ~/.vscode-remote بود.
مسیر مستندشده سه قدم دارد: نصب افزونه Remote – SSH، تست دستی دسترسی با دستور ssh در ترمینالی معمولی، و بعد اجرای فرمان «Remote-SSH: Connect to Host». ورود با کلید اجباری نیست، اما رمز ذخیره نمیشود؛ پس برای کار روزمره کلید بسازید.
تنظیمهای اتصال در VS Code Remote SSH از همان فایل config استاندارد SSH خوانده میشود و با remote.SSH.configFile میتوانید فایل دیگری بدهید. اگر پیشتر پورت SSH سرورتان را عوض کردهاید، همان پورت را در ورودی Host بنویسید؛ تغییر پورت SSH سرور مجازی جزئیات سمت سرور را دارد.
اول ببینید کلید دارید یا نه (معمولاً ~/.ssh/id_ed25519.pub). مستندات پیشنهاد میکند برای ماشینهای توسعه یک کلید جدا بسازید تا لو رفتن یک کلید همه میزبانها را باز نکند:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519-remote-ssh
chmod 400 ~/.ssh/id_ed25519-remote-ssh
ssh-copy-id -i ~/.ssh/id_ed25519-remote-ssh.pub deploy@203.0.113.10
سمت سرور مجوزها اهمیت دارد: پوشه ~/.ssh با 700 و ~/.ssh/authorized_keys با 600. روی سیستم خودتان ~/.ssh با 700 و فایل config و کلیدها با 600. هشدار UNPROTECTED PRIVATE KEY FILE دقیقاً از باز بودن همین مجوزها میآید. اگر با مفاهیم پایه تازه آشنا میشوید، آموزش اتصال به سرور با SSH قدم اول خوبی است.
با فرمان «Remote-SSH: Open SSH Configuration File…» فایل config را باز کنید و میزبان را یک بار بنویسید (مقدار Port در نمونه زیر فقط یک مثال است):
Host dev-tehran
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519-remote-ssh
LocalForward 127.0.0.1:3000 127.0.0.1:3000
اگر کلیدتان عبارت عبور دارد، ssh-agent را روی سیستم خودتان بالا نگه دارید: در لینوکس با eval “$(ssh-agent -s)” و در ویندوز با سرویس ssh-agent روی حالت خودکار؛ فهرست کلیدها را با ssh-add -l ببینید. ForwardAgent yes همان agent را روی سرور در دسترس میگذارد، ولی فقط برای میزبانی بگذاریدش که به ادمینش اعتماد دارید.
⚠️ پیش از ادامه این را امتحان کنید
پیش از هر تنظیم پیچیده، همان دستور ssh را در ترمینالی بیرون از ویرایشگر اجرا کنید.
❌ اگر از بیرون هم وصل نمیشوید، مشکل در کانفیگ SSH شماست و هیچ تنظیمی در ویرایشگر حلش نمیکند.
✅ اگر از بیرون وصل میشوید اما ویرایشگر نه، مشکل در نصب بسته سرور است.

نصب بسته سرور به دسترسی HTTPS روی پورت 443 به update.code.visualstudio.com و vscode.download.prss.microsoft.com نیاز دارد. افزونه اول آن را روی خود سرور امتحان میکند و اگر نشد، به دانلود روی سیستم محلی و انتقال با SSH برمیگردد.
در VS Code Remote SSH سه راه مستندشده برای همین حالت وجود دارد و ترتیبشان مهم است. اول لاگ را بخوانید تا بدانید کار کجا ایستاده؛ بعد محل دانلود را عوض کنید؛ بعد بسته را دستی سر جایش بگذارید؛ و اگر هیچکدام جواب نداد، پوشه نیمهکاره را پاک کنید.
فرمان «Remote-SSH: Show Log» کانال خروجی افزونه را باز میکند و خطاهایی را نشان میدهد که در رابط کاربری دیده نمیشوند. داخل همان لاگ عبارت Running ssh connection command را پیدا کنید؛ دستور بعدش همان چیزی است که افزونه اجرا کرده و میتوانید عیناً در ترمینال امتحانش کنید. لاگ سمت سرور دو مسیر دارد و تنظیم remote.SSH.useExecServer تعیین میکند کدام فعال است. مقدار پیشفرض آن true است، پس مسیر فعال امروز ~/.vscode-server/cli/servers/*/log.txt است؛ با مقدار false، لاگ در فایلی به نام.<commit id>.log داخل ~/.vscode-server مینشیند. دنبال نام ثابت نگردید:
ls -1 ~/.vscode-server/cli/servers/*/log.txt 2>/dev/null
ls -1a ~/.vscode-server/.*.log 2>/dev/null
تنظیم remote.SSH.localServerDownload دقیقاً برای همین کار است. مقدار پیشفرض auto اول سرور را امتحان میکند؛ با مقدار always دانلود را به سیستم خودتان میسپارید. این را در settings.json همان سیستمی بگذارید که ویرایشگر رویش باز است، نه روی سرور:
{
"remote.SSH.localServerDownload": "always"
}
بعد از ذخیره، پنجره را Reload کنید یا فرمان «Remote-SSH: Kill VS Code Server on Host» را بزنید تا تنظیم روی اتصال بعدی اثر کند. شرط کار کردن این مسیر آن است که لپتاپ شما به دو دامنه بالا دسترسی داشته باشد؛ اگر ندارد، سراغ راه دوم بروید.
صفحه FAQ مستندات صریح میگوید بسته سرور را خود ویرایشگر مدیریت و بهروز میکند و نصب جداگانه را توصیه نمیکند. پس این راه دوم است و با هر بهروزرسانی ویرایشگر باید تکرار شود. بسته هر نسخه با commit id همان نسخه شناخته میشود.
نشانی دانلود الگوی ثابتی دارد. هنگام نگارش این راهنما (آبان ۱۴۰۵) همین نشانی برای کانال stable به بسته نسخه 1.143.1 با commit برابر e646868227c3e3a9e3f24277c8c7220be42c0be7 میرسید:
# COMMIT را با commit نسخه ویرایشگر خودتان عوض کنید
COMMIT=e646868227c3e3a9e3f24277c8c7220be42c0be7
mkdir -p ~/.vscode-server/bin/$COMMIT
curl -fL "https://update.code.visualstudio.com/commit:$COMMIT/server-linux-x64/stable" -o /tmp/vscode-server.tar.gz
sha256sum /tmp/vscode-server.tar.gz
tar -xzf /tmp/vscode-server.tar.gz -C ~/.vscode-server/bin/$COMMIT --strip-components 1
ls ~/.vscode-server/bin/$COMMIT/bin
فلگ -f در curl لازم است؛ بدون آن پاسخ خطا هم به شکل فایل ذخیره میشود و tar با پیامی گمراهکننده میشکند. خروجی sha256sum را با هدر x-sha256 همان نشانی مقایسه کنید.
یک دانلود نصفهکاره پوشهای به جا میگذارد که دفعه بعد هم خراب میماند. دو فرمان یک کار نمیکنند: «Remote-SSH: Kill VS Code Server on Host» سرور را برمیدارد، اما فرمانی که مستندات برای حذف پوشه نصب معرفی کرده «Remote-SSH: Uninstall VS Code Server from Host…» است. معادل دستی دومی:
kill -9 $(ps aux | grep vscode-server | grep $USER | grep -v grep | awk '{print $2}')
rm -rf $HOME/.vscode-server
⚠️ قبل از rm -rf این را بدانید
این دستور پوشه افزونههای سمت سرور (~/.vscode-server/extensions) را هم پاک میکند، پس دفعه بعد همه افزونهها از نو دانلود میشوند؛ یعنی همان دانلودی که ممکن است نتوانید انجام دهید. روی اینسایدرز مسیر ~/.vscode-server-insiders است، و دستور kill با $USER ممکن است نشستهای فعال دیگر همان کاربر را هم بکشد.
دو نکته که ندانستنشان وقت زیادی میگیرد. اگر پارتیشن /tmp با گزینه noexec سوار شده باشد نصب شکست میخورد، چون اسکریپت نصب در پوشه موقت سیستم نوشته و از همانجا اجرا میشود. و اگر.bash_profile شما شل دیگری را اجرا کند، راه درست عوض کردن شل با chsh است.
یک خطای دیگر هم شکل عجیبی دارد: پیام open failed: administratively prohibited در لاگ. مستندات میگوید AllowTcpForwarding yes را در /etc/ssh/sshd_config بگذارید و sshd را ریاستارت کنید.
| تنظیم یا فرمان | کاری که میکند | کِی سراغش بروید |
|---|---|---|
| remote.SSH.localServerDownload | محل دانلود بسته را بین سرور و سیستم محلی جابهجا میکند (auto، always، off). | سرور به منبع دانلود نمیرسد ولی لپتاپ میرسد. |
| remote.SSH.useExecServer | تعیین میکند لاگ سمت سرور کدام مسیر را بگیرد؛ پیشفرضش true است. | دنبال فایل لاگ سرور میگردید. |
| remote.SSH.showLoginTerminal | ترمینال را هنگام اجرای دستورهای ssh نشان میدهد. | باید رمز یا توکن یا عبارت عبور وارد کنید. |
| remote.SSH.useLocalServer | حالت اتصال را بین Local Server و Terminal عوض میکند. | اتصال معلق میماند یا میزبان ویندوزی غلط تشخیص داده شده است. |
| Remote-SSH: Uninstall VS Code Server from Host… | پروسهها را میکشد و پوشه نصب را حذف میکند. | نصب قبلی نصفه مانده است. |
⚠️ چه کاری انجام نمیدهیم
هیچکدام از راههای بالا ترافیک سرور را از مسیر دیگری رد نمیکند؛ فقط محل دانلود بسته عوض میشود.
❌ بررسی چکسام بسته را خاموش نکنید و بسته سرور را از منبع ناشناس نگیرید.
✅ بسته را فقط از نشانی رسمی update.code.visualstudio.com بگیرید.

بعد از اتصال، ترمینال یکپارچه ویرایشگر روی سرور باز میشود و همان دستورهای همیشگی را همانجا اجرا میکنید. برای دیدن خروجی پروژه در مرورگر لپتاپ، فرمان Forward a Port یا پنل Ports را به کار ببرید.
سرویس توسعه را روی سرور بالا میآورید، مثلاً روی پورت 3000. بعد با فرمان Forward a Port همان پورت را به سیستم خودتان میآورید. اگر پورت محلی اشغال باشد، با گزینه Change Local Address Port عوضش میکنید. با خط LocalForward 127.0.0.1:3000 127.0.0.1:3000 در فایل config هم میشود دائمیاش کرد.
افزونههای زبانی باید سمت سرور نصب شوند و نصبشان به دسترسی به marketplace.visualstudio.com و *.gallerycdn.vsassets.io نیاز دارد. تنظیم remote.SSH.defaultExtensions فهرست شناسه افزونهها را روی هر میزبان نصب میکند و فرمان «Extensions: Install from VSIX…» همان مسیر مستندشده نصب بدون اینترنت است.
محدودیتهای VS Code Remote SSH را مستندات رسمی خودش شمرده و پنهان نکرده است:
🔶 درباره سرور
برای این سبک کار، پایدار بودن دسترسی SSH و کافی بودن رم و دیسک سرور اهمیت دارد. سرور مجازی ایران وبداده در دیتاسنتر تهران و روی شبکه رسپینا میزبانی میشود و IP مستقیم دارد؛ ارتقای منابع و نصب مجدد سیستمعامل از پنل اختصاصی و بدون تیکت انجام میشود و Rescue و کنسول VNC هم هست.
⚠️ استفاده از سرور مجازی ایران برای VPN و پروکسی و پورتفورواردینگ و سرور کاهش پینگ مجاز نیست؛ ارسال پورت داخل نشست SSH کار توسعه روی خود سرور است.
اگر این مسیر برای تیم شما جا نیفتاد، دو نام دیگر را هم بشناسید: code-server که ویرایشگر را در مرورگر اجرا میکند، و JetBrains Gateway. سنجیدنشان را به مستندات خودشان بسپارید؛ این مقاله درباره افزونه رسمی مایکروسافت است.
پرسشهایی که بیشتر تکرار میشوند:
اول در ترمینالی معمولی دستور ssh user@host را اجرا کنید تا مطمئن شوید ورود جواب میدهد. بعد فرمان «Remote-SSH: Connect to Host» را بزنید و همان میزبان را انتخاب کنید.
رمز پشتیبانی میشود، اما مستندات رسمی میگوید رمز ذخیره نمیشود و هر بار باید واردش کنید. کلید ed25519 با مجوز 400 روی فایل خصوصی، راه راحتتر و امنتری است.
حداقل اعلامشده در مستندات یک گیگابایت است و پیشنهادشان دو گیگابایت رم با پردازنده دو هستهای. برای پروژه بزرگ با چند افزونه زبانی، همان عدد پیشنهادی را جدی بگیرید.
چون Alpine Linux و توزیعهای غیر glibc در مستندات رسمی پشتیبانی نشدهاند و راهحلی برایش نیست. حالت glibc قدیمی فرق دارد: مستندات برای میزبان با glibc پایینتر از 2.28 اتصال را در صورت فراهم بودن یک sysroot ممکن میداند، هرچند آن را سناریوی رسماً پشتیبانیشده نمینامد.
در فایل config برای آن میزبان خط Port را با پورت جدید بنویسید؛ فایل را با فرمان «Remote-SSH: Open SSH Configuration File…» باز کنید. اگر کانفیگ شما جای پیشفرض نیست، مسیرش را با remote.SSH.configFile بدهید.
طبق ویکی رسمی مخزن افزونه، در حالت Terminal (یعنی remote.SSH.useLocalServer روی false) هر پنجره اتصال خودش را میگیرد. حالت پیشفرض یک پروسه SSH را بین پنجرهها به اشتراک میگذارد.
اینجا ویرایشگر روی سیستم خودتان اجرا میشود و فقط بسته سرور روی ماشین مقصد است. code-server پروژهای جداگانه است که خود ویرایشگر را روی سرور اجرا و در مرورگر نمایش میدهد.
جمعبندی؛ خطای دانلود مال افزونه نیست، مال یک فایل است کار VS Code Remote SSH در یک جمله خلاصه میشود: یک بسته باید از نشانی رسمی روی سرور بنشیند و بقیه ماجرا یک نشست SSH است. ترتیب عیبیابی هم همین را دنبال میکند. اول با یک ترمینال معمولی ثابت کنید اتصال SSH سالم است. بعد لاگ افزونه و لاگ سمت سرور را باز کنید؛ مسیر لاگ سرور را خود افزونه چاپ میکند و با تنظیم پیشفرض، زیر ~/.vscode-server/cli/servers است. اگر کار در مرحله دانلود ایستاده بود، محل دانلود را با remote.SSH.localServerDownload به سیستم خودتان بسپارید. اگر آن هم ممکن نبود، بسته همنسخه را با commit درست در ~/.vscode-server/bin بگذارید و چکسامش را بسنجید. و هر وقت نصب نصفه ماند، با فرمان Uninstall پوشه را حذف کنید و از صفر بروید. دو چیز را عوض نکنید: منبع دانلود بسته، و مجوز فایلهای کلید.
🚀 قدم بعدی
اگر میخواهید همین مسیر را روی یک ماشین داخلی امتحان کنید، از پلنهای سرور مجازی ایران شروع کنید؛ تحویل بعد از پرداخت خودکار است.
اگر سوالی داشتید، در بخش نظرات با ما در ارتباط باشید.
منابع