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.
1125 lines
38 KiB
JSON
1125 lines
38 KiB
JSON
{
|
|
"meta": {
|
|
"generatedAt": "2026-10-20T08:13:19.724Z",
|
|
"adminUsername": "admin",
|
|
"adminPassword": "diff-admin-pass",
|
|
"ids": {
|
|
"entryServer": "srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e",
|
|
"exitServer": "srv_67549f54-3db9-449a-93f8-57561930ac40",
|
|
"entryAgent": "agt_3e46d79e-f5a2-4740-bcb8-62c62c6fea81",
|
|
"exitAgent": "agt_fde3090a-2f91-4d6a-bb0d-f5a37558bbd7",
|
|
"alice": "cus_a4dca60e-fd93-431c-9003-a18f7e2919ee",
|
|
"bob": "cus_f109881a-aacf-4fba-846d-aee5ce8f22c1",
|
|
"n1": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"n2": "nod_bd819b9a-6f85-41fd-9270-4235daa4f20f"
|
|
},
|
|
"agentKeys": {
|
|
"entry": "Ufhe2SW3_TNY9sa7aQSdj9wLyPtniU9ZT7uBZeZJfdgTIzYpcCuvqQ",
|
|
"exit": "PL5c1FYaxduu5MIB9gLy32VWwXhdvyfTc6TN2HI5hi6GV47TjfW0uQ"
|
|
},
|
|
"seedUsage": {
|
|
"epoch": "diff-epoch-1",
|
|
"user": {
|
|
"uplink": 1000,
|
|
"downlink": 2000
|
|
},
|
|
"inbound": {
|
|
"uplink": 4000,
|
|
"downlink": 5000
|
|
},
|
|
"aliceIp": "203.0.113.10"
|
|
}
|
|
},
|
|
"steps": [
|
|
{
|
|
"name": "login",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/auth/login",
|
|
"body": {
|
|
"username": "admin"
|
|
}
|
|
},
|
|
"response": {
|
|
"status": 200,
|
|
"body": {
|
|
"user": {
|
|
"id": "usr_19357193-8c21-4854-820a-f8d70389f783",
|
|
"username": "admin",
|
|
"role": "owner"
|
|
},
|
|
"csrf": "xN0ahW9N9qIIP9IgHJPzNthIl70jpFf3"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "create-server-entry",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/servers",
|
|
"body": {
|
|
"name": "Entry",
|
|
"role": "relay",
|
|
"region": "",
|
|
"publicAddress": "entry.example.com",
|
|
"publicAddressV6": "v6.example.com",
|
|
"tlsDomain": "tls.example.com",
|
|
"portRangeStart": 20000,
|
|
"portRangeEnd": 50000
|
|
}
|
|
},
|
|
"response": {
|
|
"status": 201,
|
|
"body": {
|
|
"server": {
|
|
"name": "Entry",
|
|
"role": "relay",
|
|
"region": "",
|
|
"publicAddress": "entry.example.com",
|
|
"publicAddressV6": "v6.example.com",
|
|
"tlsDomain": "tls.example.com",
|
|
"portRangeStart": 20000,
|
|
"portRangeEnd": 50000,
|
|
"labels": [],
|
|
"id": "srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e",
|
|
"status": "pending",
|
|
"createdAt": "2026-10-20T08:13:15.284Z",
|
|
"updatedAt": "2026-10-20T08:13:15.284Z"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "create-server-exit",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/servers",
|
|
"body": {
|
|
"name": "Exit",
|
|
"role": "exit",
|
|
"region": "",
|
|
"publicAddress": "exit.example.com",
|
|
"publicAddressV6": "",
|
|
"tlsDomain": "",
|
|
"portRangeStart": 20000,
|
|
"portRangeEnd": 50000
|
|
}
|
|
},
|
|
"response": {
|
|
"status": 201,
|
|
"body": {
|
|
"server": {
|
|
"name": "Exit",
|
|
"role": "exit",
|
|
"region": "",
|
|
"publicAddress": "exit.example.com",
|
|
"publicAddressV6": "",
|
|
"tlsDomain": "",
|
|
"portRangeStart": 20000,
|
|
"portRangeEnd": 50000,
|
|
"labels": [],
|
|
"id": "srv_67549f54-3db9-449a-93f8-57561930ac40",
|
|
"status": "pending",
|
|
"createdAt": "2026-10-20T08:13:15.306Z",
|
|
"updatedAt": "2026-10-20T08:13:15.306Z"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "enrollment-token-entry",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/servers/srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e/enrollment-token",
|
|
"body": {}
|
|
},
|
|
"response": {
|
|
"status": 201,
|
|
"body": {
|
|
"token": "ikyYP4mbpp3t6E0QrR5J8p5GItq__4rlShhFmva5",
|
|
"expiresAt": "2026-10-20T08:43:15.583Z"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "enroll-entry",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/agent/enroll"
|
|
},
|
|
"response": {
|
|
"status": 201,
|
|
"body": {
|
|
"agentId": "agt_3e46d79e-f5a2-4740-bcb8-62c62c6fea81",
|
|
"serverId": "srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e",
|
|
"serverName": "Entry",
|
|
"agentKey": "Ufhe2SW3_TNY9sa7aQSdj9wLyPtniU9ZT7uBZeZJfdgTIzYpcCuvqQ",
|
|
"reconciled": 0
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "heartbeat-entry",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/agent/heartbeat"
|
|
},
|
|
"response": {
|
|
"status": 200,
|
|
"body": {
|
|
"ok": true,
|
|
"serverTime": "2026-10-20T08:13:16.124Z"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "enrollment-token-exit",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/servers/srv_67549f54-3db9-449a-93f8-57561930ac40/enrollment-token",
|
|
"body": {}
|
|
},
|
|
"response": {
|
|
"status": 201,
|
|
"body": {
|
|
"token": "3QhbJ_ToVzXputaGOUc_bqzIo9TYo9Yc8kKRuBx2",
|
|
"expiresAt": "2026-10-20T08:43:16.550Z"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "enroll-exit",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/agent/enroll"
|
|
},
|
|
"response": {
|
|
"status": 201,
|
|
"body": {
|
|
"agentId": "agt_fde3090a-2f91-4d6a-bb0d-f5a37558bbd7",
|
|
"serverId": "srv_67549f54-3db9-449a-93f8-57561930ac40",
|
|
"serverName": "Exit",
|
|
"agentKey": "PL5c1FYaxduu5MIB9gLy32VWwXhdvyfTc6TN2HI5hi6GV47TjfW0uQ",
|
|
"reconciled": 0
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "heartbeat-exit",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/agent/heartbeat"
|
|
},
|
|
"response": {
|
|
"status": 200,
|
|
"body": {
|
|
"ok": true,
|
|
"serverTime": "2026-10-20T08:13:17.497Z"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "create-customer-alice",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/customers",
|
|
"body": {
|
|
"name": "Alice"
|
|
}
|
|
},
|
|
"response": {
|
|
"status": 201,
|
|
"body": {
|
|
"customer": {
|
|
"id": "cus_a4dca60e-fd93-431c-9003-a18f7e2919ee",
|
|
"subscriptionToken": "RVQBS6ONsmknOHquaj75fFGAkdCHFra6VY6WV4DDRSI",
|
|
"name": "Alice",
|
|
"group": "",
|
|
"status": "active",
|
|
"trafficLimitBytes": 0,
|
|
"usedBytes": 0,
|
|
"usedUplinkBytes": 0,
|
|
"usedDownlinkBytes": 0,
|
|
"expiresAt": null,
|
|
"ipLimit": 0,
|
|
"deviceLimit": 0,
|
|
"tags": [],
|
|
"notes": "",
|
|
"createdAt": "2026-10-20T08:13:17.517Z",
|
|
"updatedAt": "2026-10-20T08:13:17.517Z"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "create-customer-bob",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/customers",
|
|
"body": {
|
|
"name": "Bob",
|
|
"trafficLimitBytes": 1073741824,
|
|
"ipLimit": 5,
|
|
"deviceLimit": 2
|
|
}
|
|
},
|
|
"response": {
|
|
"status": 201,
|
|
"body": {
|
|
"customer": {
|
|
"id": "cus_f109881a-aacf-4fba-846d-aee5ce8f22c1",
|
|
"subscriptionToken": "8ZyAzUjXF-OdPPuu5t4qZHkTdfX-z-0AYs8V0WqFwIg",
|
|
"name": "Bob",
|
|
"group": "",
|
|
"status": "active",
|
|
"trafficLimitBytes": 1073741824,
|
|
"usedBytes": 0,
|
|
"usedUplinkBytes": 0,
|
|
"usedDownlinkBytes": 0,
|
|
"expiresAt": null,
|
|
"ipLimit": 5,
|
|
"deviceLimit": 2,
|
|
"tags": [],
|
|
"notes": "",
|
|
"createdAt": "2026-10-20T08:13:17.529Z",
|
|
"updatedAt": "2026-10-20T08:13:17.529Z"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "create-node-n1",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/nodes",
|
|
"body": {
|
|
"name": "N1",
|
|
"serverId": "srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e",
|
|
"topology": "forward",
|
|
"protocol": "vless-reality-vision",
|
|
"exitServerId": "srv_67549f54-3db9-449a-93f8-57561930ac40",
|
|
"exitProtocol": "shadowsocks-2022-aes256",
|
|
"realityServerName": "www.amd.com"
|
|
}
|
|
},
|
|
"response": {
|
|
"status": 201,
|
|
"body": {
|
|
"node": {
|
|
"id": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"status": "draft",
|
|
"entryReady": false,
|
|
"exitReady": false,
|
|
"resourceId": "res_b28d761d-716d-4132-b6e2-250d606ec2e6",
|
|
"exitResourceId": "res_c10f3ebc-ca98-4498-bef3-a9d9951db4b0",
|
|
"name": "N1",
|
|
"serverId": "srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e",
|
|
"protocol": "vless-reality-vision",
|
|
"topology": "forward",
|
|
"exitServerId": "srv_67549f54-3db9-449a-93f8-57561930ac40",
|
|
"exitProtocol": "shadowsocks-2022-aes256",
|
|
"networkMode": "ipv4",
|
|
"realityServerName": "www.amd.com",
|
|
"realityDestPort": 443,
|
|
"portMode": "random",
|
|
"port": 34035,
|
|
"exitPortMode": "random",
|
|
"exitPort": 25230,
|
|
"artifacts": {},
|
|
"error": null,
|
|
"pendingDelete": false,
|
|
"usageCounters": null,
|
|
"retiredUsageEpochs": [],
|
|
"meteredTraffic": null,
|
|
"lastUsageAt": null,
|
|
"createdAt": "2026-10-20T08:13:17.571Z",
|
|
"updatedAt": "2026-10-20T08:13:17.571Z",
|
|
"wsPath": "/dcc7c32a84832fc03a",
|
|
"reality": {
|
|
"keyId": "reality-nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"serverName": "www.amd.com",
|
|
"destPort": 443
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "create-node-n2",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/nodes",
|
|
"body": {
|
|
"name": "N2",
|
|
"serverId": "srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e",
|
|
"topology": "direct",
|
|
"protocol": "shadowsocks-2022-aes128"
|
|
}
|
|
},
|
|
"response": {
|
|
"status": 201,
|
|
"body": {
|
|
"node": {
|
|
"id": "nod_bd819b9a-6f85-41fd-9270-4235daa4f20f",
|
|
"status": "draft",
|
|
"entryReady": false,
|
|
"exitReady": false,
|
|
"resourceId": "res_1f7d0d11-f13a-4b8d-9332-9b8dd857c2c4",
|
|
"exitResourceId": "res_0927c2fe-8b8d-4ff4-9d61-c453961c46aa",
|
|
"name": "N2",
|
|
"serverId": "srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e",
|
|
"protocol": "shadowsocks-2022-aes128",
|
|
"topology": "direct",
|
|
"exitServerId": null,
|
|
"exitProtocol": null,
|
|
"networkMode": "ipv4",
|
|
"realityServerName": "www.tesla.com",
|
|
"realityDestPort": 443,
|
|
"portMode": "random",
|
|
"port": 29256,
|
|
"exitPortMode": null,
|
|
"exitPort": null,
|
|
"artifacts": {},
|
|
"error": null,
|
|
"pendingDelete": false,
|
|
"usageCounters": null,
|
|
"retiredUsageEpochs": [],
|
|
"meteredTraffic": null,
|
|
"lastUsageAt": null,
|
|
"createdAt": "2026-10-20T08:13:17.590Z",
|
|
"updatedAt": "2026-10-20T08:13:17.590Z",
|
|
"wsPath": "/a655ba3a14d606bbe3"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "assign-n1-alice",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/nodes/nod_35de3d63-181c-4966-a483-9ae5ac40c81c/assign",
|
|
"body": {
|
|
"customerId": "cus_a4dca60e-fd93-431c-9003-a18f7e2919ee"
|
|
}
|
|
},
|
|
"response": {
|
|
"status": 200,
|
|
"body": {
|
|
"nodeClient": {
|
|
"id": "ncl_efa94560-7678-4232-8609-c2e077fd35e2",
|
|
"nodeId": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"customerId": "cus_a4dca60e-fd93-431c-9003-a18f7e2919ee",
|
|
"status": "active",
|
|
"createdAt": "2026-10-20T08:13:17.615Z",
|
|
"updatedAt": "2026-10-20T08:13:17.615Z"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "assign-n1-bob",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/nodes/nod_35de3d63-181c-4966-a483-9ae5ac40c81c/assign",
|
|
"body": {
|
|
"customerId": "cus_f109881a-aacf-4fba-846d-aee5ce8f22c1"
|
|
}
|
|
},
|
|
"response": {
|
|
"status": 200,
|
|
"body": {
|
|
"nodeClient": {
|
|
"id": "ncl_8ac57eff-cc72-4280-9c83-be338cdfb1e2",
|
|
"nodeId": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"customerId": "cus_f109881a-aacf-4fba-846d-aee5ce8f22c1",
|
|
"status": "active",
|
|
"createdAt": "2026-10-20T08:13:17.625Z",
|
|
"updatedAt": "2026-10-20T08:13:17.625Z"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "assign-n2-alice",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/nodes/nod_bd819b9a-6f85-41fd-9270-4235daa4f20f/assign",
|
|
"body": {
|
|
"customerId": "cus_a4dca60e-fd93-431c-9003-a18f7e2919ee"
|
|
}
|
|
},
|
|
"response": {
|
|
"status": 200,
|
|
"body": {
|
|
"nodeClient": {
|
|
"id": "ncl_a8622a82-296c-452e-a2b5-e6469316046c",
|
|
"nodeId": "nod_bd819b9a-6f85-41fd-9270-4235daa4f20f",
|
|
"customerId": "cus_a4dca60e-fd93-431c-9003-a18f7e2919ee",
|
|
"status": "active",
|
|
"createdAt": "2026-10-20T08:13:17.643Z",
|
|
"updatedAt": "2026-10-20T08:13:17.644Z"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "deploy-n1",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/nodes/nod_35de3d63-181c-4966-a483-9ae5ac40c81c/deploy",
|
|
"body": {}
|
|
},
|
|
"response": {
|
|
"status": 202,
|
|
"body": {
|
|
"ok": true
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "deploy-n2",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/nodes/nod_bd819b9a-6f85-41fd-9270-4235daa4f20f/deploy",
|
|
"body": {}
|
|
},
|
|
"response": {
|
|
"status": 202,
|
|
"body": {
|
|
"ok": true
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "drain-entry",
|
|
"jobs": [
|
|
{
|
|
"job": {
|
|
"id": "job_cdf4b1d7-4b8c-4324-88d0-962a4eb47ca0",
|
|
"serverId": "srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e",
|
|
"nodeId": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"action": "apply_resource",
|
|
"payload": {
|
|
"resource": {
|
|
"id": "res_b28d761d-716d-4132-b6e2-250d606ec2e6",
|
|
"engine": "sing-box",
|
|
"meta": {
|
|
"kind": "node",
|
|
"nodeId": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"metricsTag": "ng-66a4839ae5ac40c81c-in",
|
|
"protocol": "vless-reality-vision"
|
|
},
|
|
"inbounds": [
|
|
{
|
|
"type": "vless",
|
|
"tag": "ng-66a4839ae5ac40c81c-in",
|
|
"listen": "198.18.60.35",
|
|
"listen_port": 34035,
|
|
"users": [
|
|
{
|
|
"name": "ng:cus_a4dca60e-fd93-431c-9003-a18f7e2919ee",
|
|
"uuid": "631268da-ea76-479c-b9f6-9cf2c57825f6",
|
|
"flow": "xtls-rprx-vision"
|
|
},
|
|
{
|
|
"name": "ng:cus_f109881a-aacf-4fba-846d-aee5ce8f22c1",
|
|
"uuid": "c666b8e4-a8b4-4806-a1ec-76242a578970",
|
|
"flow": "xtls-rprx-vision"
|
|
}
|
|
],
|
|
"tls": {
|
|
"enabled": true,
|
|
"server_name": "www.amd.com",
|
|
"reality": {
|
|
"enabled": true,
|
|
"handshake": {
|
|
"server": "www.amd.com",
|
|
"server_port": 443
|
|
},
|
|
"private_key": "${REALITY_PRIVATE:reality-nod_35de3d63-181c-4966-a483-9ae5ac40c81c}",
|
|
"short_id": [
|
|
"45584502b5567121",
|
|
"0adf5e3d9a002211"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"outbounds": [
|
|
{
|
|
"type": "shadowsocks",
|
|
"tag": "ng-66a4839ae5ac40c81c-exit",
|
|
"server": "exit.example.com",
|
|
"server_port": 25230,
|
|
"method": "2022-blake3-aes-256-gcm",
|
|
"password": "bVnYmOnNEMI7C0Zoy3B56oYJxq5WsMPloRKC4bMNB+Q="
|
|
}
|
|
],
|
|
"routingRules": [
|
|
{
|
|
"inbound": [
|
|
"ng-66a4839ae5ac40c81c-in"
|
|
],
|
|
"action": "route",
|
|
"outbound": "ng-66a4839ae5ac40c81c-exit"
|
|
}
|
|
]
|
|
},
|
|
"kind": "node",
|
|
"keyMaterial": {
|
|
"reality-nod_35de3d63-181c-4966-a483-9ae5ac40c81c": {
|
|
"privateKey": "cFu3lxTFohX5cUQ1ouS7ZVqXTk3Nm_VZoIKvqBNDC38",
|
|
"publicKey": "QAObwuCHabzq4I5rKawYdMvlEXDSCHDOpljFD3YYkjg"
|
|
}
|
|
}
|
|
},
|
|
"status": "running",
|
|
"attempts": 1,
|
|
"createdAt": "2026-10-20T08:13:17.670Z",
|
|
"updatedAt": "2026-10-20T08:13:17.847Z",
|
|
"error": null,
|
|
"leaseUntil": "2026-10-20T08:18:17.847Z",
|
|
"startedAt": "2026-10-20T08:13:17.847Z"
|
|
},
|
|
"complete": {
|
|
"job": {
|
|
"id": "job_cdf4b1d7-4b8c-4324-88d0-962a4eb47ca0",
|
|
"serverId": "srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e",
|
|
"nodeId": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"action": "apply_resource",
|
|
"payload": {
|
|
"resource": {
|
|
"id": "res_b28d761d-716d-4132-b6e2-250d606ec2e6",
|
|
"engine": "sing-box",
|
|
"meta": {
|
|
"kind": "node",
|
|
"nodeId": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"metricsTag": "ng-66a4839ae5ac40c81c-in",
|
|
"protocol": "vless-reality-vision"
|
|
},
|
|
"inbounds": [
|
|
{
|
|
"type": "vless",
|
|
"tag": "ng-66a4839ae5ac40c81c-in",
|
|
"listen": "198.18.60.35",
|
|
"listen_port": 34035,
|
|
"users": [
|
|
{
|
|
"name": "ng:cus_a4dca60e-fd93-431c-9003-a18f7e2919ee",
|
|
"uuid": "631268da-ea76-479c-b9f6-9cf2c57825f6",
|
|
"flow": "xtls-rprx-vision"
|
|
},
|
|
{
|
|
"name": "ng:cus_f109881a-aacf-4fba-846d-aee5ce8f22c1",
|
|
"uuid": "c666b8e4-a8b4-4806-a1ec-76242a578970",
|
|
"flow": "xtls-rprx-vision"
|
|
}
|
|
],
|
|
"tls": {
|
|
"enabled": true,
|
|
"server_name": "www.amd.com",
|
|
"reality": {
|
|
"enabled": true,
|
|
"handshake": {
|
|
"server": "www.amd.com",
|
|
"server_port": 443
|
|
},
|
|
"private_key": "${REALITY_PRIVATE:reality-nod_35de3d63-181c-4966-a483-9ae5ac40c81c}",
|
|
"short_id": [
|
|
"45584502b5567121",
|
|
"0adf5e3d9a002211"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"outbounds": [
|
|
{
|
|
"type": "shadowsocks",
|
|
"tag": "ng-66a4839ae5ac40c81c-exit",
|
|
"server": "exit.example.com",
|
|
"server_port": 25230,
|
|
"method": "2022-blake3-aes-256-gcm",
|
|
"password": "bVnYmOnNEMI7C0Zoy3B56oYJxq5WsMPloRKC4bMNB+Q="
|
|
}
|
|
],
|
|
"routingRules": [
|
|
{
|
|
"inbound": [
|
|
"ng-66a4839ae5ac40c81c-in"
|
|
],
|
|
"action": "route",
|
|
"outbound": "ng-66a4839ae5ac40c81c-exit"
|
|
}
|
|
]
|
|
},
|
|
"kind": "node",
|
|
"keyMaterial": {
|
|
"reality-nod_35de3d63-181c-4966-a483-9ae5ac40c81c": {
|
|
"privateKey": "cFu3lxTFohX5cUQ1ouS7ZVqXTk3Nm_VZoIKvqBNDC38",
|
|
"publicKey": "QAObwuCHabzq4I5rKawYdMvlEXDSCHDOpljFD3YYkjg"
|
|
}
|
|
}
|
|
},
|
|
"status": "completed",
|
|
"attempts": 1,
|
|
"createdAt": "2026-10-20T08:13:17.670Z",
|
|
"updatedAt": "2026-10-20T08:13:18.055Z",
|
|
"error": null,
|
|
"leaseUntil": null,
|
|
"startedAt": "2026-10-20T08:13:17.847Z",
|
|
"completedAt": "2026-10-20T08:13:18.055Z"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"job": {
|
|
"id": "job_7f411e08-58fe-4bff-81c6-75bdc361d5e5",
|
|
"serverId": "srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e",
|
|
"nodeId": "nod_bd819b9a-6f85-41fd-9270-4235daa4f20f",
|
|
"action": "apply_resource",
|
|
"payload": {
|
|
"resource": {
|
|
"id": "res_1f7d0d11-f13a-4b8d-9332-9b8dd857c2c4",
|
|
"engine": "sing-box",
|
|
"meta": {
|
|
"kind": "node",
|
|
"nodeId": "nod_bd819b9a-6f85-41fd-9270-4235daa4f20f",
|
|
"metricsTag": "ng-fd92704235daa4f20f-in",
|
|
"protocol": "shadowsocks-2022-aes128"
|
|
},
|
|
"inbounds": [
|
|
{
|
|
"type": "shadowsocks",
|
|
"tag": "ng-fd92704235daa4f20f-in",
|
|
"listen": "198.18.60.35",
|
|
"listen_port": 29256,
|
|
"method": "2022-blake3-aes-128-gcm",
|
|
"password": "xOcB7XGgo6VpaEHZfNXrlQ==",
|
|
"users": [
|
|
{
|
|
"name": "ng:cus_a4dca60e-fd93-431c-9003-a18f7e2919ee",
|
|
"password": "zsFQrLA31cHM1USQVgHuXw=="
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"outbounds": [
|
|
{
|
|
"type": "direct",
|
|
"tag": "ng-fd92704235daa4f20f-direct"
|
|
}
|
|
],
|
|
"routingRules": [
|
|
{
|
|
"inbound": [
|
|
"ng-fd92704235daa4f20f-in"
|
|
],
|
|
"action": "route",
|
|
"outbound": "ng-fd92704235daa4f20f-direct"
|
|
}
|
|
]
|
|
},
|
|
"kind": "node"
|
|
},
|
|
"status": "running",
|
|
"attempts": 1,
|
|
"createdAt": "2026-10-20T08:13:17.685Z",
|
|
"updatedAt": "2026-10-20T08:13:18.237Z",
|
|
"error": null,
|
|
"leaseUntil": "2026-10-20T08:18:18.237Z",
|
|
"startedAt": "2026-10-20T08:13:18.237Z"
|
|
},
|
|
"complete": {
|
|
"job": {
|
|
"id": "job_7f411e08-58fe-4bff-81c6-75bdc361d5e5",
|
|
"serverId": "srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e",
|
|
"nodeId": "nod_bd819b9a-6f85-41fd-9270-4235daa4f20f",
|
|
"action": "apply_resource",
|
|
"payload": {
|
|
"resource": {
|
|
"id": "res_1f7d0d11-f13a-4b8d-9332-9b8dd857c2c4",
|
|
"engine": "sing-box",
|
|
"meta": {
|
|
"kind": "node",
|
|
"nodeId": "nod_bd819b9a-6f85-41fd-9270-4235daa4f20f",
|
|
"metricsTag": "ng-fd92704235daa4f20f-in",
|
|
"protocol": "shadowsocks-2022-aes128"
|
|
},
|
|
"inbounds": [
|
|
{
|
|
"type": "shadowsocks",
|
|
"tag": "ng-fd92704235daa4f20f-in",
|
|
"listen": "198.18.60.35",
|
|
"listen_port": 29256,
|
|
"method": "2022-blake3-aes-128-gcm",
|
|
"password": "xOcB7XGgo6VpaEHZfNXrlQ==",
|
|
"users": [
|
|
{
|
|
"name": "ng:cus_a4dca60e-fd93-431c-9003-a18f7e2919ee",
|
|
"password": "zsFQrLA31cHM1USQVgHuXw=="
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"outbounds": [
|
|
{
|
|
"type": "direct",
|
|
"tag": "ng-fd92704235daa4f20f-direct"
|
|
}
|
|
],
|
|
"routingRules": [
|
|
{
|
|
"inbound": [
|
|
"ng-fd92704235daa4f20f-in"
|
|
],
|
|
"action": "route",
|
|
"outbound": "ng-fd92704235daa4f20f-direct"
|
|
}
|
|
]
|
|
},
|
|
"kind": "node"
|
|
},
|
|
"status": "completed",
|
|
"attempts": 1,
|
|
"createdAt": "2026-10-20T08:13:17.685Z",
|
|
"updatedAt": "2026-10-20T08:13:18.424Z",
|
|
"error": null,
|
|
"leaseUntil": null,
|
|
"startedAt": "2026-10-20T08:13:18.237Z",
|
|
"completedAt": "2026-10-20T08:13:18.424Z"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "drain-exit",
|
|
"jobs": [
|
|
{
|
|
"job": {
|
|
"id": "job_8b30df25-5032-41c2-a25a-f08ea662634d",
|
|
"serverId": "srv_67549f54-3db9-449a-93f8-57561930ac40",
|
|
"nodeId": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"action": "apply_resource",
|
|
"payload": {
|
|
"resource": {
|
|
"id": "res_c10f3ebc-ca98-4498-bef3-a9d9951db4b0",
|
|
"engine": "sing-box",
|
|
"meta": {
|
|
"kind": "node-exit",
|
|
"nodeId": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"metricsTag": "ng-66a4839ae5ac40c81c-exit-in"
|
|
},
|
|
"inbounds": [
|
|
{
|
|
"type": "shadowsocks",
|
|
"tag": "ng-66a4839ae5ac40c81c-exit-in",
|
|
"listen": "198.18.60.37",
|
|
"listen_port": 25230,
|
|
"method": "2022-blake3-aes-256-gcm",
|
|
"password": "bVnYmOnNEMI7C0Zoy3B56oYJxq5WsMPloRKC4bMNB+Q="
|
|
}
|
|
],
|
|
"outbounds": [
|
|
{
|
|
"type": "direct",
|
|
"tag": "ng-66a4839ae5ac40c81c-exit-direct"
|
|
}
|
|
],
|
|
"routingRules": [
|
|
{
|
|
"inbound": [
|
|
"ng-66a4839ae5ac40c81c-exit-in"
|
|
],
|
|
"action": "route",
|
|
"outbound": "ng-66a4839ae5ac40c81c-exit-direct"
|
|
}
|
|
]
|
|
},
|
|
"kind": "node-exit"
|
|
},
|
|
"status": "running",
|
|
"attempts": 1,
|
|
"createdAt": "2026-10-20T08:13:17.671Z",
|
|
"updatedAt": "2026-10-20T08:13:18.772Z",
|
|
"error": null,
|
|
"leaseUntil": "2026-10-20T08:18:18.772Z",
|
|
"startedAt": "2026-10-20T08:13:18.772Z"
|
|
},
|
|
"complete": {
|
|
"job": {
|
|
"id": "job_8b30df25-5032-41c2-a25a-f08ea662634d",
|
|
"serverId": "srv_67549f54-3db9-449a-93f8-57561930ac40",
|
|
"nodeId": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"action": "apply_resource",
|
|
"payload": {
|
|
"resource": {
|
|
"id": "res_c10f3ebc-ca98-4498-bef3-a9d9951db4b0",
|
|
"engine": "sing-box",
|
|
"meta": {
|
|
"kind": "node-exit",
|
|
"nodeId": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"metricsTag": "ng-66a4839ae5ac40c81c-exit-in"
|
|
},
|
|
"inbounds": [
|
|
{
|
|
"type": "shadowsocks",
|
|
"tag": "ng-66a4839ae5ac40c81c-exit-in",
|
|
"listen": "198.18.60.37",
|
|
"listen_port": 25230,
|
|
"method": "2022-blake3-aes-256-gcm",
|
|
"password": "bVnYmOnNEMI7C0Zoy3B56oYJxq5WsMPloRKC4bMNB+Q="
|
|
}
|
|
],
|
|
"outbounds": [
|
|
{
|
|
"type": "direct",
|
|
"tag": "ng-66a4839ae5ac40c81c-exit-direct"
|
|
}
|
|
],
|
|
"routingRules": [
|
|
{
|
|
"inbound": [
|
|
"ng-66a4839ae5ac40c81c-exit-in"
|
|
],
|
|
"action": "route",
|
|
"outbound": "ng-66a4839ae5ac40c81c-exit-direct"
|
|
}
|
|
]
|
|
},
|
|
"kind": "node-exit"
|
|
},
|
|
"status": "completed",
|
|
"attempts": 1,
|
|
"createdAt": "2026-10-20T08:13:17.671Z",
|
|
"updatedAt": "2026-10-20T08:13:18.921Z",
|
|
"error": null,
|
|
"leaseUntil": null,
|
|
"startedAt": "2026-10-20T08:13:18.772Z",
|
|
"completedAt": "2026-10-20T08:13:18.921Z"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "list-nodes-after-deploy",
|
|
"request": {
|
|
"method": "GET",
|
|
"pathname": "/api/nodes"
|
|
},
|
|
"response": {
|
|
"status": 200,
|
|
"body": {
|
|
"nodes": [
|
|
{
|
|
"id": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"status": "active",
|
|
"entryReady": true,
|
|
"exitReady": true,
|
|
"resourceId": "res_b28d761d-716d-4132-b6e2-250d606ec2e6",
|
|
"exitResourceId": "res_c10f3ebc-ca98-4498-bef3-a9d9951db4b0",
|
|
"name": "N1",
|
|
"serverId": "srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e",
|
|
"protocol": "vless-reality-vision",
|
|
"topology": "forward",
|
|
"exitServerId": "srv_67549f54-3db9-449a-93f8-57561930ac40",
|
|
"exitProtocol": "shadowsocks-2022-aes256",
|
|
"networkMode": "ipv4",
|
|
"realityServerName": "www.amd.com",
|
|
"realityDestPort": 443,
|
|
"portMode": "random",
|
|
"port": 34035,
|
|
"exitPortMode": "random",
|
|
"exitPort": 25230,
|
|
"artifacts": {
|
|
"realityPublicKey": "QAObwuCHabzq4I5rKawYdMvlEXDSCHDOpljFD3YYkjg"
|
|
},
|
|
"error": null,
|
|
"pendingDelete": false,
|
|
"usageCounters": null,
|
|
"retiredUsageEpochs": [],
|
|
"meteredTraffic": null,
|
|
"lastUsageAt": null,
|
|
"createdAt": "2026-10-20T08:13:17.571Z",
|
|
"updatedAt": "2026-10-20T08:13:18.921Z",
|
|
"wsPath": "/dcc7c32a84832fc03a",
|
|
"reality": {
|
|
"keyId": "reality-nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"serverName": "www.amd.com",
|
|
"destPort": 443
|
|
},
|
|
"autoRemoving": false
|
|
},
|
|
{
|
|
"id": "nod_bd819b9a-6f85-41fd-9270-4235daa4f20f",
|
|
"status": "active",
|
|
"entryReady": true,
|
|
"exitReady": false,
|
|
"resourceId": "res_1f7d0d11-f13a-4b8d-9332-9b8dd857c2c4",
|
|
"exitResourceId": "res_0927c2fe-8b8d-4ff4-9d61-c453961c46aa",
|
|
"name": "N2",
|
|
"serverId": "srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e",
|
|
"protocol": "shadowsocks-2022-aes128",
|
|
"topology": "direct",
|
|
"exitServerId": null,
|
|
"exitProtocol": null,
|
|
"networkMode": "ipv4",
|
|
"realityServerName": "www.tesla.com",
|
|
"realityDestPort": 443,
|
|
"portMode": "random",
|
|
"port": 29256,
|
|
"exitPortMode": null,
|
|
"exitPort": null,
|
|
"artifacts": {},
|
|
"error": null,
|
|
"pendingDelete": false,
|
|
"usageCounters": null,
|
|
"retiredUsageEpochs": [],
|
|
"meteredTraffic": null,
|
|
"lastUsageAt": null,
|
|
"createdAt": "2026-10-20T08:13:17.590Z",
|
|
"updatedAt": "2026-10-20T08:13:18.424Z",
|
|
"wsPath": "/a655ba3a14d606bbe3",
|
|
"autoRemoving": false
|
|
}
|
|
],
|
|
"nodeClients": [
|
|
{
|
|
"id": "ncl_efa94560-7678-4232-8609-c2e077fd35e2",
|
|
"nodeId": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"customerId": "cus_a4dca60e-fd93-431c-9003-a18f7e2919ee",
|
|
"status": "active",
|
|
"createdAt": "2026-10-20T08:13:17.615Z",
|
|
"updatedAt": "2026-10-20T08:13:17.615Z",
|
|
"clientUri": "vless://631268da-ea76-479c-b9f6-9cf2c57825f6@entry.example.com:34035?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=QAObwuCHabzq4I5rKawYdMvlEXDSCHDOpljFD3YYkjg&sid=45584502b5567121&type=tcp&headerType=none&flow=xtls-rprx-vision#N1"
|
|
},
|
|
{
|
|
"id": "ncl_8ac57eff-cc72-4280-9c83-be338cdfb1e2",
|
|
"nodeId": "nod_35de3d63-181c-4966-a483-9ae5ac40c81c",
|
|
"customerId": "cus_f109881a-aacf-4fba-846d-aee5ce8f22c1",
|
|
"status": "active",
|
|
"createdAt": "2026-10-20T08:13:17.625Z",
|
|
"updatedAt": "2026-10-20T08:13:17.625Z",
|
|
"clientUri": "vless://c666b8e4-a8b4-4806-a1ec-76242a578970@entry.example.com:34035?encryption=none&security=reality&sni=www.amd.com&fp=chrome&pbk=QAObwuCHabzq4I5rKawYdMvlEXDSCHDOpljFD3YYkjg&sid=0adf5e3d9a002211&type=tcp&headerType=none&flow=xtls-rprx-vision#N1"
|
|
},
|
|
{
|
|
"id": "ncl_a8622a82-296c-452e-a2b5-e6469316046c",
|
|
"nodeId": "nod_bd819b9a-6f85-41fd-9270-4235daa4f20f",
|
|
"customerId": "cus_a4dca60e-fd93-431c-9003-a18f7e2919ee",
|
|
"status": "active",
|
|
"createdAt": "2026-10-20T08:13:17.643Z",
|
|
"updatedAt": "2026-10-20T08:13:17.644Z",
|
|
"clientUri": "ss://MjAyMi1ibGFrZTMtYWVzLTEyOC1nY206eE9jQjdYR2dvNlZwYUVIWmZOWHJsUT09OnpzRlFyTEEzMWNITTFVU1FWZ0h1WHc9PQ@entry.example.com:29256#N2"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "alice-subscriptions",
|
|
"cases": [
|
|
"raw",
|
|
"base64",
|
|
"clash",
|
|
"clash-smart",
|
|
"singbox",
|
|
"surge",
|
|
"auto-clash",
|
|
"auto-generic"
|
|
]
|
|
},
|
|
{
|
|
"name": "usage-report",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/agent/usage"
|
|
},
|
|
"response": {
|
|
"status": 200,
|
|
"body": {
|
|
"ok": true
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "list-customers-after-usage",
|
|
"request": {
|
|
"method": "GET",
|
|
"pathname": "/api/customers"
|
|
},
|
|
"response": {
|
|
"status": 200,
|
|
"body": {
|
|
"customers": [
|
|
{
|
|
"id": "cus_a4dca60e-fd93-431c-9003-a18f7e2919ee",
|
|
"subscriptionToken": "RVQBS6ONsmknOHquaj75fFGAkdCHFra6VY6WV4DDRSI",
|
|
"name": "Alice",
|
|
"group": "",
|
|
"status": "active",
|
|
"trafficLimitBytes": 0,
|
|
"usedBytes": 3000,
|
|
"usedUplinkBytes": 1000,
|
|
"usedDownlinkBytes": 2000,
|
|
"expiresAt": null,
|
|
"ipLimit": 0,
|
|
"deviceLimit": 0,
|
|
"tags": [],
|
|
"notes": "",
|
|
"createdAt": "2026-10-20T08:13:17.517Z",
|
|
"updatedAt": "2026-10-20T08:13:19.471Z",
|
|
"serverUsage": {
|
|
"srv:srv_d042baf3-83eb-4fcc-b7f9-92ea6b42198e": {
|
|
"usageCounters": {
|
|
"uplink": 1000,
|
|
"downlink": 2000,
|
|
"epoch": "diff-epoch-1"
|
|
}
|
|
}
|
|
},
|
|
"lastUsageAt": "2026-10-20T08:13:19.471Z",
|
|
"observedIpCount": 0,
|
|
"subscriptionClientCount": 3
|
|
},
|
|
{
|
|
"id": "cus_f109881a-aacf-4fba-846d-aee5ce8f22c1",
|
|
"subscriptionToken": "8ZyAzUjXF-OdPPuu5t4qZHkTdfX-z-0AYs8V0WqFwIg",
|
|
"name": "Bob",
|
|
"group": "",
|
|
"status": "active",
|
|
"trafficLimitBytes": 1073741824,
|
|
"usedBytes": 0,
|
|
"usedUplinkBytes": 0,
|
|
"usedDownlinkBytes": 0,
|
|
"expiresAt": null,
|
|
"ipLimit": 5,
|
|
"deviceLimit": 2,
|
|
"tags": [],
|
|
"notes": "",
|
|
"createdAt": "2026-10-20T08:13:17.529Z",
|
|
"updatedAt": "2026-10-20T08:13:17.529Z",
|
|
"observedIpCount": 0,
|
|
"subscriptionClientCount": 0
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "observations-report",
|
|
"request": {
|
|
"method": "POST",
|
|
"pathname": "/api/agent/observations"
|
|
},
|
|
"response": {
|
|
"status": 200,
|
|
"body": {
|
|
"ok": true
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|