Dasturiy ta'minot

Sula: Scryer Prologda yozilgan Gemini protokol serveri — kichik veb uchun yangi yondashuv

6-avgust, 2026, 07:070 ko'rish6 daqiqa o'qish
Sula: Scryer Prologda yozilgan Gemini protokol serveri — kichik veb uchun yangi yondashuv

Gemini protokoli — bu HTTP va Gopher orasida joylashgan, minimalistik va maxfiylikga e'tibor beruvchi "kichik veb" (small web) standarti. Ushbu ekotizimda server va klient dasturlash odatda Rust, Go yoki Python kabi tillarda amalga oshiriladi. Lekin Sula loyihasi alohida yo'lni tanladi: u Scryer Prolog tilida yozilgan to'liq funksiyaga ega Gemini serveri.

Nima uchun Prolog? Nima uchun Scryer?

Prolog — bu logik dasturlash tili, uni odatda sun'iy intellekt, avtomatik sabab-qol aniqlash va ramzli hisoblash uchun tanishamiz. Server dasturlash uchun bu tanish emas. Ammo Sula muallifi (GitHub/GitLab profili js nomi ostida) Prologning kuchli DCG (Definite Clause Grammar) mexanizmini URI, MIME-tiplari va HTTP/Gemini status kodlarini parse qilish uchun samarali ishlatgan.

sula logo

Scryer Prolog — bu Rustda yozilgan, ISO standartiga yaqin Prolog implementatsiyasi. U tezkor, modulli va Rust ekotizimi bilan integratsiya qilingan. Sula uchun Scryer tanlashi tabiiy: Rust kutubxonalari (masalan, rustls TLS uchun) orqali pastki darajali tarmoq va xavfsizlik operatsiyalarini bajarish, yuqori darajada esa logikani Prologda ifodalash imkonini beradi.

Yamash (patch) talab etiladigan Scryer versiyasi

Sula hozirgi kunda js/fixes branchidagi yamashlangan Scryer Prolog ni talab qiladi. Bu yamashlar server ishlashi uchun kritikal:

  • $copy_stream/2 builtin — Prolog xotirasi (heap) ga yuklamasdan, to'g'ridan-to'g'ri fayldan TLS soketga binar oqimni nusxalash. Bu katta fayllar uchun xotira tejash va tezlik beradi.
  • library(pio) da buffer_prepare_for_n/5 tuzatishiat_end_of_stream/1 true qaytarmagan oqimlar (masalan, protsess kanallari) uchun EOF da to'xtashni ta'minlaydi, cheksiz sikl (spinning) oldini oladi.
  • Bloklamas socket_server_accept/4 polling — Scryer INTERRUPT bayrog'ini tekshiradi, shunda SIGINT (Ctrl+C) bloklangan sistem chaqiruvlari orasida qolganda, ushlanishi mumkin $interrupt_thrown istisnosiga aylanadi. Bu toza o'chirish (graceful shutdown) uchun shart.
  • rustls porti — OpenSSL o'rniga Rust TLS kutubxonasidan foydalash.
  • tls_server_negotiate o'zgartirishlari — ixtiyoriy klient sertifikati qo'llab-quvvatlash uchun.

Bu yamashlar hali asosiy Scryer repositoriyasiga kiritilmagan, shuning uchun Sula o'zining git.sagredo.dev dagi forkidan foydalana oladi.

git clone https://git.sagredo.dev/scryer-prolog -b js/fixes
cd scryer-prolog
cargo install --path .

Arxitektura va modul tuzilishi

Sula sula.pl — bitta faylga jamlangan polyglot (bash va Prolog ikkalasi ham tushunadigan) ishga tushiruvchi skriptdan iborat. Ammo ichki modullar aniq ajratilgan:

  • config.pl — CLI argumentlarni DCG yordamida parse qiladi va konfiguratsiya accessorlari (cert/1, addr/1 va boshqalar) taqdim etadi.
  • cert.pl — sertifikat yuklash va openssl x509 chaqiruvi orqali CN (Common Name) ni --hostname bilan solishtirish.
  • mime.pl/etc/mime.types faylini DCG parseri orqali o'qiydi, mime/2 faktlarini yaratadi. .gmi kengaytmasi uchun text/gemini avtomatik qo'shiladi.
  • request.pl — Gemini so'rov qatorini o'qiydi.
  • gemini_uri.plgemini://host[:port]/path[?query] URI sxemasini DCGda tasvirlaydi. IP manzillar host sifatida rad etiladi.
  • response.pl — Javob status kodlari DCGsi.
  • log.pl — Tegli loglash (log_msg/3).
  • banner.plbanner.txt ni qator-qator ko'rsatadi.

Bu modullik yakunlashuv Prologning kuchli tomoni — har bir modul alohida test qilinishi, o'zgarishi va kengaytirilishi mumkin.

Ishlatish va sozlash

O'rnatish uchun quyidagi qadamlar bajariladi:

./sula.pl --addr HOST:PORT --hostname NAME --content DIR --certs DIR
git clone https://git.sagredo.dev/scryer-prolog -b js/fixes
cd scryer-prolog
cargo install --path .

openssl ham PATH da bo'lishi shart — server ishga tushganda sertifikat CN ni tekshirish uchun chaqiriladi.

Serverni ishga tushirish:

./sula.pl --addr 127.0.0.1:1965 \
    --hostname gmi.example.dev \
    --content ./site \
    --certs .

