diff --git a/docs/en/api/api.md b/docs/en/api/api.md
new file mode 100644
index 000000000..85830fb7a
--- /dev/null
+++ b/docs/en/api/api.md
@@ -0,0 +1,2599 @@
+# Dragonfly Manager
+
+
+
+## Overview
+Dragonfly Manager Server
+
+
+### Version information
+*Version* : 1.0.0
+
+
+### License information
+*License* : Apache 2.0
+*Terms of service* : null
+
+
+### URI scheme
+*Host* : localhost:8080
+*BasePath* : /api/v1
+
+
+
+
+
+## Paths
+
+
+### Create CDNCluster
+```
+POST /api/v1/cdn-clusters
+```
+
+
+#### Description
+create by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Body**|**CDNCluster**
*required*|DNCluster|[types.CreateCDNClusterRequest](#types-createcdnclusterrequest)|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.CDNCluster](#model-cdncluster)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* CDNCluster
+
+
+
+### Get CDNClusters
+```
+GET /api/v1/cdn-clusters
+```
+
+
+#### Description
+Get CDNClusters
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|Default|
+|---|---|---|---|---|
+|**Query**|**page**
*required*|current page|integer|`0`|
+|**Query**|**per_page**
*required*|return max item count, default 10, max 50|integer|`10`|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|< [model.CDNCluster](#model-cdncluster) > array|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* CDNCluster
+
+
+
+### Get CDNCluster
+```
+GET /api/v1/cdn-clusters/{id}
+```
+
+
+#### Description
+Get CDNCluster by id
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.CDNCluster](#model-cdncluster)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* CDNCluster
+
+
+
+### Destroy CDNCluster
+```
+DELETE /api/v1/cdn-clusters/{id}
+```
+
+
+#### Description
+Destroy by id
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**404**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* CDNCluster
+
+
+
+### Update CDNCluster
+```
+PATCH /api/v1/cdn-clusters/{id}
+```
+
+
+#### Description
+Update by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+|**Body**|**CDNCluster**
*required*|CDNCluster|[types.UpdateCDNClusterRequest](#types-updatecdnclusterrequest)|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.CDNCluster](#model-cdncluster)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* CDNCluster
+
+
+
+### Add Instance to CDNCluster
+```
+PUT /api/v1/cdn-clusters/{id}/cdns/{cdn_id}
+```
+
+
+#### Description
+Add CDN to CDNCluster
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**cdn_id**
*required*|cdn id|string|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**404**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* CDNCluster
+
+
+
+### Add SchedulerCluster to CDNCluster
+```
+PUT /api/v1/cdn-clusters/{id}/scheduler-clusters/{scheduler_cluster_id}
+```
+
+
+#### Description
+Add SchedulerCluster to CDNCluster
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+|**Path**|**scheduler_cluster_id**
*required*|scheduler cluster id|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**404**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* CDNCluster
+
+
+
+### Create CDN
+```
+POST /api/v1/cdns
+```
+
+
+#### Description
+create by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Body**|**CDN**
*required*|CDN|[types.CreateCDNRequest](#types-createcdnrequest)|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.CDN](#model-cdn)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* CDN
+
+
+
+### Get CDNs
+```
+GET /api/v1/cdns
+```
+
+
+#### Description
+Get CDNs
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|Default|
+|---|---|---|---|---|
+|**Query**|**page**
*required*|current page|integer|`0`|
+|**Query**|**per_page**
*required*|return max item count, default 10, max 50|integer|`10`|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|< [model.CDN](#model-cdn) > array|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* CDN
+
+
+
+### Get CDN
+```
+GET /api/v1/cdns/{id}
+```
+
+
+#### Description
+Get CDN by id
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.CDN](#model-cdn)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* CDN
+
+
+
+### Destroy CDN
+```
+DELETE /api/v1/cdns/{id}
+```
+
+
+#### Description
+Destroy by id
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**404**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* CDN
+
+
+
+### Update CDN
+```
+PATCH /api/v1/cdns/{id}
+```
+
+
+#### Description
+Update by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+|**Body**|**CDN**
*required*|CDN|[types.UpdateCDNRequest](#types-updatecdnrequest)|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.CDN](#model-cdn)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* CDN
+
+
+
+### Get Health
+```
+GET /api/v1/healthy
+```
+
+
+#### Description
+Get app health
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**404**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Health
+
+
+
+### Create Oauth
+```
+POST /api/v1/oauth
+```
+
+
+#### Description
+create by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Body**|**Oauth**
*required*|Oauth|[types.CreateOauthRequest](#types-createoauthrequest)|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.Oauth](#model-oauth)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Oauth
+
+
+
+### Get Oauths
+```
+GET /api/v1/oauth
+```
+
+
+#### Description
+Get Oauths
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|Default|
+|---|---|---|---|---|
+|**Query**|**page**
*required*|current page|integer|`0`|
+|**Query**|**per_page**
*required*|return max item count, default 10, max 50|integer|`10`|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|< [model.Oauth](#model-oauth) > array|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Oauth
+
+
+
+### Get Oauth
+```
+GET /api/v1/oauth/{id}
+```
+
+
+#### Description
+Get Oauth by id
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.Oauth](#model-oauth)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Oauth
+
+
+
+### Destroy Oauth
+```
+DELETE /api/v1/oauth/{id}
+```
+
+
+#### Description
+Destroy by id
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**404**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Oauth
+
+
+
+### Update Oauth
+```
+PATCH /api/v1/oauth/{id}
+```
+
+
+#### Description
+Update by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+|**Body**|**Oauth**
*required*|Oauth|[types.UpdateOauthRequest](#types-updateoauthrequest)|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.Oauth](#model-oauth)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Oauth
+
+
+
+### Get Permissions
+```
+GET /api/v1/permissions
+```
+
+
+#### Description
+Get Permissions
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|< [rbac.Permission](#rbac-permission) > array|
+|**400**||No Content|
+|**500**||No Content|
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Permission
+
+
+
+### Create Preheat
+```
+POST /api/v1/preheats
+```
+
+
+#### Description
+create by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Body**|**CDN**
*required*|Preheat|[types.CreatePreheatRequest](#types-createpreheatrequest)|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[types.Preheat](#types-preheat)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Preheat
+
+
+
+### Get Preheat
+```
+GET /api/v1/preheats/{id}
+```
+
+
+#### Description
+Get Preheat by id
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[types.Preheat](#types-preheat)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Preheat
+
+
+
+### Create Role
+```
+POST /api/v1/roles
+```
+
+
+#### Description
+Create Role by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Body**|**Role**
*required*|Role|[types.CreateRoleRequest](#types-createrolerequest)|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Role
+
+
+
+### Get Roles
+```
+GET /api/v1/roles
+```
+
+
+#### Description
+Get roles
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Role
+
+
+
+### Get Role
+```
+GET /api/v1/roles/:role
+```
+
+
+#### Description
+Get Role
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**role**
*required*|role|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Role
+
+
+
+### Destroy Role
+```
+DELETE /api/v1/roles/:role
+```
+
+
+#### Description
+Destroy role by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**role**
*required*|role|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Role
+
+
+
+### Add Permission For Role
+```
+POST /api/v1/roles/:role/permissions
+```
+
+
+#### Description
+Add Permission by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**role**
*required*|role|string|
+|**Body**|**Permission**
*required*|Permission|[types.AddPermissionForRoleRequest](#types-addpermissionforrolerequest)|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Role
+
+
+
+### Update Role
+```
+DELETE /api/v1/roles/:role/permissions
+```
+
+
+#### Description
+Remove Role Permission by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**role**
*required*|role|string|
+|**Body**|**Permission**
*required*|Permission|[types.DeletePermissionForRoleRequest](#types-deletepermissionforrolerequest)|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Role
+
+
+
+### Create SchedulerCluster
+```
+POST /api/v1/scheduler-clusters
+```
+
+
+#### Description
+create by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Body**|**SchedulerCluster**
*required*|SchedulerCluster|[types.CreateSchedulerClusterRequest](#types-createschedulerclusterrequest)|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.SchedulerCluster](#model-schedulercluster)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* SchedulerCluster
+
+
+
+### Get SchedulerClusters
+```
+GET /api/v1/scheduler-clusters
+```
+
+
+#### Description
+Get SchedulerClusters
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|Default|
+|---|---|---|---|---|
+|**Query**|**page**
*required*|current page|integer|`0`|
+|**Query**|**per_page**
*required*|return max item count, default 10, max 50|integer|`10`|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|< [model.SchedulerCluster](#model-schedulercluster) > array|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* SchedulerCluster
+
+
+
+### Get SchedulerCluster
+```
+GET /api/v1/scheduler-clusters/{id}
+```
+
+
+#### Description
+Get SchedulerCluster by id
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.SchedulerCluster](#model-schedulercluster)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* SchedulerCluster
+
+
+
+### Destroy SchedulerCluster
+```
+DELETE /api/v1/scheduler-clusters/{id}
+```
+
+
+#### Description
+Destroy by id
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**404**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* SchedulerCluster
+
+
+
+### Update SchedulerCluster
+```
+PATCH /api/v1/scheduler-clusters/{id}
+```
+
+
+#### Description
+Update by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+|**Body**|**SchedulerCluster**
*required*|SchedulerCluster|[types.UpdateSchedulerClusterRequest](#types-updateschedulerclusterrequest)|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.SchedulerCluster](#model-schedulercluster)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* SchedulerCluster
+
+
+
+### Add Scheduler to schedulerCluster
+```
+PUT /api/v1/scheduler-clusters/{id}/schedulers/{scheduler_id}
+```
+
+
+#### Description
+Add Scheduler to schedulerCluster
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+|**Path**|**scheduler_id**
*required*|scheduler id|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**404**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* SchedulerCluster
+
+
+
+### Create Scheduler
+```
+POST /api/v1/schedulers
+```
+
+
+#### Description
+create by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Body**|**Scheduler**
*required*|Scheduler|[types.CreateSchedulerRequest](#types-createschedulerrequest)|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.Scheduler](#model-scheduler)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Scheduler
+
+
+
+### Get Schedulers
+```
+GET /api/v1/schedulers
+```
+
+
+#### Description
+Get Schedulers
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|Default|
+|---|---|---|---|---|
+|**Query**|**page**
*required*|current page|integer|`0`|
+|**Query**|**per_page**
*required*|return max item count, default 10, max 50|integer|`10`|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|< [model.Scheduler](#model-scheduler) > array|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Scheduler
+
+
+
+### Get Scheduler
+```
+GET /api/v1/schedulers/{id}
+```
+
+
+#### Description
+Get Scheduler by id
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.Scheduler](#model-scheduler)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Scheduler
+
+
+
+### Destroy Scheduler
+```
+DELETE /api/v1/schedulers/{id}
+```
+
+
+#### Description
+Destroy by id
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**404**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Scheduler
+
+
+
+### Update Scheduler
+```
+PATCH /api/v1/schedulers/{id}
+```
+
+
+#### Description
+Update by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+|**Body**|**Scheduler**
*required*|Scheduler|[types.UpdateSchedulerRequest](#types-updateschedulerrequest)|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.Scheduler](#model-scheduler)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Scheduler
+
+
+
+### Create SecurityGroup
+```
+POST /api/v1/security-groups
+```
+
+
+#### Description
+create by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Body**|**SecurityGroup**
*required*|SecurityGroup|[types.CreateSecurityGroupRequest](#types-createsecuritygrouprequest)|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.SecurityGroup](#model-securitygroup)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* SecurityGroup
+
+
+
+### Get SecurityGroups
+```
+GET /api/v1/security-groups
+```
+
+
+#### Description
+Get SecurityGroups
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|Default|
+|---|---|---|---|---|
+|**Query**|**page**
*required*|current page|integer|`0`|
+|**Query**|**per_page**
*required*|return max item count, default 10, max 50|integer|`10`|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|< [model.SecurityGroup](#model-securitygroup) > array|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* SecurityGroup
+
+
+
+### Get SecurityGroup
+```
+GET /api/v1/security-groups/{id}
+```
+
+
+#### Description
+Get SecurityGroup by id
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.SecurityGroup](#model-securitygroup)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* SecurityGroup
+
+
+
+### Update SecurityGroup
+```
+PATCH /api/v1/security-groups/{id}
+```
+
+
+#### Description
+Update by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+|**Body**|**SecurityGroup**
*required*|SecurityGroup|[types.UpdateSecurityGroupRequest](#types-updatesecuritygrouprequest)|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.SecurityGroup](#model-securitygroup)|
+|**400**||No Content|
+|**404**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* SecurityGroup
+
+
+
+### Add CDN to SecurityGroup
+```
+PUT /api/v1/security-groups/{id}/cdn-clusters/{cdn_cluster_id}
+```
+
+
+#### Description
+Add CDN to SecurityGroup
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**cdn_cluster_id**
*required*|cdn cluster id|string|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**404**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* SecurityGroup
+
+
+
+### Add Scheduler to SecurityGroup
+```
+PUT /api/v1/security-groups/{id}/scheduler-clusters/{scheduler_cluster_id}
+```
+
+
+#### Description
+Add Scheduler to SecurityGroup
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+|**Path**|**scheduler_cluster_id**
*required*|scheduler cluster id|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**404**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* SecurityGroup
+
+
+
+### Destroy SecurityGroup
+```
+DELETE /api/v1/securityGroups/{id}
+```
+
+
+#### Description
+Destroy by id
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**404**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* SecurityGroup
+
+
+
+### Oauth Signin
+```
+GET /api/v1/user/signin/{name}
+```
+
+
+#### Description
+oauth signin by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**name**
*required*|name|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**404**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* User
+
+
+
+### Oauth Signin Callback
+```
+GET /api/v1/user/signin/{name}/callback
+```
+
+
+#### Description
+oauth signin callback by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**name**
*required*|name|string|
+|**Query**|**code**
*required*|code|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**404**|No Content|
+|**500**|No Content|
+
+
+#### Tags
+
+* Oauth
+
+
+
+### SignUp user
+```
+POST /api/v1/user/signup
+```
+
+
+#### Description
+signup by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Body**|**User**
*required*|User|[types.SignUpRequest](#types-signuprequest)|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|[model.User](#model-user)|
+|**400**||No Content|
+|**500**||No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* User
+
+
+
+### Reset Password For User
+```
+POST /api/v1/users/:id/reset_password
+```
+
+
+#### Description
+reset password by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Body**|**User**
*required*|User|[types.ResetPasswordRequest](#types-resetpasswordrequest)|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* User
+
+
+
+### Get User Roles
+```
+GET /api/v1/users/:id/roles
+```
+
+
+#### Description
+get roles by json config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+
+
+#### Responses
+
+|HTTP Code|Description|Schema|
+|---|---|---|
+|**200**|OK|< string > array|
+|**400**||No Content|
+|**500**||No Content|
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* User
+
+
+
+### Add Role For User
+```
+PUT /api/v1/users/:id/roles/:role
+```
+
+
+#### Description
+add role to user by uri config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+|**Path**|**role**
*required*|role|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Users
+
+
+
+### Delete Role For User
+```
+DELETE /api/v1/users/:id/roles/:role
+```
+
+
+#### Description
+delete role by uri config
+
+
+#### Parameters
+
+|Type|Name|Description|Schema|
+|---|---|---|---|
+|**Path**|**id**
*required*|id|string|
+|**Path**|**role**
*required*|role|string|
+
+
+#### Responses
+
+|HTTP Code|Schema|
+|---|---|
+|**200**|No Content|
+|**400**|No Content|
+|**500**|No Content|
+
+
+#### Consumes
+
+* `application/json`
+
+
+#### Produces
+
+* `application/json`
+
+
+#### Tags
+
+* Users
+
+
+
+
+
+## Definitions
+
+
+### model.Assertion
+
+|Name|Schema|
+|---|---|
+|**key**
*optional*|string|
+|**policy**
*optional*|< < string > array > array|
+|**policyMap**
*optional*|< string, integer > map|
+|**rm**
*optional*|[rbac.RoleManager](#rbac-rolemanager)|
+|**tokens**
*optional*|< string > array|
+|**value**
*optional*|string|
+
+
+
+### model.AssertionMap
+*Type* : < string, [model.Assertion](#model-assertion) > map
+
+
+
+### model.CDN
+
+|Name|Schema|
+|---|---|
+|**cdnclusterID**
*optional*|integer|
+|**download_port**
*optional*|integer|
+|**host_name**
*optional*|string|
+|**idc**
*optional*|string|
+|**ip**
*optional*|string|
+|**location**
*optional*|string|
+|**port**
*optional*|integer|
+|**status**
*optional*|string|
+
+
+
+### model.CDNCluster
+
+|Name|Schema|
+|---|---|
+|**bio**
*optional*|string|
+|**config**
*optional*|[model.JSONMap](#model-jsonmap)|
+|**is_default**
*optional*|boolean|
+|**name**
*optional*|string|
+|**securityGroupID**
*optional*|integer|
+
+
+
+### model.JSONMap
+*Type* : object
+
+
+
+### model.Oauth
+
+|Name|Schema|
+|---|---|
+|**bio**
*optional*|string|
+|**client_id**
*optional*|string|
+|**client_secret**
*optional*|string|
+|**name**
*optional*|string|
+|**redirect_url**
*optional*|string|
+
+
+
+### model.Scheduler
+
+|Name|Schema|
+|---|---|
+|**host_name**
*optional*|string|
+|**idc**
*optional*|string|
+|**ip**
*optional*|string|
+|**location**
*optional*|string|
+|**net_config**
*optional*|[model.JSONMap](#model-jsonmap)|
+|**port**
*optional*|integer|
+|**schedulerClusterID**
*optional*|integer|
+|**status**
*optional*|string|
+|**vips**
*optional*|string|
+
+
+
+### model.SchedulerCluster
+
+|Name|Schema|
+|---|---|
+|**bio**
*optional*|string|
+|**client_config**
*optional*|[model.JSONMap](#model-jsonmap)|
+|**config**
*optional*|[model.JSONMap](#model-jsonmap)|
+|**is_default**
*optional*|boolean|
+|**name**
*optional*|string|
+|**scopes**
*optional*|[model.JSONMap](#model-jsonmap)|
+|**securityGroupID**
*optional*|integer|
+
+
+
+### model.SecurityGroup
+
+|Name|Schema|
+|---|---|
+|**bio**
*optional*|string|
+|**domain**
*optional*|string|
+|**name**
*optional*|string|
+|**proxy_domain**
*optional*|string|
+
+
+
+### model.User
+
+|Name|Schema|
+|---|---|
+|**avatar**
*optional*|string|
+|**bio**
*optional*|string|
+|**email**
*optional*|string|
+|**location**
*optional*|string|
+|**name**
*optional*|string|
+|**phone**
*optional*|string|
+|**private_token**
*optional*|string|
+|**state**
*optional*|string|
+
+
+
+### rbac.Permission
+
+|Name|Schema|
+|---|---|
+|**action**
*required*|string|
+|**object**
*required*|string|
+
+
+
+### rbac.RoleManager
+*Type* : object
+
+
+
+### types.AddPermissionForRoleRequest
+
+|Name|Schema|
+|---|---|
+|**action**
*required*|string|
+|**object**
*required*|string|
+
+
+
+### types.CreateCDNClusterRequest
+
+|Name|Schema|
+|---|---|
+|**bio**
*optional*|string|
+|**config**
*required*|object|
+|**name**
*required*|string|
+|**security_group_domain**
*optional*|string|
+
+
+
+### types.CreateCDNRequest
+
+|Name|Schema|
+|---|---|
+|**cdn_cluster_id**
*required*|integer|
+|**download_port**
*required*|integer|
+|**host_name**
*required*|string|
+|**idc**
*required*|string|
+|**ip**
*required*|string|
+|**location**
*optional*|string|
+|**port**
*required*|integer|
+
+
+
+### types.CreateOauthRequest
+
+|Name|Schema|
+|---|---|
+|**bio**
*optional*|string|
+|**client_id**
*required*|string|
+|**client_secret**
*required*|string|
+|**name**
*required*|string|
+|**redirect_url**
*optional*|string|
+
+
+
+### types.CreatePreheatRequest
+
+|Name|Schema|
+|---|---|
+|**filter**
*optional*|string|
+|**headers**
*optional*|< string, string > map|
+|**scheduler_cluster_id**
*optional*|integer|
+|**type**
*required*|string|
+|**url**
*required*|string|
+
+
+
+### types.CreateRoleRequest
+
+|Name|Schema|
+|---|---|
+|**permissions**
*required*|< [rbac.Permission](#rbac-permission) > array|
+|**role**
*required*|string|
+
+
+
+### types.CreateSchedulerClusterRequest
+
+|Name|Schema|
+|---|---|
+|**bio**
*optional*|string|
+|**cdn_cluster_id**
*optional*|integer|
+|**client_config**
*required*|object|
+|**config**
*required*|object|
+|**is_default**
*optional*|boolean|
+|**name**
*required*|string|
+|**scopes**
*optional*|object|
+|**security_group_domain**
*optional*|string|
+
+
+
+### types.CreateSchedulerRequest
+
+|Name|Schema|
+|---|---|
+|**host_name**
*required*|string|
+|**idc**
*required*|string|
+|**ip**
*required*|string|
+|**location**
*optional*|string|
+|**net_config**
*optional*|object|
+|**port**
*required*|integer|
+|**scheduler_cluster_id**
*required*|integer|
+|**vips**
*optional*|string|
+
+
+
+### types.CreateSecurityGroupRequest
+
+|Name|Schema|
+|---|---|
+|**bio**
*optional*|string|
+|**domain**
*required*|string|
+|**name**
*required*|string|
+|**proxy_domain**
*optional*|string|
+
+
+
+### types.DeletePermissionForRoleRequest
+
+|Name|Schema|
+|---|---|
+|**action**
*required*|string|
+|**object**
*required*|string|
+
+
+
+### types.Preheat
+
+|Name|Schema|
+|---|---|
+|**create_at**
*optional*|string|
+|**id**
*optional*|string|
+|**status**
*optional*|string|
+
+
+
+### types.ResetPasswordRequest
+
+|Name|Schema|
+|---|---|
+|**new_password**
*required*|string|
+|**old_password**
*required*|string|
+
+
+
+### types.SignUpRequest
+
+|Name|Schema|
+|---|---|
+|**avatar**
*optional*|string|
+|**bio**
*optional*|string|
+|**email**
*required*|string|
+|**location**
*optional*|string|
+|**name**
*required*|string|
+|**password**
*required*|string|
+|**phone**
*optional*|string|
+
+
+
+### types.UpdateCDNClusterRequest
+
+|Name|Schema|
+|---|---|
+|**bio**
*optional*|string|
+|**config**
*optional*|object|
+|**name**
*optional*|string|
+|**security_group_domain**
*optional*|string|
+
+
+
+### types.UpdateCDNRequest
+
+|Name|Schema|
+|---|---|
+|**cdn_cluster_id**
*optional*|integer|
+|**download_port**
*optional*|integer|
+|**idc**
*optional*|string|
+|**ip**
*optional*|string|
+|**location**
*optional*|string|
+|**port**
*optional*|integer|
+
+
+
+### types.UpdateOauthRequest
+
+|Name|Schema|
+|---|---|
+|**bio**
*optional*|string|
+|**client_id**
*optional*|string|
+|**client_secret**
*optional*|string|
+|**name**
*optional*|string|
+|**redirect_url**
*optional*|string|
+
+
+
+### types.UpdateSchedulerClusterRequest
+
+|Name|Schema|
+|---|---|
+|**bio**
*optional*|string|
+|**cdn_cluster_id**
*optional*|integer|
+|**client_config**
*optional*|object|
+|**config**
*optional*|object|
+|**is_default**
*optional*|boolean|
+|**name**
*optional*|string|
+|**scopes**
*optional*|object|
+|**security_group_domain**
*optional*|string|
+
+
+
+### types.UpdateSchedulerRequest
+
+|Name|Schema|
+|---|---|
+|**idc**
*optional*|string|
+|**ip**
*optional*|string|
+|**location**
*optional*|string|
+|**net_config**
*optional*|object|
+|**port**
*optional*|integer|
+|**scheduler_cluster_id**
*optional*|integer|
+|**scheduler_id**
*optional*|integer|
+|**vips**
*optional*|string|
+
+
+
+### types.UpdateSecurityGroupRequest
+
+|Name|Schema|
+|---|---|
+|**bio**
*optional*|string|
+|**domain**
*optional*|string|
+|**name**
*optional*|string|
+|**proxy_domain**
*optional*|string|
+
+
+
+
+
diff --git a/docs/en/user-guide/preheat/preheat.md b/docs/en/user-guide/preheat/preheat.md
new file mode 100644
index 000000000..223ab74c7
--- /dev/null
+++ b/docs/en/user-guide/preheat/preheat.md
@@ -0,0 +1,39 @@
+# Preheat
+
+P2P provides two types of preheating: `image` and `file`. Users can be preheat in the `console` or directly call `preheat api` for preheating
+
+## Console
+
+TODO
+
+## API
+
+Use preheat apis for preheating. First create a POST request for preheating, you can refer to [create preheat api document](../../api/api.md#create-preheat)
+
+```bash
+curl --request POST 'http://dragonfly-manager:8080/api/v1/preheats' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+ "type": "image",
+ "url": "https://registry-1.docker.io/v2/library/busybox/manifests/latest",
+ "scheduler_cluster_id": 1
+}'
+```
+
+If the output of command above has content like
+
+```bash
+{"id":"group_28439e0b-d4c3-43bf-945e-482b54c49dc5","status":"PENDING","create_at":"2021-10-09T11:54:50.6182794Z"}
+```
+
+Polling the preheating status with id. if status is `SUCCESS`, preheating is successful, you can refer to [get preheat api document](../../api/api.md#get-preheat)
+
+```bash
+curl --request GET 'http://manager-domain:8080/api/v1/preheats/group_28439e0b-d4c3-43bf-945e-482b54c49dc5'
+```
+
+If the status is `SUCCESS`, the preheating is successful.
+
+```bash
+{"id":"group_28439e0b-d4c3-43bf-945e-482b54c49dc5","status":"SUCCESS","create_at":"2021-10-09T11:54:50.5712334Z"}
+```
diff --git a/docs/en/user-guide/quick-start.md b/docs/en/user-guide/quick-start.md
index 596d9452f..6564ccdd6 100644
--- a/docs/en/user-guide/quick-start.md
+++ b/docs/en/user-guide/quick-start.md
@@ -23,3 +23,4 @@ This table describes some container runtimes version and documents.
- Container Runtimes
- [cri-o mirror](../user-guide/registry-mirror/cri-o.md) - make Dragonfly as Registry Mirror for CRIO daemon
- [cri-containerd mirror](../user-guide/registry-mirror/cri-containerd.md) - make Dragonfly as Registry Mirror for containerd daemon
+- [preheat](../user-guide/preheat/preheat.md) - preheat feature
diff --git a/docs/zh-CN/api/api.md b/docs/zh-CN/api/api.md
new file mode 100644
index 000000000..325e937fa
--- /dev/null
+++ b/docs/zh-CN/api/api.md
@@ -0,0 +1,2599 @@
+# Dragonfly Manager
+
+
+
+## 概览
+Dragonfly Manager Server
+
+
+### 版本信息
+*版本* : 1.0.0
+
+
+### 许可信息
+*许可证* : Apache 2.0
+*服务条款* : null
+
+
+### URI scheme
+*域名* : localhost:8080
+*基础路径* : /api/v1
+
+
+
+
+
+## 路径
+
+
+### Create CDNCluster
+```
+POST /api/v1/cdn-clusters
+```
+
+
+#### 说明
+create by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Body**|**CDNCluster**
*必填*|DNCluster|[types.CreateCDNClusterRequest](#types-createcdnclusterrequest)|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.CDNCluster](#model-cdncluster)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* CDNCluster
+
+
+
+### Get CDNClusters
+```
+GET /api/v1/cdn-clusters
+```
+
+
+#### 说明
+Get CDNClusters
+
+
+#### 参数
+
+|类型|名称|说明|类型|默认值|
+|---|---|---|---|---|
+|**Query**|**page**
*必填*|current page|integer|`0`|
+|**Query**|**per_page**
*必填*|return max item count, default 10, max 50|integer|`10`|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|< [model.CDNCluster](#model-cdncluster) > array|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* CDNCluster
+
+
+
+### Get CDNCluster
+```
+GET /api/v1/cdn-clusters/{id}
+```
+
+
+#### 说明
+Get CDNCluster by id
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.CDNCluster](#model-cdncluster)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* CDNCluster
+
+
+
+### Destroy CDNCluster
+```
+DELETE /api/v1/cdn-clusters/{id}
+```
+
+
+#### 说明
+Destroy by id
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**404**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* CDNCluster
+
+
+
+### Update CDNCluster
+```
+PATCH /api/v1/cdn-clusters/{id}
+```
+
+
+#### 说明
+Update by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+|**Body**|**CDNCluster**
*必填*|CDNCluster|[types.UpdateCDNClusterRequest](#types-updatecdnclusterrequest)|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.CDNCluster](#model-cdncluster)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* CDNCluster
+
+
+
+### Add Instance to CDNCluster
+```
+PUT /api/v1/cdn-clusters/{id}/cdns/{cdn_id}
+```
+
+
+#### 说明
+Add CDN to CDNCluster
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**cdn_id**
*必填*|cdn id|string|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**404**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* CDNCluster
+
+
+
+### Add SchedulerCluster to CDNCluster
+```
+PUT /api/v1/cdn-clusters/{id}/scheduler-clusters/{scheduler_cluster_id}
+```
+
+
+#### 说明
+Add SchedulerCluster to CDNCluster
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+|**Path**|**scheduler_cluster_id**
*必填*|scheduler cluster id|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**404**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* CDNCluster
+
+
+
+### Create CDN
+```
+POST /api/v1/cdns
+```
+
+
+#### 说明
+create by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Body**|**CDN**
*必填*|CDN|[types.CreateCDNRequest](#types-createcdnrequest)|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.CDN](#model-cdn)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* CDN
+
+
+
+### Get CDNs
+```
+GET /api/v1/cdns
+```
+
+
+#### 说明
+Get CDNs
+
+
+#### 参数
+
+|类型|名称|说明|类型|默认值|
+|---|---|---|---|---|
+|**Query**|**page**
*必填*|current page|integer|`0`|
+|**Query**|**per_page**
*必填*|return max item count, default 10, max 50|integer|`10`|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|< [model.CDN](#model-cdn) > array|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* CDN
+
+
+
+### Get CDN
+```
+GET /api/v1/cdns/{id}
+```
+
+
+#### 说明
+Get CDN by id
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.CDN](#model-cdn)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* CDN
+
+
+
+### Destroy CDN
+```
+DELETE /api/v1/cdns/{id}
+```
+
+
+#### 说明
+Destroy by id
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**404**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* CDN
+
+
+
+### Update CDN
+```
+PATCH /api/v1/cdns/{id}
+```
+
+
+#### 说明
+Update by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+|**Body**|**CDN**
*必填*|CDN|[types.UpdateCDNRequest](#types-updatecdnrequest)|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.CDN](#model-cdn)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* CDN
+
+
+
+### Get Health
+```
+GET /api/v1/healthy
+```
+
+
+#### 说明
+Get app health
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**404**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Health
+
+
+
+### Create Oauth
+```
+POST /api/v1/oauth
+```
+
+
+#### 说明
+create by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Body**|**Oauth**
*必填*|Oauth|[types.CreateOauthRequest](#types-createoauthrequest)|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.Oauth](#model-oauth)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Oauth
+
+
+
+### Get Oauths
+```
+GET /api/v1/oauth
+```
+
+
+#### 说明
+Get Oauths
+
+
+#### 参数
+
+|类型|名称|说明|类型|默认值|
+|---|---|---|---|---|
+|**Query**|**page**
*必填*|current page|integer|`0`|
+|**Query**|**per_page**
*必填*|return max item count, default 10, max 50|integer|`10`|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|< [model.Oauth](#model-oauth) > array|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Oauth
+
+
+
+### Get Oauth
+```
+GET /api/v1/oauth/{id}
+```
+
+
+#### 说明
+Get Oauth by id
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.Oauth](#model-oauth)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Oauth
+
+
+
+### Destroy Oauth
+```
+DELETE /api/v1/oauth/{id}
+```
+
+
+#### 说明
+Destroy by id
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**404**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Oauth
+
+
+
+### Update Oauth
+```
+PATCH /api/v1/oauth/{id}
+```
+
+
+#### 说明
+Update by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+|**Body**|**Oauth**
*必填*|Oauth|[types.UpdateOauthRequest](#types-updateoauthrequest)|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.Oauth](#model-oauth)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Oauth
+
+
+
+### Get Permissions
+```
+GET /api/v1/permissions
+```
+
+
+#### 说明
+Get Permissions
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|< [rbac.Permission](#rbac-permission) > array|
+|**400**||无内容|
+|**500**||无内容|
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Permission
+
+
+
+### Create Preheat
+```
+POST /api/v1/preheats
+```
+
+
+#### 说明
+create by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Body**|**CDN**
*必填*|Preheat|[types.CreatePreheatRequest](#types-createpreheatrequest)|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[types.Preheat](#types-preheat)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Preheat
+
+
+
+### Get Preheat
+```
+GET /api/v1/preheats/{id}
+```
+
+
+#### 说明
+Get Preheat by id
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[types.Preheat](#types-preheat)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Preheat
+
+
+
+### Create Role
+```
+POST /api/v1/roles
+```
+
+
+#### 说明
+Create Role by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Body**|**Role**
*必填*|Role|[types.CreateRoleRequest](#types-createrolerequest)|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Role
+
+
+
+### Get Roles
+```
+GET /api/v1/roles
+```
+
+
+#### 说明
+Get roles
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Role
+
+
+
+### Get Role
+```
+GET /api/v1/roles/:role
+```
+
+
+#### 说明
+Get Role
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**role**
*必填*|role|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Role
+
+
+
+### Destroy Role
+```
+DELETE /api/v1/roles/:role
+```
+
+
+#### 说明
+Destroy role by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**role**
*必填*|role|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Role
+
+
+
+### Add Permission For Role
+```
+POST /api/v1/roles/:role/permissions
+```
+
+
+#### 说明
+Add Permission by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**role**
*必填*|role|string|
+|**Body**|**Permission**
*必填*|Permission|[types.AddPermissionForRoleRequest](#types-addpermissionforrolerequest)|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Role
+
+
+
+### Update Role
+```
+DELETE /api/v1/roles/:role/permissions
+```
+
+
+#### 说明
+Remove Role Permission by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**role**
*必填*|role|string|
+|**Body**|**Permission**
*必填*|Permission|[types.DeletePermissionForRoleRequest](#types-deletepermissionforrolerequest)|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Role
+
+
+
+### Create SchedulerCluster
+```
+POST /api/v1/scheduler-clusters
+```
+
+
+#### 说明
+create by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Body**|**SchedulerCluster**
*必填*|SchedulerCluster|[types.CreateSchedulerClusterRequest](#types-createschedulerclusterrequest)|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.SchedulerCluster](#model-schedulercluster)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* SchedulerCluster
+
+
+
+### Get SchedulerClusters
+```
+GET /api/v1/scheduler-clusters
+```
+
+
+#### 说明
+Get SchedulerClusters
+
+
+#### 参数
+
+|类型|名称|说明|类型|默认值|
+|---|---|---|---|---|
+|**Query**|**page**
*必填*|current page|integer|`0`|
+|**Query**|**per_page**
*必填*|return max item count, default 10, max 50|integer|`10`|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|< [model.SchedulerCluster](#model-schedulercluster) > array|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* SchedulerCluster
+
+
+
+### Get SchedulerCluster
+```
+GET /api/v1/scheduler-clusters/{id}
+```
+
+
+#### 说明
+Get SchedulerCluster by id
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.SchedulerCluster](#model-schedulercluster)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* SchedulerCluster
+
+
+
+### Destroy SchedulerCluster
+```
+DELETE /api/v1/scheduler-clusters/{id}
+```
+
+
+#### 说明
+Destroy by id
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**404**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* SchedulerCluster
+
+
+
+### Update SchedulerCluster
+```
+PATCH /api/v1/scheduler-clusters/{id}
+```
+
+
+#### 说明
+Update by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+|**Body**|**SchedulerCluster**
*必填*|SchedulerCluster|[types.UpdateSchedulerClusterRequest](#types-updateschedulerclusterrequest)|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.SchedulerCluster](#model-schedulercluster)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* SchedulerCluster
+
+
+
+### Add Scheduler to schedulerCluster
+```
+PUT /api/v1/scheduler-clusters/{id}/schedulers/{scheduler_id}
+```
+
+
+#### 说明
+Add Scheduler to schedulerCluster
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+|**Path**|**scheduler_id**
*必填*|scheduler id|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**404**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* SchedulerCluster
+
+
+
+### Create Scheduler
+```
+POST /api/v1/schedulers
+```
+
+
+#### 说明
+create by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Body**|**Scheduler**
*必填*|Scheduler|[types.CreateSchedulerRequest](#types-createschedulerrequest)|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.Scheduler](#model-scheduler)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Scheduler
+
+
+
+### Get Schedulers
+```
+GET /api/v1/schedulers
+```
+
+
+#### 说明
+Get Schedulers
+
+
+#### 参数
+
+|类型|名称|说明|类型|默认值|
+|---|---|---|---|---|
+|**Query**|**page**
*必填*|current page|integer|`0`|
+|**Query**|**per_page**
*必填*|return max item count, default 10, max 50|integer|`10`|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|< [model.Scheduler](#model-scheduler) > array|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Scheduler
+
+
+
+### Get Scheduler
+```
+GET /api/v1/schedulers/{id}
+```
+
+
+#### 说明
+Get Scheduler by id
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.Scheduler](#model-scheduler)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Scheduler
+
+
+
+### Destroy Scheduler
+```
+DELETE /api/v1/schedulers/{id}
+```
+
+
+#### 说明
+Destroy by id
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**404**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Scheduler
+
+
+
+### Update Scheduler
+```
+PATCH /api/v1/schedulers/{id}
+```
+
+
+#### 说明
+Update by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+|**Body**|**Scheduler**
*必填*|Scheduler|[types.UpdateSchedulerRequest](#types-updateschedulerrequest)|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.Scheduler](#model-scheduler)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Scheduler
+
+
+
+### Create SecurityGroup
+```
+POST /api/v1/security-groups
+```
+
+
+#### 说明
+create by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Body**|**SecurityGroup**
*必填*|SecurityGroup|[types.CreateSecurityGroupRequest](#types-createsecuritygrouprequest)|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.SecurityGroup](#model-securitygroup)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* SecurityGroup
+
+
+
+### Get SecurityGroups
+```
+GET /api/v1/security-groups
+```
+
+
+#### 说明
+Get SecurityGroups
+
+
+#### 参数
+
+|类型|名称|说明|类型|默认值|
+|---|---|---|---|---|
+|**Query**|**page**
*必填*|current page|integer|`0`|
+|**Query**|**per_page**
*必填*|return max item count, default 10, max 50|integer|`10`|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|< [model.SecurityGroup](#model-securitygroup) > array|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* SecurityGroup
+
+
+
+### Get SecurityGroup
+```
+GET /api/v1/security-groups/{id}
+```
+
+
+#### 说明
+Get SecurityGroup by id
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.SecurityGroup](#model-securitygroup)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* SecurityGroup
+
+
+
+### Update SecurityGroup
+```
+PATCH /api/v1/security-groups/{id}
+```
+
+
+#### 说明
+Update by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+|**Body**|**SecurityGroup**
*必填*|SecurityGroup|[types.UpdateSecurityGroupRequest](#types-updatesecuritygrouprequest)|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.SecurityGroup](#model-securitygroup)|
+|**400**||无内容|
+|**404**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* SecurityGroup
+
+
+
+### Add CDN to SecurityGroup
+```
+PUT /api/v1/security-groups/{id}/cdn-clusters/{cdn_cluster_id}
+```
+
+
+#### 说明
+Add CDN to SecurityGroup
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**cdn_cluster_id**
*必填*|cdn cluster id|string|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**404**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* SecurityGroup
+
+
+
+### Add Scheduler to SecurityGroup
+```
+PUT /api/v1/security-groups/{id}/scheduler-clusters/{scheduler_cluster_id}
+```
+
+
+#### 说明
+Add Scheduler to SecurityGroup
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+|**Path**|**scheduler_cluster_id**
*必填*|scheduler cluster id|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**404**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* SecurityGroup
+
+
+
+### Destroy SecurityGroup
+```
+DELETE /api/v1/securityGroups/{id}
+```
+
+
+#### 说明
+Destroy by id
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**404**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* SecurityGroup
+
+
+
+### Oauth Signin
+```
+GET /api/v1/user/signin/{name}
+```
+
+
+#### 说明
+oauth signin by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**name**
*必填*|name|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**404**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* User
+
+
+
+### Oauth Signin Callback
+```
+GET /api/v1/user/signin/{name}/callback
+```
+
+
+#### 说明
+oauth signin callback by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**name**
*必填*|name|string|
+|**Query**|**code**
*必填*|code|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**404**|无内容|
+|**500**|无内容|
+
+
+#### 标签
+
+* Oauth
+
+
+
+### SignUp user
+```
+POST /api/v1/user/signup
+```
+
+
+#### 说明
+signup by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Body**|**User**
*必填*|User|[types.SignUpRequest](#types-signuprequest)|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|[model.User](#model-user)|
+|**400**||无内容|
+|**500**||无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* User
+
+
+
+### Reset Password For User
+```
+POST /api/v1/users/:id/reset_password
+```
+
+
+#### 说明
+reset password by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Body**|**User**
*必填*|User|[types.ResetPasswordRequest](#types-resetpasswordrequest)|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* User
+
+
+
+### Get User Roles
+```
+GET /api/v1/users/:id/roles
+```
+
+
+#### 说明
+get roles by json config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+
+
+#### 响应
+
+|HTTP代码|说明|类型|
+|---|---|---|
+|**200**|OK|< string > array|
+|**400**||无内容|
+|**500**||无内容|
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* User
+
+
+
+### Add Role For User
+```
+PUT /api/v1/users/:id/roles/:role
+```
+
+
+#### 说明
+add role to user by uri config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+|**Path**|**role**
*必填*|role|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Users
+
+
+
+### Delete Role For User
+```
+DELETE /api/v1/users/:id/roles/:role
+```
+
+
+#### 说明
+delete role by uri config
+
+
+#### 参数
+
+|类型|名称|说明|类型|
+|---|---|---|---|
+|**Path**|**id**
*必填*|id|string|
+|**Path**|**role**
*必填*|role|string|
+
+
+#### 响应
+
+|HTTP代码|类型|
+|---|---|
+|**200**|无内容|
+|**400**|无内容|
+|**500**|无内容|
+
+
+#### 消耗
+
+* `application/json`
+
+
+#### 生成
+
+* `application/json`
+
+
+#### 标签
+
+* Users
+
+
+
+
+
+## 定义
+
+
+### model.Assertion
+
+|名称|类型|
+|---|---|
+|**key**
*可选*|string|
+|**policy**
*可选*|< < string > array > array|
+|**policyMap**
*可选*|< string, integer > map|
+|**rm**
*可选*|[rbac.RoleManager](#rbac-rolemanager)|
+|**tokens**
*可选*|< string > array|
+|**value**
*可选*|string|
+
+
+
+### model.AssertionMap
+*类型* : < string, [model.Assertion](#model-assertion) > map
+
+
+
+### model.CDN
+
+|名称|类型|
+|---|---|
+|**cdnclusterID**
*可选*|integer|
+|**download_port**
*可选*|integer|
+|**host_name**
*可选*|string|
+|**idc**
*可选*|string|
+|**ip**
*可选*|string|
+|**location**
*可选*|string|
+|**port**
*可选*|integer|
+|**status**
*可选*|string|
+
+
+
+### model.CDNCluster
+
+|名称|类型|
+|---|---|
+|**bio**
*可选*|string|
+|**config**
*可选*|[model.JSONMap](#model-jsonmap)|
+|**is_default**
*可选*|boolean|
+|**name**
*可选*|string|
+|**securityGroupID**
*可选*|integer|
+
+
+
+### model.JSONMap
+*类型* : object
+
+
+
+### model.Oauth
+
+|名称|类型|
+|---|---|
+|**bio**
*可选*|string|
+|**client_id**
*可选*|string|
+|**client_secret**
*可选*|string|
+|**name**
*可选*|string|
+|**redirect_url**
*可选*|string|
+
+
+
+### model.Scheduler
+
+|名称|类型|
+|---|---|
+|**host_name**
*可选*|string|
+|**idc**
*可选*|string|
+|**ip**
*可选*|string|
+|**location**
*可选*|string|
+|**net_config**
*可选*|[model.JSONMap](#model-jsonmap)|
+|**port**
*可选*|integer|
+|**schedulerClusterID**
*可选*|integer|
+|**status**
*可选*|string|
+|**vips**
*可选*|string|
+
+
+
+### model.SchedulerCluster
+
+|名称|类型|
+|---|---|
+|**bio**
*可选*|string|
+|**client_config**
*可选*|[model.JSONMap](#model-jsonmap)|
+|**config**
*可选*|[model.JSONMap](#model-jsonmap)|
+|**is_default**
*可选*|boolean|
+|**name**
*可选*|string|
+|**scopes**
*可选*|[model.JSONMap](#model-jsonmap)|
+|**securityGroupID**
*可选*|integer|
+
+
+
+### model.SecurityGroup
+
+|名称|类型|
+|---|---|
+|**bio**
*可选*|string|
+|**domain**
*可选*|string|
+|**name**
*可选*|string|
+|**proxy_domain**
*可选*|string|
+
+
+
+### model.User
+
+|名称|类型|
+|---|---|
+|**avatar**
*可选*|string|
+|**bio**
*可选*|string|
+|**email**
*可选*|string|
+|**location**
*可选*|string|
+|**name**
*可选*|string|
+|**phone**
*可选*|string|
+|**private_token**
*可选*|string|
+|**state**
*可选*|string|
+
+
+
+### rbac.Permission
+
+|名称|类型|
+|---|---|
+|**action**
*必填*|string|
+|**object**
*必填*|string|
+
+
+
+### rbac.RoleManager
+*类型* : object
+
+
+
+### types.AddPermissionForRoleRequest
+
+|名称|类型|
+|---|---|
+|**action**
*必填*|string|
+|**object**
*必填*|string|
+
+
+
+### types.CreateCDNClusterRequest
+
+|名称|类型|
+|---|---|
+|**bio**
*可选*|string|
+|**config**
*必填*|object|
+|**name**
*必填*|string|
+|**security_group_domain**
*可选*|string|
+
+
+
+### types.CreateCDNRequest
+
+|名称|类型|
+|---|---|
+|**cdn_cluster_id**
*必填*|integer|
+|**download_port**
*必填*|integer|
+|**host_name**
*必填*|string|
+|**idc**
*必填*|string|
+|**ip**
*必填*|string|
+|**location**
*可选*|string|
+|**port**
*必填*|integer|
+
+
+
+### types.CreateOauthRequest
+
+|名称|类型|
+|---|---|
+|**bio**
*可选*|string|
+|**client_id**
*必填*|string|
+|**client_secret**
*必填*|string|
+|**name**
*必填*|string|
+|**redirect_url**
*可选*|string|
+
+
+
+### types.CreatePreheatRequest
+
+|名称|类型|
+|---|---|
+|**filter**
*可选*|string|
+|**headers**
*可选*|< string, string > map|
+|**scheduler_cluster_id**
*可选*|integer|
+|**type**
*必填*|string|
+|**url**
*必填*|string|
+
+
+
+### types.CreateRoleRequest
+
+|名称|类型|
+|---|---|
+|**permissions**
*必填*|< [rbac.Permission](#rbac-permission) > array|
+|**role**
*必填*|string|
+
+
+
+### types.CreateSchedulerClusterRequest
+
+|名称|类型|
+|---|---|
+|**bio**
*可选*|string|
+|**cdn_cluster_id**
*可选*|integer|
+|**client_config**
*必填*|object|
+|**config**
*必填*|object|
+|**is_default**
*可选*|boolean|
+|**name**
*必填*|string|
+|**scopes**
*可选*|object|
+|**security_group_domain**
*可选*|string|
+
+
+
+### types.CreateSchedulerRequest
+
+|名称|类型|
+|---|---|
+|**host_name**
*必填*|string|
+|**idc**
*必填*|string|
+|**ip**
*必填*|string|
+|**location**
*可选*|string|
+|**net_config**
*可选*|object|
+|**port**
*必填*|integer|
+|**scheduler_cluster_id**
*必填*|integer|
+|**vips**
*可选*|string|
+
+
+
+### types.CreateSecurityGroupRequest
+
+|名称|类型|
+|---|---|
+|**bio**
*可选*|string|
+|**domain**
*必填*|string|
+|**name**
*必填*|string|
+|**proxy_domain**
*可选*|string|
+
+
+
+### types.DeletePermissionForRoleRequest
+
+|名称|类型|
+|---|---|
+|**action**
*必填*|string|
+|**object**
*必填*|string|
+
+
+
+### types.Preheat
+
+|名称|类型|
+|---|---|
+|**create_at**
*可选*|string|
+|**id**
*可选*|string|
+|**status**
*可选*|string|
+
+
+
+### types.ResetPasswordRequest
+
+|名称|类型|
+|---|---|
+|**new_password**
*必填*|string|
+|**old_password**
*必填*|string|
+
+
+
+### types.SignUpRequest
+
+|名称|类型|
+|---|---|
+|**avatar**
*可选*|string|
+|**bio**
*可选*|string|
+|**email**
*必填*|string|
+|**location**
*可选*|string|
+|**name**
*必填*|string|
+|**password**
*必填*|string|
+|**phone**
*可选*|string|
+
+
+
+### types.UpdateCDNClusterRequest
+
+|名称|类型|
+|---|---|
+|**bio**
*可选*|string|
+|**config**
*可选*|object|
+|**name**
*可选*|string|
+|**security_group_domain**
*可选*|string|
+
+
+
+### types.UpdateCDNRequest
+
+|名称|类型|
+|---|---|
+|**cdn_cluster_id**
*可选*|integer|
+|**download_port**
*可选*|integer|
+|**idc**
*可选*|string|
+|**ip**
*可选*|string|
+|**location**
*可选*|string|
+|**port**
*可选*|integer|
+
+
+
+### types.UpdateOauthRequest
+
+|名称|类型|
+|---|---|
+|**bio**
*可选*|string|
+|**client_id**
*可选*|string|
+|**client_secret**
*可选*|string|
+|**name**
*可选*|string|
+|**redirect_url**
*可选*|string|
+
+
+
+### types.UpdateSchedulerClusterRequest
+
+|名称|类型|
+|---|---|
+|**bio**
*可选*|string|
+|**cdn_cluster_id**
*可选*|integer|
+|**client_config**
*可选*|object|
+|**config**
*可选*|object|
+|**is_default**
*可选*|boolean|
+|**name**
*可选*|string|
+|**scopes**
*可选*|object|
+|**security_group_domain**
*可选*|string|
+
+
+
+### types.UpdateSchedulerRequest
+
+|名称|类型|
+|---|---|
+|**idc**
*可选*|string|
+|**ip**
*可选*|string|
+|**location**
*可选*|string|
+|**net_config**
*可选*|object|
+|**port**
*可选*|integer|
+|**scheduler_cluster_id**
*可选*|integer|
+|**scheduler_id**
*可选*|integer|
+|**vips**
*可选*|string|
+
+
+
+### types.UpdateSecurityGroupRequest
+
+|名称|类型|
+|---|---|
+|**bio**
*可选*|string|
+|**domain**
*可选*|string|
+|**name**
*可选*|string|
+|**proxy_domain**
*可选*|string|
+
+
+
+
+
diff --git a/docs/zh-CN/user-guide/preheat/preheat.md b/docs/zh-CN/user-guide/preheat/preheat.md
new file mode 100644
index 000000000..c7ccd1c91
--- /dev/null
+++ b/docs/zh-CN/user-guide/preheat/preheat.md
@@ -0,0 +1,40 @@
+# 预热
+
+P2P 加速可预热两种类型数据 `image` 和 `file`, 用户可以在控制台操作或者直接调用 api 进行预热。
+
+## Console
+
+TODO
+
+## API
+
+用户使用 api 进行预热。首先发送 POST 请求创建预热任务,具体 api 可以参考文档 [create preheat api document](../../api/api.md#create-preheat)。
+
+```bash
+curl --request POST 'http://dragonfly-manager:8080/api/v1/preheats' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+ "type": "image",
+ "url": "https://registry-1.docker.io/v2/library/busybox/manifests/latest",
+ "scheduler_cluster_id": 1
+}'
+```
+
+命令行日志返回预热任务 ID。
+
+```bash
+{"id":"group_28439e0b-d4c3-43bf-945e-482b54c49dc5","status":"PENDING","create_at":"2021-10-09T11:54:50.6182794Z"}
+```
+
+使用预热任务 ID 轮训查询任务是否成功,具体 api 可以参考文档 [get preheat api document](../../api/api.md#get-preheat)。
+
+
+```bash
+curl --request GET 'http://manager-domain:8080/api/v1/preheats/group_28439e0b-d4c3-43bf-945e-482b54c49dc5'
+```
+
+如果返回预热任务状态为 `SUCCESS`,表示预热成功。
+
+```bash
+{"id":"group_28439e0b-d4c3-43bf-945e-482b54c49dc5","status":"SUCCESS","create_at":"2021-10-09T11:54:50.5712334Z"}
+```
diff --git a/docs/zh-CN/user-guide/quick-start.md b/docs/zh-CN/user-guide/quick-start.md
index 8eb9d95fd..336a1e714 100644
--- a/docs/zh-CN/user-guide/quick-start.md
+++ b/docs/zh-CN/user-guide/quick-start.md
@@ -22,3 +22,4 @@
- Container Runtimes
- [cri-o mirror](../user-guide/registry-mirror/cri-o.md) - 使用 Dragonfly 作为 CRIO daemon 的 Registry Mirror
- [cri-containerd mirror](../user-guide/registry-mirror/cri-containerd.md) - 使用 Dragonfly 作为 containerd daemon 的 Registry Mirror
+- [preheat](../user-guide/preheat/preheat.md) - 预热功能