P7: restore agent node type, agent heartbeat expiry, build-version injection, remove log/history/xray-metrics modules, optional sub port

- nodes: port node-type (traditional/agent) picker back from web-src into
  the embedded frontend; backend annotates NodeView.nodeType from
  agent_nodes bindings; fix agent-node update path (skip reachability
  probe and apiToken requirement for agent-managed nodes); restore i18n
  keys in all 13 locales; install command now uses the Gitea mirror
- jobs: expire agent-bound nodes whose agent_nodes.last_seen is older
  than max(3x heartbeat interval, 120s) = 180s; last_seen=0 (never
  registered) is left untouched; transitions reuse UpdateHeartbeat +
  node event broadcast
- config: GetBaseVersion honors ldflags-injected buildVersion; release
  builds inject 3.7.0-agent.1 so the panel no longer reports a phantom
  update against the Gitea release tag
- logger/server: remove the three log viewers (panel/xray/amneziawg),
  their API endpoints and the 10240-entry in-memory log buffer; file
  logging via lumberjack unchanged; tests assert via a new optional
  logger hook instead of the removed buffer
- server: remove system history and xray metrics modules end to end
  (endpoints, sampling appends in RefreshStatus, per-minute persist
  cron, gob snapshot/restore, XrayMetricsService); realtime status and
  per-node history are untouched
- settings: subPort may be 0/unset - subscription links are generated
  without a port while the subscription service keeps binding the
  default 2096; the settings form declares the cleared state via
  onNumber's new onClear option instead of snapping back to 1
