Commit Graph
37 Commits
Author SHA1 Message Date
aaaamoooo 1b32b57377 feat(web): UI batch — content width, latency removal, icon tooltips, avatar removal (round-2 #3/#5/#6/#9)
#3 .content: drop max-width:1460px centering, padding 24px full width
   (3x-ui content-area parity), 8px under the 760px breakpoint.
#5 servers page: remove latency column + average-latency stat cell
   (stats grid 4->3, table 15->14 cols incl. detail colspan/empty row).
#6 icon buttons: native title replaced by data-tip with a 3x-ui style
   bubble (black/white, rounded, arrow, body-level fixed layer so table
   scroll containers cannot clip it); customer QR tip renamed to 二维码;
   covers customers/servers/nodes rows, credentials pane, links pane,
   address eye toggle, drag grip, filter chip clear, logout, modal close.
#9 remove decorative topbar avatar span#avatar, its showApp assignment
   and the dead .avatar CSS rule. Refresh button untouched.

Golden re-captured: sole diff was errors.badSubscription body (the SPA
index.html served there) reflecting the avatar/data-tip changes.
2026-10-21 11:18:00 +08:00
aaaamoooo 3de4c4945f fix(panel-go): random ports roll once — sticky across edits (round-2 #7)
NormalizeNode re-selected ports whenever the request merely CONTAINED
port/serverId keys; the browser form always submits them (port=null in
random mode), so every save re-rolled both entry and exit ports. Now an
assigned port only moves on an explicit addressing change: mode switch to
random, a different fixed port value, or a server move where the port is
taken (fixed mode surfaces the 409). random->fixed pins the current port.

Regression: portlock_test.go (UI-shape payload saved twice, rename-only,
mode switches, fixed change/conflict, server move free/taken).
Golden re-captured: diff confined to nodePatchUiStyle/nodePatchJobs/
nodesAfterPatch/backup port leaves returning to the seed ports.
2026-10-21 11:17:59 +08:00
aaaamoooo 85763ebdb7 test(panel-go): freeze Go golden behavior baseline (Node retired, difftest superseded)
Single-source Go from this round on: golden.mjs replays a fixed API script
against a Go panel seeded from the difftest seed DB and diffs every response
(learning-normalized) against golden.json. 25 sections: lists, credentials,
all subscription formats, deploy job payloads, usage/presence, UI-style node
PATCH, /api/system shape, backup, error cases.
2026-10-21 11:17:59 +08:00
aaaamoooo 612035ac4e docs: UI reskin report
CI / test (push) Canceled after 0s
CI / anytls-smoke (push) Canceled after 0s
2026-10-21 03:16:31 +08:00
aaaamoooo 0a2889b4e4 feat(web): 3x-ui style reskin — amo branding, light/dark themes, four pages + tabbed customer form 2026-10-21 03:16:30 +08:00
aaaamoooo d287bb9be9 feat(panel): reskin backend — node sortIndex, presence/speed, /api/system, credentials, subscription aggregation (Node+Go parity) 2026-10-21 03:16:30 +08:00
aaaamoooo c6f6b9dbea feat(panel-go): monthly traffic reset for customers
- trafficResetDay/Period/At on the shared customer record (omitempty,
  inert for the Node panel, which preserves unknown fields)
- housekeeping applies due resets before quota evaluation: period-key
  idempotency, short-month clamping (31st fires Feb 28), missed-period
  catch-up after panel downtime, traffic suspensions auto-resume
- first sight of a schedule only arms the period marker, never zeroes;
  API create/PATCH accept trafficResetDay (0=off) and re-arm on change
- UI: reset-day input + last-reset display in the customer form
- tests: calendar math, apply pass, API lifecycle, persistence;
  full Go/Node suites green, difftest formal 50/50
2026-10-21 03:16:30 +08:00
aaaamoooo f4ef3d96a6 chore: migrate self-distribution links from GitHub to self-hosted Gitea
CI / test (push) Canceled after 0s
CI / anytls-smoke (push) Canceled after 0s
GitHub accounts suspended; all first-party distribution now served from
git.881218.xyz/rogue/NexusGate (Gitea):
- raw:  /rogue/NexusGate/raw/branch/<branch>/<path>
- release assets and source archives under the same repo path
- scripts gain a GIT_BASE variable built from NG_REPO (default
  rogue/NexusGate); NG_REPO/NG_BRANCH/--repo/--branch semantics unchanged
- panel enrollment/uninstall commands in public/app.js point at Gitea raw
- install.sh/nexusgate.sh/agent-singbox.sh stats source previously
  defaulted to the upstream repo (a2899882); defaults now this repo
Upstream dependency references (sagernet/sing-box Go module) untouched.
2026-10-20 11:05:55 +00:00
aaaamoooo 3951134940 feat: Go port of the panel in panel-go/ — drop-in replacement for server.js
CI / test (push) Canceled after 0s
CI / anytls-smoke (push) Canceled after 0s
Pure-stdlib Go implementation of the whole control plane: same
nexusgate.json schema (unknown fields preserved verbatim, explicit
null/false tri-states modeled), same HTTP API and error strings,
embedded frontend (NG_PUBLIC_DIR override), self-implemented scrypt
auth, X25519 Reality keys, panel-hosted keyStore and heartbeat
reconciliation included. Version stays 0.6.8.

Verified: Go tests 33/33 (scrypt + Reality vectors generated from
the Node implementation, subscription goldens byte-identical),
Node suite 52/52 untouched, differential E2E against the Node
panel 50/50 including two-way DB swap. See panel-go/PARITY.md
and panel-go/INSTALL-GO.md.
agent-v0.6.8 sing-box-v1.13.21
2026-10-20 08:21:54 +00:00
aaaamoooo abb1a4344b feat: heartbeat reconciliation — panel re-dispatches resources a node lost
Agents (Go + Node) now report the resource IDs they actually hold in
each heartbeat. When an expected resource is missing locally (e.g. the
node's /etc/nexusgate state was wiped and only the agent restarted, so
no re-enrollment happens), the panel re-queues applies for just the
affected nodes via reconcileFromHeartbeat: gated on no queued/running
jobs for the server (in-flight jobs are never failed by this path) and
throttled to one trigger per server per 120s, audited as
system:heartbeat. reconcileServer gains optional onlyNodeIds /
failInFlight parameters; the enrollment call is unchanged. Heartbeats
without a resources array (old agents) behave exactly as before.
2026-10-20 07:46:33 +00:00
aaaamoooo f2b7d8e181 feat(agent-go): consume panel-hosted Reality keys (persist keyMaterial, backfill unused-provided keys) 2026-10-20 07:20:59 +00:00
aaaamoooo 483b891306 feat: panel-hosted Reality keys (keyStore, payload keyMaterial, backfill, cleanup) 2026-10-20 07:20:42 +00:00
aaaamoooo 1b77c610f4 fix: keep current page on refresh via hash routing (restore page from location.hash, back/forward supported) 2026-10-20 15:09:44 +08:00
aaaamoooo 495b949f18 feat: ng-agent update migrates Node agents to Go by default (NG_AGENT_IMPL=node opts out) 2026-10-20 15:05:07 +08:00
aaaamoooo 9c3789a1a4 chore(uninstall): also remove nexusgate-agent-go test unit; docs(README): Go agent memory/install notes 2026-10-20 06:56:17 +00:00
aaaamoooo d29b4f7ef1 feat(update): detect installed impl; Go path downloads release asset and replaces binary, flush-usage via binary; Node path unchanged except unit ExecStart rewrite; default REPO now aaaamoooo/NexusGate 2026-10-20 06:56:07 +00:00
aaaamoooo 545c0668ba feat(install): default to Go agent binary from release agent-v0.6.8, drop Node.js dependency; NG_AGENT_IMPL=node fallback via run.sh; shell-only enroll JSON; units ExecStart the Go binary 2026-10-20 06:55:54 +00:00
aaaamoooo ddfc27efba feat: Go agent source (stdlib-only rewrite of agent.js) + parity/install docs; binaries ship as release assets 2026-10-20 06:55:29 +00:00
aaaamoooo c6615f0ab5 fix: systemd agent unit add --max-semi-space-size=4 (match run.sh); README memory numbers to measured values 2026-10-20 06:25:37 +00:00
aaaamoooo ae9e607527 fix: agent run.sh add node memory limits (max-old-space 64) 2026-10-20 13:41:43 +08:00
aaaamoooo 5f272ed356 fix: create /usr/local/sbin before fetching agent scripts (Alpine) 2026-10-20 13:35:33 +08:00
Muse 823d0290e2 迁移到新账号 aaaamoooo 2026-10-20 12:33:22 +08:00
Muse c3a2086273 agent: Reality 密钥直接用 JWK base64url(与 sing-box 一致),去掉错误转换 2026-10-20 01:51:04 +08:00
Muse 0b180fe7cc agent: 用 Buffer 做 base64url 转 base64,修填充错误 2026-10-20 01:44:21 +08:00
Muse 693bb959ce agent-install: raw URL 加时间戳,破 GitHub 缓存防拉旧版 2026-10-20 01:37:23 +08:00
Muse 5569055c17 agent: Reality 密钥 JWK base64url 转标准 base64,修 sing-box check 失败 2026-10-20 01:28:09 +08:00
Muse f29a2d3375 agent-singbox: 优先从 GitHub Release 下载预编译二进制,失败再源码编译 2026-10-20 00:25:31 +08:00
Muse 11632e74a2 agent 安装脚本默认仓库改为 imamoxilin/NexusGate 2026-10-19 23:46:52 +08:00
Muse 0857bca0d3 修复转发节点 exitCredentials 缺失导致的部署失败 2026-10-19 23:38:02 +08:00
Muse e3024866bf sing-box 默认版本升到 v1.13.21(v2ray_api 可用,保证按用户统计准确) 2026-10-19 23:24:50 +08:00
Muse 240ad26a6b 流量统计改为单向累计描述 2026-10-19 22:54:36 +08:00
Muse e9bad1f496 订阅信息页去掉3x-ui风格字样和深色背景 2026-10-19 22:54:06 +08:00
Muse 715f55b88a 注册命令改用 fork 仓库地址 2026-10-19 22:33:05 +08:00
Muse ad0e140fca README: Agent 安装改为注册流程说明 2026-10-19 22:31:31 +08:00
Muse 51be07de3d README 重写为二开版安装说明 2026-10-19 22:24:27 +08:00
Muse 084afeb8f4 3x-ui 式共享节点改造:nodes 状态机 + nodeClients 各自凭据
- 移除 VMess 协议
- VLESS/SS2022 按用户流量统计(AnyTLS 日志解析,SS 节点级)
- sing-box v2ray_api stats 支持
- 内存优化:面板 128M,agent 64M,sing-box 64M
2026-10-19 22:23:40 +08:00
a2899882 1678f766ac Release v0.6.8: reduce idle I/O and monitor node capacity 2026-09-24 03:15:34 -07:00