feat!: probes link to the panel; signed release updates for container nodes [CI]

Probes connect to the panel directly and get the agent list as desired state.
CI signs the image digest of agent and probe releases, the panel forwards the
manifest, and a host updater verifies it with a local public key, pulls by
digest and rolls back when the new version is unhealthy.
This commit is contained in:
justme committed 2026-10-06 22:42:12 +08:00
1 parent c645851c0e
commit 8dd3209a65
57 files changed
+1640 -559

No files matched your search

+304 -35
View File
@@ -3696,7 +3696,7 @@
"tags": [
"admin-build"
],
"summary": "Version, tag, commit and build time of the backend and every agent and probe",
"summary": "Version, tag, commit, build time and update state of the backend and every agent and probe",
"operationId": "build_info_get",
"responses": {
"200": {
@@ -3732,6 +3732,175 @@
}
}
},
"/api/admin/releases": {
"get": {
"tags": [
"admin-build"
],
"summary": "The latest signed release manifest of each component",
"operationId": "releases_list",
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PageDtoOfReleaseDto"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDto"
}
}
}
},
"403": {
"description": "Forbidden",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDto"
}
}
}
}
}
},
"post": {
"tags": [
"admin-build"
],
"summary": "Register a CI-signed release manifest; online nodes get it right away (their updaters verify the signature)",
"operationId": "releases_publish",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PublishReleaseRequest"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ReleaseDto"
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDto"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDto"
}
}
}
},
"403": {
"description": "Forbidden",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDto"
}
}
}
},
"409": {
"description": "Conflict",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDto"
}
}
}
}
}
}
},
"/api/admin/nodes/{id}/update": {
"post": {
"tags": [
"admin-build"
],
"summary": "Ask an online agent or probe to install the release it has been offered",
"operationId": "nodes_update",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"204": {
"description": "No Content",
"content": {
"application/json": {
"schema": { }
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDto"
}
}
}
},
"403": {
"description": "Forbidden",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDto"
}
}
}
},
"409": {
"description": "Conflict",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDto"
}
}
}
}
}
}
},
"/healthz": {
"get": {
"tags": [
@@ -4136,34 +4305,6 @@
}
}
},
"BootstrapAgentDto": {
"required": [
"agent_id",
"host",
"tcp_port",
"spki"
],
"type": "object",
"properties": {
"agent_id": {
"type": "string"
},
"host": {
"type": "string"
},
"tcp_port": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"spki": {
"type": "string"
}
}
},
"BuildDto": {
"required": [
"version",
@@ -5568,6 +5709,16 @@
"null",
"string"
]
},
"update": {
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/components/schemas/NodeUpdateDto"
}
]
}
}
},
@@ -5640,6 +5791,49 @@
}
}
},
"NodeUpdateDto": {
"required": [
"state",
"current_digest",
"available_tag",
"available_version",
"error",
"at"
],
"type": "object",
"properties": {
"state": {
"type": "string"
},
"current_digest": {
"type": [
"null",
"string"
]
},
"available_tag": {
"type": [
"null",
"string"
]
},
"available_version": {
"type": [
"null",
"string"
]
},
"error": {
"type": [
"null",
"string"
]
},
"at": {
"format": "date-time"
}
}
},
"OverviewDto": {
"required": [
"range",
@@ -6017,6 +6211,27 @@
}
}
},
"PageDtoOfReleaseDto": {
"required": [
"items",
"next_cursor"
],
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ReleaseDto"
}
},
"next_cursor": {
"type": [
"null",
"string"
]
}
}
},
"PageDtoOfSettingDto": {
"required": [
"items",
@@ -6326,6 +6541,7 @@
"created_at",
"revoked_at",
"revoked",
"online",
"connections"
],
"type": "object",
@@ -6345,6 +6561,9 @@
"revoked": {
"type": "boolean"
},
"online": {
"type": "boolean"
},
"connections": {
"type": "array",
"items": {
@@ -6357,7 +6576,7 @@
"required": [
"probe_id",
"private_key",
"bootstrap",
"server",
"limits"
],
"type": "object",
@@ -6368,11 +6587,8 @@
"private_key": {
"type": "string"
},
"bootstrap": {
"type": "array",
"items": {
"$ref": "#/components/schemas/BootstrapAgentDto"
}
"server": {
"type": "string"
},
"limits": {
"$ref": "#/components/schemas/ProbeLimitsDto"
@@ -6459,6 +6675,27 @@
}
}
},
"PublishReleaseRequest": {
"required": [
"manifest",
"signature"
],
"type": "object",
"properties": {
"manifest": {
"type": [
"null",
"string"
]
},
"signature": {
"type": [
"null",
"string"
]
}
}
},
"RawChunkMetaDto": {
"required": [
"chunk_id",
@@ -6600,6 +6837,38 @@
}
}
},
"ReleaseDto": {
"required": [
"component",
"seq",
"tag",
"version",
"digest"
],
"type": "object",
"properties": {
"component": {
"type": "string"
},
"seq": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int64"
},
"tag": {
"type": "string"
},
"version": {
"type": "string"
},
"digest": {
"type": "string"
}
}
},
"ScoreDto": {
"required": [
"score",