feat: install nodes and the backend from a static compose file; remove dead code [CI]
ci/woodpecker/push/main-amd64-build Pipeline was successful

Agent, Probe and Backend now start from one static compose.yaml plus a local
.env: the panel (or the release assets, for the very first Backend) provides
the file, the panel's command writes the public values into .env, checks the
file's SHA-256 and runs compose up. Updating is compose pull && compose up -d.
The image is chosen by the CI channel (:latest, or MOSHIRO_VERSION in .env),
not by the panel; the previous one-line script stays as a fallback.

- packaging/compose/{agent,probe,backend}/compose.yaml are the single source,
  embedded in the Backend and served at /install/compose/{file}; the root
  compose.yaml moved there. Releases also carry them and list them in the
  signed SHA256SUMS.
- The container entrypoint defaults the node name to the host name.
- Join token creation returns a compose block (.env, url, hash, per-platform
  commands); the admin dialog leads with it.
- Remove code with no references (HotLayer members, LiveHub.SubscriberCount,
  QueryService.ParseParams, ReleaseService.Forget, a few constants) and reduce
  the install-code lookup to the role it is for.
This commit is contained in:
justme committed 2026-10-08 20:24:23 +08:00
1 parent e014a19554
commit 12be44645f
31 files changed
+492 -176

No files matched your search

+55
View File
@@ -1178,6 +1178,23 @@ export interface paths {
patch?: never;
trace?: never;
};
"/install/compose/{file}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** The static compose file of agent, probe or backend (agent.yaml, probe.yaml, backend.yaml; same bytes for everyone) */
get: operations["install_compose"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/install.ps1": {
parameters: {
query?: never;
@@ -1407,6 +1424,14 @@ export interface components {
[key: string]: null | number | string;
};
};
ComposeInstallDto: {
env: string;
url: string;
sha256: string;
linux: string;
macos: string;
windows: string;
};
ConfirmBackendUpdateRequest: {
/** Format: int64 */
seq: number | string;
@@ -1459,6 +1484,7 @@ export interface components {
token: components["schemas"]["JoinTokenDto"];
plaintext: string;
install_commands: components["schemas"]["InstallCommandsDto"];
compose: components["schemas"]["ComposeInstallDto"];
};
DimensionDto: {
id: string;
@@ -6179,6 +6205,35 @@ export interface operations {
};
};
};
install_compose: {
parameters: {
query?: never;
header?: never;
path: {
file: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
/** @description OK */
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Not Found */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/problem+json": components["schemas"]["ProblemDto"];
};
};
};
};
install_ps1: {
parameters: {
query?: never;
+1
View File
@@ -40,6 +40,7 @@ export type ParamDto = Narrow<S['ParamDto']>
export type MetricDto = Narrow<S['MetricDto']>
export type JoinTokenDto = Narrow<S['JoinTokenDto']>
export type CreatedJoinTokenDto = Narrow<S['CreatedJoinTokenDto']>
export type ComposeInstallDto = Narrow<S['ComposeInstallDto']>
export type ApiTokenDto = Narrow<S['ApiTokenDto']>
export type CreatedApiTokenDto = Narrow<S['CreatedApiTokenDto']>
export type CapabilityCatalogDto = Narrow<S['CapabilityCatalogDto']>