Skip to content

API 接口

CKMAN 提供 RESTful API,所有接口的唯一权威定义是 Swagger,由代码注解自动生成。

📖 浏览所有接口(API Playground) 或在自己的 ckman 实例上启用 swagger_enable 后访问 http://<ckman-host>:8808/swagger/index.html 进行 try-it-out。

不再手写 API 表

本页只描述接口设计原则、鉴权、响应结构与典型集成。具体每个接口的请求/响应字段以 Swagger 为准。

接口前缀

所有 API 均位于 /api/v1 前缀下。

POST /api/login                       # 登录(不带版本前缀)
PUT  /api/logout                      # 登出
GET  /api/v1/<resource>               # 业务接口

鉴权

登录获取 Token

http
POST /api/login
Content-Type: application/json

{
  "username": "ckman",
  "password": "<前端 hash 后的密码>"
}

返回:

json
{
  "retCode": "0000",
  "retMsg": "ok",
  "entity": {
    "username": "ckman",
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
  }
}

密码 hash

前端会先对密码做 hash 再传给服务端。直接用明文调用 /api/login 不会通过。集成调用方需要在自己一侧实现同样的 hash 算法,或使用统一门户 Token 方式(见下文)。

后续请求带 Token

http
GET /api/v1/ck/cluster
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Token 与客户端 IP 绑定,反代时务必设置 X-Forwarded-For

统一门户 Token

适合企业内部系统集成:

http
GET /api/v1/ck/cluster
userToken: <RSA 私钥加密后的内容>

CKMAN 用配置的 server.public_key 解密。优先级高于 JWT。详见server 配置

登出

http
PUT /api/logout
token: <你的 token>

调用后 token 立即失效。

统一响应结构

所有接口返回相同的 JSON 包裹:

json
{
  "retCode": "0000",
  "retMsg": "ok",
  "entity": <实际数据>
}
字段含义
retCode业务返回码,0000 为成功,其他为失败
retMsg返回消息,失败时会包含错误描述(含 ClickHouse 异常时会带具体错误码)
entity业务数据,失败时为 null

错误码列表见错误码

URL 路径占位

占位含义
:clusterName集群名
:taskId任务 ID
:policy_id备份策略 ID
:run_id备份运行记录 ID
:username用户名

权限要求

不同接口对调用方有不同的角色要求,规则汇总在用户与角色权限

简要:

  • admin:所有接口
  • ordinary:表/分区/备份/DML 等运维操作 + guest 全部
  • guest:所有 GET 查询 + 修改自己密码 + ping 节点

未授权访问返回 5009 permission denied

完整接口列表

两种查阅方式:

  • 文档站内浏览(只读)API Playground,无需部署
  • 本地 try-it-out:在自己的 ckman 实例上启用后访问 http://<ckman-host>:8808/swagger/index.html

启用本地 Swagger

默认 Swagger 未开启,在 ckman.hjson 中将 server.swagger_enable 设为 true 并重启即可。本地版本支持直接对接口发起请求。

接口分类速览

代码注解中的接口分类(与 controller 对应):

Tag控制器主要内容
clickhouseClickHouseController集群 CRUD、表、分区、查询、节点、rebalance 等
packagePackageController安装包上传/查询/删除
deployDeployController部署集群
metricMetricControllerPrometheus 指标查询
zookeeperZookeeperControllerZK 状态、复制队列
configConfigControllerCKMAN 版本、实例列表
taskTaskController任务管理
data_manageDataManageController备份策略与运行记录
userUserController用户管理
node_overrideNodeOverrideController节点 override XML 配置
schema_uiSchemaUIController前端表单 JSON Schema

集成示例

Python

python
import hashlib
import requests

# 登录
pwd_hashed = hashlib.md5("Ckman123456!".encode()).hexdigest()
r = requests.post("http://ckman:8808/api/login", json={
    "username": "ckman",
    "password": pwd_hashed,
})
token = r.json()["entity"]["token"]

# 调用业务接口
r = requests.get(
    "http://ckman:8808/api/v1/ck/cluster",
    headers={"token": token},
)
print(r.json()["entity"])

curl

bash
TOKEN=$(curl -s -X POST http://ckman:8808/api/login \
  -H "Content-Type: application/json" \
  -d '{"username":"ckman","password":"<hashed>"}' \
  | jq -r .entity.token)

curl http://ckman:8808/api/v1/ck/cluster -H "token: $TOKEN"

基于 Apache 2.0 协议发布