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
+15 -65
View File
@@ -136,45 +136,6 @@
"currentCommit": "Current commit",
"latestCommit": "Latest commit",
"updateChannelChanged": "Update channel changed",
"systemHistoryTitle": "System History",
"historyTitleCpu": "CPU Usage",
"historyTitleMem": "Memory Usage",
"historyTitleNetwork": "Network Bandwidth",
"historyTitlePackets": "Network Packets",
"historyTitleDisk": "Disk I/O",
"historyTitleOnline": "Online Clients",
"historyTitleLoad": "System Load Average (1m / 5m / 15m)",
"historyTitleConnections": "Active Connections (TCP / UDP)",
"historyTitleDiskUsage": "Disk Space Usage",
"historyTabBandwidth": "Bandwidth",
"historyTabPackets": "Packets",
"historyTabDisk": "Disk I/O",
"historyTabOnline": "Online",
"historyTabLoad": "Load",
"historyTabConnections": "Connections",
"historyTabDiskUsage": "Disk Usage",
"xrayMetricsTitle": "Xray Metrics",
"xrayTitleHeap": "Allocated Heap Memory",
"xrayTitleSys": "Memory Reserved from OS",
"xrayTitleObjects": "Live Heap Objects",
"xrayTitleGcCount": "Completed GC Cycles",
"xrayTitleGcPause": "GC Pause Duration",
"xrayTitleObservatory": "Outbound Connection Health",
"xrayTabHeap": "Heap",
"xrayTabSys": "Sys",
"xrayTabObjects": "Objects",
"xrayTabGcCount": "GC Count",
"xrayTabGcPause": "GC Pause",
"xrayTabObservatory": "Observatory",
"xrayMetricsDisabled": "Xray metrics endpoint not configured",
"xrayMetricsHint": "Add a top-level metrics block to the xray config with tag metrics_out and listen 127.0.0.1:11111, then restart xray.",
"xrayObservatoryEmpty": "No observatory data yet",
"xrayObservatoryHint": "Add an observatory block to the xray config listing the outbound tags to probe, then restart xray.",
"xrayObservatoryTagPlaceholder": "Select outbound",
"xrayObservatoryAlive": "Alive",
"xrayObservatoryDead": "Down",
"xrayObservatoryLastSeen": "Last seen",
"xrayObservatoryLastTry": "Last try",
"connectionCount": "Connection Stats",
"ipAddresses": "IP Addresses",
"toggleIpVisibility": "Toggle visibility of the IP",
@@ -191,18 +152,6 @@
"panelUpdateUnknownTitle": "Couldn't confirm the update finished",
"panelUpdateUnknownDesc": "The panel didn't report a result in time. Reload to check the current version, or check the server logs.",
"dontRefresh": "Installation is in progress, please do not refresh this page",
"logs": "Logs",
"accessLogs": "Access Logs",
"autoUpdate": "Auto Update",
"amneziawgLogs": "AmneziaWG Logs",
"amneziawgHandshake": "Last Handshake",
"amneziawgInterface": "Interface",
"amneziawgInbound": "Inbound",
"amneziawgEndpoint": "Endpoint",
"amneziawgIdle": "Idle",
"amneziawgEvents": "Events",
"amneziawgNoPeers": "No AmneziaWG peers are currently up",
"amneziawgNoEvents": "No AmneziaWG events recorded yet",
"config": "Config",
"backupTitle": "Backup & Restore",
"exportDatabase": "Back Up",
@@ -219,25 +168,14 @@
"importDatabasePgDesc": "Click to select and upload a PostgreSQL backup (.dump), a SQLite database (.db), or a SQLite migration dump to restore your database. This replaces all current data.",
"migrationDownload": "Download Migration",
"migrationDownloadPgDesc": "Click to download a .db SQLite database built from your PostgreSQL data, ready to run this panel on SQLite.",
"avg": "avg",
"peak": "peak",
"free": "free",
"openSockets": "open sockets",
"throughputSub": "Interface total",
"avgWindow": "Avg over window",
"healthWarm": "{list} — running warm",
"healthCritical": "{list} — critical",
"panel": "Panel",
"threads": "Threads",
"uptime": "Uptime",
"logLevelDebug": "Debug",
"logLevelInfo": "Info",
"logLevelNotice": "Notice",
"logLevelWarning": "Warning",
"logLevelError": "Error",
"accessDirect": "DIRECT",
"accessBlocked": "BLOCKED",
"accessProxy": "PROXY",
"importKeepHostSettings": "Keep this machine's settings",
"importKeepHostSettingsDesc": "Keeps this panel's listen addresses, ports, base path, certificates and node identity instead of taking them from the uploaded file."
},
@@ -1088,7 +1026,19 @@
"pinnedCertPlaceholder": "base64 or hex SHA-256",
"fetchPin": "Fetch",
"pinFetched": "Fetched the node's current certificate",
"pinFetchFailed": "Could not fetch the certificate"
"pinFetchFailed": "Could not fetch the certificate",
"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": "Default",
@@ -1192,7 +1142,7 @@
"subListen": "Listen IP",
"subListenDesc": "The IP address for the subscription service. (leave blank to listen on all IPs)",
"subPort": "Listen Port",
"subPortDesc": "The port number for the subscription service. (must be an unused port). Also used to build the subscription link/QR shown in the panel when \"Reverse Proxy URI\" below is empty — if the subscription is reached through a reverse proxy on a different port, set \"Reverse Proxy URI\" instead.",
"subPortDesc": "The port number for the subscription service. (must be an unused port). Also used to build the subscription link/QR shown in the panel when \"Reverse Proxy URI\" below is empty — if the subscription is reached through a reverse proxy on a different port, set \"Reverse Proxy URI\" instead.Leave empty to omit the port from subscription links (the service still listens on the default port 2096).",
"subCertPath": "Public Key Path",
"subCertPathDesc": "The public key file path for the subscription service. (begins with ‘/‘)",
"subKeyPath": "Private Key Path",
@@ -1725,4 +1675,4 @@
"noIpRecord": "❗ No IP Record!"
},
"email": {}
}
}