Files
NexusGate/panel-go/golden/golden.json
T
aaaamoooo ad18e16ac6 feat: customer-level credentials shared across all nodes (item 2)
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
2026-10-20 21:21:13 +00:00

3614 lines
125 KiB
JSON

{
"meta": {
"capturedAt": "2026-10-20T21:20:39.194Z",
"note": "Go panel golden baseline; see README.md in this directory."
},
"sections": {
"login": {
"body": {
"csrf": "<csrf>#1",
"user": {
"id": "<usr>#1",
"role": "owner",
"username": "admin"
}
},
"status": 200
},
"session": {
"body": {
"authenticated": true,
"csrf": "<csrf>#1",
"user": {
"id": "<usr>#1",
"role": "owner",
"username": "admin"
}
},
"status": 200
},
"heartbeatSeedAgents": {
"entry": {
"body": {
"ok": true,
"serverTime": "<ts>"
},
"status": 200
},
"exit": {
"body": {
"ok": true,
"serverTime": "<ts>"
},
"status": 200
}
},
"lists": {
"customers": {
"body": {
"customers": [
{
"createdAt": "<ts>",
"credentials": {
"clientId": "<uuid>#1",
"relayPassword": "<secret>#1",
"shortId": "<secret>#2"
},
"deviceLimit": 0,
"expiresAt": null,
"group": "",
"id": "<cus>#1",
"ipLimit": 0,
"lastActiveAt": null,
"lastUsageAt": "<ts>",
"name": "Alice",
"notes": "",
"observedIpCount": 0,
"online": false,
"serverUsage": {
"srv:<srv>#1": {
"usageCounters": {
"downlink": 2000,
"epoch": "diff-epoch-1",
"uplink": 1000
}
}
},
"speedDownBps": 0,
"speedUpBps": 0,
"status": "active",
"subscriptionClientCount": 3,
"subscriptionToken": "<subtoken>#1",
"tags": [],
"trafficLimitBytes": 0,
"updatedAt": "<ts>",
"usedBytes": 3000,
"usedDownlinkBytes": 2000,
"usedUplinkBytes": 1000
},
{
"createdAt": "<ts>",
"credentials": {
"clientId": "<uuid>#2",
"relayPassword": "<secret>#3",
"shortId": "<secret>#4"
},
"deviceLimit": 2,
"expiresAt": null,
"group": "",
"id": "<cus>#2",
"ipLimit": 5,
"lastActiveAt": null,
"name": "Bob",
"notes": "",
"observedIpCount": 0,
"online": false,
"speedDownBps": 0,
"speedUpBps": 0,
"status": "active",
"subscriptionClientCount": 0,
"subscriptionToken": "<subtoken>#2",
"tags": [],
"trafficLimitBytes": 1073741824,
"updatedAt": "<ts>",
"usedBytes": 0,
"usedDownlinkBytes": 0,
"usedUplinkBytes": 0
}
],
"summary": {
"depleted": 0,
"depletingSoon": 0,
"disabled": 0,
"enabled": 2,
"online": 0,
"total": 2
}
},
"status": 200
},
"jobs": {
"body": {
"jobs": [
{
"action": "apply_resource",
"attempts": 1,
"completedAt": "<ts>",
"createdAt": "<ts>",
"error": null,
"id": "<job>#1",
"leaseUntil": null,
"nodeId": "<nod>#1",
"serverId": "<srv>#1",
"startedAt": "<ts>",
"status": "completed",
"updatedAt": "<ts>"
},
{
"action": "apply_resource",
"attempts": 1,
"completedAt": "<ts>",
"createdAt": "<ts>",
"error": null,
"id": "<job>#2",
"leaseUntil": null,
"nodeId": "<nod>#2",
"serverId": "<srv>#2",
"startedAt": "<ts>",
"status": "completed",
"updatedAt": "<ts>"
},
{
"action": "apply_resource",
"attempts": 1,
"completedAt": "<ts>",
"createdAt": "<ts>",
"error": null,
"id": "<job>#3",
"leaseUntil": null,
"nodeId": "<nod>#2",
"serverId": "<srv>#1",
"startedAt": "<ts>",
"status": "completed",
"updatedAt": "<ts>"
}
]
},
"status": 200
},
"nodes": {
"body": {
"nodeClients": [
{
"clientUri": "vless://<uuid>#1@entry.example.com:<port>#2?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#1&sid=<secret>#2&type=tcp&headerType=none&flow=xtls-rprx-vision#N1",
"createdAt": "<ts>",
"customerId": "<cus>#1",
"id": "<ncl>#1",
"nodeId": "<nod>#2",
"status": "active",
"updatedAt": "<ts>"
},
{
"clientUri": "vless://<uuid>#2@entry.example.com:<port>#2?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#1&sid=<secret>#4&type=tcp&headerType=none&flow=xtls-rprx-vision#N1",
"createdAt": "<ts>",
"customerId": "<cus>#2",
"id": "<ncl>#2",
"nodeId": "<nod>#2",
"status": "active",
"updatedAt": "<ts>"
},
{
"clientUri": "ss://<ssblob>#1@entry.example.com:<port>#3#N2",
"createdAt": "<ts>",
"customerId": "<cus>#1",
"id": "<ncl>#3",
"nodeId": "<nod>#1",
"status": "active",
"updatedAt": "<ts>"
}
],
"nodes": [
{
"artifacts": {
"realityPublicKey": "<rpub>#1"
},
"autoRemoving": false,
"clientCount": 2,
"createdAt": "<ts>",
"entryReady": true,
"error": null,
"exitPort": "<port>#1",
"exitPortMode": "random",
"exitProtocol": "shadowsocks-2022-aes256",
"exitReady": true,
"exitResourceId": "<res>#1",
"exitServerId": "<srv>#2",
"id": "<nod>#2",
"lastUsageAt": "<ts>",
"meteredTraffic": {
"downlink": 5000,
"uplink": 4000
},
"name": "N1",
"networkMode": "ipv4",
"onlineCount": 0,
"onlineCustomerIds": [],
"pendingDelete": false,
"port": "<port>#2",
"portMode": "random",
"protocol": "vless-reality-vision",
"reality": {
"destPort": 443,
"keyId": "reality-<nod>#2",
"serverName": "www.amd.com"
},
"realityDestPort": 443,
"realityServerName": "www.amd.com",
"resourceId": "<res>#2",
"retiredUsageEpochs": [],
"serverId": "<srv>#1",
"sortIndex": 0,
"speedDownBps": 0,
"speedUpBps": 0,
"status": "active",
"topology": "forward",
"updatedAt": "<ts>",
"usageCounters": {
"downlink": 5000,
"epoch": "diff-epoch-1",
"uplink": 4000
},
"wsPath": "<secret>#5"
},
{
"artifacts": {},
"autoRemoving": false,
"clientCount": 1,
"createdAt": "<ts>",
"entryReady": true,
"error": null,
"exitPort": null,
"exitPortMode": null,
"exitProtocol": null,
"exitReady": false,
"exitResourceId": "<res>#3",
"exitServerId": null,
"id": "<nod>#1",
"lastUsageAt": null,
"meteredTraffic": null,
"name": "N2",
"networkMode": "ipv4",
"onlineCount": 0,
"onlineCustomerIds": [],
"pendingDelete": false,
"port": "<port>#3",
"portMode": "random",
"protocol": "shadowsocks-2022-aes128",
"realityDestPort": 443,
"realityServerName": "www.tesla.com",
"resourceId": "<res>#4",
"retiredUsageEpochs": [],
"serverId": "<srv>#1",
"sortIndex": 1,
"speedDownBps": 0,
"speedUpBps": 0,
"status": "active",
"topology": "direct",
"updatedAt": "<ts>",
"usageCounters": null,
"wsPath": "<secret>#6"
}
]
},
"status": 200
},
"overview": {
"body": {
"activity": [
{
"action": "deploy_node",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "N2"
},
"id": "<evt>#1",
"target": "<nod>#1"
},
{
"action": "deploy_node",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "N1"
},
"id": "<evt>#2",
"target": "<nod>#2"
},
{
"action": "assign_customer",
"actor": "admin",
"at": "<ts>",
"detail": {
"customer": "Alice",
"customerId": "<cus>#1"
},
"id": "<evt>#3",
"target": "<nod>#1"
},
{
"action": "assign_customer",
"actor": "admin",
"at": "<ts>",
"detail": {
"customer": "Bob",
"customerId": "<cus>#2"
},
"id": "<evt>#4",
"target": "<nod>#2"
},
{
"action": "assign_customer",
"actor": "admin",
"at": "<ts>",
"detail": {
"customer": "Alice",
"customerId": "<cus>#1"
},
"id": "<evt>#5",
"target": "<nod>#2"
},
{
"action": "create_node",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "N2"
},
"id": "<evt>#6",
"target": "<nod>#1"
},
{
"action": "create_node",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "N1"
},
"id": "<evt>#7",
"target": "<nod>#2"
},
{
"action": "create_customer",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "Bob"
},
"id": "<evt>#8",
"target": "<cus>#2"
},
{
"action": "create_customer",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "Alice"
},
"id": "<evt>#9",
"target": "<cus>#1"
},
{
"action": "reconcile_server",
"actor": "agent:<agt>#1",
"at": "<ts>",
"detail": {
"nodes": 0
},
"id": "<evt>#10",
"target": "<srv>#2"
},
{
"action": "enroll_agent",
"actor": "agent:<agt>#1",
"at": "<ts>",
"detail": {},
"id": "<evt>#11",
"target": "<srv>#2"
},
{
"action": "create_enrollment",
"actor": "admin",
"at": "<ts>",
"detail": {},
"id": "<evt>#12",
"target": "<srv>#2"
}
],
"counts": {
"activeNodes": 2,
"customers": 2,
"nodes": 2,
"online": 2,
"queuedJobs": 0,
"servers": 2
},
"degraded": [],
"version": "0.6.8"
},
"status": 200
},
"servers": {
"body": {
"servers": [
{
"agentVersion": "0.6.8",
"createdAt": "<ts>",
"enabled": true,
"engine": null,
"id": "<srv>#1",
"labels": [],
"lastSeenAt": "<ts>",
"name": "Entry",
"pendingCleanup": 0,
"portRangeEnd": 50000,
"portRangeStart": 20000,
"publicAddress": "entry.example.com",
"publicAddressV6": "v6.example.com",
"region": "",
"role": "relay",
"status": "online",
"system": {},
"tlsDomain": "tls.example.com",
"updatedAt": "<ts>",
"usage": {
"error": null,
"lastReportAt": "<ts>",
"sampleCount": 2
}
},
{
"agentVersion": "0.6.8",
"createdAt": "<ts>",
"enabled": true,
"engine": null,
"id": "<srv>#2",
"labels": [],
"lastSeenAt": "<ts>",
"name": "Exit",
"pendingCleanup": 0,
"portRangeEnd": 50000,
"portRangeStart": 20000,
"publicAddress": "exit.example.com",
"publicAddressV6": "",
"region": "",
"role": "exit",
"status": "online",
"system": {},
"tlsDomain": "",
"updatedAt": "<ts>"
}
]
},
"status": 200
}
},
"heartbeatWithEngine": {
"body": {
"ok": true,
"serverTime": "<ts>"
},
"status": 200
},
"serversAfterEngineHeartbeat": {
"body": {
"servers": [
{
"agentVersion": "0.6.8",
"createdAt": "<ts>",
"enabled": true,
"engine": {
"at": "<ts>",
"certificates": [],
"detail": "",
"singBoxInstalled": true,
"singBoxStatus": "ready",
"singBoxVersion": "1.13.21",
"status": "ready"
},
"id": "<srv>#1",
"labels": [],
"lastSeenAt": "<ts>",
"name": "Entry",
"pendingCleanup": 0,
"portRangeEnd": 50000,
"portRangeStart": 20000,
"publicAddress": "entry.example.com",
"publicAddressV6": "v6.example.com",
"region": "",
"role": "relay",
"status": "online",
"system": {},
"tlsDomain": "tls.example.com",
"updatedAt": "<ts>",
"usage": {
"error": null,
"lastReportAt": "<ts>",
"sampleCount": 2
}
},
{
"agentVersion": "0.6.8",
"createdAt": "<ts>",
"enabled": true,
"engine": null,
"id": "<srv>#2",
"labels": [],
"lastSeenAt": "<ts>",
"name": "Exit",
"pendingCleanup": 0,
"portRangeEnd": 50000,
"portRangeStart": 20000,
"publicAddress": "exit.example.com",
"publicAddressV6": "",
"region": "",
"role": "exit",
"status": "online",
"system": {},
"tlsDomain": "",
"updatedAt": "<ts>"
}
]
},
"status": 200
},
"credentials": {
"alice": {
"body": {
"bindings": [
{
"nodeClientId": "<ncl>#1",
"nodeId": "<nod>#2",
"nodeName": "N1",
"protocol": "vless-reality-vision",
"realityPublicKey": "<rpub>#1",
"status": "active",
"username": ""
},
{
"nodeClientId": "<ncl>#3",
"nodeId": "<nod>#1",
"nodeName": "N2",
"protocol": "shadowsocks-2022-aes128",
"realityPublicKey": null,
"status": "active",
"username": ""
}
],
"credentials": {
"clientId": "<uuid>#1",
"password": "<secret>#1",
"shortId": "<secret>#2"
},
"customerId": "<cus>#1",
"subscriptionToken": "<subtoken>#1"
},
"status": 200
},
"bob": {
"body": {
"bindings": [
{
"nodeClientId": "<ncl>#2",
"nodeId": "<nod>#2",
"nodeName": "N1",
"protocol": "vless-reality-vision",
"realityPublicKey": "<rpub>#1",
"status": "active",
"username": ""
}
],
"credentials": {
"clientId": "<uuid>#2",
"password": "<secret>#3",
"shortId": "<secret>#4"
},
"customerId": "<cus>#2",
"subscriptionToken": "<subtoken>#2"
},
"status": 200
}
},
"subscriptionsSeed": {
"alice": {
"auto-clash": {
"body": "mixed-port: 7890\nallow-lan: false\nmode: rule\nproxies:\n - name: \"N1\"\n server: \"entry.example.com\"\n port: <port>#2\n type: \"vless\"\n uuid: \"<uuid>#1\"\n tls: true\n network: \"tcp\"\n servername: \"www.amd.com\"\n client-fingerprint: \"chrome\"\n reality-opts: \n public-key: \"<rpub>#1\"\n short-id: \"<secret>#2\"\n flow: \"xtls-rprx-vision\"\n - name: \"N2\"\n server: \"entry.example.com\"\n port: <port>#3\n type: \"ss\"\n cipher: \"2022-blake3-aes-128-gcm\"\n password: \"xOcB7XGgo6VpaEHZfNXrlQ==:<secret>#1\"\nproxy-groups:\n - name: \"节点选择\"\n type: select\n proxies:\n - \"N1\"\n - \"N2\"\nrules:\n - \"MATCH,节点选择\"\n",
"contentType": "text/yaml; charset=utf-8",
"status": 200,
"userinfo": "upload=1000; download=2000; total=0; expire=0"
},
"auto-generic": {
"body": "vless://<uuid>#1@entry.example.com:<port>#2?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#1&sid=<secret>#2&type=tcp&headerType=none&flow=xtls-rprx-vision#N1\nss://<ssblob>#1@entry.example.com:<port>#3#N2\n",
"contentType": "text/plain; charset=utf-8",
"status": 200,
"userinfo": "upload=1000; download=2000; total=0; expire=0"
},
"base64": {
"body": "vless://<uuid>#1@entry.example.com:<port>#2?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#1&sid=<secret>#2&type=tcp&headerType=none&flow=xtls-rprx-vision#N1\nss://<ssblob>#1@entry.example.com:<port>#3#N2\n",
"contentType": "text/plain; charset=utf-8",
"status": 200,
"userinfo": "upload=1000; download=2000; total=0; expire=0"
},
"clash": {
"body": "mixed-port: 7890\nallow-lan: false\nmode: rule\nproxies:\n - name: \"N1\"\n server: \"entry.example.com\"\n port: <port>#2\n type: \"vless\"\n uuid: \"<uuid>#1\"\n tls: true\n network: \"tcp\"\n servername: \"www.amd.com\"\n client-fingerprint: \"chrome\"\n reality-opts: \n public-key: \"<rpub>#1\"\n short-id: \"<secret>#2\"\n flow: \"xtls-rprx-vision\"\n - name: \"N2\"\n server: \"entry.example.com\"\n port: <port>#3\n type: \"ss\"\n cipher: \"2022-blake3-aes-128-gcm\"\n password: \"xOcB7XGgo6VpaEHZfNXrlQ==:<secret>#1\"\nproxy-groups:\n - name: \"节点选择\"\n type: select\n proxies:\n - \"N1\"\n - \"N2\"\nrules:\n - \"MATCH,节点选择\"\n",
"contentType": "text/yaml; charset=utf-8",
"status": 200,
"userinfo": "upload=1000; download=2000; total=0; expire=0"
},
"clash-smart": {
"body": "mixed-port: 7890\nallow-lan: false\nmode: rule\nproxies:\n - name: \"N1\"\n server: \"entry.example.com\"\n port: <port>#2\n type: \"vless\"\n uuid: \"<uuid>#1\"\n tls: true\n network: \"tcp\"\n servername: \"www.amd.com\"\n client-fingerprint: \"chrome\"\n reality-opts: \n public-key: \"<rpub>#1\"\n short-id: \"<secret>#2\"\n flow: \"xtls-rprx-vision\"\n - name: \"N2\"\n server: \"entry.example.com\"\n port: <port>#3\n type: \"ss\"\n cipher: \"2022-blake3-aes-128-gcm\"\n password: \"xOcB7XGgo6VpaEHZfNXrlQ==:<secret>#1\"\nproxy-groups:\n - name: \"节点选择\"\n type: select\n proxies:\n - \"自动选择\"\n - \"N1\"\n - \"N2\"\n - \"DIRECT\"\n - name: \"自动选择\"\n type: url-test\n url: \"https://www.gstatic.com/generate_204\"\n interval: 300\n tolerance: 80\n proxies:\n - \"N1\"\n - \"N2\"\n - name: \"流媒体\"\n type: select\n proxies:\n - \"节点选择\"\n - \"自动选择\"\n - \"N1\"\n - \"N2\"\n - name: \"AI 服务\"\n type: select\n proxies:\n - \"节点选择\"\n - \"自动选择\"\n - \"N1\"\n - \"N2\"\n - name: \"Meta 服务\"\n type: select\n proxies:\n - \"节点选择\"\n - \"自动选择\"\n - \"N1\"\n - \"N2\"\nrules:\n - \"GEOSITE,category-ads-all,REJECT\"\n - \"GEOSITE,private,DIRECT\"\n - \"GEOSITE,openai,AI 服务\"\n - \"GEOSITE,netflix,流媒体\"\n - \"GEOSITE,facebook,Meta 服务\"\n - \"DOMAIN-SUFFIX,fbcdn.net,Meta 服务\"\n - \"DOMAIN-SUFFIX,instagram.com,Meta 服务\"\n - \"DOMAIN-SUFFIX,whatsapp.net,Meta 服务\"\n - \"GEOSITE,geolocation-!cn,节点选择\"\n - \"GEOSITE,cn,DIRECT\"\n - \"GEOIP,CN,DIRECT\"\n - \"MATCH,节点选择\"\n",
"contentType": "text/yaml; charset=utf-8",
"status": 200,
"userinfo": "upload=1000; download=2000; total=0; expire=0"
},
"raw": {
"body": "vless://<uuid>#1@entry.example.com:<port>#2?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#1&sid=<secret>#2&type=tcp&headerType=none&flow=xtls-rprx-vision#N1\nss://<ssblob>#1@entry.example.com:<port>#3#N2\n",
"contentType": "text/plain; charset=utf-8",
"status": 200,
"userinfo": "upload=1000; download=2000; total=0; expire=0"
},
"singbox": {
"body": "{\n \"log\": {\n \"level\": \"warn\"\n },\n \"inbounds\": [\n {\n \"type\": \"mixed\",\n \"tag\": \"local\",\n \"listen\": \"127.0.0.1\",\n \"listen_port\": 2080\n }\n ],\n \"outbounds\": [\n {\n \"type\": \"selector\",\n \"tag\": \"proxy\",\n \"outbounds\": [\n \"node-1\",\n \"node-2\"\n ]\n },\n {\n \"type\": \"vless\",\n \"tag\": \"node-1\",\n \"server\": \"entry.example.com\",\n \"server_port\": <port>#2,\n \"uuid\": \"<uuid>#1\",\n \"flow\": \"xtls-rprx-vision\",\n \"tls\": {\n \"enabled\": true,\n \"server_name\": \"www.amd.com\",\n \"reality\": {\n \"enabled\": true,\n \"public_key\": \"<rpub>#1\",\n \"short_id\": \"<secret>#2\"\n }\n }\n },\n {\n \"type\": \"shadowsocks\",\n \"tag\": \"node-2\",\n \"server\": \"entry.example.com\",\n \"server_port\": <port>#3,\n \"method\": \"2022-blake3-aes-128-gcm\",\n \"password\": \"xOcB7XGgo6VpaEHZfNXrlQ==:<secret>#1\"\n },\n {\n \"type\": \"direct\",\n \"tag\": \"direct\"\n }\n ],\n \"route\": {\n \"final\": \"proxy\"\n }\n}\n",
"contentType": "application/json; charset=utf-8",
"status": 200,
"userinfo": "upload=1000; download=2000; total=0; expire=0"
},
"surge": {
"body": "[General]\nloglevel = notify\n[Proxy]\nN2 = ss, entry.example.com, <port>#3, encrypt-method=2022-blake3-aes-128-gcm, password=xOcB7XGgo6VpaEHZfNXrlQ__:<secret>#1\n[Proxy Group]\n节点选择 = select, N2, DIRECT\n自动选择 = url-test, N2, url=http://www.gstatic.com/generate_204, interval=600\n[Rule]\nGEOIP,CN,DIRECT\nFINAL,节点选择\n",
"contentType": "text/plain; charset=utf-8",
"status": 200,
"userinfo": "upload=1000; download=2000; total=0; expire=0"
}
},
"bob": {
"auto-clash": {
"body": "mixed-port: 7890\nallow-lan: false\nmode: rule\nproxies:\n - name: \"N1\"\n server: \"entry.example.com\"\n port: <port>#2\n type: \"vless\"\n uuid: \"<uuid>#2\"\n tls: true\n network: \"tcp\"\n servername: \"www.amd.com\"\n client-fingerprint: \"chrome\"\n reality-opts: \n public-key: \"<rpub>#1\"\n short-id: \"<secret>#4\"\n flow: \"xtls-rprx-vision\"\nproxy-groups:\n - name: \"节点选择\"\n type: select\n proxies:\n - \"N1\"\nrules:\n - \"MATCH,节点选择\"\n",
"contentType": "text/yaml; charset=utf-8",
"status": 200,
"userinfo": "upload=0; download=0; total=1073741824; expire=0"
},
"auto-generic": {
"body": "{\"message\":\"订阅客户端数达到上限。可在客户访问记录中检查并重置观察窗口。\"}",
"contentType": "application/json; charset=utf-8",
"status": 429,
"userinfo": ""
},
"base64": {
"body": "vless://<uuid>#2@entry.example.com:<port>#2?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#1&sid=<secret>#4&type=tcp&headerType=none&flow=xtls-rprx-vision#N1\n",
"contentType": "text/plain; charset=utf-8",
"status": 200,
"userinfo": "upload=0; download=0; total=1073741824; expire=0"
},
"clash": {
"body": "mixed-port: 7890\nallow-lan: false\nmode: rule\nproxies:\n - name: \"N1\"\n server: \"entry.example.com\"\n port: <port>#2\n type: \"vless\"\n uuid: \"<uuid>#2\"\n tls: true\n network: \"tcp\"\n servername: \"www.amd.com\"\n client-fingerprint: \"chrome\"\n reality-opts: \n public-key: \"<rpub>#1\"\n short-id: \"<secret>#4\"\n flow: \"xtls-rprx-vision\"\nproxy-groups:\n - name: \"节点选择\"\n type: select\n proxies:\n - \"N1\"\nrules:\n - \"MATCH,节点选择\"\n",
"contentType": "text/yaml; charset=utf-8",
"status": 200,
"userinfo": "upload=0; download=0; total=1073741824; expire=0"
},
"clash-smart": {
"body": "mixed-port: 7890\nallow-lan: false\nmode: rule\nproxies:\n - name: \"N1\"\n server: \"entry.example.com\"\n port: <port>#2\n type: \"vless\"\n uuid: \"<uuid>#2\"\n tls: true\n network: \"tcp\"\n servername: \"www.amd.com\"\n client-fingerprint: \"chrome\"\n reality-opts: \n public-key: \"<rpub>#1\"\n short-id: \"<secret>#4\"\n flow: \"xtls-rprx-vision\"\nproxy-groups:\n - name: \"节点选择\"\n type: select\n proxies:\n - \"自动选择\"\n - \"N1\"\n - \"DIRECT\"\n - name: \"自动选择\"\n type: url-test\n url: \"https://www.gstatic.com/generate_204\"\n interval: 300\n tolerance: 80\n proxies:\n - \"N1\"\n - name: \"流媒体\"\n type: select\n proxies:\n - \"节点选择\"\n - \"自动选择\"\n - \"N1\"\n - name: \"AI 服务\"\n type: select\n proxies:\n - \"节点选择\"\n - \"自动选择\"\n - \"N1\"\n - name: \"Meta 服务\"\n type: select\n proxies:\n - \"节点选择\"\n - \"自动选择\"\n - \"N1\"\nrules:\n - \"GEOSITE,category-ads-all,REJECT\"\n - \"GEOSITE,private,DIRECT\"\n - \"GEOSITE,openai,AI 服务\"\n - \"GEOSITE,netflix,流媒体\"\n - \"GEOSITE,facebook,Meta 服务\"\n - \"DOMAIN-SUFFIX,fbcdn.net,Meta 服务\"\n - \"DOMAIN-SUFFIX,instagram.com,Meta 服务\"\n - \"DOMAIN-SUFFIX,whatsapp.net,Meta 服务\"\n - \"GEOSITE,geolocation-!cn,节点选择\"\n - \"GEOSITE,cn,DIRECT\"\n - \"GEOIP,CN,DIRECT\"\n - \"MATCH,节点选择\"\n",
"contentType": "text/yaml; charset=utf-8",
"status": 200,
"userinfo": "upload=0; download=0; total=1073741824; expire=0"
},
"raw": {
"body": "vless://<uuid>#2@entry.example.com:<port>#2?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#1&sid=<secret>#4&type=tcp&headerType=none&flow=xtls-rprx-vision#N1\n",
"contentType": "text/plain; charset=utf-8",
"status": 200,
"userinfo": "upload=0; download=0; total=1073741824; expire=0"
},
"singbox": {
"body": "{\n \"log\": {\n \"level\": \"warn\"\n },\n \"inbounds\": [\n {\n \"type\": \"mixed\",\n \"tag\": \"local\",\n \"listen\": \"127.0.0.1\",\n \"listen_port\": 2080\n }\n ],\n \"outbounds\": [\n {\n \"type\": \"selector\",\n \"tag\": \"proxy\",\n \"outbounds\": [\n \"node-1\"\n ]\n },\n {\n \"type\": \"vless\",\n \"tag\": \"node-1\",\n \"server\": \"entry.example.com\",\n \"server_port\": <port>#2,\n \"uuid\": \"<uuid>#2\",\n \"flow\": \"xtls-rprx-vision\",\n \"tls\": {\n \"enabled\": true,\n \"server_name\": \"www.amd.com\",\n \"reality\": {\n \"enabled\": true,\n \"public_key\": \"<rpub>#1\",\n \"short_id\": \"<secret>#4\"\n }\n }\n },\n {\n \"type\": \"direct\",\n \"tag\": \"direct\"\n }\n ],\n \"route\": {\n \"final\": \"proxy\"\n }\n}\n",
"contentType": "application/json; charset=utf-8",
"status": 200,
"userinfo": "upload=0; download=0; total=1073741824; expire=0"
},
"surge": {
"body": "{\"message\":\"当前没有部署成功的入口节点,请在“转发与节点”部署节点\"}",
"contentType": "application/json; charset=utf-8",
"status": 503,
"userinfo": ""
}
}
},
"createServerS3": {
"body": {
"server": {
"createdAt": "<ts>",
"enabled": true,
"id": "<srv>#3",
"labels": [],
"name": "S3",
"portRangeEnd": 50000,
"portRangeStart": 20000,
"publicAddress": "s3.example.com",
"publicAddressV6": "",
"region": "",
"role": "relay",
"status": "pending",
"tlsDomain": "",
"updatedAt": "<ts>"
}
},
"status": 201
},
"enrollS3": {
"enroll": {
"body": {
"agentId": "<agt>#2",
"agentKey": "<agentkey>#1",
"reconciled": 0,
"serverId": "<srv>#3",
"serverName": "S3"
},
"status": 201
},
"ticket": {
"body": {
"expiresAt": "<ts>",
"token": "<enrolltoken>#1"
},
"status": 201
}
},
"createCarol": {
"body": {
"customer": {
"createdAt": "<ts>",
"credentials": {
"clientId": "<uuid>#3",
"relayPassword": "<secret>#7",
"shortId": "<secret>#8"
},
"deviceLimit": 0,
"expiresAt": null,
"group": "",
"id": "<cus>#3",
"ipLimit": 0,
"name": "Carol",
"notes": "",
"status": "active",
"subscriptionToken": "<subtoken>#3",
"tags": [],
"trafficLimitBytes": 0,
"updatedAt": "<ts>",
"usedBytes": 0,
"usedDownlinkBytes": 0,
"usedUplinkBytes": 0
}
},
"status": 201
},
"createNodeN3": {
"body": {
"node": {
"artifacts": {},
"createdAt": "<ts>",
"entryReady": false,
"error": null,
"exitPort": null,
"exitPortMode": null,
"exitProtocol": null,
"exitReady": false,
"exitResourceId": "<res>#5",
"exitServerId": null,
"id": "<nod>#3",
"lastUsageAt": null,
"meteredTraffic": null,
"name": "N3",
"networkMode": "ipv4",
"pendingDelete": false,
"port": "<port>#4",
"portMode": "random",
"protocol": "vless-reality",
"reality": {
"destPort": 443,
"keyId": "reality-<nod>#3",
"serverName": "www.amd.com"
},
"realityDestPort": 443,
"realityServerName": "www.amd.com",
"resourceId": "<res>#6",
"retiredUsageEpochs": [],
"serverId": "<srv>#3",
"sortIndex": 2,
"status": "draft",
"topology": "direct",
"updatedAt": "<ts>",
"usageCounters": null,
"wsPath": "<secret>#9"
}
},
"status": 201
},
"assignN3": {
"body": {
"nodeClient": {
"createdAt": "<ts>",
"customerId": "<cus>#3",
"id": "<ncl>#4",
"nodeId": "<nod>#3",
"status": "active",
"updatedAt": "<ts>"
}
},
"status": 200
},
"deployN3": {
"body": {
"ok": true
},
"status": 202
},
"deployN3Jobs": [
{
"complete": {
"job": {
"action": "apply_resource",
"attempts": 1,
"completedAt": "<ts>",
"createdAt": "<ts>",
"error": null,
"id": "<job>#4",
"leaseUntil": null,
"nodeId": "<nod>#3",
"payload": {
"keyMaterial": {
"reality-<nod>#3": {
"privateKey": "<rpriv>#1",
"publicKey": "<rpub>#2"
}
},
"kind": "node",
"resource": {
"engine": "sing-box",
"id": "<res>#6",
"inbounds": [
{
"listen": "<hostip>",
"listen_port": "<port>#4",
"tag": "ng-<nod>#3-in",
"tls": {
"enabled": true,
"reality": {
"enabled": true,
"handshake": {
"server": "www.amd.com",
"server_port": "<port>#5"
},
"private_key": "${REALITY_PRIVATE:reality-<nod>#3}",
"short_id": [
"<secret>#8"
]
},
"server_name": "www.amd.com"
},
"type": "vless",
"users": [
{
"name": "ng:<cus>#3",
"uuid": "<uuid>#3"
}
]
}
],
"meta": {
"kind": "node",
"metricsTag": "ng-<nod>#3-in",
"nodeId": "<nod>#3",
"protocol": "vless-reality"
},
"outbounds": [
{
"tag": "ng-<nod>#3-direct",
"type": "direct"
}
],
"routingRules": [
{
"action": "route",
"inbound": [
"ng-<nod>#3-in"
],
"outbound": "ng-<nod>#3-direct"
}
]
}
},
"serverId": "<srv>#3",
"startedAt": "<ts>",
"status": "completed",
"updatedAt": "<ts>"
}
},
"job": {
"action": "apply_resource",
"attempts": 1,
"createdAt": "<ts>",
"error": null,
"id": "<job>#4",
"leaseUntil": "<ts>",
"nodeId": "<nod>#3",
"payload": {
"keyMaterial": {
"reality-<nod>#3": {
"privateKey": "<rpriv>#1",
"publicKey": "<rpub>#2"
}
},
"kind": "node",
"resource": {
"engine": "sing-box",
"id": "<res>#6",
"inbounds": [
{
"listen": "<hostip>",
"listen_port": "<port>#4",
"tag": "ng-<nod>#3-in",
"tls": {
"enabled": true,
"reality": {
"enabled": true,
"handshake": {
"server": "www.amd.com",
"server_port": "<port>#5"
},
"private_key": "${REALITY_PRIVATE:reality-<nod>#3}",
"short_id": [
"<secret>#8"
]
},
"server_name": "www.amd.com"
},
"type": "vless",
"users": [
{
"name": "ng:<cus>#3",
"uuid": "<uuid>#3"
}
]
}
],
"meta": {
"kind": "node",
"metricsTag": "ng-<nod>#3-in",
"nodeId": "<nod>#3",
"protocol": "vless-reality"
},
"outbounds": [
{
"tag": "ng-<nod>#3-direct",
"type": "direct"
}
],
"routingRules": [
{
"action": "route",
"inbound": [
"ng-<nod>#3-in"
],
"outbound": "ng-<nod>#3-direct"
}
]
}
},
"serverId": "<srv>#3",
"startedAt": "<ts>",
"status": "running",
"updatedAt": "<ts>"
}
}
],
"nodesAfterDeploy": {
"body": {
"nodeClients": [
{
"clientUri": "vless://<uuid>#1@entry.example.com:<port>#2?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#1&sid=<secret>#2&type=tcp&headerType=none&flow=xtls-rprx-vision#N1",
"createdAt": "<ts>",
"customerId": "<cus>#1",
"id": "<ncl>#1",
"nodeId": "<nod>#2",
"status": "active",
"updatedAt": "<ts>"
},
{
"clientUri": "vless://<uuid>#2@entry.example.com:<port>#2?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#1&sid=<secret>#4&type=tcp&headerType=none&flow=xtls-rprx-vision#N1",
"createdAt": "<ts>",
"customerId": "<cus>#2",
"id": "<ncl>#2",
"nodeId": "<nod>#2",
"status": "active",
"updatedAt": "<ts>"
},
{
"clientUri": "ss://<ssblob>#1@entry.example.com:<port>#3#N2",
"createdAt": "<ts>",
"customerId": "<cus>#1",
"id": "<ncl>#3",
"nodeId": "<nod>#1",
"status": "active",
"updatedAt": "<ts>"
},
{
"clientUri": "vless://<uuid>#3@s3.example.com:<port>#4?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#2&sid=<secret>#8&type=tcp&headerType=none#N3",
"createdAt": "<ts>",
"customerId": "<cus>#3",
"id": "<ncl>#4",
"nodeId": "<nod>#3",
"status": "active",
"updatedAt": "<ts>"
}
],
"nodes": [
{
"artifacts": {
"realityPublicKey": "<rpub>#1"
},
"autoRemoving": false,
"clientCount": 2,
"createdAt": "<ts>",
"entryReady": true,
"error": null,
"exitPort": "<port>#1",
"exitPortMode": "random",
"exitProtocol": "shadowsocks-2022-aes256",
"exitReady": true,
"exitResourceId": "<res>#1",
"exitServerId": "<srv>#2",
"id": "<nod>#2",
"lastUsageAt": "<ts>",
"meteredTraffic": {
"downlink": 5000,
"uplink": 4000
},
"name": "N1",
"networkMode": "ipv4",
"onlineCount": 0,
"onlineCustomerIds": [],
"pendingDelete": false,
"port": "<port>#2",
"portMode": "random",
"protocol": "vless-reality-vision",
"reality": {
"destPort": 443,
"keyId": "reality-<nod>#2",
"serverName": "www.amd.com"
},
"realityDestPort": 443,
"realityServerName": "www.amd.com",
"resourceId": "<res>#2",
"retiredUsageEpochs": [],
"serverId": "<srv>#1",
"sortIndex": 0,
"speedDownBps": 0,
"speedUpBps": 0,
"status": "active",
"topology": "forward",
"updatedAt": "<ts>",
"usageCounters": {
"downlink": 5000,
"epoch": "diff-epoch-1",
"uplink": 4000
},
"wsPath": "<secret>#5"
},
{
"artifacts": {},
"autoRemoving": false,
"clientCount": 1,
"createdAt": "<ts>",
"entryReady": true,
"error": null,
"exitPort": null,
"exitPortMode": null,
"exitProtocol": null,
"exitReady": false,
"exitResourceId": "<res>#3",
"exitServerId": null,
"id": "<nod>#1",
"lastUsageAt": null,
"meteredTraffic": null,
"name": "N2",
"networkMode": "ipv4",
"onlineCount": 0,
"onlineCustomerIds": [],
"pendingDelete": false,
"port": "<port>#3",
"portMode": "random",
"protocol": "shadowsocks-2022-aes128",
"realityDestPort": 443,
"realityServerName": "www.tesla.com",
"resourceId": "<res>#4",
"retiredUsageEpochs": [],
"serverId": "<srv>#1",
"sortIndex": 1,
"speedDownBps": 0,
"speedUpBps": 0,
"status": "active",
"topology": "direct",
"updatedAt": "<ts>",
"usageCounters": null,
"wsPath": "<secret>#6"
},
{
"artifacts": {
"realityPublicKey": "<rpub>#2"
},
"autoRemoving": false,
"clientCount": 1,
"createdAt": "<ts>",
"entryReady": true,
"error": null,
"exitPort": null,
"exitPortMode": null,
"exitProtocol": null,
"exitReady": false,
"exitResourceId": "<res>#5",
"exitServerId": null,
"id": "<nod>#3",
"lastUsageAt": null,
"meteredTraffic": null,
"name": "N3",
"networkMode": "ipv4",
"onlineCount": 0,
"onlineCustomerIds": [],
"pendingDelete": false,
"port": "<port>#4",
"portMode": "random",
"protocol": "vless-reality",
"reality": {
"destPort": 443,
"keyId": "reality-<nod>#3",
"serverName": "www.amd.com"
},
"realityDestPort": 443,
"realityServerName": "www.amd.com",
"resourceId": "<res>#6",
"retiredUsageEpochs": [],
"serverId": "<srv>#3",
"sortIndex": 2,
"speedDownBps": 0,
"speedUpBps": 0,
"status": "active",
"topology": "direct",
"updatedAt": "<ts>",
"usageCounters": null,
"wsPath": "<secret>#9"
}
]
},
"status": 200
},
"carolSubscriptions": {
"auto-clash": {
"body": "mixed-port: 7890\nallow-lan: false\nmode: rule\nproxies:\n - name: \"N3\"\n server: \"s3.example.com\"\n port: <port>#4\n type: \"vless\"\n uuid: \"<uuid>#3\"\n tls: true\n network: \"tcp\"\n servername: \"www.amd.com\"\n client-fingerprint: \"chrome\"\n reality-opts: \n public-key: \"<rpub>#2\"\n short-id: \"<secret>#8\"\nproxy-groups:\n - name: \"节点选择\"\n type: select\n proxies:\n - \"N3\"\nrules:\n - \"MATCH,节点选择\"\n",
"contentType": "text/yaml; charset=utf-8",
"status": 200,
"userinfo": "upload=0; download=0; total=0; expire=0"
},
"auto-generic": {
"body": "vless://<uuid>#3@s3.example.com:<port>#4?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#2&sid=<secret>#8&type=tcp&headerType=none#N3\n",
"contentType": "text/plain; charset=utf-8",
"status": 200,
"userinfo": "upload=0; download=0; total=0; expire=0"
},
"base64": {
"body": "vless://<uuid>#3@s3.example.com:<port>#4?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#2&sid=<secret>#8&type=tcp&headerType=none#N3\n",
"contentType": "text/plain; charset=utf-8",
"status": 200,
"userinfo": "upload=0; download=0; total=0; expire=0"
},
"clash": {
"body": "mixed-port: 7890\nallow-lan: false\nmode: rule\nproxies:\n - name: \"N3\"\n server: \"s3.example.com\"\n port: <port>#4\n type: \"vless\"\n uuid: \"<uuid>#3\"\n tls: true\n network: \"tcp\"\n servername: \"www.amd.com\"\n client-fingerprint: \"chrome\"\n reality-opts: \n public-key: \"<rpub>#2\"\n short-id: \"<secret>#8\"\nproxy-groups:\n - name: \"节点选择\"\n type: select\n proxies:\n - \"N3\"\nrules:\n - \"MATCH,节点选择\"\n",
"contentType": "text/yaml; charset=utf-8",
"status": 200,
"userinfo": "upload=0; download=0; total=0; expire=0"
},
"clash-smart": {
"body": "mixed-port: 7890\nallow-lan: false\nmode: rule\nproxies:\n - name: \"N3\"\n server: \"s3.example.com\"\n port: <port>#4\n type: \"vless\"\n uuid: \"<uuid>#3\"\n tls: true\n network: \"tcp\"\n servername: \"www.amd.com\"\n client-fingerprint: \"chrome\"\n reality-opts: \n public-key: \"<rpub>#2\"\n short-id: \"<secret>#8\"\nproxy-groups:\n - name: \"节点选择\"\n type: select\n proxies:\n - \"自动选择\"\n - \"N3\"\n - \"DIRECT\"\n - name: \"自动选择\"\n type: url-test\n url: \"https://www.gstatic.com/generate_204\"\n interval: 300\n tolerance: 80\n proxies:\n - \"N3\"\n - name: \"流媒体\"\n type: select\n proxies:\n - \"节点选择\"\n - \"自动选择\"\n - \"N3\"\n - name: \"AI 服务\"\n type: select\n proxies:\n - \"节点选择\"\n - \"自动选择\"\n - \"N3\"\n - name: \"Meta 服务\"\n type: select\n proxies:\n - \"节点选择\"\n - \"自动选择\"\n - \"N3\"\nrules:\n - \"GEOSITE,category-ads-all,REJECT\"\n - \"GEOSITE,private,DIRECT\"\n - \"GEOSITE,openai,AI 服务\"\n - \"GEOSITE,netflix,流媒体\"\n - \"GEOSITE,facebook,Meta 服务\"\n - \"DOMAIN-SUFFIX,fbcdn.net,Meta 服务\"\n - \"DOMAIN-SUFFIX,instagram.com,Meta 服务\"\n - \"DOMAIN-SUFFIX,whatsapp.net,Meta 服务\"\n - \"GEOSITE,geolocation-!cn,节点选择\"\n - \"GEOSITE,cn,DIRECT\"\n - \"GEOIP,CN,DIRECT\"\n - \"MATCH,节点选择\"\n",
"contentType": "text/yaml; charset=utf-8",
"status": 200,
"userinfo": "upload=0; download=0; total=0; expire=0"
},
"raw": {
"body": "vless://<uuid>#3@s3.example.com:<port>#4?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#2&sid=<secret>#8&type=tcp&headerType=none#N3\n",
"contentType": "text/plain; charset=utf-8",
"status": 200,
"userinfo": "upload=0; download=0; total=0; expire=0"
},
"singbox": {
"body": "{\n \"log\": {\n \"level\": \"warn\"\n },\n \"inbounds\": [\n {\n \"type\": \"mixed\",\n \"tag\": \"local\",\n \"listen\": \"127.0.0.1\",\n \"listen_port\": 2080\n }\n ],\n \"outbounds\": [\n {\n \"type\": \"selector\",\n \"tag\": \"proxy\",\n \"outbounds\": [\n \"node-1\"\n ]\n },\n {\n \"type\": \"vless\",\n \"tag\": \"node-1\",\n \"server\": \"s3.example.com\",\n \"server_port\": <port>#4,\n \"uuid\": \"<uuid>#3\",\n \"tls\": {\n \"enabled\": true,\n \"server_name\": \"www.amd.com\",\n \"reality\": {\n \"enabled\": true,\n \"public_key\": \"<rpub>#2\",\n \"short_id\": \"<secret>#8\"\n }\n }\n },\n {\n \"type\": \"direct\",\n \"tag\": \"direct\"\n }\n ],\n \"route\": {\n \"final\": \"proxy\"\n }\n}\n",
"contentType": "application/json; charset=utf-8",
"status": 200,
"userinfo": "upload=0; download=0; total=0; expire=0"
},
"surge": {
"body": "{\"message\":\"当前没有部署成功的入口节点,请在“转发与节点”部署节点\"}",
"contentType": "application/json; charset=utf-8",
"status": 503,
"userinfo": ""
}
},
"usageReport1": {
"body": {
"ok": true
},
"status": 200
},
"usageReport2": {
"body": {
"ok": true
},
"status": 200
},
"presenceProjection": {
"customers": [
{
"name": "Alice",
"online": true,
"speedPositive": true,
"hasLastActiveAt": true
},
{
"name": "Bob",
"online": false,
"speedPositive": false,
"hasLastActiveAt": false
},
{
"name": "Carol",
"online": false,
"speedPositive": false,
"hasLastActiveAt": false
}
],
"nodes": [
{
"name": "N1",
"clientCount": 2,
"onlineCount": 1,
"onlineNames": [
"Alice"
],
"speedPositive": true
},
{
"name": "N2",
"clientCount": 1,
"onlineCount": 1,
"onlineNames": [
"Alice"
],
"speedPositive": false
},
{
"name": "N3",
"clientCount": 1,
"onlineCount": 0,
"onlineNames": [],
"speedPositive": false
}
]
},
"customersAfterUsage": {
"body": {
"customers": [
{
"createdAt": "<ts>",
"credentials": {
"clientId": "<uuid>#1",
"relayPassword": "<secret>#1",
"shortId": "<secret>#2"
},
"deviceLimit": 0,
"expiresAt": null,
"group": "",
"id": "<cus>#1",
"ipLimit": 0,
"lastActiveAt": "<ts>",
"lastOnlineAt": "<ts>",
"lastUsageAt": "<ts>",
"name": "Alice",
"notes": "",
"observedIpCount": 0,
"online": true,
"serverUsage": {
"srv:<srv>#1": {
"lastActiveAt": "<ts>",
"lastSampleAt": "<ts>",
"retiredUsageEpochs": [
"diff-epoch-1"
],
"speedAt": "<ts>",
"speedDownBps": "<speed+>",
"speedUpBps": "<speed+>",
"usageCounters": {
"downlink": 6300,
"epoch": "golden-epoch-1",
"uplink": 4500
}
}
},
"speedDownBps": "<speed+>",
"speedUpBps": "<speed+>",
"status": "active",
"subscriptionClientCount": 3,
"subscriptionToken": "<subtoken>#1",
"tags": [],
"trafficLimitBytes": 0,
"updatedAt": "<ts>",
"usedBytes": 13800,
"usedDownlinkBytes": 8300,
"usedUplinkBytes": 5500
},
{
"createdAt": "<ts>",
"credentials": {
"clientId": "<uuid>#2",
"relayPassword": "<secret>#3",
"shortId": "<secret>#4"
},
"deviceLimit": 2,
"expiresAt": null,
"group": "",
"id": "<cus>#2",
"ipLimit": 5,
"lastActiveAt": null,
"name": "Bob",
"notes": "",
"observedIpCount": 0,
"online": false,
"speedDownBps": 0,
"speedUpBps": 0,
"status": "active",
"subscriptionClientCount": 2,
"subscriptionToken": "<subtoken>#2",
"tags": [],
"trafficLimitBytes": 1073741824,
"updatedAt": "<ts>",
"usedBytes": 0,
"usedDownlinkBytes": 0,
"usedUplinkBytes": 0
},
{
"createdAt": "<ts>",
"credentials": {
"clientId": "<uuid>#3",
"relayPassword": "<secret>#7",
"shortId": "<secret>#8"
},
"deviceLimit": 0,
"expiresAt": null,
"group": "",
"id": "<cus>#3",
"ipLimit": 0,
"lastActiveAt": null,
"name": "Carol",
"notes": "",
"observedIpCount": 0,
"online": false,
"speedDownBps": 0,
"speedUpBps": 0,
"status": "active",
"subscriptionClientCount": 3,
"subscriptionToken": "<subtoken>#3",
"tags": [],
"trafficLimitBytes": 0,
"updatedAt": "<ts>",
"usedBytes": 0,
"usedDownlinkBytes": 0,
"usedUplinkBytes": 0
}
],
"summary": {
"depleted": 0,
"depletingSoon": 0,
"disabled": 0,
"enabled": 3,
"online": 1,
"total": 3
}
},
"status": 200
},
"nodePatchUiStyle": {
"body": {
"node": {
"artifacts": {
"realityPublicKey": "<rpub>#1"
},
"autoRemoving": false,
"createdAt": "<ts>",
"entryReady": true,
"error": null,
"exitPort": "<port>#1",
"exitPortMode": "random",
"exitProtocol": "shadowsocks-2022-aes256",
"exitReady": true,
"exitResourceId": "<res>#1",
"exitServerId": "<srv>#2",
"id": "<nod>#2",
"lastActiveAt": "<ts>",
"lastSampleAt": "<ts>",
"lastUsageAt": "<ts>",
"meteredTraffic": {
"downlink": 14000,
"uplink": 12000
},
"name": "N1-renamed",
"networkMode": "ipv4",
"pendingDelete": false,
"port": "<port>#2",
"portMode": "random",
"protocol": "vless-reality-vision",
"reality": {
"destPort": 443,
"keyId": "reality-<nod>#2",
"serverName": "www.amd.com"
},
"realityDestPort": 443,
"realityServerName": "www.amd.com",
"resourceId": "<res>#2",
"retiredUsageEpochs": [
"diff-epoch-1"
],
"serverId": "<srv>#1",
"sortIndex": 0,
"speedAt": "<ts>",
"speedDownBps": "<speed+>",
"speedUpBps": "<speed+>",
"status": "deploying",
"topology": "forward",
"updatedAt": "<ts>",
"usageCounters": {
"downlink": 9000,
"epoch": "golden-epoch-1",
"uplink": 8000
},
"wsPath": "<secret>#5"
}
},
"status": 200
},
"nodePatchJobs": {
"entry": [
{
"complete": {
"job": {
"action": "apply_resource",
"attempts": 1,
"completedAt": "<ts>",
"createdAt": "<ts>",
"error": null,
"id": "<job>#5",
"leaseUntil": null,
"nodeId": "<nod>#2",
"payload": {
"keyMaterial": {
"reality-<nod>#2": {
"privateKey": "<rpriv>#2",
"publicKey": "<rpub>#1"
}
},
"kind": "node",
"resource": {
"engine": "sing-box",
"id": "<res>#2",
"inbounds": [
{
"listen": "<hostip>",
"listen_port": "<port>#2",
"tag": "ng-<nod>#2-in",
"tls": {
"enabled": true,
"reality": {
"enabled": true,
"handshake": {
"server": "www.amd.com",
"server_port": "<port>#5"
},
"private_key": "${REALITY_PRIVATE:reality-<nod>#2}",
"short_id": [
"<secret>#2",
"<secret>#4"
]
},
"server_name": "www.amd.com"
},
"type": "vless",
"users": [
{
"flow": "xtls-rprx-vision",
"name": "ng:<cus>#1",
"uuid": "<uuid>#1"
},
{
"flow": "xtls-rprx-vision",
"name": "ng:<cus>#2",
"uuid": "<uuid>#2"
}
]
}
],
"meta": {
"kind": "node",
"metricsTag": "ng-<nod>#2-in",
"nodeId": "<nod>#2",
"protocol": "vless-reality-vision"
},
"outbounds": [
{
"method": "2022-blake3-aes-256-gcm",
"password": "<secret>#10",
"server": "exit.example.com",
"server_port": "<port>#1",
"tag": "ng-<nod>#2-exit",
"type": "shadowsocks"
}
],
"routingRules": [
{
"action": "route",
"inbound": [
"ng-<nod>#2-in"
],
"outbound": "ng-<nod>#2-exit"
}
]
}
},
"serverId": "<srv>#1",
"startedAt": "<ts>",
"status": "completed",
"updatedAt": "<ts>"
}
},
"job": {
"action": "apply_resource",
"attempts": 1,
"createdAt": "<ts>",
"error": null,
"id": "<job>#5",
"leaseUntil": "<ts>",
"nodeId": "<nod>#2",
"payload": {
"keyMaterial": {
"reality-<nod>#2": {
"privateKey": "<rpriv>#2",
"publicKey": "<rpub>#1"
}
},
"kind": "node",
"resource": {
"engine": "sing-box",
"id": "<res>#2",
"inbounds": [
{
"listen": "<hostip>",
"listen_port": "<port>#2",
"tag": "ng-<nod>#2-in",
"tls": {
"enabled": true,
"reality": {
"enabled": true,
"handshake": {
"server": "www.amd.com",
"server_port": "<port>#5"
},
"private_key": "${REALITY_PRIVATE:reality-<nod>#2}",
"short_id": [
"<secret>#2",
"<secret>#4"
]
},
"server_name": "www.amd.com"
},
"type": "vless",
"users": [
{
"flow": "xtls-rprx-vision",
"name": "ng:<cus>#1",
"uuid": "<uuid>#1"
},
{
"flow": "xtls-rprx-vision",
"name": "ng:<cus>#2",
"uuid": "<uuid>#2"
}
]
}
],
"meta": {
"kind": "node",
"metricsTag": "ng-<nod>#2-in",
"nodeId": "<nod>#2",
"protocol": "vless-reality-vision"
},
"outbounds": [
{
"method": "2022-blake3-aes-256-gcm",
"password": "<secret>#10",
"server": "exit.example.com",
"server_port": "<port>#1",
"tag": "ng-<nod>#2-exit",
"type": "shadowsocks"
}
],
"routingRules": [
{
"action": "route",
"inbound": [
"ng-<nod>#2-in"
],
"outbound": "ng-<nod>#2-exit"
}
]
}
},
"serverId": "<srv>#1",
"startedAt": "<ts>",
"status": "running",
"updatedAt": "<ts>"
}
}
],
"exit": [
{
"complete": {
"job": {
"action": "apply_resource",
"attempts": 1,
"completedAt": "<ts>",
"createdAt": "<ts>",
"error": null,
"id": "<job>#6",
"leaseUntil": null,
"nodeId": "<nod>#2",
"payload": {
"kind": "node-exit",
"resource": {
"engine": "sing-box",
"id": "<res>#1",
"inbounds": [
{
"listen": "<hostip>",
"listen_port": "<port>#1",
"method": "2022-blake3-aes-256-gcm",
"password": "<secret>#10",
"tag": "ng-<nod>#2-exit-in",
"type": "shadowsocks"
}
],
"meta": {
"kind": "node-exit",
"metricsTag": "ng-<nod>#2-exit-in",
"nodeId": "<nod>#2"
},
"outbounds": [
{
"tag": "ng-<nod>#2-exit-direct",
"type": "direct"
}
],
"routingRules": [
{
"action": "route",
"inbound": [
"ng-<nod>#2-exit-in"
],
"outbound": "ng-<nod>#2-exit-direct"
}
]
}
},
"serverId": "<srv>#2",
"startedAt": "<ts>",
"status": "completed",
"updatedAt": "<ts>"
}
},
"job": {
"action": "apply_resource",
"attempts": 1,
"createdAt": "<ts>",
"error": null,
"id": "<job>#6",
"leaseUntil": "<ts>",
"nodeId": "<nod>#2",
"payload": {
"kind": "node-exit",
"resource": {
"engine": "sing-box",
"id": "<res>#1",
"inbounds": [
{
"listen": "<hostip>",
"listen_port": "<port>#1",
"method": "2022-blake3-aes-256-gcm",
"password": "<secret>#10",
"tag": "ng-<nod>#2-exit-in",
"type": "shadowsocks"
}
],
"meta": {
"kind": "node-exit",
"metricsTag": "ng-<nod>#2-exit-in",
"nodeId": "<nod>#2"
},
"outbounds": [
{
"tag": "ng-<nod>#2-exit-direct",
"type": "direct"
}
],
"routingRules": [
{
"action": "route",
"inbound": [
"ng-<nod>#2-exit-in"
],
"outbound": "ng-<nod>#2-exit-direct"
}
]
}
},
"serverId": "<srv>#2",
"startedAt": "<ts>",
"status": "running",
"updatedAt": "<ts>"
}
}
]
},
"nodesAfterPatch": {
"body": {
"nodeClients": [
{
"clientUri": "vless://<uuid>#1@entry.example.com:<port>#2?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#1&sid=<secret>#2&type=tcp&headerType=none&flow=xtls-rprx-vision#N1-renamed",
"createdAt": "<ts>",
"customerId": "<cus>#1",
"id": "<ncl>#1",
"nodeId": "<nod>#2",
"status": "active",
"updatedAt": "<ts>"
},
{
"clientUri": "vless://<uuid>#2@entry.example.com:<port>#2?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#1&sid=<secret>#4&type=tcp&headerType=none&flow=xtls-rprx-vision#N1-renamed",
"createdAt": "<ts>",
"customerId": "<cus>#2",
"id": "<ncl>#2",
"nodeId": "<nod>#2",
"status": "active",
"updatedAt": "<ts>"
},
{
"clientUri": "ss://<ssblob>#1@entry.example.com:<port>#3#N2",
"createdAt": "<ts>",
"customerId": "<cus>#1",
"id": "<ncl>#3",
"nodeId": "<nod>#1",
"status": "active",
"updatedAt": "<ts>"
},
{
"clientUri": "vless://<uuid>#3@s3.example.com:<port>#4?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=<rpub>#2&sid=<secret>#8&type=tcp&headerType=none#N3",
"createdAt": "<ts>",
"customerId": "<cus>#3",
"id": "<ncl>#4",
"nodeId": "<nod>#3",
"status": "active",
"updatedAt": "<ts>"
}
],
"nodes": [
{
"artifacts": {
"realityPublicKey": "<rpub>#1"
},
"autoRemoving": false,
"clientCount": 2,
"createdAt": "<ts>",
"entryReady": true,
"error": null,
"exitPort": "<port>#1",
"exitPortMode": "random",
"exitProtocol": "shadowsocks-2022-aes256",
"exitReady": true,
"exitResourceId": "<res>#1",
"exitServerId": "<srv>#2",
"id": "<nod>#2",
"lastActiveAt": "<ts>",
"lastSampleAt": "<ts>",
"lastUsageAt": "<ts>",
"meteredTraffic": {
"downlink": 14000,
"uplink": 12000
},
"name": "N1-renamed",
"networkMode": "ipv4",
"onlineCount": 1,
"onlineCustomerIds": [
"<cus>#1"
],
"pendingDelete": false,
"port": "<port>#2",
"portMode": "random",
"protocol": "vless-reality-vision",
"reality": {
"destPort": 443,
"keyId": "reality-<nod>#2",
"serverName": "www.amd.com"
},
"realityDestPort": 443,
"realityServerName": "www.amd.com",
"resourceId": "<res>#2",
"retiredUsageEpochs": [
"diff-epoch-1"
],
"serverId": "<srv>#1",
"sortIndex": 0,
"speedAt": "<ts>",
"speedDownBps": "<speed+>",
"speedUpBps": "<speed+>",
"status": "active",
"topology": "forward",
"updatedAt": "<ts>",
"usageCounters": {
"downlink": 9000,
"epoch": "golden-epoch-1",
"uplink": 8000
},
"wsPath": "<secret>#5"
},
{
"artifacts": {},
"autoRemoving": false,
"clientCount": 1,
"createdAt": "<ts>",
"entryReady": true,
"error": null,
"exitPort": null,
"exitPortMode": null,
"exitProtocol": null,
"exitReady": false,
"exitResourceId": "<res>#3",
"exitServerId": null,
"id": "<nod>#1",
"lastUsageAt": null,
"meteredTraffic": null,
"name": "N2",
"networkMode": "ipv4",
"onlineCount": 1,
"onlineCustomerIds": [
"<cus>#1"
],
"pendingDelete": false,
"port": "<port>#3",
"portMode": "random",
"protocol": "shadowsocks-2022-aes128",
"realityDestPort": 443,
"realityServerName": "www.tesla.com",
"resourceId": "<res>#4",
"retiredUsageEpochs": [],
"serverId": "<srv>#1",
"sortIndex": 1,
"speedDownBps": 0,
"speedUpBps": 0,
"status": "active",
"topology": "direct",
"updatedAt": "<ts>",
"usageCounters": null,
"wsPath": "<secret>#6"
},
{
"artifacts": {
"realityPublicKey": "<rpub>#2"
},
"autoRemoving": false,
"clientCount": 1,
"createdAt": "<ts>",
"entryReady": true,
"error": null,
"exitPort": null,
"exitPortMode": null,
"exitProtocol": null,
"exitReady": false,
"exitResourceId": "<res>#5",
"exitServerId": null,
"id": "<nod>#3",
"lastUsageAt": null,
"meteredTraffic": null,
"name": "N3",
"networkMode": "ipv4",
"onlineCount": 0,
"onlineCustomerIds": [],
"pendingDelete": false,
"port": "<port>#4",
"portMode": "random",
"protocol": "vless-reality",
"reality": {
"destPort": 443,
"keyId": "reality-<nod>#3",
"serverName": "www.amd.com"
},
"realityDestPort": 443,
"realityServerName": "www.amd.com",
"resourceId": "<res>#6",
"retiredUsageEpochs": [],
"serverId": "<srv>#3",
"sortIndex": 2,
"speedDownBps": 0,
"speedUpBps": 0,
"status": "active",
"topology": "direct",
"updatedAt": "<ts>",
"usageCounters": null,
"wsPath": "<secret>#9"
}
]
},
"status": 200
},
"systemShape": {
"status": 200,
"body": {
"history": [
{
"at": "<ts>",
"connections": 1,
"cpu": null,
"downBps": "<num>",
"mem": "<num>",
"upBps": "<num>"
}
],
"host": {
"cpuCount": "<num>",
"cpuPercent": null,
"diskPercent": "<num>",
"diskTotal": "<num>",
"diskUsed": "<num>",
"load1": "<num>",
"memPercent": "<num>",
"memTotal": "<num>",
"memUsed": "<num>"
},
"hostUptimeSec": "<num>",
"ips": {
"ipv4": "<ip>",
"ipv6": null
},
"network": {
"connections": 1,
"customersTotal": 3,
"downBps": "<num>",
"nodesTotal": 3,
"onlineCustomers": 1,
"onlineNodes": 3,
"upBps": "<num>"
},
"panelMemBytes": "<num>",
"panelUptimeSec": "<num>",
"startedAt": "<ts>",
"today": {
"downBytes": "<num>",
"upBytes": "<num>"
},
"totals": {
"downBytes": "<num>",
"upBytes": "<num>"
},
"version": "0.6.8"
}
},
"backup": {
"body": {
"activity": [
{
"action": "update_node",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "N1-renamed"
},
"id": "<evt>#13",
"target": "<nod>#2"
},
{
"action": "deploy_node",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "N3"
},
"id": "<evt>#14",
"target": "<nod>#3"
},
{
"action": "assign_customer",
"actor": "admin",
"at": "<ts>",
"detail": {
"customer": "Carol",
"customerId": "<cus>#3"
},
"id": "<evt>#15",
"target": "<nod>#3"
},
{
"action": "create_node",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "N3"
},
"id": "<evt>#16",
"target": "<nod>#3"
},
{
"action": "create_customer",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "Carol"
},
"id": "<evt>#17",
"target": "<cus>#3"
},
{
"action": "reconcile_server",
"actor": "agent:<agt>#2",
"at": "<ts>",
"detail": {
"nodes": 0
},
"id": "<evt>#18",
"target": "<srv>#3"
},
{
"action": "enroll_agent",
"actor": "agent:<agt>#2",
"at": "<ts>",
"detail": {},
"id": "<evt>#19",
"target": "<srv>#3"
},
{
"action": "create_enrollment",
"actor": "admin",
"at": "<ts>",
"detail": {},
"id": "<evt>#20",
"target": "<srv>#3"
},
{
"action": "create_server",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "S3"
},
"id": "<evt>#21",
"target": "<srv>#3"
},
{
"action": "deploy_node",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "N2"
},
"id": "<evt>#1",
"target": "<nod>#1"
},
{
"action": "deploy_node",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "N1"
},
"id": "<evt>#2",
"target": "<nod>#2"
},
{
"action": "assign_customer",
"actor": "admin",
"at": "<ts>",
"detail": {
"customer": "Alice",
"customerId": "<cus>#1"
},
"id": "<evt>#3",
"target": "<nod>#1"
},
{
"action": "assign_customer",
"actor": "admin",
"at": "<ts>",
"detail": {
"customer": "Bob",
"customerId": "<cus>#2"
},
"id": "<evt>#4",
"target": "<nod>#2"
},
{
"action": "assign_customer",
"actor": "admin",
"at": "<ts>",
"detail": {
"customer": "Alice",
"customerId": "<cus>#1"
},
"id": "<evt>#5",
"target": "<nod>#2"
},
{
"action": "create_node",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "N2"
},
"id": "<evt>#6",
"target": "<nod>#1"
},
{
"action": "create_node",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "N1"
},
"id": "<evt>#7",
"target": "<nod>#2"
},
{
"action": "create_customer",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "Bob"
},
"id": "<evt>#8",
"target": "<cus>#2"
},
{
"action": "create_customer",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "Alice"
},
"id": "<evt>#9",
"target": "<cus>#1"
},
{
"action": "reconcile_server",
"actor": "agent:<agt>#1",
"at": "<ts>",
"detail": {
"nodes": 0
},
"id": "<evt>#10",
"target": "<srv>#2"
},
{
"action": "enroll_agent",
"actor": "agent:<agt>#1",
"at": "<ts>",
"detail": {},
"id": "<evt>#11",
"target": "<srv>#2"
},
{
"action": "create_enrollment",
"actor": "admin",
"at": "<ts>",
"detail": {},
"id": "<evt>#12",
"target": "<srv>#2"
},
{
"action": "reconcile_server",
"actor": "agent:<agt>#3",
"at": "<ts>",
"detail": {
"nodes": 0
},
"id": "<evt>#22",
"target": "<srv>#1"
},
{
"action": "enroll_agent",
"actor": "agent:<agt>#3",
"at": "<ts>",
"detail": {},
"id": "<evt>#23",
"target": "<srv>#1"
},
{
"action": "create_enrollment",
"actor": "admin",
"at": "<ts>",
"detail": {},
"id": "<evt>#24",
"target": "<srv>#1"
},
{
"action": "create_server",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "Exit"
},
"id": "<evt>#25",
"target": "<srv>#2"
},
{
"action": "create_server",
"actor": "admin",
"at": "<ts>",
"detail": {
"name": "Entry"
},
"id": "<evt>#26",
"target": "<srv>#1"
}
],
"agents": [
{
"createdAt": "<ts>",
"hostname": "diff-agent-entry",
"id": "<agt>#3",
"keyFingerprint": "<fingerprint>#1",
"keyHash": "<hash>#1",
"lastSeenAt": "<ts>",
"serverId": "<srv>#1",
"status": "active",
"version": "0.6.8"
},
{
"createdAt": "<ts>",
"hostname": "diff-agent-exit",
"id": "<agt>#1",
"keyFingerprint": "<fingerprint>#2",
"keyHash": "<hash>#3",
"lastSeenAt": "<ts>",
"serverId": "<srv>#2",
"status": "active",
"version": "0.6.8"
},
{
"createdAt": "<ts>",
"hostname": "golden-agent-s3",
"id": "<agt>#2",
"keyFingerprint": "<fingerprint>#3",
"keyHash": "<hash>#5",
"lastSeenAt": "<ts>",
"serverId": "<srv>#3",
"status": "active",
"version": "0.6.8"
}
],
"createdAt": "<ts>",
"customers": [
{
"createdAt": "<ts>",
"credentials": {
"clientId": "<uuid>#1",
"relayPassword": "<secret>#1",
"shortId": "<secret>#2"
},
"deviceLimit": 0,
"expiresAt": null,
"group": "",
"id": "<cus>#1",
"ipLimit": 0,
"lastOnlineAt": "<ts>",
"lastUsageAt": "<ts>",
"name": "Alice",
"notes": "",
"serverUsage": {
"srv:<srv>#1": {
"lastActiveAt": "<ts>",
"lastSampleAt": "<ts>",
"retiredUsageEpochs": [
"diff-epoch-1"
],
"speedAt": "<ts>",
"speedDownBps": "<speed+>",
"speedUpBps": "<speed+>",
"usageCounters": {
"downlink": 6300,
"epoch": "golden-epoch-1",
"uplink": 4500
}
}
},
"status": "active",
"subscriptionToken": "<subtoken>#1",
"tags": [],
"trafficLimitBytes": 0,
"updatedAt": "<ts>",
"usedBytes": 13800,
"usedDownlinkBytes": 8300,
"usedUplinkBytes": 5500
},
{
"createdAt": "<ts>",
"credentials": {
"clientId": "<uuid>#2",
"relayPassword": "<secret>#3",
"shortId": "<secret>#4"
},
"deviceLimit": 2,
"expiresAt": null,
"group": "",
"id": "<cus>#2",
"ipLimit": 5,
"name": "Bob",
"notes": "",
"status": "active",
"subscriptionToken": "<subtoken>#2",
"tags": [],
"trafficLimitBytes": 1073741824,
"updatedAt": "<ts>",
"usedBytes": 0,
"usedDownlinkBytes": 0,
"usedUplinkBytes": 0
},
{
"createdAt": "<ts>",
"credentials": {
"clientId": "<uuid>#3",
"relayPassword": "<secret>#7",
"shortId": "<secret>#8"
},
"deviceLimit": 0,
"expiresAt": null,
"group": "",
"id": "<cus>#3",
"ipLimit": 0,
"name": "Carol",
"notes": "",
"status": "active",
"subscriptionToken": "<subtoken>#3",
"tags": [],
"trafficLimitBytes": 0,
"updatedAt": "<ts>",
"usedBytes": 0,
"usedDownlinkBytes": 0,
"usedUplinkBytes": 0
}
],
"enrollmentTokens": [
{
"createdAt": "<ts>",
"expiresAt": "<ts>",
"id": "<enr>#1",
"serverId": "<srv>#1",
"tokenHash": "<hash>#7",
"usedAt": "<ts>"
},
{
"createdAt": "<ts>",
"expiresAt": "<ts>",
"id": "<enr>#2",
"serverId": "<srv>#2",
"tokenHash": "<hash>#9",
"usedAt": "<ts>"
},
{
"createdAt": "<ts>",
"expiresAt": "<ts>",
"id": "<enr>#3",
"serverId": "<srv>#3",
"tokenHash": "<hash>#11",
"usedAt": "<ts>"
}
],
"jobs": [
{
"action": "apply_resource",
"attempts": 1,
"completedAt": "<ts>",
"createdAt": "<ts>",
"error": null,
"id": "<job>#3",
"leaseUntil": null,
"nodeId": "<nod>#2",
"payload": {
"keyMaterial": {
"reality-<nod>#2": {
"privateKey": "<rpriv>#2",
"publicKey": "<rpub>#1"
}
},
"kind": "node",
"resource": {
"engine": "sing-box",
"id": "<res>#2",
"inbounds": [
{
"listen": "<hostip>",
"listen_port": "<port>#2",
"tag": "ng-<nod>#2-in",
"tls": {
"enabled": true,
"reality": {
"enabled": true,
"handshake": {
"server": "www.amd.com",
"server_port": "<port>#5"
},
"private_key": "${REALITY_PRIVATE:reality-<nod>#2}",
"short_id": [
"<secret>#2",
"<secret>#4"
]
},
"server_name": "www.amd.com"
},
"type": "vless",
"users": [
{
"flow": "xtls-rprx-vision",
"name": "ng:<cus>#1",
"uuid": "<uuid>#1"
},
{
"flow": "xtls-rprx-vision",
"name": "ng:<cus>#2",
"uuid": "<uuid>#2"
}
]
}
],
"meta": {
"kind": "node",
"metricsTag": "ng-<nod>#2-in",
"nodeId": "<nod>#2",
"protocol": "vless-reality-vision"
},
"outbounds": [
{
"method": "2022-blake3-aes-256-gcm",
"password": "<secret>#10",
"server": "exit.example.com",
"server_port": "<port>#1",
"tag": "ng-<nod>#2-exit",
"type": "shadowsocks"
}
],
"routingRules": [
{
"action": "route",
"inbound": [
"ng-<nod>#2-in"
],
"outbound": "ng-<nod>#2-exit"
}
]
}
},
"serverId": "<srv>#1",
"startedAt": "<ts>",
"status": "completed",
"updatedAt": "<ts>"
},
{
"action": "apply_resource",
"attempts": 1,
"completedAt": "<ts>",
"createdAt": "<ts>",
"error": null,
"id": "<job>#2",
"leaseUntil": null,
"nodeId": "<nod>#2",
"payload": {
"kind": "node-exit",
"resource": {
"engine": "sing-box",
"id": "<res>#1",
"inbounds": [
{
"listen": "<hostip>",
"listen_port": "<port>#1",
"method": "2022-blake3-aes-256-gcm",
"password": "<secret>#10",
"tag": "ng-<nod>#2-exit-in",
"type": "shadowsocks"
}
],
"meta": {
"kind": "node-exit",
"metricsTag": "ng-<nod>#2-exit-in",
"nodeId": "<nod>#2"
},
"outbounds": [
{
"tag": "ng-<nod>#2-exit-direct",
"type": "direct"
}
],
"routingRules": [
{
"action": "route",
"inbound": [
"ng-<nod>#2-exit-in"
],
"outbound": "ng-<nod>#2-exit-direct"
}
]
}
},
"serverId": "<srv>#2",
"startedAt": "<ts>",
"status": "completed",
"updatedAt": "<ts>"
},
{
"action": "apply_resource",
"attempts": 1,
"completedAt": "<ts>",
"createdAt": "<ts>",
"error": null,
"id": "<job>#1",
"leaseUntil": null,
"nodeId": "<nod>#1",
"payload": {
"kind": "node",
"resource": {
"engine": "sing-box",
"id": "<res>#4",
"inbounds": [
{
"listen": "<hostip>",
"listen_port": "<port>#3",
"method": "2022-blake3-aes-128-gcm",
"password": "<secret>#11",
"tag": "ng-<nod>#1-in",
"type": "shadowsocks",
"users": [
{
"name": "ng:<cus>#1",
"password": "<secret>#12"
}
]
}
],
"meta": {
"kind": "node",
"metricsTag": "ng-<nod>#1-in",
"nodeId": "<nod>#1",
"protocol": "shadowsocks-2022-aes128"
},
"outbounds": [
{
"tag": "ng-<nod>#1-direct",
"type": "direct"
}
],
"routingRules": [
{
"action": "route",
"inbound": [
"ng-<nod>#1-in"
],
"outbound": "ng-<nod>#1-direct"
}
]
}
},
"serverId": "<srv>#1",
"startedAt": "<ts>",
"status": "completed",
"updatedAt": "<ts>"
},
{
"action": "apply_resource",
"attempts": 1,
"completedAt": "<ts>",
"createdAt": "<ts>",
"error": null,
"id": "<job>#4",
"leaseUntil": null,
"nodeId": "<nod>#3",
"payload": {
"keyMaterial": {
"reality-<nod>#3": {
"privateKey": "<rpriv>#1",
"publicKey": "<rpub>#2"
}
},
"kind": "node",
"resource": {
"engine": "sing-box",
"id": "<res>#6",
"inbounds": [
{
"listen": "<hostip>",
"listen_port": "<port>#4",
"tag": "ng-<nod>#3-in",
"tls": {
"enabled": true,
"reality": {
"enabled": true,
"handshake": {
"server": "www.amd.com",
"server_port": "<port>#5"
},
"private_key": "${REALITY_PRIVATE:reality-<nod>#3}",
"short_id": [
"<secret>#8"
]
},
"server_name": "www.amd.com"
},
"type": "vless",
"users": [
{
"name": "ng:<cus>#3",
"uuid": "<uuid>#3"
}
]
}
],
"meta": {
"kind": "node",
"metricsTag": "ng-<nod>#3-in",
"nodeId": "<nod>#3",
"protocol": "vless-reality"
},
"outbounds": [
{
"tag": "ng-<nod>#3-direct",
"type": "direct"
}
],
"routingRules": [
{
"action": "route",
"inbound": [
"ng-<nod>#3-in"
],
"outbound": "ng-<nod>#3-direct"
}
]
}
},
"serverId": "<srv>#3",
"startedAt": "<ts>",
"status": "completed",
"updatedAt": "<ts>"
},
{
"action": "apply_resource",
"attempts": 1,
"completedAt": "<ts>",
"createdAt": "<ts>",
"error": null,
"id": "<job>#5",
"leaseUntil": null,
"nodeId": "<nod>#2",
"payload": {
"keyMaterial": {
"reality-<nod>#2": {
"privateKey": "<rpriv>#2",
"publicKey": "<rpub>#1"
}
},
"kind": "node",
"resource": {
"engine": "sing-box",
"id": "<res>#2",
"inbounds": [
{
"listen": "<hostip>",
"listen_port": "<port>#2",
"tag": "ng-<nod>#2-in",
"tls": {
"enabled": true,
"reality": {
"enabled": true,
"handshake": {
"server": "www.amd.com",
"server_port": "<port>#5"
},
"private_key": "${REALITY_PRIVATE:reality-<nod>#2}",
"short_id": [
"<secret>#2",
"<secret>#4"
]
},
"server_name": "www.amd.com"
},
"type": "vless",
"users": [
{
"flow": "xtls-rprx-vision",
"name": "ng:<cus>#1",
"uuid": "<uuid>#1"
},
{
"flow": "xtls-rprx-vision",
"name": "ng:<cus>#2",
"uuid": "<uuid>#2"
}
]
}
],
"meta": {
"kind": "node",
"metricsTag": "ng-<nod>#2-in",
"nodeId": "<nod>#2",
"protocol": "vless-reality-vision"
},
"outbounds": [
{
"method": "2022-blake3-aes-256-gcm",
"password": "<secret>#10",
"server": "exit.example.com",
"server_port": "<port>#1",
"tag": "ng-<nod>#2-exit",
"type": "shadowsocks"
}
],
"routingRules": [
{
"action": "route",
"inbound": [
"ng-<nod>#2-in"
],
"outbound": "ng-<nod>#2-exit"
}
]
}
},
"serverId": "<srv>#1",
"startedAt": "<ts>",
"status": "completed",
"updatedAt": "<ts>"
},
{
"action": "apply_resource",
"attempts": 1,
"completedAt": "<ts>",
"createdAt": "<ts>",
"error": null,
"id": "<job>#6",
"leaseUntil": null,
"nodeId": "<nod>#2",
"payload": {
"kind": "node-exit",
"resource": {
"engine": "sing-box",
"id": "<res>#1",
"inbounds": [
{
"listen": "<hostip>",
"listen_port": "<port>#1",
"method": "2022-blake3-aes-256-gcm",
"password": "<secret>#10",
"tag": "ng-<nod>#2-exit-in",
"type": "shadowsocks"
}
],
"meta": {
"kind": "node-exit",
"metricsTag": "ng-<nod>#2-exit-in",
"nodeId": "<nod>#2"
},
"outbounds": [
{
"tag": "ng-<nod>#2-exit-direct",
"type": "direct"
}
],
"routingRules": [
{
"action": "route",
"inbound": [
"ng-<nod>#2-exit-in"
],
"outbound": "ng-<nod>#2-exit-direct"
}
]
}
},
"serverId": "<srv>#2",
"startedAt": "<ts>",
"status": "completed",
"updatedAt": "<ts>"
}
],
"keyStore": {
"reality-<nod>#3": {
"privateKey": "<rpriv>#1",
"publicKey": "<rpub>#2",
"updatedAt": "<ts>"
},
"reality-<nod>#2": {
"privateKey": "<rpriv>#2",
"publicKey": "<rpub>#1",
"updatedAt": "<ts>"
}
},
"nodeClients": [
{
"createdAt": "<ts>",
"customerId": "<cus>#1",
"id": "<ncl>#1",
"nodeId": "<nod>#2",
"status": "active",
"updatedAt": "<ts>"
},
{
"createdAt": "<ts>",
"customerId": "<cus>#2",
"id": "<ncl>#2",
"nodeId": "<nod>#2",
"status": "active",
"updatedAt": "<ts>"
},
{
"createdAt": "<ts>",
"customerId": "<cus>#1",
"id": "<ncl>#3",
"nodeId": "<nod>#1",
"status": "active",
"updatedAt": "<ts>"
},
{
"createdAt": "<ts>",
"customerId": "<cus>#3",
"id": "<ncl>#4",
"nodeId": "<nod>#3",
"status": "active",
"updatedAt": "<ts>"
}
],
"nodes": [
{
"artifacts": {
"realityPublicKey": "<rpub>#1"
},
"autoRemoving": false,
"createdAt": "<ts>",
"entryReady": true,
"error": null,
"exitCredentials": {
"clientId": "<uuid>#4",
"password": "<secret>#10",
"socksUser": "ng_5b8dd6b991"
},
"exitPort": "<port>#1",
"exitPortMode": "random",
"exitProtocol": "shadowsocks-2022-aes256",
"exitReady": true,
"exitResourceId": "<res>#1",
"exitServerId": "<srv>#2",
"id": "<nod>#2",
"lastActiveAt": "<ts>",
"lastSampleAt": "<ts>",
"lastUsageAt": "<ts>",
"meteredTraffic": {
"downlink": 14000,
"uplink": 12000
},
"name": "N1-renamed",
"networkMode": "ipv4",
"pendingDelete": false,
"port": "<port>#2",
"portMode": "random",
"protocol": "vless-reality-vision",
"reality": {
"destPort": 443,
"keyId": "reality-<nod>#2",
"serverName": "www.amd.com"
},
"realityDestPort": 443,
"realityServerName": "www.amd.com",
"resourceId": "<res>#2",
"retiredUsageEpochs": [
"diff-epoch-1"
],
"serverId": "<srv>#1",
"sortIndex": 0,
"speedAt": "<ts>",
"speedDownBps": "<speed+>",
"speedUpBps": "<speed+>",
"status": "active",
"topology": "forward",
"updatedAt": "<ts>",
"usageCounters": {
"downlink": 9000,
"epoch": "golden-epoch-1",
"uplink": 8000
},
"wsPath": "<secret>#5"
},
{
"artifacts": {},
"autoRemoving": false,
"createdAt": "<ts>",
"entryReady": true,
"error": null,
"exitPort": null,
"exitPortMode": null,
"exitProtocol": null,
"exitReady": false,
"exitResourceId": "<res>#3",
"exitServerId": null,
"id": "<nod>#1",
"lastUsageAt": null,
"meteredTraffic": null,
"name": "N2",
"networkMode": "ipv4",
"pendingDelete": false,
"port": "<port>#3",
"portMode": "random",
"protocol": "shadowsocks-2022-aes128",
"realityDestPort": 443,
"realityServerName": "www.tesla.com",
"resourceId": "<res>#4",
"retiredUsageEpochs": [],
"serverId": "<srv>#1",
"sortIndex": 1,
"ssServerKey": "<secret>#11",
"status": "active",
"topology": "direct",
"updatedAt": "<ts>",
"usageCounters": null,
"wsPath": "<secret>#6"
},
{
"artifacts": {
"realityPublicKey": "<rpub>#2"
},
"autoRemoving": false,
"createdAt": "<ts>",
"entryReady": true,
"error": null,
"exitPort": null,
"exitPortMode": null,
"exitProtocol": null,
"exitReady": false,
"exitResourceId": "<res>#5",
"exitServerId": null,
"id": "<nod>#3",
"lastUsageAt": null,
"meteredTraffic": null,
"name": "N3",
"networkMode": "ipv4",
"pendingDelete": false,
"port": "<port>#4",
"portMode": "random",
"protocol": "vless-reality",
"reality": {
"destPort": 443,
"keyId": "reality-<nod>#3",
"serverName": "www.amd.com"
},
"realityDestPort": 443,
"realityServerName": "www.amd.com",
"resourceId": "<res>#6",
"retiredUsageEpochs": [],
"serverId": "<srv>#3",
"sortIndex": 2,
"status": "active",
"topology": "direct",
"updatedAt": "<ts>",
"usageCounters": null,
"wsPath": "<secret>#9"
}
],
"observations": [],
"schemaVersion": 1,
"servers": [
{
"createdAt": "<ts>",
"engine": {
"at": "<ts>",
"certificates": [],
"detail": "",
"singBoxInstalled": true,
"singBoxStatus": "ready",
"singBoxVersion": "1.13.21",
"status": "ready"
},
"id": "<srv>#1",
"labels": [],
"lastSeenAt": "<ts>",
"name": "Entry",
"portRangeEnd": 50000,
"portRangeStart": 20000,
"publicAddress": "entry.example.com",
"publicAddressV6": "v6.example.com",
"region": "",
"role": "relay",
"status": "online",
"system": {},
"tlsDomain": "tls.example.com",
"updatedAt": "<ts>",
"usage": {
"error": null,
"lastReportAt": "<ts>",
"sampleCount": 2
}
},
{
"createdAt": "<ts>",
"engine": null,
"id": "<srv>#2",
"labels": [],
"lastSeenAt": "<ts>",
"name": "Exit",
"portRangeEnd": 50000,
"portRangeStart": 20000,
"publicAddress": "exit.example.com",
"publicAddressV6": "",
"region": "",
"role": "exit",
"status": "online",
"system": {},
"tlsDomain": "",
"updatedAt": "<ts>"
},
{
"createdAt": "<ts>",
"enabled": true,
"id": "<srv>#3",
"labels": [],
"lastSeenAt": "<ts>",
"name": "S3",
"portRangeEnd": 50000,
"portRangeStart": 20000,
"publicAddress": "s3.example.com",
"publicAddressV6": "",
"region": "",
"role": "relay",
"status": "online",
"system": {},
"tlsDomain": "",
"updatedAt": "<ts>"
}
],
"settings": {
"activityRetentionDays": 30,
"brandName": "NexusGate",
"completedJobRetentionDays": 7,
"observationTtlMinutes": 10,
"sessionHours": 12
},
"subscriptionAccess": [
{
"at": "<ts>",
"bytes": 378,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#1",
"format": "raw",
"id": "<acc>#1",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 504,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#1",
"format": "base64",
"id": "<acc>#2",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 736,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#1",
"format": "clash",
"id": "<acc>#3",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 1704,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#1",
"format": "clash-smart",
"id": "<acc>#4",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 1127,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#1",
"format": "singbox",
"id": "<acc>#5",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 343,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#1",
"format": "surge",
"id": "<acc>#6",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 736,
"clientKey": "<clientkey>#2",
"customerId": "<cus>#1",
"format": "auto",
"id": "<acc>#7",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "clash-verge/v2.0.0"
},
{
"at": "<ts>",
"bytes": 504,
"clientKey": "<clientkey>#3",
"customerId": "<cus>#1",
"format": "auto",
"id": "<acc>#8",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "Mozilla/5.0 (DiffTest)"
},
{
"at": "<ts>",
"bytes": 378,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#1",
"format": "raw",
"id": "<acc>#9",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 504,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#1",
"format": "base64",
"id": "<acc>#10",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 736,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#1",
"format": "clash",
"id": "<acc>#11",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 1704,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#1",
"format": "clash-smart",
"id": "<acc>#12",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 1127,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#1",
"format": "singbox",
"id": "<acc>#13",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 343,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#1",
"format": "surge",
"id": "<acc>#14",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 736,
"clientKey": "<clientkey>#2",
"customerId": "<cus>#1",
"format": "auto",
"id": "<acc>#15",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "clash-verge/v2.0.0"
},
{
"at": "<ts>",
"bytes": 504,
"clientKey": "<clientkey>#3",
"customerId": "<cus>#1",
"format": "auto",
"id": "<acc>#16",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "Mozilla/5.0 (DiffTest)"
},
{
"at": "<ts>",
"bytes": 247,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#2",
"format": "raw",
"id": "<acc>#17",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 332,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#2",
"format": "base64",
"id": "<acc>#18",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 541,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#2",
"format": "clash",
"id": "<acc>#19",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 1457,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#2",
"format": "clash-smart",
"id": "<acc>#20",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 866,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#2",
"format": "singbox",
"id": "<acc>#21",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 0,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#2",
"format": "surge",
"id": "<acc>#22",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "没有已部署的入口节点",
"status": 503,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 541,
"clientKey": "<clientkey>#2",
"customerId": "<cus>#2",
"format": "auto",
"id": "<acc>#23",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "clash-verge/v2.0.0"
},
{
"at": "<ts>",
"bytes": 0,
"clientKey": "<clientkey>#3",
"customerId": "<cus>#2",
"format": "auto",
"id": "<acc>#24",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "订阅客户端估计数超限",
"status": 429,
"userAgent": "Mozilla/5.0 (DiffTest)"
},
{
"at": "<ts>",
"bytes": 222,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#3",
"format": "raw",
"id": "<acc>#25",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 296,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#3",
"format": "base64",
"id": "<acc>#26",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 509,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#3",
"format": "clash",
"id": "<acc>#27",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 1425,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#3",
"format": "clash-smart",
"id": "<acc>#28",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 829,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#3",
"format": "singbox",
"id": "<acc>#29",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 0,
"clientKey": "<clientkey>#1",
"customerId": "<cus>#3",
"format": "surge",
"id": "<acc>#30",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "没有已部署的入口节点",
"status": 503,
"userAgent": "NexusGate-DiffTest/1.0"
},
{
"at": "<ts>",
"bytes": 509,
"clientKey": "<clientkey>#2",
"customerId": "<cus>#3",
"format": "auto",
"id": "<acc>#31",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "clash-verge/v2.0.0"
},
{
"at": "<ts>",
"bytes": 296,
"clientKey": "<clientkey>#3",
"customerId": "<cus>#3",
"format": "auto",
"id": "<acc>#32",
"identityType": "user-agent",
"ip": "127.0.0.1",
"reason": "已返回",
"status": 200,
"userAgent": "Mozilla/5.0 (DiffTest)"
}
],
"subscriptionClients": [
{
"clientKey": "<clientkey>#1",
"customerId": "<cus>#1",
"firstSeenAt": "<ts>",
"identityType": "user-agent",
"lastSeenAt": "<ts>"
},
{
"clientKey": "<clientkey>#2",
"customerId": "<cus>#1",
"firstSeenAt": "<ts>",
"identityType": "user-agent",
"lastSeenAt": "<ts>"
},
{
"clientKey": "<clientkey>#3",
"customerId": "<cus>#1",
"firstSeenAt": "<ts>",
"identityType": "user-agent",
"lastSeenAt": "<ts>"
},
{
"clientKey": "<clientkey>#1",
"customerId": "<cus>#2",
"firstSeenAt": "<ts>",
"identityType": "user-agent",
"lastSeenAt": "<ts>"
},
{
"clientKey": "<clientkey>#2",
"customerId": "<cus>#2",
"firstSeenAt": "<ts>",
"identityType": "user-agent",
"lastSeenAt": "<ts>"
},
{
"clientKey": "<clientkey>#1",
"customerId": "<cus>#3",
"firstSeenAt": "<ts>",
"identityType": "user-agent",
"lastSeenAt": "<ts>"
},
{
"clientKey": "<clientkey>#2",
"customerId": "<cus>#3",
"firstSeenAt": "<ts>",
"identityType": "user-agent",
"lastSeenAt": "<ts>"
},
{
"clientKey": "<clientkey>#3",
"customerId": "<cus>#3",
"firstSeenAt": "<ts>",
"identityType": "user-agent",
"lastSeenAt": "<ts>"
}
],
"users": [
{
"createdAt": "<ts>",
"id": "<usr>#1",
"passwordHash": "<hash>#13",
"role": "owner",
"status": "active",
"username": "admin"
}
]
},
"status": 200
},
"errors": {
"badSubscription": {
"body": "<!doctype html>\n<html lang=\"zh-CN\" data-theme=\"light\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n <meta name=\"color-scheme\" content=\"light dark\">\n <meta name=\"theme-color\" content=\"#f0f2f5\">\n <title>amo</title>\n <script>(function(){try{var t=localStorage.getItem('nexusgate-theme');if(t==='dark'){document.documentElement.setAttribute('data-theme','dark');document.querySelector('meta[name=\"theme-color\"]').content='#1a1b1f';}}catch(e){}})();</script>\n <link rel=\"stylesheet\" href=\"/styles.css?v=0.7.0\">\n</head>\n<body>\n <div id=\"login\" class=\"login-shell hidden\">\n <section class=\"login-card panel\">\n <div class=\"login-brand\">amo</div>\n <form id=\"login-form\" class=\"stack\">\n <label>登录账号<input name=\"username\" autocomplete=\"username\" required></label>\n <label>登录密码<input name=\"password\" type=\"password\" autocomplete=\"current-password\" required></label>\n <button class=\"btn primary full\" type=\"submit\">登录</button>\n </form>\n <p id=\"login-error\" class=\"form-error\"></p>\n <button class=\"theme-btn login-theme\" type=\"button\" data-theme-toggle>🌙 深色</button>\n </section>\n </div>\n\n <div id=\"app\" class=\"layout hidden\">\n <aside class=\"sider\">\n <div class=\"brand\">amo</div>\n <nav class=\"menu\" id=\"nav\">\n <a class=\"mi\" data-page=\"overview\" href=\"#overview\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 12l9-9 9 9\"/><path d=\"M5 10v10h14V10\"/></svg>系统状态</a>\n <a class=\"mi\" data-page=\"servers\" href=\"#servers\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"7\" rx=\"2\"/><rect x=\"3\" y=\"13\" width=\"18\" height=\"7\" rx=\"2\"/><path d=\"M7 7.5h.01M7 16.5h.01\"/></svg>服务器</a>\n <a class=\"mi\" data-page=\"customers\" href=\"#customers\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"9\" cy=\"8\" r=\"3.5\"/><path d=\"M2.5 20c.8-3.2 3.4-5 6.5-5s5.7 1.8 6.5 5\"/><path d=\"M16 4.6a3.5 3.5 0 010 6.8M21.5 20c-.6-2.6-2.2-4.2-4.5-4.8\"/></svg>客户与订阅</a>\n <a class=\"mi\" data-page=\"chains\" href=\"#chains\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"5\" cy=\"12\" r=\"2.5\"/><circle cx=\"19\" cy=\"6\" r=\"2.5\"/><circle cx=\"19\" cy=\"18\" r=\"2.5\"/><path d=\"M7.3 10.8l9.4-3.6M7.3 13.2l9.4 3.6\"/></svg>转发与节点</a>\n <a class=\"mi\" data-page=\"commands\" href=\"#commands\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M4 17l6-5-6-5M12 19h8\"/></svg>安装与命令</a>\n <a class=\"mi\" data-page=\"operations\" href=\"#operations\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19 12a7 7 0 00-.1-1.2l2-1.5-2-3.4-2.3 1a7 7 0 00-2-1.2L14.2 3h-4l-.4 2.5a7 7 0 00-2 1.2l-2.3-1-2 3.4 2 1.5A7 7 0 005 12c0 .4 0 .8.1 1.2l-2 1.5 2 3.4 2.3-1a7 7 0 002 1.2l.4 2.7h4l.4-2.5a7 7 0 002-1.2l2.3 1 2-3.4-2-1.5c.1-.4.1-.8.1-1.2z\"/></svg>设置与运维</a>\n </nav>\n <div class=\"sider-foot\"><span id=\"user-chip\"></span><span class=\"foot-right\"><span id=\"version-label\"></span><button id=\"logout\" class=\"icon-btn\" type=\"button\" data-tip=\"退出登录\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><path d=\"M9 21H5a2 2 0 01-2-2V5a2 2 0 012-2h4\"/><path d=\"M16 17l5-5-5-5M21 12H9\"/></svg></button></span></div>\n </aside>\n\n <div class=\"main\">\n <header class=\"topbar\">\n <span class=\"crumb\">amo / <b id=\"page-title\">系统状态</b></span>\n <span class=\"sp\"></span>\n <input class=\"top-search\" placeholder=\"搜索服务器、客户、节点…\" disabled>\n <button class=\"theme-btn\" id=\"refresh\" type=\"button\" title=\"刷新数据\">刷新</button>\n <button class=\"theme-btn\" type=\"button\" data-theme-toggle>🌙 深色</button>\n </header>\n <main class=\"content\" id=\"content\"></main>\n </div>\n </div>\n\n <div id=\"modal-overlay\" class=\"modal-overlay hidden\">\n <section class=\"modal panel\" role=\"dialog\" aria-modal=\"true\">\n <header class=\"modal-head\"><h2 id=\"modal-title\"></h2><button type=\"button\" class=\"icon-btn\" data-close aria-label=\"关闭\" data-tip=\"关闭\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg></button></header>\n <div id=\"modal-body\" class=\"modal-body\"></div>\n </section>\n </div>\n <div id=\"float-pop\" class=\"float-pop hidden\"></div>\n <div id=\"toasts\" aria-live=\"polite\"></div>\n <script src=\"/vendor/qrcode.js?v=0.4.0\" defer></script>\n <script src=\"/app.js?v=0.7.0\" defer></script>\n</body>\n</html>\n",
"status": 200
},
"loginFailure": {
"body": {
"error": "invalid_credentials",
"message": "账号或密码不正确"
},
"status": 401
},
"missingNode": {
"body": {
"error": "not_found",
"message": "接口不存在"
},
"status": 404
},
"unauthenticated": {
"body": {
"error": "unauthorized",
"message": "请先登录"
},
"status": 401
}
}
}
}