معماری

پنل چطور سرهم شده، از یک باینری Go که یک SPA با React را به مرورگر می‌فرستد تا چهار راهی که می‌تواند به یک روتر برسد.

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

مرور کلی

نس‌نت پنل یک پروسه است. یک سرویس Go (Echo v4) یک JSON API را در معرض می‌گذارد و برنامهٔ تک‌صفحه‌ای (single-page app) با React را روی همان پورت به مرورگر می‌فرستد، چون frontend کامپایل‌شده با go:embed داخل باینری جاسازی شده است. نه سرور وب جداگانه‌ای هست، نه پایگاه داده، و نه agent نصب‌شده روی روترها.

این شکل عمدی است. پنل قرار است روی «خودِ» یک میکروتیک با ۳۰ مگابایت RAM اضافه اجرا شود، و هر قطعهٔ متحرک اضافه هم باید در همان بودجه جا بگیرد.

قطعه‌ها

قطعه چه می‌کند
React SPA رابط اپراتور. با مبدأ (origin) خودش JSON حرف می‌زند.
Go API (Echo v4) SPA را به مرورگر می‌فرستد، API را در معرض می‌گذارد، و هر فراخوانی روتر را واسطه‌گری می‌کند.
دارایی‌های جاسازی‌شده frontend ساخته‌شده، که با go:embed داخل باینری کامپایل شده است.
اسکنر ساب‌نت یک ساب‌نت را برای دستگاه‌های میکروتیک جاروب می‌کند و سرویس‌های روی پورت‌های رایج را شناسایی می‌کند.
اجراکنندهٔ دسته‌ای زنجیره‌های دستور RouterOS را با پیشرفت، اجرای آزمایشی (dry-run) و بازگردانی هنگام شکست اجرا می‌کند.

چطور به یک روتر می‌رسد

backend چهار پروتکل را می‌داند و خودکار عقب می‌نشیند، به همین ترتیب:

  1. REST API، رابط HTTP در RouterOS نسخهٔ ۷. ترجیح‌داده‌شده.
  2. RouterOS API، پروتکل باینری بومی روی 8728، یا 8729 با TLS.
  3. SSH روی پورت 22.
  4. Telnet به‌عنوان آخرین چاره، برای دستگاه‌هایی که چیز دیگری رویشان باز نیست.

عقب‌نشینی برای هر روتر جدا و خودکار است، پس مجموعه‌ای که یک دستگاهش فقط روی SSH پاسخ می‌دهد و دیگری REST API فعال دارد به هیچ رفتار خاصی نیاز ندارد. روی خود روتر چیزی نصب نمی‌شود. هر عملیات یک دستور است که روی یکی از این چهار مسیر ارتباطی (transport) فرستاده می‌شود.

دسته‌بندی و بازگردانی

هر چیزی که بیش از یک تنظیم را یک‌جا عوض می‌کند از اجراکنندهٔ دسته‌ای می‌گذرد، نه اینکه دستور به دستور فرستاده شود. یک دسته در حین اجرا پیشرفت را گزارش می‌دهد، می‌تواند اول آزمایشی اجرا شود تا دقیقاً نشان دهد چه چیزی فرستاده می‌شود، و اگر گامی بعدی شکست بخورد گام‌هایی که قبلاً اعمال کرده را برمی‌گرداند. همین چیزی است که زیر ویزارد Easy Config نشسته، که یک دسته با چهرهٔ دوستانه است.

مرزهای اعتماد

ارزش دارد دقیق بگوییم چه چیزی کجا اجرا می‌شود، چون فرض کردن خلافش آسان است:

  • اعتبارنامهٔ روتر را backend نوشته‌شده با Go تا پایان یک نشست نگه می‌دارد و با آن به روتر ارتباط باز می‌کند. به مرورگر فرستاده نمی‌شود.
  • مرورگر فقط با پنل حرف می‌زند، هیچ‌وقت مستقیم با یک روتر.
  • گزارش‌های خرابی از مرورگر می‌آیند، نه از روتر. میکروتیک هیچ‌وقت به یک سرویس گزارش خطا وصل نمی‌شود. گزارش‌ها خود خطا، stack trace، نسخهٔ برنامه، و نام مرورگر و سیستم‌عامل را دارند. آدرس‌های IP پیش از فرستادن حذف می‌شوند، و کل این کار را می‌توان برای هر مرورگر از صفحهٔ Diagnostics خاموش کرد.

شکل‌های استقرار

شکل چه شکلی است
روی خود روتر یک کانتینر RouterOS روی veth1 با 192.168.50.2/24، که از راه یک قاعدهٔ dst-nat از پورت شبکهٔ محلی به آن می‌رسند.
روی یک سرور در شبکهٔ محلی یک کانتینر Docker ساده، معمولاً با شبکهٔ میزبان تا روترها را ببیند.
از روی کد منبع dev server مربوط به frontend روی 3000، backend روی 8080، با فراخوانی‌های API که بینشان واسطه می‌شود.

ایمیج production بر پایهٔ busybox با musl ساخته می‌شود، و یک باینری فشردهٔ Go را با GOMAXPROCS=1 و یک نقطهٔ پایانی /health پشت healthcheck کانتینر اجرا می‌کند. ایمیج‌ها چندمعماری برای linux/amd64 و linux/arm64 و linux/arm/v7 منتشر می‌شوند.

مرتبط