This commit is contained in:
Muse
2026-10-21 06:44:00 +00:00
parent 2c85f85549
commit f887f47bb9
66 changed files with 1093 additions and 5129 deletions
+14 -64
View File
@@ -136,45 +136,6 @@
"currentCommit": "کامیت فعلی",
"latestCommit": "آخرین کامیت",
"updateChannelChanged": "کانال به‌روزرسانی تغییر کرد",
"systemHistoryTitle": "تاریخچه سیستم",
"historyTitleCpu": "مصرف پردازنده",
"historyTitleMem": "مصرف حافظه",
"historyTitleNetwork": "پهنای باند شبکه",
"historyTitlePackets": "بسته‌های شبکه",
"historyTitleDisk": "ورودی/خروجی دیسک",
"historyTitleOnline": "کاربران آنلاین",
"historyTitleLoad": "میانگین بار سیستم (۱ / ۵ / ۱۵ دقیقه)",
"historyTitleConnections": "اتصالات فعال (TCP / UDP)",
"historyTitleDiskUsage": "مصرف فضای دیسک",
"historyTabBandwidth": "پهنای باند",
"historyTabPackets": "بسته‌ها",
"historyTabDisk": "دیسک I/O",
"historyTabOnline": "آنلاین",
"historyTabLoad": "بار",
"historyTabConnections": "اتصالات",
"historyTabDiskUsage": "مصرف دیسک",
"xrayMetricsTitle": "متریک‌های Xray",
"xrayTitleHeap": "حافظه‌ی Heap تخصیص‌یافته",
"xrayTitleSys": "حافظه‌ی رزروشده از سیستم‌عامل",
"xrayTitleObjects": "اشیای زنده‌ی Heap",
"xrayTitleGcCount": "چرخه‌های کامل‌شده‌ی GC",
"xrayTitleGcPause": "مدت مکث GC",
"xrayTitleObservatory": "سلامت اتصال خروجی",
"xrayTabHeap": "Heap",
"xrayTabSys": "Sys",
"xrayTabObjects": "اشیا",
"xrayTabGcCount": "تعداد GC",
"xrayTabGcPause": "مکث GC",
"xrayTabObservatory": "رصدخانه",
"xrayMetricsDisabled": "نقطه پایانی متریک‌های Xray پیکربندی نشده",
"xrayMetricsHint": "یک بلاک metrics در سطح بالای پیکربندی xray با tag برابر metrics_out و listen برابر 127.0.0.1:11111 اضافه کنید، سپس xray را راه‌اندازی مجدد کنید.",
"xrayObservatoryEmpty": "هنوز داده‌ای از Observatory دریافت نشده",
"xrayObservatoryHint": "یک بلاک observatory در پیکربندی xray اضافه کنید و outbound tag‌هایی که می‌خواهید بررسی شوند را لیست کنید، سپس xray را راه‌اندازی مجدد کنید.",
"xrayObservatoryTagPlaceholder": "انتخاب outbound",
"xrayObservatoryAlive": "فعال",
"xrayObservatoryDead": "غیرفعال",
"xrayObservatoryLastSeen": "آخرین مشاهده",
"xrayObservatoryLastTry": "آخرین تلاش",
"connectionCount": "تعداد کانکشن ها",
"ipAddresses": "آدرس‌های IP",
"toggleIpVisibility": "تغییر وضعیت نمایش IP",
@@ -191,18 +152,6 @@
"panelUpdateUnknownTitle": "تأیید نشد که به‌روزرسانی به پایان رسیده باشد",
"panelUpdateUnknownDesc": "پنل به‌موقع نتیجه‌ای گزارش نکرد. صفحه را بارگذاری مجدد کنید تا نسخه فعلی را بررسی کنید یا گزارش‌های سرور را بررسی کنید.",
"dontRefresh": "در حال نصب، لطفا صفحه را رفرش نکنید",
"logs": "لاگ‌ها",
"accessLogs": "لاگ‌های دسترسی",
"autoUpdate": "به‌روزرسانی خودکار",
"amneziawgLogs": "لاگ‌های AmneziaWG",
"amneziawgHandshake": "آخرین دست‌دهی",
"amneziawgInterface": "رابط شبکه",
"amneziawgInbound": "ورودی",
"amneziawgEndpoint": "نقطه اتصال",
"amneziawgIdle": "بی‌کار",
"amneziawgEvents": "رویدادها",
"amneziawgNoPeers": "هیچ پیر فعالی برای AmneziaWG وجود ندارد",
"amneziawgNoEvents": "هنوز رویدادی برای AmneziaWG ثبت نشده است",
"config": "پیکربندی",
"backupTitle": "پشتیبان‌گیری و بازیابی",
"exportDatabase": "پشتیبان‌گیری",
@@ -219,25 +168,14 @@
"importDatabasePgDesc": "برای انتخاب و بارگذاری یک پشتیبان PostgreSQL (.dump)، پایگاه‌دادهٔ SQLite (.db) یا فایل مهاجرت SQLite جهت بازیابی پایگاه داده کلیک کنید. این کار همه داده‌های فعلی را جایگزین می‌کند.",
"migrationDownload": "دانلود فایل مهاجرت",
"migrationDownloadPgDesc": "برای دانلود یک پایگاه‌دادهٔ SQLite با پسوند ‎.db که از داده‌های PostgreSQL شما ساخته می‌شود کلیک کنید؛ آمادهٔ اجرای این پنل روی SQLite.",
"avg": "میانگین",
"peak": "اوج",
"free": "آزاد",
"openSockets": "اتصال باز",
"throughputSub": "کل اینترفیس",
"avgWindow": "میانگین بازه",
"healthWarm": "{list} — رو به گرم شدن",
"healthCritical": "{list} — بحرانی",
"panel": "پنل",
"threads": "نخ‌ها",
"uptime": "مدت کارکرد",
"logLevelDebug": "Debug",
"logLevelInfo": "Info",
"logLevelNotice": "Notice",
"logLevelWarning": "Warning",
"logLevelError": "Error",
"accessDirect": "DIRECT",
"accessBlocked": "BLOCKED",
"accessProxy": "PROXY",
"importKeepHostSettings": "حفظ تنظیمات این دستگاه",
"importKeepHostSettingsDesc": "آدرس‌ها و پورت‌های شنود، مسیر پایه، گواهی‌ها و هویت نودِ همین پنل را نگه می‌دارد و آن‌ها را از فایل بارگذاری‌شده نمی‌گیرد."
},
@@ -970,7 +908,19 @@
"pinnedCertPlaceholder": "SHA-256 به‌صورت base64 یا hex",
"fetchPin": "دریافت",
"pinFetched": "گواهیِ فعلیِ نود دریافت شد",
"pinFetchFailed": "دریافت گواهی ممکن نشد"
"pinFetchFailed": "دریافت گواهی ممکن نشد",
"nodeType": "Node Type",
"nodeTypeTraditional": "Traditional Panel Node",
"nodeTypeAgent": "Agent Lightweight Node",
"agentHint": "Agent nodes connect out to the master; no address, port or API token needed. An install command is generated on creation.",
"agentTokenTitle": "Agent Node Setup",
"agentTokenCreated": "Node {{name}} created successfully",
"agentTokenHint": "Copy the command below and run it on the node machine. This token is shown only once!",
"agentTokenInstructions": "The command downloads the installer, configures the master URL and token. The node comes online in ~30s.",
"agentTokenCopied": "Install command copied",
"agentTokenCopyFailed": "Copy failed, please copy manually",
"copyToken": "Copy Install Command",
"agentMasterUrlHint": "Master URL (used by agent to reach the master; change to public address if behind proxy):"
},
"settings": {
"defaultTag": "پیش‌فرض",
@@ -1725,4 +1675,4 @@
"noIpRecord": "❗ رکورد آی پی وجود ندارد!"
},
"email": {}
}
}