mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-09-03 17:07:15 +00:00
7100fbcd08
* feat(model): add MemberWeights to SubBalancer Per-inbound leastLoad weights, stored with the same gorm json serializer as InboundIds so AutoMigrate adds the text column on every dialect (postgresModelSettled sees the missing column and re-runs). Absent entries mean weight 1.0; only meaningful for strategy leastLoad. * feat(sub): accept memberWeights on the sub-balancer API Parsed as one JSON form field (gin cannot bind bracket-keyed maps from urlencoded bodies). validate() rejects weights under any strategy but leastLoad — xray would silently ignore costs there, so storing them would pretend a knob exists. Non-positive weights error instead of defaulting: a zero usually means a typo'd "never pick this node". Entries for inbounds no longer selected are dropped on save. * feat(sub): emit leastLoad strategy costs from member weights costs[] is built after the tagging loop reuses the exact retagged tags (bal-N-protocol[-k]) and each member's owning inbound id. Members without a configured weight default to 1.0, but costs are omitted entirely unless at least one explicit weight survives — an all-1.0 array would bloat every subscription response for no effect. * feat(sub-balancers): leastLoad member weight inputs Weight fields render only under leastLoad and hide on strategy change without dropping their values, so an accidental toggle away and back loses nothing until save; non-leastLoad submits strip them entirely because xray would ignore costs. Weights travel as one JSON form field (gin cannot bind bracket-keyed maps) and every locale gets the three new keys in the same commit per the dead-keys rule. * docs(api): document memberWeights on sub-balancers leastLoad-only JSON form field; update notes that omitting it clears stored weights. Regenerated openapi artifacts via make gen + the docs copy/gen:api step nothing checks automatically. * fix(api-docs): use the allowed object ParamType for memberWeights * fix(sub-balancers): cap the member-weight list height Many selected inbounds pushed the modal body past the viewport. The weight rows now scroll inside a 220px viewport, mirroring the inbound picker's listHeight so both lists read the same. * fix(sub): anchor leastLoad cost matches to exact member tags Verified against xray-core: without regexp, WeightManager matches costs by substring (strings.Index), so the bare tag "bal-1-vless" also hits the deduplicated "bal-1-vless-2" and both members get the first entry's weight. Anchored ^tag$ regexps make every cost entry match only its own member. Also confirmed value<=0 makes xray derive a weight from the first digit of the matched tag — validating weights > 0 server-side was the right call. * fix(sub-balancers): keep member weights across the enabled toggle The table's toggleEnabled re-posted a full-row payload without memberWeights, and the update path treats an absent key as "erase" — flipping the switch silently dropped every configured weight. Round-trip the stored weights through the toggle payload, and prove persistence with a re-Get in the weight-validation test (the returned struct alone would stay green even if Save skipped the column). * fix(sub-balancers): address review on member weights - omitempty on MemberWeights: the panel sends null for every pre-existing and non-leastLoad balancer, which failed the hand-written zod response schema on every fetch (zod .optional() accepts undefined only; switched to .nullish() per repo convention) and drifted the generated contract. Regenerated openapi artifacts + docs copy + MDX. - Bound weights to the positive float32 range: xray decodes costs as float32, so an over-range value makes clients reject the whole subscription document and an underflow decays to the tag-digit fallback weight. Tests for both directions. - Trim six comment blocks to the 2-line cap from CLAUDE.md. --------- Co-authored-by: DIMFLIX <dimflix@users.noreply.github.com>
828 lines
18 KiB
TypeScript
828 lines
18 KiB
TypeScript
// Code generated by tools/openapigen. DO NOT EDIT.
|
|
export const EXAMPLES: Record<string, unknown> = {
|
|
"AllSetting": {
|
|
"datepicker": "",
|
|
"expireDiff": 0,
|
|
"externalTrafficInformEnable": false,
|
|
"externalTrafficInformURI": "",
|
|
"ipLimitAllowlist": "",
|
|
"ldapAutoCreate": false,
|
|
"ldapAutoDelete": false,
|
|
"ldapBaseDN": "",
|
|
"ldapBindDN": "",
|
|
"ldapDefaultExpiryDays": 0,
|
|
"ldapDefaultLimitIP": 0,
|
|
"ldapDefaultTotalGB": 0,
|
|
"ldapEnable": false,
|
|
"ldapFlagField": "",
|
|
"ldapHost": "",
|
|
"ldapInboundTags": "",
|
|
"ldapInsecureSkipVerify": false,
|
|
"ldapInvertFlag": false,
|
|
"ldapPassword": "",
|
|
"ldapPort": 0,
|
|
"ldapSyncCron": "",
|
|
"ldapTruthyValues": "",
|
|
"ldapUseTLS": false,
|
|
"ldapUserAttr": "",
|
|
"ldapUserFilter": "",
|
|
"ldapVlessField": "",
|
|
"outboundDownThreshold": 1,
|
|
"pageSize": 0,
|
|
"panelOutbound": "",
|
|
"remarkTemplate": "",
|
|
"restartXrayOnClientDisable": false,
|
|
"sessionMaxAge": 1,
|
|
"smtpCpu": 0,
|
|
"smtpEnable": false,
|
|
"smtpEnabledEvents": "",
|
|
"smtpEncryptionType": "",
|
|
"smtpFrom": "",
|
|
"smtpFromName": "",
|
|
"smtpHost": "",
|
|
"smtpMemory": 0,
|
|
"smtpPassword": "",
|
|
"smtpPort": 1,
|
|
"smtpTo": "",
|
|
"smtpUsername": "",
|
|
"subAnnounce": "",
|
|
"subCertFile": "",
|
|
"subClashAutoDetect": false,
|
|
"subClashEnable": false,
|
|
"subClashEnableRouting": false,
|
|
"subClashPath": "",
|
|
"subClashRules": "",
|
|
"subClashURI": "",
|
|
"subClashUserAgentRegex": "",
|
|
"subDomain": "",
|
|
"subEnable": false,
|
|
"subEnableRouting": false,
|
|
"subEncrypt": false,
|
|
"subHideSettings": false,
|
|
"subIncyEnableRouting": false,
|
|
"subIncyRoutingRules": "",
|
|
"subJsonAlwaysArray": false,
|
|
"subJsonAutoDetect": false,
|
|
"subJsonEnable": false,
|
|
"subJsonFinalMask": "",
|
|
"subJsonMux": "",
|
|
"subJsonObservatory": "",
|
|
"subJsonPath": "",
|
|
"subJsonRules": "",
|
|
"subJsonURI": "",
|
|
"subJsonUserAgentRegex": "",
|
|
"subKeyFile": "",
|
|
"subListen": "",
|
|
"subPath": "",
|
|
"subPort": 1,
|
|
"subProfileUrl": "",
|
|
"subRoutingRules": "",
|
|
"subShowIdentityOnAllLinks": false,
|
|
"subSupportUrl": "",
|
|
"subThemeDir": "",
|
|
"subTitle": "",
|
|
"subURI": "",
|
|
"subUpdates": 0,
|
|
"tgBotAPIServer": "",
|
|
"tgBotBackup": false,
|
|
"tgBotChatId": "",
|
|
"tgBotEnable": false,
|
|
"tgBotProxy": "",
|
|
"tgBotToken": "",
|
|
"tgCpu": 0,
|
|
"tgEnabledEvents": "",
|
|
"tgLang": "",
|
|
"tgMemory": 0,
|
|
"tgRunTime": "",
|
|
"timeLocation": "",
|
|
"trafficDiff": 0,
|
|
"trustedProxyCIDRs": "",
|
|
"twoFactorEnable": false,
|
|
"twoFactorToken": "",
|
|
"warpUpdateInterval": 0,
|
|
"webBasePath": "",
|
|
"webCertFile": "",
|
|
"webDomain": "",
|
|
"webKeyFile": "",
|
|
"webListen": "",
|
|
"webPort": 1
|
|
},
|
|
"AllSettingView": {
|
|
"datepicker": "",
|
|
"expireDiff": 0,
|
|
"externalTrafficInformEnable": false,
|
|
"externalTrafficInformURI": "",
|
|
"hasApiToken": false,
|
|
"hasLdapPassword": false,
|
|
"hasNordSecret": false,
|
|
"hasSmtpPassword": false,
|
|
"hasTgBotToken": false,
|
|
"hasTwoFactorToken": false,
|
|
"hasWarpSecret": false,
|
|
"ipLimitAllowlist": "",
|
|
"ldapAutoCreate": false,
|
|
"ldapAutoDelete": false,
|
|
"ldapBaseDN": "",
|
|
"ldapBindDN": "",
|
|
"ldapDefaultExpiryDays": 0,
|
|
"ldapDefaultLimitIP": 0,
|
|
"ldapDefaultTotalGB": 0,
|
|
"ldapEnable": false,
|
|
"ldapFlagField": "",
|
|
"ldapHost": "",
|
|
"ldapInboundTags": "",
|
|
"ldapInsecureSkipVerify": false,
|
|
"ldapInvertFlag": false,
|
|
"ldapPassword": "",
|
|
"ldapPort": 0,
|
|
"ldapSyncCron": "",
|
|
"ldapTruthyValues": "",
|
|
"ldapUseTLS": false,
|
|
"ldapUserAttr": "",
|
|
"ldapUserFilter": "",
|
|
"ldapVlessField": "",
|
|
"outboundDownThreshold": 1,
|
|
"pageSize": 0,
|
|
"panelOutbound": "",
|
|
"remarkTemplate": "",
|
|
"restartXrayOnClientDisable": false,
|
|
"sessionMaxAge": 1,
|
|
"smtpCpu": 0,
|
|
"smtpEnable": false,
|
|
"smtpEnabledEvents": "",
|
|
"smtpEncryptionType": "",
|
|
"smtpFrom": "",
|
|
"smtpFromName": "",
|
|
"smtpHost": "",
|
|
"smtpMemory": 0,
|
|
"smtpPassword": "",
|
|
"smtpPort": 1,
|
|
"smtpTo": "",
|
|
"smtpUsername": "",
|
|
"subAnnounce": "",
|
|
"subCertFile": "",
|
|
"subClashAutoDetect": false,
|
|
"subClashEnable": false,
|
|
"subClashEnableRouting": false,
|
|
"subClashPath": "",
|
|
"subClashRules": "",
|
|
"subClashURI": "",
|
|
"subClashUserAgentRegex": "",
|
|
"subDomain": "",
|
|
"subEnable": false,
|
|
"subEnableRouting": false,
|
|
"subEncrypt": false,
|
|
"subHideSettings": false,
|
|
"subIncyEnableRouting": false,
|
|
"subIncyRoutingRules": "",
|
|
"subJsonAlwaysArray": false,
|
|
"subJsonAutoDetect": false,
|
|
"subJsonEnable": false,
|
|
"subJsonFinalMask": "",
|
|
"subJsonMux": "",
|
|
"subJsonObservatory": "",
|
|
"subJsonPath": "",
|
|
"subJsonRules": "",
|
|
"subJsonURI": "",
|
|
"subJsonUserAgentRegex": "",
|
|
"subKeyFile": "",
|
|
"subListen": "",
|
|
"subPath": "",
|
|
"subPort": 1,
|
|
"subProfileUrl": "",
|
|
"subRoutingRules": "",
|
|
"subShowIdentityOnAllLinks": false,
|
|
"subSupportUrl": "",
|
|
"subThemeDir": "",
|
|
"subTitle": "",
|
|
"subURI": "",
|
|
"subUpdates": 0,
|
|
"tgBotAPIServer": "",
|
|
"tgBotBackup": false,
|
|
"tgBotChatId": "",
|
|
"tgBotEnable": false,
|
|
"tgBotProxy": "",
|
|
"tgBotToken": "",
|
|
"tgCpu": 0,
|
|
"tgEnabledEvents": "",
|
|
"tgLang": "",
|
|
"tgMemory": 0,
|
|
"tgRunTime": "",
|
|
"timeLocation": "",
|
|
"trafficDiff": 0,
|
|
"trustedProxyCIDRs": "",
|
|
"twoFactorEnable": false,
|
|
"twoFactorToken": "",
|
|
"warpUpdateInterval": 0,
|
|
"webBasePath": "",
|
|
"webCertFile": "",
|
|
"webDomain": "",
|
|
"webKeyFile": "",
|
|
"webListen": "",
|
|
"webPort": 1
|
|
},
|
|
"AmneziaWGLogs": {
|
|
"events": [
|
|
"2025/01/01 12:00:00 amneziawg: started interface awg1 for inbound 1"
|
|
],
|
|
"peers": [
|
|
{
|
|
"allowedIPs": "10.8.1.2/32",
|
|
"down": 4194304,
|
|
"email": "peer@example.com",
|
|
"endpoint": "203.0.113.9:51820",
|
|
"handshake": 1735732800000,
|
|
"inboundId": 1,
|
|
"interface": "awg1",
|
|
"online": true,
|
|
"tag": "inbound-51820",
|
|
"up": 1048576
|
|
}
|
|
],
|
|
"running": true
|
|
},
|
|
"ApiToken": {
|
|
"createdAt": 0,
|
|
"enabled": false,
|
|
"expiresAt": 0,
|
|
"id": 0,
|
|
"name": "",
|
|
"scope": "",
|
|
"token": ""
|
|
},
|
|
"ApiTokenView": {
|
|
"createdAt": 1736000000,
|
|
"enabled": true,
|
|
"expiresAt": 0,
|
|
"id": 2,
|
|
"name": "central-panel-a",
|
|
"scope": "admin",
|
|
"token": "new-token-string"
|
|
},
|
|
"Client": {
|
|
"adTag": "0123456789abcdef0123456789abcdef",
|
|
"allowedIPs": [
|
|
""
|
|
],
|
|
"allowedIPsByInbound": {},
|
|
"auth": "",
|
|
"comment": "",
|
|
"created_at": 0,
|
|
"email": "",
|
|
"enable": false,
|
|
"expiryTime": 0,
|
|
"flow": "",
|
|
"forwardedPorts": "",
|
|
"group": "",
|
|
"id": "",
|
|
"keepAlive": 0,
|
|
"limitIp": 0,
|
|
"password": "",
|
|
"preSharedKey": "",
|
|
"privateKey": "",
|
|
"publicKey": "",
|
|
"reset": 0,
|
|
"resetDay": 0,
|
|
"resetMax": 0,
|
|
"reverse": null,
|
|
"secret": "ee1234567890abcdef1234567890abcd7777772e636c6f7564666c6172652e636f6d",
|
|
"security": "",
|
|
"subId": "",
|
|
"tgId": 0,
|
|
"totalGB": 0,
|
|
"trafficReset": "never",
|
|
"trafficResetDay": 1,
|
|
"updated_at": 0
|
|
},
|
|
"ClientInbound": {
|
|
"clientId": 0,
|
|
"createdAt": 0,
|
|
"flowOverride": "",
|
|
"inboundId": 0
|
|
},
|
|
"ClientRecord": {
|
|
"adTag": "",
|
|
"allowedIPs": "",
|
|
"auth": "",
|
|
"comment": "",
|
|
"createdAt": 0,
|
|
"email": "",
|
|
"enable": false,
|
|
"expiryTime": 0,
|
|
"flow": "",
|
|
"forwardedPorts": "",
|
|
"group": "",
|
|
"id": 0,
|
|
"keepAlive": 0,
|
|
"limitHwid": 0,
|
|
"limitIp": 0,
|
|
"password": "",
|
|
"preSharedKey": "",
|
|
"privateKey": "",
|
|
"publicKey": "",
|
|
"reset": 0,
|
|
"resetDay": 0,
|
|
"resetMax": 0,
|
|
"reverse": null,
|
|
"secret": "",
|
|
"security": "",
|
|
"subId": "",
|
|
"tgId": 0,
|
|
"totalGB": 0,
|
|
"trafficReset": "",
|
|
"trafficResetDay": 0,
|
|
"updatedAt": 0,
|
|
"uuid": ""
|
|
},
|
|
"ClientReverse": {
|
|
"tag": ""
|
|
},
|
|
"ClientTraffic": {
|
|
"down": 2097152,
|
|
"email": "user1",
|
|
"enable": true,
|
|
"expiryTime": 1735689600000,
|
|
"id": 14825,
|
|
"inboundId": 1,
|
|
"lastOnline": 1735680000000,
|
|
"lastSubFetch": 1735680000000,
|
|
"reset": 0,
|
|
"resetCount": 0,
|
|
"resetDay": 0,
|
|
"resetMax": 0,
|
|
"subId": "i7tvdpeffi0hvvf1",
|
|
"total": 10737418240,
|
|
"up": 1048576,
|
|
"uuid": "e18c9a96-71bf-48d4-933f-8b9a46d4290c"
|
|
},
|
|
"FallbackParentInfo": {
|
|
"masterId": 0,
|
|
"path": ""
|
|
},
|
|
"GeoCategory": {
|
|
"attributes": [
|
|
"ads",
|
|
"cn"
|
|
],
|
|
"code": "google",
|
|
"entries": 1284
|
|
},
|
|
"GeoCategoryPage": {
|
|
"items": [
|
|
{
|
|
"attributes": [
|
|
"ads",
|
|
"cn"
|
|
],
|
|
"code": "google",
|
|
"entries": 1284
|
|
}
|
|
],
|
|
"total": 1043
|
|
},
|
|
"GeoEntry": {
|
|
"kind": "domain",
|
|
"value": "google.com"
|
|
},
|
|
"GeoEntryPage": {
|
|
"items": [
|
|
{
|
|
"kind": "domain",
|
|
"value": "google.com"
|
|
}
|
|
],
|
|
"total": 1284
|
|
},
|
|
"GeoFile": {
|
|
"categories": 1043,
|
|
"error": "",
|
|
"kind": "site",
|
|
"modifiedAt": 1769558400000,
|
|
"name": "geosite.dat",
|
|
"size": 1467392
|
|
},
|
|
"GeodataTokenIssue": {
|
|
"code": "blabla",
|
|
"file": "geosite.dat",
|
|
"reason": "categoryMissing",
|
|
"token": "geosite:blabla"
|
|
},
|
|
"HistoryOfSeeders": {
|
|
"id": 0,
|
|
"seederName": ""
|
|
},
|
|
"Host": {
|
|
"address": "cdn.example.com",
|
|
"allowInsecure": false,
|
|
"alpn": [
|
|
""
|
|
],
|
|
"createdAt": 0,
|
|
"echConfigList": "",
|
|
"excludeFromSubTypes": [
|
|
""
|
|
],
|
|
"finalMask": "",
|
|
"fingerprint": "",
|
|
"groupId": "",
|
|
"hostHeader": "",
|
|
"id": 1,
|
|
"inboundId": 1,
|
|
"isDisabled": false,
|
|
"isHidden": false,
|
|
"keepSniBlank": false,
|
|
"mihomoIpVersion": "dual",
|
|
"mihomoX25519": false,
|
|
"muxParams": null,
|
|
"nodeGuids": [
|
|
""
|
|
],
|
|
"overrideSniFromAddress": false,
|
|
"path": "",
|
|
"pinnedPeerCertSha256": [
|
|
""
|
|
],
|
|
"port": 8443,
|
|
"remark": "cdn-front",
|
|
"security": "same",
|
|
"serverDescription": "",
|
|
"shuffleHost": false,
|
|
"sni": "",
|
|
"sockoptParams": null,
|
|
"sortOrder": 0,
|
|
"tags": [
|
|
""
|
|
],
|
|
"updatedAt": 0,
|
|
"verifyPeerCertByName": "",
|
|
"vlessRoute": "443"
|
|
},
|
|
"HostGroup": {
|
|
"allowInsecure": false,
|
|
"alpn": [
|
|
""
|
|
],
|
|
"echConfigList": "",
|
|
"excludeFromSubTypes": [
|
|
""
|
|
],
|
|
"finalMask": "",
|
|
"fingerprint": "",
|
|
"groupId": "",
|
|
"hostHeader": "",
|
|
"hosts": [
|
|
""
|
|
],
|
|
"inboundIds": [
|
|
0
|
|
],
|
|
"isDisabled": false,
|
|
"isHidden": false,
|
|
"keepSniBlank": false,
|
|
"mihomoIpVersion": "dual",
|
|
"mihomoX25519": false,
|
|
"muxParams": "",
|
|
"nodeGuids": [
|
|
""
|
|
],
|
|
"overrideSniFromAddress": false,
|
|
"path": "",
|
|
"pinnedPeerCertSha256": [
|
|
""
|
|
],
|
|
"port": 0,
|
|
"remark": "",
|
|
"security": "same",
|
|
"serverDescription": "",
|
|
"shuffleHost": false,
|
|
"sni": "",
|
|
"sockoptParams": "",
|
|
"sortOrder": 0,
|
|
"tags": [
|
|
""
|
|
],
|
|
"verifyPeerCertByName": "",
|
|
"vlessRoute": ""
|
|
},
|
|
"Inbound": {
|
|
"clientStats": [
|
|
{
|
|
"down": 2097152,
|
|
"email": "user1",
|
|
"enable": true,
|
|
"expiryTime": 1735689600000,
|
|
"id": 14825,
|
|
"inboundId": 1,
|
|
"lastOnline": 1735680000000,
|
|
"lastSubFetch": 1735680000000,
|
|
"reset": 0,
|
|
"resetCount": 0,
|
|
"resetDay": 0,
|
|
"resetMax": 0,
|
|
"subId": "i7tvdpeffi0hvvf1",
|
|
"total": 10737418240,
|
|
"up": 1048576,
|
|
"uuid": "e18c9a96-71bf-48d4-933f-8b9a46d4290c"
|
|
}
|
|
],
|
|
"disableFlow": false,
|
|
"down": 0,
|
|
"enable": true,
|
|
"expiryTime": 0,
|
|
"fallbackParent": null,
|
|
"id": 1,
|
|
"lastTrafficResetTime": 0,
|
|
"listen": "",
|
|
"nodeId": null,
|
|
"originNodeGuid": "",
|
|
"port": 443,
|
|
"protocol": "vless",
|
|
"remark": "VLESS-443",
|
|
"settings": null,
|
|
"shareAddr": "",
|
|
"shareAddrStrategy": "node",
|
|
"sniffing": null,
|
|
"streamSettings": null,
|
|
"subSortIndex": 1,
|
|
"tag": "in-443-tcp",
|
|
"total": 0,
|
|
"trafficReset": "never",
|
|
"trafficResetDay": 1,
|
|
"up": 0
|
|
},
|
|
"InboundClientIps": {
|
|
"clientEmail": "",
|
|
"id": 0,
|
|
"ips": null
|
|
},
|
|
"InboundFallback": {
|
|
"alpn": "",
|
|
"childId": 0,
|
|
"dest": "",
|
|
"id": 0,
|
|
"masterId": 0,
|
|
"name": "",
|
|
"path": "",
|
|
"sortOrder": 0,
|
|
"xver": 0
|
|
},
|
|
"InboundOption": {
|
|
"awgServer": null,
|
|
"enable": true,
|
|
"id": 1,
|
|
"listen": "",
|
|
"mtprotoDomain": "",
|
|
"nodeAddress": "",
|
|
"nodeId": null,
|
|
"port": 443,
|
|
"protocol": "vless",
|
|
"remark": "VLESS-443",
|
|
"shareAddr": "",
|
|
"shareAddrStrategy": "",
|
|
"ssMethod": "",
|
|
"tag": "in-443-tcp",
|
|
"tlsFlowCapable": true,
|
|
"wgDns": "",
|
|
"wgMtu": 0,
|
|
"wgPublicKey": ""
|
|
},
|
|
"Msg": {
|
|
"msg": "",
|
|
"obj": null,
|
|
"success": false
|
|
},
|
|
"Node": {
|
|
"activeCount": 23,
|
|
"address": "node1.example.com",
|
|
"allowPrivateAddress": false,
|
|
"basePath": "/",
|
|
"clientCount": 27,
|
|
"configDirty": false,
|
|
"configDirtyAt": 0,
|
|
"cpuPct": 23.5,
|
|
"createdAt": 1700000000,
|
|
"depletedCount": 1,
|
|
"disabledCount": 3,
|
|
"enable": true,
|
|
"guid": "",
|
|
"id": 1,
|
|
"inboundCount": 5,
|
|
"inboundSyncMode": "all",
|
|
"inboundTags": [
|
|
""
|
|
],
|
|
"lastError": "",
|
|
"lastHeartbeat": 1700000000,
|
|
"latencyMs": 42,
|
|
"memPct": 45.1,
|
|
"name": "de-fra-1",
|
|
"netDown": 2097152,
|
|
"netUp": 1048576,
|
|
"onlineCount": 3,
|
|
"outboundTag": "",
|
|
"panelVersion": "v3.x.x",
|
|
"parentGuid": "",
|
|
"pinnedCertSha256": "",
|
|
"port": 2053,
|
|
"remark": "",
|
|
"scheme": "https",
|
|
"status": "online",
|
|
"tlsVerifyMode": "verify",
|
|
"transitive": false,
|
|
"updatedAt": 1700000000,
|
|
"uptimeSecs": 86400,
|
|
"xrayError": "",
|
|
"xrayState": "",
|
|
"xrayVersion": "25.10.31"
|
|
},
|
|
"NodeMutationRequest": {
|
|
"address": "",
|
|
"allowPrivateAddress": false,
|
|
"apiToken": null,
|
|
"basePath": "",
|
|
"clearApiToken": false,
|
|
"enable": false,
|
|
"id": 0,
|
|
"inboundSyncMode": "all",
|
|
"inboundTags": [
|
|
""
|
|
],
|
|
"name": "",
|
|
"outboundTag": "",
|
|
"pinnedCertSha256": "",
|
|
"port": 1,
|
|
"remark": "",
|
|
"scheme": "http",
|
|
"tlsVerifyMode": "verify"
|
|
},
|
|
"NodeView": {
|
|
"activeCount": 20,
|
|
"address": "node.example.com",
|
|
"allowPrivateAddress": false,
|
|
"basePath": "/",
|
|
"clientCount": 25,
|
|
"configDirty": false,
|
|
"configDirtyAt": 0,
|
|
"cpuPct": 12.5,
|
|
"createdAt": 1700000000,
|
|
"depletedCount": 1,
|
|
"disabledCount": 2,
|
|
"enable": true,
|
|
"guid": "node-guid",
|
|
"hasApiToken": true,
|
|
"id": 1,
|
|
"inboundCount": 3,
|
|
"inboundSyncMode": "all",
|
|
"inboundTags": [
|
|
"in-443-tcp"
|
|
],
|
|
"lastError": "",
|
|
"lastHeartbeat": 1700000000,
|
|
"latencyMs": 42,
|
|
"memPct": 45.2,
|
|
"name": "edge-1",
|
|
"netDown": 1048576,
|
|
"netUp": 2097152,
|
|
"onlineCount": 5,
|
|
"outboundTag": "direct",
|
|
"panelVersion": "v3.x.x",
|
|
"parentGuid": "",
|
|
"pinnedCertSha256": "",
|
|
"port": 2053,
|
|
"remark": "Primary edge",
|
|
"scheme": "https",
|
|
"status": "online",
|
|
"tlsVerifyMode": "verify",
|
|
"transitive": false,
|
|
"updatedAt": 1700003600,
|
|
"uptimeSecs": 86400,
|
|
"xrayError": "",
|
|
"xrayState": "running",
|
|
"xrayVersion": "25.10.31"
|
|
},
|
|
"OutboundTraffics": {
|
|
"down": 0,
|
|
"id": 0,
|
|
"tag": "",
|
|
"total": 0,
|
|
"up": 0
|
|
},
|
|
"PanelUpdateStatus": {
|
|
"exitCode": 0,
|
|
"finishedAt": 1735689612,
|
|
"runId": "1735689600123456789",
|
|
"state": "success"
|
|
},
|
|
"PeerActivity": {
|
|
"allowedIPs": "10.8.1.2/32",
|
|
"down": 4194304,
|
|
"email": "peer@example.com",
|
|
"endpoint": "203.0.113.9:51820",
|
|
"handshake": 1735732800000,
|
|
"inboundId": 1,
|
|
"interface": "awg1",
|
|
"online": true,
|
|
"tag": "inbound-51820",
|
|
"up": 1048576
|
|
},
|
|
"ProbeResultUI": {
|
|
"cpuPct": 12.5,
|
|
"error": "",
|
|
"latencyMs": 42,
|
|
"memPct": 45.2,
|
|
"panelVersion": "v3.x.x",
|
|
"status": "online",
|
|
"uptimeSecs": 86400,
|
|
"xrayError": "",
|
|
"xrayState": "",
|
|
"xrayVersion": "25.10.31"
|
|
},
|
|
"RealityScanResult": {
|
|
"alpn": "h2",
|
|
"certChainValid": true,
|
|
"certIssuer": "Google Trust Services",
|
|
"certSubject": "cloudflare.com",
|
|
"certValid": true,
|
|
"curveID": "X25519",
|
|
"feasible": true,
|
|
"h2": true,
|
|
"host": "www.cloudflare.com",
|
|
"ip": "104.16.124.96",
|
|
"latencyMs": 180,
|
|
"notAfter": "2026-08-01T00:00:00Z",
|
|
"port": 443,
|
|
"privateTarget": false,
|
|
"reason": "",
|
|
"serverNames": [
|
|
""
|
|
],
|
|
"target": "www.cloudflare.com:443",
|
|
"tls13": true,
|
|
"tlsVersion": "1.3",
|
|
"x25519": true
|
|
},
|
|
"ServerSettings": {
|
|
"contentPaddingAddition": "",
|
|
"disableCookies": false,
|
|
"externalInterface": "",
|
|
"h1": "",
|
|
"h2": "",
|
|
"h3": "",
|
|
"h4": "",
|
|
"headerProtectionKey": "",
|
|
"i1": "",
|
|
"i2": "",
|
|
"i3": "",
|
|
"i4": "",
|
|
"i5": "",
|
|
"ipv6Enabled": false,
|
|
"ipv6ExternalInterface": "",
|
|
"ipv6Subnet": "",
|
|
"jc": 0,
|
|
"jmax": 0,
|
|
"jmin": 0,
|
|
"keepaliveTimeout": "",
|
|
"maxHandshakeAttempts": "",
|
|
"mtu": 0,
|
|
"primaryDns": "",
|
|
"privateKey": "",
|
|
"publicKey": "",
|
|
"randomTrailers": false,
|
|
"rejectAfterTime": "",
|
|
"rekeyAfterTime": "",
|
|
"rekeyTimeout": "",
|
|
"routeThroughXray": false,
|
|
"s1": 0,
|
|
"s2": 0,
|
|
"s3": 0,
|
|
"s4": 0,
|
|
"secondaryDns": "",
|
|
"subnetCidr": 0,
|
|
"subnetIp": ""
|
|
},
|
|
"Setting": {
|
|
"id": 0,
|
|
"key": "",
|
|
"value": ""
|
|
},
|
|
"SubBalancer": {
|
|
"createdAt": 1710000000000,
|
|
"enabled": true,
|
|
"id": 1,
|
|
"inboundIds": [
|
|
1,
|
|
3
|
|
],
|
|
"memberWeights": {},
|
|
"remark": "auto-fastest",
|
|
"sortOrder": 1,
|
|
"strategy": "random",
|
|
"updatedAt": 1710000000000
|
|
},
|
|
"User": {
|
|
"id": 0,
|
|
"password": "",
|
|
"username": ""
|
|
}
|
|
};
|