Parametrlar har qanday tartibda berilishi mumkin, taninmaganlar chetlab o'tiladi. --addr standart Gemini porti 1965 da tinglaydi, --content statik fayllar papkasini, --certs esa cert.pem va key.pem (yoki identity.p12) joylashgan papkani ko'rsatadi.

./sula.pl \
    --addr 127.0.0.1:1965 \
    --hostname gmi.example.dev \
    --content ./site \
    --certs .

Joriy imkoniyatlar va texnik yechimlar

  • TLS via rustls — OpenSSL ga bog'liq emas, Rust xavfsizlik modelidan foydalaydi. PKCS#12 (.p12) identifikatsiya fayllarini qo'llab-quvvatlaydi.
  • Hostname tekshiruvi — Ishga tushirishda cert_is_for_hostname/2 orqali sertifikat CN si --hostname ga mos kelishini kafolatlaydi. Mos kelmasa server to'xtaydi.
  • Kontent muzokarasi (Content negotiation) — Fayl kengaytmasiga asoslanib MIME-tipini aniqlaydi. Matnli javoblar format/3 orqali, binar fayllar esa copy_stream/2 (native kod) orqali Prolog heapiga yuklanmasdan to'g'ridan-to'g'ri TLS soketga o'tkaziladi. Bu katta fayllar (rasm, video, arxivlar) uchun muhim optimizatsiya.
  • Xatoliklarga chidamli yondashuv — TLS handshake xatolari va mijoz uzilishlari loglanadi va server ishlashda davom etadi. Boshqa xatolar yuqori darajaga uzatiladi.
  • Toza o'chirishSIGINT (Ctrl+C) tinglovchi soketni yopadi, Shutting down logini yozadi va kod 0 bilan chiqadi.

Kelajak rejalari: CGI, virtual hosting, ko'p oqimlilik

Loyiha hali faol rivojlanish bosqichida. Rejalashtirilgan funksiyalar o'rtasida:

  • Kalit va sertifikat alohida fayllar sifatida (hozir .p12 majburiy).
  • Klient sertifikatlari (mTLS) — Gemini da kimlik tasdiqlash uchun standart yo'l.
  • Konfiguratsiya faylidan yuklash (hozir faqat CLI).
  • Foydalanuvchilarni saqlash/yuklash — shaxsiy kapsulalar (capsules) uchun.
  • CGI skriptlarini ishga tushirish — bu statik fayllardan dinamik kontentga o'tishni anglatadi, Prolog da CGI interfeysi qiziq yechimlar berishi mumkin.
  • Barcha Gemini status kodlari.
  • Cheklov (rate limiting), virtual hosting, faylga log yozish.
  • Ko'p oqimlilik (multi-threading) yoki alternatava — Scryer hali to'liq threading qo'llab-quvvatlamasa, bu eng murakkab va qiziq chalish bo'ladi.
  • Issiq yangilash (hot reload) — kod o'zgarishlari serverni to'xtatmasdan qo'llash.

Nega bu muhim: Gemini ekotizimi uchun yangi vosita

Gemini protokoli minimalizmga intilishi bilan tanilgan: HTML emas, text/gemini (Markdown ga o'xshash oddiy format), cookies yo'q, JavaScript yo'q, faqat TLS majburiy. Bu ekotizimda serverlar odatda oddiy va statik bo'ladi. Sula esa logik dasturlash qudrati bilan dinamik xatti-harakatlar, murakkab marshrutizatsiya, kimlik tasdiqlash va kelajakda CGI orqali to'liq dasturiy logikani Gemini so'rovlariga bog'lash imkonini ochadi.

Scryer Prolog tanlashi ham o'ziga xos: Rust xavfsizligi va samaradorligi bilan Prologning ramzli, deklarativ parsing va sorov qayta ishlash kuchini birlashtiradi. Bu "kichik veb" falsafasiga zid emas — aksincha, minimal protokol ustida maksimal ifodalik qurish misoli.

sula.pl        Polyglot launcher + main sula module (run/0, request loop).
config.pl      CLI parsing (DCG) and config accessors (cert/1, addr/1, ...).
cert.pl        Certificate loading + hostname-vs-CN check.
mime.pl        /etc/mime.types parser (DCG) and mime/2 facts.
request.pl     Request line reader.
gemini_uri.pl  Gemini URI DCG (gemini://host[:port]/path[?query]).
ip.pl          IP address recognition (rejected as Gemini hosts).
response.pl    Response status code DCG.
log.pl         Tagged log_msg/3.
banner.pl      Reads banner.txt and emits it line-by-line via display_banner/1.

Xulosa

Sula — bu hali erta bosqichdagi, lekin texnik jihatdan juda qiziq loyiha. U Gemini serverlari qanday bo'lishi mumkinligining chegarasini kengaytiradi: Prolog logikasi, Rust xavfsizligi, native oqimlash (zero-copy streaming) va modullar arxitektura. Agar siz Gemini kapsulasi betashtirasiz, o'z serveringizni qurmoqchisiz yoki Prologni tizim dasturlashda sinab ko'rmoqchisiz — Sula kuzatib borish va hatto ishtirok etish arziyndir.

Loyiha manbasi: git.sagredo.dev/~js/sula (manba havolasi asl matnda ko'rsatilmagan, lekin muallif repositoriyasi git.sagredo.dev da joylashgan). Scryer Prolog yamashlangan versiyasi: git.sagredo.dev/scryer-prolog (js/fixes branchi).

Asl manba: sagredo.dev

Manba: Hacker News
#gemini #prolog #scryer-prolog #small-web #tls
Telegram da muhokama qilish