walgit؛ سرور گیتی که فقط یه باینری و یه باکته
خلاصهٔ کاملتر
تو README پروژه اومده که walgit یه پیادهسازی با Rust از همون معماریه که Cursor تو مقالهٔ «Git at any scale» توضیح داده بود (سیستمی که خودشون اسمشو Continuity گذاشتن)، با تغییرهایی که لازمه تا روی ماشینهایی کوچیکتر از خود مخزن هم کار کنه. کل استقرارش هم همینه: یه باینری، یه فایل کانفیگ و یه باکت S3 یا GCS. نه دیتابیس، نه لیدر، نه استیت محلیای که از دستدادنش مهم باشه.
نویسنده میگه دردسر هاستکردن گیت یه ریشهٔ مشخص داره: packfileها. کل محتوای مخزن تو چندتا فایل باینری بزرگ فشرده میشه که برای کمحجمبودن چیده شدن نه برای خوندهشدن پشتسرهم، و هر عملیات گیت عملاً یه پرش تصادفی روی گیگابایتهاست. روی لپتاپ مشکلی نیست چون فایل تو page cacheه، ولی روی فایلسیستم شبکه فاجعهست؛ برای همینم ایدهٔ «مخزنها رو بذاریم روی NFS» تو هر هاست بزرگی که امتحانش کرد شکست خورد.
راهحل اینه که یه write-ahead log (یعنی یه دفترچهٔ فقط-افزودنی از همهٔ تغییرها) توی آبجکتاستوریج منبع حقیقت باشه و هر مخزن روی دیسک فقط یه کش. پوش بهشکل آبجکت تغییرناپذیر آپلود میشه و تازه وقتی دیده میشه که مانیفست کوچیک مخزن با compare-and-swap بازنویسی بشه. همون CAS نقش اجماع رو بازی میکنه: هر نمونهای میتونه پوش قبول کنه و دوتا پوش همزمان هیچوقت هر دو برنده نمیشن. خوندن هم هماهنگی نمیخواد، چون هر درخواست اول با یه conditional GET از باکت میپرسه چیزی عوض شده یا نه و معمولاً جواب ۳۰۴ میگیره.
کانفیگش هم به همین سادگیه و کافیه باینری رو به باکت وصل کنی:
[server]
listen = "0.0.0.0:8080"
public_url = "https://git.example.com"
auto_create_on_push = true
[store]
backend = "s3"
bucket = "my-walgit"از امکانات هم چیزی کم نذاشته: smart HTTP نسخهٔ v0 و v2 برای fetch و push، کلون با bundle-uri که بایتهاش رو باکت یا CDN بهشکل فایل استاتیک تحویل میده، پشتیبانی از Git LFS، یه رابط وب React با API جیسون و SDK، سیاست پوش جدا برای هر مخزن، وبهوک، و احراز هویت با توکن استاتیک یا هر issuer که OIDC رو پشتیبانی کنه. یعنی چند ماشین رو میتونی به یه باکت وصل کنی و بدون هیچ هماهنگیای همه همون مخزنها رو سرو کنن.
نکات کلیدی:
- منبع حقیقت یه write-ahead log توی باکت S3 یا GCSه و دیسک محلی فقط کشه
- تنها نقطهٔ کامیت، CAS روی manifest.pbه؛ نه انتخاب لیدر لازمه نه کوروم
- کلون و catch-up از راه bundle-uri بهشکل فایل استاتیک از باکت یا CDN سرو میشه
- Git LFS، وبهوک، سیاست پوش هر مخزن و سه حالت احراز هویت none/token/oidc
- استورهای پشتیبانیشده: S3 و سازگارهاش (MinIO، R2، Ceph، rustfs) و GCS
- کد پروژه با لایسنس MIT منتشر شده




