# معماری

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

Source: https://joinnasnet.com/fa/guides/nasnet-linux/architecture/
Last updated: 2026-08-17

---

## مرور کلی

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

دانستن این شکل، بیشتر توصیه‌های عملیاتی جاهای دیگر این راهنما را توضیح می‌دهد:
اینکه چرا ارتقا معمولاً یعنی «باینری را عوض کن و راه‌اندازی مجدد کن»، چرا صف
پیامی برای زنده نگه‌داشتن وجود ندارد، و چرا از دست دادن میزبان یعنی از دست دادن
همه چیز، و همین نکته
[پشتیبان‌گیری](/fa/guides/nasnet-linux/backup/) را به مهم‌ترین کاری تبدیل می‌کند
که باید درست انجام دهید.

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

نقطهٔ ورود `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 و میزبان را می‌سنجد و با تغییر وضعیت رویداد می‌سازد.
- **کارگر تدارک.** افزودن و حذف حساب‌ها را از یک صف روی هستهٔ محلی اعمال می‌کند.
- **موتور هشدار.** قواعد را روی رویدادها ارزیابی می‌کند و هشدار سیستمی می‌سازد
  که فرستنده آن را به تلگرام، دیسکورد یا وب‌هوک می‌رساند.

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

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

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

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

## مرتبط

- [نیازمندی‌های سیستم](/fa/guides/nasnet-linux/system-requirements/)
- [سرور و Xray](/fa/guides/nasnet-linux/server/)
- [پشتیبان‌گیری](/fa/guides/nasnet-linux/backup/)
