Startpoint.uz uchun bulutli IDE’ni qanday yozdik

Post image

Startpoint.uz ni rejalashtirganimizda, oldimizda katta maqsad bor edi: talaba noutbukidagi VS Code va bizning brauzerdagi muharrir o‘rtasidagi farqni sezmasligi kerak. Hech qanday imitatsiyalar - faqat haqiqiy kod, haqiqiy terminal va haqiqiy muhit. "Run" tugmasi sehrli darajada tez ishlashi uchun biz bugun hikoya qilib beradigan murakkab orkestratsiya tizimini qurishimizga to‘g‘ri keldi.

Frontend: Shunchaki matn muharriridan ko‘ra ko‘proq

Brauzerda ko‘rayotgan narsangiz - bu murakkab SPA. Kod muharriri asosi sifatida Monaco Editor (VS Code ishlaydigan o‘sha mashhur dvigatel) olindi, terminal uchun esa xterm.js dan foydalanamiz. Ammo eng qizig‘i - bularning barchasi server bilan qanday muloqot qilishidir.

Aloqa gibrid shaklda. HTTP va WebSockets. Yuklamani optimallashtirish uchun biz ma'lumotlar oqimini ajratdik:

HTTP(S) "og‘ir" kontent uchun ishlatiladi. Faylni ochganingizda, uning tarkibi oddiy GET-so‘rov orqali keladi.

WebSockets - bu IDE ning asab tizimi. Soketlar orqali real vaqt rejimida quyidagilar uchadi:

  • Terminal ma'lumotlar oqimi (stdin/stdout).
  • Fayllar boshqaruvi (yaratish, o‘chirish, nomini o‘zgartirish).
  • Texnik telemetriya (konteyner holati, yuklama).

Frontendning asosiy qiyinchiliklari:

Aqlli avtomatik saqlash. Biz har bir tugma bosilganda faylni shunchaki saqlay olmasdik (bu tarmoqni "o‘ldirgan" bo‘lardi). Saqlash ishonchli, ammo sezilmas bo‘lishi uchun murakkab "debounce" (kechikish) va so‘rovlar navbati mantiqini yozishga to‘g‘ri keldi.

AFK-rejimi (Away From Keyboard). Virtual serverlar pul va resurs talab qiladi. Agar talaba tabni ochib, 2 soatga choy ichgani ketsa, biz konteynerni ishga tushirilgan holatda ushlab turolmaymiz. Biz faollikni kuzatish tizimini joriy qildik: agar foydalanuvchi harakatsiz bo‘lsa, biz WebSockets orqali ulanishni uzamiz va resurslarni tejash uchun konteynerlarni "uxlatamiz".

Xatolarni qayta ishlash. Internet "uzilib qoldimi"? Konteyner ishga tushmadimi? Xotira limiti tugadimi? Frontend o‘nlab xato turlarini ajrata olishi va talabaga nima sodir bo‘lganini tushunarli tushuntirib berishi kerak. Hozir ham xatolarni tutib, ularni tezda bartaraf etyapmiz.

Backend: Konteynerlar orkestri

Eng asosiy "mag‘iz" serverlarda joylashgan. Har bir amaliyot uchun har bir talabaga biz izolyatsiya qilingan Docker-konteynerlar tarmog‘ini ko‘taramiz.

Bu qanday ishlaydi: Darsga kirganingizda, bizning Orkestrator buyruq beradi:

  • Repozitoriydan kerakli fayllarni yuklab olish.
  • Muhitni tayyorlash (Python, Node.js, MB).
  • Bitta tarmoqda konteynerlar bog‘lamasini ishga tushirish.
  • va boshqalar.

Brauzerdagi terminal. Veb-interfeysni Linux-konsol bilan ulash uchun biz GoTTY utilitini (Go tilida yozilgan) oldik va uni ehtiyojlarimizga moslab jiddiy takomillashtirdik. U konteynerdan kiritish/chiqarishni to‘g‘ridan-to‘g‘ri mijozdagi xterm.js tinglaydigan WebSocket-ga uzatadi.

Paradoks: "Cheklovlardagi erkinlik"

Biz talabaga to‘liq erkinlik berishimiz kerak: istalgan kodni yoz, fayllar yarat, tizimni buz. Ammo shu bilan birga, bir talaba butun serverni "qulatishiga" yo‘l qo‘ya olmaymiz. Yechim: Dockerni nozik sozlash. Konteyner foydalanuvchi uchun to‘liq qonli Linux kabi ko‘rinadi, ammo u CPU va RAM bo‘yicha qat'iy cheklangan, shuningdek, xost-tizimdan izolyatsiya qilingan.

Live-sinxronizatsiya (inotify)

Agar kod yangi fayl yaratsa (masalan, dastur ishlash logi), u darhol chap tomondagi fayllar daraxtida paydo bo‘lishi kerak. Biz fayl tizimidagi o‘zgarishlarni kuzatish va soketlar orqali frontga "Hoy, bu yerda fayl yaratildi, uni chizib ber!" degan bildirishnomalarni yuborish uchun serverda inotify-dan foydalanamiz.

Veb-prevyu (Port Forwarding)

Agar natijani ko‘rmasangiz, React yoki HTMLni qanday o‘rganasiz? Veb-amaliyotlar uchun biz portlarni dinamik yo‘naltirishni (forwarding) sozladik. Konteyner ichida lokal serverni ishga tushirganingizda (masalan, 3000-portda), bizning tizimimiz uni tashqariga proksi qiladi. Siz noyob havolani olasiz va saytingizni xuddi u lokal ishga tushirilgandek ko‘rasiz.

Xulosa

Biz oson va tez esga olinadigan narsalarni tasvirlab berdik. Ehtimol, nimadir qolib ketgandir, ammo savollar uchun doim ochiqmiz!

Startpoint-dagi IDE - bu yuzlab soatlik nosozliklarni tuzatish, Linux-yadroni sozlash va JS optimizatsiyasi natijasidir. Siz uchun ta'lim tashqi tomondan oddiy bo‘lishi uchun, biz uning ichki qismini murakkab qildik.

2019-2026 «Endpoint» MChJ. Barcha xizmatlar litsenziyalangan
STIR: 306 410 506