One credential set per customer (UUID + 32-byte root relay key + shortId)
lives on the customer record; node bindings no longer store credentials.
SS2022 user keys derive deterministically from the root key by method
length (16/24/32-byte prefix), so a single password serves every protocol,
matching 3x-ui's per-client credential model. Reality public keys stay a
node property and are shown per binding in the credentials pane.
- store: load-time convergence — first binding's set wins; a converged
password that is not a 32-byte root key is regenerated (uuid/shortId
preserved); bindings are stripped; idempotent, covered by tests
- deploy: the orchestrator stamps the customer's set onto a build copy;
subscriptions resolve the same set; the derivation applies in both the
inbound builder and the URI builder (verified live: Alice's N1 link is
byte-identical to the pre-change seed expectation, her N2 user key is
exactly the root key's 16-byte prefix)
- API: GET /api/customers/:id/credentials returns {credentials, bindings};
regenerate is now POST /api/customers/:id/credentials/regenerate and
rotates the whole set, rebuilding every deployed node of the customer
- UI: credentials pane shows the single shared set plus per-binding
node/protocol/Reality-public-key rows
- golden subscriptions fixture regenerated under one shared set (RF and
SS entries byte-identical to before; five entries audited by hand)
- golden baseline re-captured for the new shapes; difftest normalizer now
treats a base64 root key's prefix-truncation encodings and the Surge
'='-mangled variants as the same secret
5.7 KiB
5.7 KiB
NexusGate 分发链接迁移报告(GitHub → 自建 Gitea)
- 日期:2026-10-20
- 提交:
f4ef3d9chore: migrate self-distribution links from GitHub to self-hosted Gitea(8 文件,本地已 commit,未 push,等云电脑侧续推) - 新基址:
https://git.881218.xyz/rogue/NexusGate
映射规则(已按此执行)
| 类型 | 旧(GitHub) | 新(Gitea) |
|---|---|---|
| raw | raw.githubusercontent.com/aaaamoooo/NexusGate/<branch>/<path> |
git.881218.xyz/rogue/NexusGate/raw/branch/<branch>/<path> |
| release | github.com/aaaamoooo/NexusGate/releases/download/<tag>/<file> |
git.881218.xyz/rogue/NexusGate/releases/download/<tag>/<file> |
| archive | github.com/<REPO>/archive/refs/heads/<branch>.tar.gz |
git.881218.xyz/rogue/NexusGate/archive/<branch>.tar.gz |
| clone | github.com/aaaamoooo/NexusGate.git |
git.881218.xyz/rogue/NexusGate.git |
逐文件改动
public/app.js(2 处):面板生成的节点注册命令、旧版卸载兼容命令的 raw 链接 → Gitea raw。panel-go/embed_public/app.js:同上同步改毕,两份 app.js 全文件逐字一致。注意该目录是 panel-go 的构建产物(.gitignore排除,build.sh每次从../public重新拷贝),不入仓;panel-go 已编译的三个二进制(同为 gitignore 产物)内嵌的仍是旧链接,需重跑 panel-go/build.sh 重建后才生效。scripts/agent-install.sh/scripts/agent-update.sh:新增GIT_BASE="https://git.881218.xyz/${REPO}",raw 与 release 链接改由 GIT_BASE 拼装;REPO默认aaaamoooo/NexusGate→rogue/NexusGate;NG_REPO/NG_BRANCH/--repo/--branch/NG_AGENT_RELEASE语义与默认值不变;raw 的?t=缓存破坏参数保留。相关注释 "GitHub Release" → "Gitea Release"。scripts/install.sh/scripts/nexusgate.sh:同上加 GIT_BASE;归档链接改 Gitea archive 格式(两脚本的解包逻辑对顶层目录的处理与 Gitea 包结构兼容:install.sh 取唯一顶层目录、nexusgate.sh 用 --strip-components=1)。scripts/agent-singbox.sh:release 基址改为https://git.881218.xyz/${NG_REPO:-rogue/NexusGate}/releases/download/${release_tag}(调用方 agent-install.sh 本就透传 NG_REPO);stats-query.go 的 raw 拉取改 Gitea raw 格式;提示文案 GitHub → Gitea。README.md:clone 地址、一键注册命令 raw 链接、"GitHub Release" 文案。agent-go/INSTALL-GO.md:release 下载地址与文案。
⚠️ 判断性改动(请复核)
以下三处脚本的 REPO 默认值原本指向上游原作者 a2899882/NexusGate,本次一并改为 rogue/NexusGate:
scripts/install.sh、scripts/nexusgate.sh的源码归档下载scripts/agent-singbox.sh中 stats-query.go 的拉取源
理由:这三处下载的是本 fork 的面板/Agent 代码本身(上游原版没有本 fork 的二开改动,装错即装成原版),且 a2899882 在自建 Gitea 上不存在、保留只会 404。调用方均可继续用 NG_REPO 覆盖。如认为应保留上游默认,回滚这三行即可。
未改动(残留清单及理由)
agent/stats-query.go的 import、scripts/agent-singbox.sh的go install/go get github.com/sagernet/sing-box@...、agent-go/PARITY.md中的提及:均为上游 sing-box 依赖包名,不是分发链接。scripts/agent-singbox.sh中 Go 工具链下载go.dev/dl/...:上游官方地址、非 GitHub。.github/workflows/ci.yml:GitHub Actions 配置(actions/checkout 等),与分发无关;Gitea 侧默认不执行,保持原样。- 全仓已复查:无 ghproxy / jsdelivr 等镜像域名、无其他写死的旧分发域名。
自检结果
- grep 复查:文本文件中已无指向
aaaamoooo/a2899882/imamoxilin或以${REPO}拼 GitHub 主机的自有分发链接(残留仅上表上游依赖)。 bash -n五个改过的脚本全部通过。public/app.js与panel-go/embed_public/app.jsdiff 为空(逐字一致)。
★ Gitea 上尚不存在、需手工建的 Release 清单
脚本已指向以下地址,但在把文件传上去之前它们是 404。raw 与源码归档由 Gitea 按仓自动提供,无需手工处理;只有这两组 release 要建:
1. 标签 agent-v0.6.8(agent-install.sh / agent-update.sh 的 AGENT_RELEASE 默认值)
| 附件名(必须逐字一致) | 本地现存文件 |
|---|---|
nexusgate-agent-linux-amd64 |
~/workspace/backups/2026-10-20/binaries/nexusgate-agent-linux-amd64 |
nexusgate-agent-linux-arm64 |
~/workspace/backups/2026-10-20/binaries/nexusgate-agent-linux-arm64 |
(同名同大小副本也在 ~/workspace/NexusGate/agent-go/ 下,任选一处上传,文件名不用改。)
2. 标签 sing-box-v1.13.21(agent-singbox.sh 的 release_tag 默认值,可由 NG_SINGBOX_RELEASE 覆盖)
| 附件名(必须逐字一致) | 本地现存文件(上传时需改名去掉 -v1.13.21 后缀) |
|---|---|
nexusgate-sing-box-linux-amd64 |
~/workspace/nexusgate-release/bin/nexusgate-sing-box-linux-amd64-v1.13.21 |
nexusgate-sing-box-linux-arm64 |
~/workspace/nexusgate-release/bin/nexusgate-sing-box-linux-arm64-v1.13.21 |
nexusgate-sing-box-stats-linux-amd64 |
~/workspace/nexusgate-release/bin/nexusgate-sing-box-stats-linux-amd64-v1.13.21 |
nexusgate-sing-box-stats-linux-arm64 |
~/workspace/nexusgate-release/bin/nexusgate-sing-box-stats-linux-arm64-v1.13.21 |
(~/workspace/backups/2026-10-20/binaries/ 下有同名镜像副本。)
注:sing-box 预编译下载失败时脚本会自动回退现场源码编译,所以这组 release 缺失不会让装机彻底失败,只是慢;agent 那组缺失则 Go 版 agent 无法新装(Node 回退路径走 raw,不受影响)。