# NodeService
> 边缘节点管理服务

---

## checkNodeLatestVersion
> 检查新版本

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/checkNodeLatestVersion`
- RPC：`rpc checkNodeLatestVersion (CheckNodeLatestVersionRequest) returns (CheckNodeLatestVersionResponse);`

**请求对象 (`CheckNodeLatestVersionRequest`)**

```json
{
  "os": "string",
  "arch": "string",
  "currentVersion": "string"
}
```

**响应对象 (`CheckNodeLatestVersionResponse`)**

```json
{
  "hasNewVersion": "bool",
  "newVersion": "string"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/checkNodeLatestVersion" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## copyNodeActionsToNodeCluster
> 复制动作设置到集群

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/copyNodeActionsToNodeCluster`
- RPC：`rpc copyNodeActionsToNodeCluster(CopyNodeActionsToNodeClusterRequest) returns (RPCSuccess);`

**请求对象 (`CopyNodeActionsToNodeClusterRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/copyNodeActionsToNodeCluster" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## copyNodeActionsToNodeGroup
> 复制动作设置到分组

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/copyNodeActionsToNodeGroup`
- RPC：`rpc copyNodeActionsToNodeGroup(CopyNodeActionsToNodeGroupRequest) returns (RPCSuccess);`

**请求对象 (`CopyNodeActionsToNodeGroupRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/copyNodeActionsToNodeGroup" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## countAllEnabledNodes
> 所有可用的节点数量

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/countAllEnabledNodes`
- RPC：`rpc countAllEnabledNodes (CountAllEnabledNodesRequest) returns (RPCCountResponse);`

**请求对象 (`CountAllEnabledNodesRequest`)**

```json
{}
```

**响应对象 (`RPCCountResponse`)**

```json
{
  "count": "int64 // 数量"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/countAllEnabledNodes" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## countAllEnabledNodesMatch
> 计算匹配的节点数量

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/countAllEnabledNodesMatch`
- RPC：`rpc countAllEnabledNodesMatch (CountAllEnabledNodesMatchRequest) returns (RPCCountResponse);`

**请求对象 (`CountAllEnabledNodesMatchRequest`)**

```json
{
  "nodeClusterId": "int64 // 集群ID",
  "installState": "int32",
  "activeState": "int32",
  "keyword": "string // 关键词",
  "nodeGroupId": "int64",
  "nodeRegionId": "int64",
  "level": "int32"
}
```

**响应对象 (`RPCCountResponse`)**

```json
{
  "count": "int64 // 数量"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/countAllEnabledNodesMatch" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## countAllEnabledNodesWithNodeGrantId
> 计算使用某个认证的节点数量

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/countAllEnabledNodesWithNodeGrantId`
- RPC：`rpc countAllEnabledNodesWithNodeGrantId (CountAllEnabledNodesWithNodeGrantIdRequest) returns (RPCCountResponse);`

**请求对象 (`CountAllEnabledNodesWithNodeGrantIdRequest`)**

```json
{
  "nodeGrantId": "int64"
}
```

**响应对象 (`RPCCountResponse`)**

```json
{
  "count": "int64 // 数量"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/countAllEnabledNodesWithNodeGrantId" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## countAllEnabledNodesWithNodeGroupId
> 计算某个节点分组内的节点数量

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/countAllEnabledNodesWithNodeGroupId`
- RPC：`rpc countAllEnabledNodesWithNodeGroupId (CountAllEnabledNodesWithNodeGroupIdRequest) returns (RPCCountResponse);`

**请求对象 (`CountAllEnabledNodesWithNodeGroupIdRequest`)**

```json
{
  "nodeGroupId": "int64"
}
```

**响应对象 (`RPCCountResponse`)**

```json
{
  "count": "int64 // 数量"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/countAllEnabledNodesWithNodeGroupId" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## countAllEnabledNodesWithNodeRegionId
> 计算某个区域下的节点数量

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/countAllEnabledNodesWithNodeRegionId`
- RPC：`rpc countAllEnabledNodesWithNodeRegionId (CountAllEnabledNodesWithNodeRegionIdRequest) returns (RPCCountResponse);`

**请求对象 (`CountAllEnabledNodesWithNodeRegionIdRequest`)**

```json
{
  "nodeRegionId": "int64"
}
```

**响应对象 (`RPCCountResponse`)**

```json
{
  "count": "int64 // 数量"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/countAllEnabledNodesWithNodeRegionId" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## countAllNodeRegionInfo
> 查找节点区域信息数量

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/countAllNodeRegionInfo`
- RPC：`rpc countAllNodeRegionInfo(CountAllNodeRegionInfoRequest) returns (RPCCountResponse);`

**请求对象 (`CountAllNodeRegionInfoRequest`)**

```json
{
  "nodeRegionId": "int64 // 区域ID，可选"
}
```

**响应对象 (`RPCCountResponse`)**

```json
{
  "count": "int64 // 数量"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/countAllNodeRegionInfo" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## countAllNotInstalledNodesWithNodeClusterId
> 计算没有安装的节点数量

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/countAllNotInstalledNodesWithNodeClusterId`
- RPC：`rpc countAllNotInstalledNodesWithNodeClusterId (CountAllNotInstalledNodesWithNodeClusterIdRequest) returns (RPCCountResponse);`

**请求对象 (`CountAllNotInstalledNodesWithNodeClusterIdRequest`)**

```json
{
  "nodeClusterId": "int64 // 集群ID"
}
```

**响应对象 (`RPCCountResponse`)**

```json
{
  "count": "int64 // 数量"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/countAllNotInstalledNodesWithNodeClusterId" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## countAllUpgradeNodesWithNodeClusterId
> 计算需要升级的节点数量

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/countAllUpgradeNodesWithNodeClusterId`
- RPC：`rpc countAllUpgradeNodesWithNodeClusterId (CountAllUpgradeNodesWithNodeClusterIdRequest) returns (RPCCountResponse);`

**请求对象 (`CountAllUpgradeNodesWithNodeClusterIdRequest`)**

```json
{
  "nodeClusterId": "int64 // 集群ID"
}
```

**响应对象 (`RPCCountResponse`)**

```json
{
  "count": "int64 // 数量"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/countAllUpgradeNodesWithNodeClusterId" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## countNodeInitScript
> 查找节点区域信息数量

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/countNodeInitScript`
- RPC：`rpc countNodeInitScript(CountNodeInitScriptRequest) returns (RPCCountResponse);`

**请求对象 (`CountNodeInitScriptRequest`)**

```json
{}
```

**响应对象 (`RPCCountResponse`)**

```json
{
  "count": "int64 // 数量"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/countNodeInitScript" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## createNode
> 创建节点

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/createNode`
- RPC：`rpc createNode (CreateNodeRequest) returns (CreateNodeResponse);`

**请求对象 (`CreateNodeRequest`)**

```json
{
  "name": "string // 节点名称",
  "nodeClusterId": "int64 // 节点所属集群",
  "nodeLogin": "NodeLogin // 节点登录信息",
  "nodeGroupId": "int64 // 节点所属分组",
  "dnsRoutes": "[]string // 节点DNS线路列表",
  "nodeRegionId": "int64 // 节点所属区域"
}
```

**响应对象 (`CreateNodeResponse`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/createNode" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## createNodeInitScript
> 创建节点初始化脚本

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/createNodeInitScript`
- RPC：`rpc createNodeInitScript(CreateNodeInitScriptRequest) returns (CreateNodeInitScriptResponse);`

**请求对象 (`CreateNodeInitScriptRequest`)**

```json
{
  "name": "string // 脚本名称",
  "code": "string // 脚本代码"
}
```

**响应对象 (`CreateNodeInitScriptResponse`)**

```json
{
  "scriptId": "int64"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/createNodeInitScript" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## deleteNode
> 删除节点

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/deleteNode`
- RPC：`rpc deleteNode (DeleteNodeRequest) returns (RPCSuccess);`

**请求对象 (`DeleteNodeRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/deleteNode" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## deleteNodeFromNodeCluster
> 从集群中删除节点

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/deleteNodeFromNodeCluster`
- RPC：`rpc deleteNodeFromNodeCluster (DeleteNodeFromNodeClusterRequest) returns (RPCSuccess);`

**请求对象 (`DeleteNodeFromNodeClusterRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "nodeClusterId": "int64 // 集群ID"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/deleteNodeFromNodeCluster" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## deleteNodeInitScript
> 删除节点初始化脚本

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/deleteNodeInitScript`
- RPC：`rpc deleteNodeInitScript(DeleteNodeInitScriptRequest) returns(RPCSuccess);`

**请求对象 (`DeleteNodeInitScriptRequest`)**

```json
{
  "scriptId": "int64"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/deleteNodeInitScript" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findAllEnabledNodesDNSWithNodeClusterId
> 取得某个集群下的所有节点DNS信息

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findAllEnabledNodesDNSWithNodeClusterId`
- RPC：`rpc findAllEnabledNodesDNSWithNodeClusterId (FindAllEnabledNodesDNSWithNodeClusterIdRequest) returns (FindAllEnabledNodesDNSWithNodeClusterIdResponse);`

**请求对象 (`FindAllEnabledNodesDNSWithNodeClusterIdRequest`)**

```json
{
  "nodeClusterId": "int64 // 集群ID",
  "isInstalled": "bool"
}
```

**响应对象 (`FindAllEnabledNodesDNSWithNodeClusterIdResponse`)**

```json
{
  "nodes": "[]NodeDNSInfo"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findAllEnabledNodesDNSWithNodeClusterId" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findAllEnabledNodesWithNodeClusterId
> 根据集群查找所有节点

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findAllEnabledNodesWithNodeClusterId`
- RPC：`rpc findAllEnabledNodesWithNodeClusterId (FindAllEnabledNodesWithNodeClusterIdRequest) returns (FindAllEnabledNodesWithNodeClusterIdResponse);`

**请求对象 (`FindAllEnabledNodesWithNodeClusterIdRequest`)**

```json
{
  "nodeClusterId": "int64 // 集群ID",
  "includeSecondary": "bool // 是否检查节点的从集群，如果为false，则只检查主集群ID"
}
```

**响应对象 (`FindAllEnabledNodesWithNodeClusterIdResponse`)**

```json
{
  "nodes": "[]Node"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findAllEnabledNodesWithNodeClusterId" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findAllEnabledNodesWithNodeGrantId
> 查找使用某个认证的所有节点

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findAllEnabledNodesWithNodeGrantId`
- RPC：`rpc findAllEnabledNodesWithNodeGrantId (FindAllEnabledNodesWithNodeGrantIdRequest) returns (FindAllEnabledNodesWithNodeGrantIdResponse);`

**请求对象 (`FindAllEnabledNodesWithNodeGrantIdRequest`)**

```json
{
  "nodeGrantId": "int64"
}
```

**响应对象 (`FindAllEnabledNodesWithNodeGrantIdResponse`)**

```json
{
  "nodes": "[]Node"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findAllEnabledNodesWithNodeGrantId" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findAllNodeInitScripts
> 获取一共节点初始化脚本

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findAllNodeInitScripts`
- RPC：`rpc findAllNodeInitScripts(FindAllNodeInitScriptsRequest) returns (FindAllNodeInitScriptsResponse);`

**请求对象 (`FindAllNodeInitScriptsRequest`)**

```json
{}
```

**响应对象 (`FindAllNodeInitScriptsResponse`)**

```json
{
  "nodeInitScripts": "[]NodeInitScript"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findAllNodeInitScripts" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findAllNodeScheduleInfoWithNodeClusterId
> 查找集群的节点调度信息

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findAllNodeScheduleInfoWithNodeClusterId`
- RPC：`rpc findAllNodeScheduleInfoWithNodeClusterId(FindAllNodeScheduleInfoWithNodeClusterIdRequest) returns (FindAllNodeScheduleInfoWithNodeClusterIdResponse);`

**请求对象 (`FindAllNodeScheduleInfoWithNodeClusterIdRequest`)**

```json
{
  "nodeClusterId": "int64 // 集群ID"
}
```

**响应对象 (`FindAllNodeScheduleInfoWithNodeClusterIdResponse`)**

```json
{
  "nodes": "[]ScheduleInfo // 调动信息列表",
  "nodeId": "int64 // 节点ID",
  "nodeName": "string // 节点名称",
  "nodeGroupId": "int64 // 节点分组ID",
  "nodeGroupName": "string // 节点分组名称",
  "offlineDay": "string // 下线日期，格式YYYYMMDD",
  "isBackupForCluster": "bool // 是否为集群备份节点",
  "isBackupForGroup": "bool // 是否为分组备份节点",
  "backupIPs": "[]string // 备用IP",
  "actionStatusJSON": "bytes // 动作状态"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findAllNodeScheduleInfoWithNodeClusterId" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findAllNotInstalledNodesWithNodeClusterId
> 列出所有未安装的节点

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findAllNotInstalledNodesWithNodeClusterId`
- RPC：`rpc findAllNotInstalledNodesWithNodeClusterId (FindAllNotInstalledNodesWithNodeClusterIdRequest) returns (FindAllNotInstalledNodesWithNodeClusterIdResponse);`

**请求对象 (`FindAllNotInstalledNodesWithNodeClusterIdRequest`)**

```json
{
  "nodeClusterId": "int64 // 集群ID"
}
```

**响应对象 (`FindAllNotInstalledNodesWithNodeClusterIdResponse`)**

```json
{
  "nodes": "[]Node"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findAllNotInstalledNodesWithNodeClusterId" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findAllUpgradeNodesWithNodeClusterId
> 列出所有需要升级的节点

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findAllUpgradeNodesWithNodeClusterId`
- RPC：`rpc findAllUpgradeNodesWithNodeClusterId (FindAllUpgradeNodesWithNodeClusterIdRequest) returns (FindAllUpgradeNodesWithNodeClusterIdResponse);`

**请求对象 (`FindAllUpgradeNodesWithNodeClusterIdRequest`)**

```json
{
  "nodeClusterId": "int64 // 集群ID"
}
```

**响应对象 (`FindAllUpgradeNodesWithNodeClusterIdResponse`)**

```json
{
  "nodes": "[]NodeUpgrade",
  "node": "Node",
  "os": "string",
  "arch": "string",
  "oldVersion": "string",
  "newVersion": "string"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findAllUpgradeNodesWithNodeClusterId" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findEnabledBasicNode
> 获取单个节点基本信息

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findEnabledBasicNode`
- RPC：`rpc findEnabledBasicNode (FindEnabledBasicNodeRequest) returns (FindEnabledBasicNodeResponse);`

**请求对象 (`FindEnabledBasicNodeRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`FindEnabledBasicNodeResponse`)**

```json
{
  "node": "BasicNode // 节点基本信息"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findEnabledBasicNode" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findEnabledNode
> 获取单个节点信息

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findEnabledNode`
- RPC：`rpc findEnabledNode (FindEnabledNodeRequest) returns (FindEnabledNodeResponse);`

**请求对象 (`FindEnabledNodeRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`FindEnabledNodeResponse`)**

```json
{
  "node": "Node // 节点信息"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findEnabledNode" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findEnabledNodeConfigInfo
> 取得节点的配置概要信息

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findEnabledNodeConfigInfo`
- RPC：`rpc findEnabledNodeConfigInfo (FindEnabledNodeConfigInfoRequest) returns (FindEnabledNodeConfigInfoResponse);`

**请求对象 (`FindEnabledNodeConfigInfoRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`FindEnabledNodeConfigInfoResponse`)**

```json
{
  "hasDNSInfo": "bool // 是否有DNS设置",
  "hasCacheInfo": "bool // 是否有缓存设置",
  "hasThresholds": "bool // 是否有阈值设置",
  "hasSSH": "bool // 是否有SSH设置",
  "hasSystemSettings": "bool // 是否有系统设置",
  "hasDDoSProtection": "bool // 是否有DDoS防护设置",
  "hasScheduleSettings": "bool // 是否有调度设置"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findEnabledNodeConfigInfo" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findEnabledNodeDNS
> 查找单个节点的域名解析信息

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findEnabledNodeDNS`
- RPC：`rpc findEnabledNodeDNS (FindEnabledNodeDNSRequest) returns (FindEnabledNodeDNSResponse);`

**请求对象 (`FindEnabledNodeDNSRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "nodeClusterId": "int64 // 集群ID",
  "nodeIPAddrId": "int64"
}
```

**响应对象 (`FindEnabledNodeDNSResponse`)**

```json
{
  "node": "NodeDNSInfo"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findEnabledNodeDNS" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findEnabledNodesWithIds
> 根据一组ID获取节点信息

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findEnabledNodesWithIds`
- RPC：`rpc findEnabledNodesWithIds (FindEnabledNodesWithIdsRequest) returns (FindEnabledNodesWithIdsResponse);`

**请求对象 (`FindEnabledNodesWithIdsRequest`)**

```json
{
  "nodeIds": "[]int64"
}
```

**响应对象 (`FindEnabledNodesWithIdsResponse`)**

```json
{
  "nodes": "[]Node"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findEnabledNodesWithIds" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findNodeAPIConfig
> 查找单个节点的API相关配置

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findNodeAPIConfig`
- RPC：`rpc findNodeAPIConfig(FindNodeAPIConfigRequest) returns (FindNodeAPIConfigResponse);`

**请求对象 (`FindNodeAPIConfigRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`FindNodeAPIConfigResponse`)**

```json
{
  "apiNodeAddrsJSON": "bytes"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findNodeAPIConfig" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findNodeDDoSProtection
> 获取节点的DDoS设置

- 角色：`node`, `admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findNodeDDoSProtection`
- RPC：`rpc findNodeDDoSProtection(FindNodeDDoSProtectionRequest) returns (FindNodeDDoSProtectionResponse);`

**请求对象 (`FindNodeDDoSProtectionRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`FindNodeDDoSProtectionResponse`)**

```json
{
  "ddosProtectionJSON": "bytes"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findNodeDDoSProtection" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findNodeDNSResolver
> 读取节点DNS Resolver

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findNodeDNSResolver`
- RPC：`rpc findNodeDNSResolver(FindNodeDNSResolverRequest) returns (FindNodeDNSResolverResponse);`

**请求对象 (`FindNodeDNSResolverRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`FindNodeDNSResolverResponse`)**

```json
{
  "dnsResolverJSON": "bytes"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findNodeDNSResolver" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findNodeGlobalServerConfig
> 取得节点的服务全局配置

- 角色：`node`, `admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findNodeGlobalServerConfig`
- RPC：`rpc findNodeGlobalServerConfig(FindNodeGlobalServerConfigRequest) returns (FindNodeGlobalServerConfigResponse);`

**请求对象 (`FindNodeGlobalServerConfigRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`FindNodeGlobalServerConfigResponse`)**

```json
{
  "globalServerConfigJSON": "bytes"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findNodeGlobalServerConfig" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findNodeInitScript
> 获取节点初始化脚本

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findNodeInitScript`
- RPC：`rpc findNodeInitScript(FindNodeInitScriptRequest) returns (FindNodeInitScriptResponse);`

**请求对象 (`FindNodeInitScriptRequest`)**

```json
{
  "scriptId": "int64"
}
```

**响应对象 (`FindNodeInitScriptResponse`)**

```json
{
  "nodeInitScript": "NodeInitScript"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findNodeInitScript" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findNodeInstallStatus
> 读取节点安装状态

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findNodeInstallStatus`
- RPC：`rpc findNodeInstallStatus (FindNodeInstallStatusRequest) returns (FindNodeInstallStatusResponse);`

**请求对象 (`FindNodeInstallStatusRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`FindNodeInstallStatusResponse`)**

```json
{
  "installStatus": "NodeInstallStatus"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findNodeInstallStatus" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## findNodeScheduleInfo
> 查找节点调度信息

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/findNodeScheduleInfo`
- RPC：`rpc findNodeScheduleInfo(FindNodeScheduleInfoRequest) returns (FindNodeScheduleInfoResponse);`

**请求对象 (`FindNodeScheduleInfoRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`FindNodeScheduleInfoResponse`)**

```json
{
  "scheduleInfo": "ScheduleInfo // 调度信息",
  "offlineDay": "string // 下线日期，格式YYYYMMDD",
  "isBackupForCluster": "bool // 是否为集群备份节点",
  "isBackupForGroup": "bool // 是否为分组备份节点",
  "backupIPs": "[]string // 备用IP",
  "actionStatusJSON": "bytes // 动作状态"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/findNodeScheduleInfo" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## installNode
> 安装节点

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/installNode`
- RPC：`rpc installNode (InstallNodeRequest) returns (InstallNodeResponse);`

**请求对象 (`InstallNodeRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "initScriptId": "int64"
}
```

**响应对象 (`InstallNodeResponse`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/installNode" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## listEnabledNodesMatch
> 列出单页节点

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/listEnabledNodesMatch`
- RPC：`rpc listEnabledNodesMatch (ListEnabledNodesMatchRequest) returns (ListEnabledNodesMatchResponse);`

**请求对象 (`ListEnabledNodesMatchRequest`)**

```json
{
  "offset": "int64 // 读取位置",
  "size": "int64 // 读取数量",
  "nodeClusterId": "int64 // 集群ID",
  "installState": "int32 // 安装状态",
  "activeState": "int32 // 在线状态",
  "keyword": "string // 关键词",
  "nodeGroupId": "int64 // 节点分组ID",
  "nodeRegionId": "int64 // 节点区域ID",
  "level": "int32 // 节点级别，目前只有1（L1）和2（L2）",
  "cpuAsc": "bool",
  "cpuDesc": "bool",
  "memoryAsc": "bool",
  "memoryDesc": "bool",
  "trafficInAsc": "bool",
  "trafficInDesc": "bool",
  "trafficOutAsc": "bool",
  "trafficOutDesc": "bool",
  "loadAsc": "bool",
  "loadDesc": "bool",
  "connectionsAsc": "bool",
  "connectionsDesc": "bool"
}
```

**响应对象 (`ListEnabledNodesMatchResponse`)**

```json
{
  "nodes": "[]Node"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/listEnabledNodesMatch" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## listNodeInitScript
> 列表节点初始化脚本

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/listNodeInitScript`
- RPC：`rpc listNodeInitScript(ListNodeInitScriptRequest) returns (ListNodeInitScriptResponse);`

**请求对象 (`ListNodeInitScriptRequest`)**

```json
{
  "offset": "int64 // 读取位置",
  "size": "int64 // 读取数量"
}
```

**响应对象 (`ListNodeInitScriptResponse`)**

```json
{
  "nodeInitScripts": "[]NodeInitScript"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/listNodeInitScript" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## listNodeRegionInfo
> 列出单页节点区域信息

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/listNodeRegionInfo`
- RPC：`rpc listNodeRegionInfo(ListNodeRegionInfoRequest) returns (ListNodeRegionInfoResponse);`

**请求对象 (`ListNodeRegionInfoRequest`)**

```json
{
  "nodeRegionId": "int64 // 区域ID，可选",
  "offset": "int64 // 读取位置",
  "size": "int64 // 数量，通常不能小于0"
}
```

**响应对象 (`ListNodeRegionInfoResponse`)**

```json
{
  "infoList": "[]Info",
  "id": "int64",
  "name": "string // 名称",
  "nodeRegion": "NodeRegion",
  "nodeCluster": "NodeCluster"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/listNodeRegionInfo" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## resetNodeActionStatus
> 重置节点动作状态

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/resetNodeActionStatus`
- RPC：`rpc resetNodeActionStatus(ResetNodeActionStatusRequest) returns (RPCSuccess);`

**请求对象 (`ResetNodeActionStatusRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/resetNodeActionStatus" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## sendCommandToNode
> 向节点发送命令

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/sendCommandToNode`
- RPC：`rpc sendCommandToNode (NodeStreamMessage) returns (NodeStreamMessage);`

**请求对象 (`NodeStreamMessage`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "requestId": "int64",
  "timeoutSeconds": "int32",
  "code": "string",
  "dataJSON": "bytes",
  "isOk": "bool",
  "message": "string"
}
```

**响应对象 (`NodeStreamMessage`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "requestId": "int64",
  "timeoutSeconds": "int32",
  "code": "string",
  "dataJSON": "bytes",
  "isOk": "bool",
  "message": "string"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/sendCommandToNode" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## startNode
> 启动节点

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/startNode`
- RPC：`rpc startNode (StartNodeRequest) returns (StartNodeResponse);`

**请求对象 (`StartNodeRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`StartNodeResponse`)**

```json
{
  "isOk": "bool",
  "error": "string"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/startNode" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## stopNode
> 停止节点

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/stopNode`
- RPC：`rpc stopNode (StopNodeRequest) returns (StopNodeResponse);`

**请求对象 (`StopNodeRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`StopNodeResponse`)**

```json
{
  "isOk": "bool // 是否成功",
  "error": "string // 失败时的错误信息"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/stopNode" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## uninstallNode
> 卸载节点

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/uninstallNode`
- RPC：`rpc uninstallNode(UninstallNodeRequest) returns (UninstallNodeResponse);`

**请求对象 (`UninstallNodeRequest`)**

```json
{
  "nodeId": "int64 // 节点ID"
}
```

**响应对象 (`UninstallNodeResponse`)**

```json
{
  "isOk": "bool // 是否成功",
  "error": "string // 失败时的错误信息"
}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/uninstallNode" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNode
> 修改节点

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNode`
- RPC：`rpc updateNode (UpdateNodeRequest) returns (RPCSuccess);`

**请求对象 (`UpdateNodeRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "name": "string // 名称",
  "nodeClusterId": "int64 // 集群ID",
  "secondaryNodeClusterIds": "[]int64",
  "isOn": "bool // 是否启用",
  "nodeGroupId": "int64",
  "nodeRegionId": "int64",
  "level": "int32",
  "lnAddrs": "[]string // Ln节点访问地址",
  "enableIPLists": "bool // 是否启用IP名单"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNode" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNodeAPIConfig
> 修改某个节点的API相关配置

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNodeAPIConfig`
- RPC：`rpc updateNodeAPIConfig(UpdateNodeAPIConfigRequest) returns (RPCSuccess);`

**请求对象 (`UpdateNodeAPIConfigRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "apiNodeAddrsJSON": "bytes"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNodeAPIConfig" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNodeBypassMobile
> 修改节点是否过移动

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNodeBypassMobile`
- RPC：`rpc updateNodeBypassMobile(UpdateNodeBypassMobile) returns (RPCSuccess);`

**请求对象 (`UpdateNodeBypassMobile`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "bypassMobile": "int32"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNodeBypassMobile" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNodeCache
> 修改节点缓存设置

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNodeCache`
- RPC：`rpc updateNodeCache(UpdateNodeCacheRequest) returns (RPCSuccess);`

**请求对象 (`UpdateNodeCacheRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "maxCacheDiskCapacity": "SizeCapacity // 磁盘容量限制",
  "maxCacheMemoryCapacity": "SizeCapacity // 内存容量限制",
  "cacheDiskDir": "string // 磁盘缓存目录",
  "cacheDiskSubDirsJSON": "bytes // 磁盘缓存子目录"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNodeCache" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNodeDDoSProtection
> 修改节点的DDoS设置

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNodeDDoSProtection`
- RPC：`rpc updateNodeDDoSProtection(UpdateNodeDDoSProtectionRequest) returns (RPCSuccess);`

**请求对象 (`UpdateNodeDDoSProtectionRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "ddosProtectionJSON": "bytes"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNodeDDoSProtection" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNodeDNS
> 修改节点的DNS解析信息

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNodeDNS`
- RPC：`rpc updateNodeDNS (UpdateNodeDNSRequest) returns (RPCSuccess);`

**请求对象 (`UpdateNodeDNSRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "ipAddr": "string",
  "nodeIPAddressId": "int64",
  "dnsDomainId": "int64",
  "routes": "[]string"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNodeDNS" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNodeDNSResolver
> 修改DNS Resolver

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNodeDNSResolver`
- RPC：`rpc updateNodeDNSResolver(UpdateNodeDNSResolverRequest) returns (RPCSuccess);`

**请求对象 (`UpdateNodeDNSResolverRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "dnsResolverJSON": "bytes"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNodeDNSResolver" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNodeInitScript
> 更新节点初始化脚本

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNodeInitScript`
- RPC：`rpc updateNodeInitScript(UpdateNodeInitScriptRequest) returns (RPCSuccess);`

**请求对象 (`UpdateNodeInitScriptRequest`)**

```json
{
  "scriptId": "int64",
  "name": "string // 名称",
  "code": "string"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNodeInitScript" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNodeIsInstalled
> 修改节点安装状态

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNodeIsInstalled`
- RPC：`rpc updateNodeIsInstalled (UpdateNodeIsInstalledRequest) returns (RPCSuccess);`

**请求对象 (`UpdateNodeIsInstalledRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "isInstalled": "bool"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNodeIsInstalled" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNodeIsOn
> 修改节点的启用状态

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNodeIsOn`
- RPC：`rpc updateNodeIsOn(UpdateNodeIsOnRequest) returns (RPCSuccess);`

**请求对象 (`UpdateNodeIsOnRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "isOn": "bool // 是否启用"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNodeIsOn" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNodeLogin
> 修改节点登录信息

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNodeLogin`
- RPC：`rpc updateNodeLogin (UpdateNodeLoginRequest) returns (RPCSuccess);`

**请求对象 (`UpdateNodeLoginRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "nodeLogin": "NodeLogin"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNodeLogin" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNodeRegionInfo
> 修改节点区域信息

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNodeRegionInfo`
- RPC：`rpc updateNodeRegionInfo(UpdateNodeRegionInfoRequest) returns (RPCSuccess);`

**请求对象 (`UpdateNodeRegionInfoRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "nodeRegionId": "int64"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNodeRegionInfo" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNodeScheduleInfo
> 修改节点调度信息

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNodeScheduleInfo`
- RPC：`rpc updateNodeScheduleInfo(UpdateNodeScheduleInfoRequest) returns (RPCSuccess);`

**请求对象 (`UpdateNodeScheduleInfoRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "offlineDay": "string // 下线日期，格式YYYYMMDD",
  "isBackupForCluster": "bool // 是否为集群备份节点",
  "isBackupForGroup": "bool // 是否为分组备份节点",
  "backupIPs": "[]string // 备用IP"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNodeScheduleInfo" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNodeSystem
> 修改节点系统信息

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNodeSystem`
- RPC：`rpc updateNodeSystem(UpdateNodeSystemRequest) returns (RPCSuccess);`

**请求对象 (`UpdateNodeSystemRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "maxCPU": "int32"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNodeSystem" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## updateNodeUp
> 设置节点上线状态

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/updateNodeUp`
- RPC：`rpc updateNodeUp (UpdateNodeUpRequest) returns (RPCSuccess);`

**请求对象 (`UpdateNodeUpRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "isUp": "bool"
}
```

**响应对象 (`RPCSuccess`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/updateNodeUp" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---

## upgradeNode
> 升级节点

- 角色：`admin`
- HTTP：`POST https://backend.dooki.cloud/NodeService/upgradeNode`
- RPC：`rpc upgradeNode (UpgradeNodeRequest) returns (UpgradeNodeResponse);`

**请求对象 (`UpgradeNodeRequest`)**

```json
{
  "nodeId": "int64 // 节点ID",
  "initScriptId": "int64"
}
```

**响应对象 (`UpgradeNodeResponse`)**

```json
{}
```

**调用示例**

```bash
curl -X POST "https://backend.dooki.cloud/NodeService/upgradeNode" \
  -H "Content-Type: application/json" \
  -H "X-Edge-Access-Token: <YOUR_TOKEN>" \
  -d '{
    ...
  }'
```

---
