معماری

یک باینری Go که پنل، ربات و کارگرهای پس‌زمینه را در خود دارد و Xray-core را به‌عنوان پروسهٔ فرزند سرپرستی می‌کند.

آخرین به‌روزرسانی ۲۶ مرداد ۱۴۰۵نمایش به‌صورت مارک‌داون

مرور کلی

نس‌نت لینوکس یک باینری واحد Go است که همه چیز را اجرا می‌کند: API روی HTTP، پنل مدیریت و پنل مشترک که داخلش جاسازی شده‌اند، ربات تلگرام، کارگرهای پس‌زمینه، و سرپرستی یک پروسهٔ محلی Xray-core. نه عاملی برای نصب هست و نه مجموعه‌ای که باید هماهنگ شود، چون پنل و هستهٔ پروکسی روی یک میزبان می‌نشینند.

دانستن این شکل، بیشتر توصیه‌های عملیاتی جاهای دیگر این راهنما را توضیح می‌دهد: اینکه چرا ارتقا معمولاً یعنی «باینری را عوض کن و راه‌اندازی مجدد کن»، چرا صف پیامی برای زنده نگه‌داشتن وجود ندارد، و چرا از دست دادن میزبان یعنی از دست دادن همه چیز، و همین نکته پشتیبان‌گیری را به مهم‌ترین کاری تبدیل می‌کند که باید درست انجام دهید.

باینری چه چیزهایی را اجرا می‌کند

نقطهٔ ورود main.gocmd/root.go، با nasnet-panel serve شروع می‌شود.

مؤلفه کارش
سرور HTTP (Gin) API به‌همراه پنل مدیریت و پنل مشترکِ جاسازی‌شده، از یک بیلد Vite داخل go:embed.
ربات تلگرام اختیاری. عملیات مدیریتی و اطلاعات اشتراک برای کاربر.
سرپرست Xray Xray-core را به‌عنوان پروسهٔ فرزند اجرا می‌کند، با نگهبان زنده نگهش می‌دارد و پیکربندی تولیدشده را اعمال می‌کند.
سرویس‌های پس‌زمینه زمان‌بند، پایشگر، کارگر تدارک، موتور هشدار، فرستندهٔ اعلان.
پایگاه‌داده PostgreSQL یا SQLite از طریق GORM، با مهاجرت خودکار ساختار هنگام بالا آمدن.

چطور Xray را می‌راند

پنل با Xray از طریق یک لایهٔ کنترل شبکه‌ای حرف نمی‌زند. inbound‌ها، outbound‌ها، مسیریابی و توزیع باری که در پنل می‌سازید توسط تولیدکنندهٔ پیکربندی به یک پیکربندی Xray تبدیل می‌شوند؛ بعد سرپرست آن را روی هستهٔ محلی اعمال و بارگذاری مجدد می‌کند. آمار و کاربران پروکسی از طریق API محلی gRPC خود Xray خوانده و مدیریت می‌شوند، به‌صورت پیش‌فرض روی 127.0.0.1:10085.

شکل درخواست‌ها و پاسخ‌هایی که با هسته رد و بدل می‌شود در proto/node_agent.proto تعریف شده، ولی به‌عنوان نوع‌های درون‌پروسه‌ای به کار می‌رود. میان پنل و هسته هیچ انتقال روی سیم نیست، و در نتیجه هیچ TLS دوطرفه‌ای هم برای تنظیم‌کردن وجود ندارد.

کد لایه‌ای

هر قابلیت زیر internal/<feature>/ از همان چهار لایه پیروی می‌کند، و به همین دلیل است که کد با اضافه شدن قابلیت‌ها قابل پیمایش می‌ماند:

لایه مسئولیت
domain موجودیت‌ها و رابط‌های repository/usecase. بدون وابستگی به چارچوب.
repository دسترسی به داده، با پیاده‌سازی رابط‌های دامنه روی GORM.
usecase منطق کسب‌وکار. مخازن را هماهنگ می‌کند، قواعد را اعمال می‌کند، رویداد منتشر می‌کند.
delivery آداپتورهای انتقال، یعنی هندلرهای Gin و هندلرهای ربات تلگرام که usecase را صدا می‌زنند.

کتابخانه‌های قابل استفادهٔ مجدد در pkg/ هستند و شامل JWT، ACME، متریک، زمان‌بند، رویدادها، حافظهٔ نهان، geoip، i18n، کلیدهای WireGuard و کمکی‌های Xray. سیم‌کشی HTTP و تلگرام در transport/ است. همه چیز یک بار هنگام شروع در cmd/bootstrap.go ساخته و تزریق می‌شود.

رویدادها و کار پس‌زمینه

  • گذرگاه رویداد. usecaseها رویدادهای دامنه منتشر می‌کنند (ایجاد اشتراک، انقضای اشتراک، از کار افتادن یا بازگشت Xray). جمع‌کنندهٔ متریک، موتور هشدار و فرستندهٔ اعلان مشترک آن‌ها هستند.
  • زمان‌بند. کارهای دوره‌ای شامل انقضای اشتراک، تجمیع مصرف، تمدید گواهی، پاک‌سازی نگه‌داری، خلاصه‌ها و اعلان‌ها.
  • پایشگر. سلامت Xray و میزبان را می‌سنجد و با تغییر وضعیت رویداد می‌سازد.
  • کارگر تدارک. افزودن و حذف حساب‌ها را از یک صف روی هستهٔ محلی اعمال می‌کند.
  • موتور هشدار. قواعد را روی رویدادها ارزیابی می‌کند و هشدار سیستمی می‌سازد که فرستنده آن را به تلگرام، دیسکورد یا وب‌هوک می‌رساند.

وقتی یک مشترک پیکربندی‌اش را می‌گیرد چه می‌شود

  1. کلاینت /sub/{link_key} را درخواست می‌کند.
  2. لایهٔ HTTP اشتراک را پیدا می‌کند، انقضا و مصرف را بررسی می‌کند و برنامهٔ کلاینت را از روی User-Agent تشخیص می‌دهد.
  3. usecase اشتراک از تأمین‌کنندهٔ Xray می‌خواهد پیکربندی و پیوندهای هر کلاینت را از inboundهای اشتراک و دادهٔ میزبان سرور بسازد.
  4. پاسخ به‌صورت یک خوراک base64 با فراداده‌های مصرف در سرایندها برمی‌گردد.

ماندگاری داده

مدل‌های GORM همهٔ قابلیت‌ها هنگام شروع ثبت و به‌صورت خودکار مهاجرت داده می‌شوند، و در کنارشان توالی بالا آمدن پرکردن‌های خنثی‌پذیر داده را هم اجرا می‌کند. PostgreSQL چند ایندکس GIN می‌گیرد که SQLite پشتیبانی نمی‌کند؛ جز این، رفتار هر دو یکسان است.

مرتبط