معماری
یک باینری Go که پنل، ربات و کارگرهای پسزمینه را در خود دارد و Xray-core را بهعنوان پروسهٔ فرزند سرپرستی میکند.
مرور کلی
نسنت لینوکس یک باینری واحد Go است که همه چیز را اجرا میکند: API روی HTTP، پنل مدیریت و پنل مشترک که داخلش جاسازی شدهاند، ربات تلگرام، کارگرهای پسزمینه، و سرپرستی یک پروسهٔ محلی Xray-core. نه عاملی برای نصب هست و نه مجموعهای که باید هماهنگ شود، چون پنل و هستهٔ پروکسی روی یک میزبان مینشینند.
دانستن این شکل، بیشتر توصیههای عملیاتی جاهای دیگر این راهنما را توضیح میدهد: اینکه چرا ارتقا معمولاً یعنی «باینری را عوض کن و راهاندازی مجدد کن»، چرا صف پیامی برای زنده نگهداشتن وجود ندارد، و چرا از دست دادن میزبان یعنی از دست دادن همه چیز، و همین نکته پشتیبانگیری را به مهمترین کاری تبدیل میکند که باید درست انجام دهید.
باینری چه چیزهایی را اجرا میکند
نقطهٔ ورود main.go ← cmd/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 و میزبان را میسنجد و با تغییر وضعیت رویداد میسازد.
- کارگر تدارک. افزودن و حذف حسابها را از یک صف روی هستهٔ محلی اعمال میکند.
- موتور هشدار. قواعد را روی رویدادها ارزیابی میکند و هشدار سیستمی میسازد که فرستنده آن را به تلگرام، دیسکورد یا وبهوک میرساند.
وقتی یک مشترک پیکربندیاش را میگیرد چه میشود
- کلاینت
/sub/{link_key}را درخواست میکند. - لایهٔ HTTP اشتراک را پیدا میکند، انقضا و مصرف را بررسی میکند و برنامهٔ
کلاینت را از روی
User-Agentتشخیص میدهد. - usecase اشتراک از تأمینکنندهٔ Xray میخواهد پیکربندی و پیوندهای هر کلاینت را از inboundهای اشتراک و دادهٔ میزبان سرور بسازد.
- پاسخ بهصورت یک خوراک base64 با فرادادههای مصرف در سرایندها برمیگردد.
ماندگاری داده
مدلهای GORM همهٔ قابلیتها هنگام شروع ثبت و بهصورت خودکار مهاجرت داده میشوند، و در کنارشان توالی بالا آمدن پرکردنهای خنثیپذیر داده را هم اجرا میکند. PostgreSQL چند ایندکس GIN میگیرد که SQLite پشتیبانی نمیکند؛ جز این، رفتار هر دو یکسان است.