feat(health): деплоить probe-Worker из CFDM и опрашивать цели с edge
quality / changes (push) Successful in 9s
quality / commitlint (push) Skipped
quality / docker-check (push) Skipped
CD / update-wiki (push) Successful in 6s
quality / web (push) Successful in 1m4s
quality / api (push) Successful in 54s
CD / quality (push) Successful in 2m17s
CD / publish (push) Successful in 2m21s
quality / changes (push) Successful in 9s
quality / commitlint (push) Skipped
quality / docker-check (push) Skipped
CD / update-wiki (push) Successful in 6s
quality / web (push) Successful in 1m4s
quality / api (push) Successful in 54s
CD / quality (push) Successful in 2m17s
CD / publish (push) Successful in 2m21s
Worker сам ходит на origin по Cron Trigger; CFDM кладёт цели в KV и забирает результаты без POST /probe. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
2c92e78b24
commit
4c4908558b
38 files changed
+1941
-555
No files matched your search
@@ -393,6 +393,11 @@ export const appSettings = sqliteTable("app_settings", {
|
||||
health_success_recoveries: integer("health_success_recoveries"),
|
||||
health_worker_url: text("health_worker_url"),
|
||||
health_worker_token: text("health_worker_token"),
|
||||
health_worker_account_id: text("health_worker_account_id"),
|
||||
health_worker_kv_namespace_id: text("health_worker_kv_namespace_id"),
|
||||
health_worker_error: text("health_worker_error"),
|
||||
health_worker_deployed_at: text("health_worker_deployed_at"),
|
||||
health_worker_last_ingest_at: text("health_worker_last_ingest_at"),
|
||||
created_at: text("created_at")
|
||||
.notNull()
|
||||
.default(sql`datetime('now')`),
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { eq } from "drizzle-orm";
|
||||
import type { HealthWorkerStatus } from "@cfdm/shared";
|
||||
import type { Db } from "./client.js";
|
||||
import { appSettings } from "./schema.js";
|
||||
|
||||
@@ -21,6 +22,12 @@ export type AppSettingsDto = {
|
||||
showQuickActions: boolean;
|
||||
healthWorkerUrl: string;
|
||||
healthWorkerTokenSet: boolean;
|
||||
healthWorkerStatus: HealthWorkerStatus;
|
||||
healthWorkerAccountId: string;
|
||||
healthWorkerKvNamespaceId: string;
|
||||
healthWorkerError: string | null;
|
||||
healthWorkerDeployedAt: string | null;
|
||||
healthWorkerLastIngestAt: string | null;
|
||||
} & HealthEngineSettings;
|
||||
|
||||
export type AppSettingsPatch = {
|
||||
@@ -35,6 +42,11 @@ export type AppSettingsPatch = {
|
||||
healthSuccessRecoveries?: number;
|
||||
healthWorkerUrl?: string;
|
||||
healthWorkerToken?: string;
|
||||
healthWorkerAccountId?: string | null;
|
||||
healthWorkerKvNamespaceId?: string | null;
|
||||
healthWorkerError?: string | null;
|
||||
healthWorkerDeployedAt?: string | null;
|
||||
healthWorkerLastIngestAt?: string | null;
|
||||
};
|
||||
|
||||
export type HealthEngineFallbacks = HealthEngineSettings & {
|
||||
@@ -46,6 +58,17 @@ function coalesceInt(value: number | null | undefined, fallback: number): number
|
||||
return value == null || Number.isNaN(value) || value < 1 ? fallback : value;
|
||||
}
|
||||
|
||||
function workerStatus(
|
||||
row: typeof appSettings.$inferSelect,
|
||||
envUrl: string,
|
||||
): HealthWorkerStatus {
|
||||
if (row.health_worker_error?.trim()) return "error";
|
||||
const url = row.health_worker_url?.trim() || envUrl;
|
||||
const kv = row.health_worker_kv_namespace_id?.trim();
|
||||
if (kv && url) return "ready";
|
||||
return "missing";
|
||||
}
|
||||
|
||||
function toDto(
|
||||
row: typeof appSettings.$inferSelect,
|
||||
fallbacks?: HealthEngineFallbacks,
|
||||
@@ -89,6 +112,12 @@ function toDto(
|
||||
healthWorkerUrl: row.health_worker_url?.trim() || env.healthWorkerUrl,
|
||||
healthWorkerTokenSet:
|
||||
Boolean(row.health_worker_token?.trim()) || env.healthWorkerTokenSet,
|
||||
healthWorkerAccountId: row.health_worker_account_id?.trim() ?? "",
|
||||
healthWorkerKvNamespaceId: row.health_worker_kv_namespace_id?.trim() ?? "",
|
||||
healthWorkerError: row.health_worker_error?.trim() || null,
|
||||
healthWorkerDeployedAt: row.health_worker_deployed_at ?? null,
|
||||
healthWorkerLastIngestAt: row.health_worker_last_ingest_at ?? null,
|
||||
healthWorkerStatus: workerStatus(row, env.healthWorkerUrl),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -154,7 +183,6 @@ export function updateAppSettings(
|
||||
|
||||
db.update(appSettings)
|
||||
.set({
|
||||
// app_switcher_json: deprecated — source of truth is auth-portal
|
||||
vps_tracker_url:
|
||||
patch.vpsTrackerUrl !== undefined
|
||||
? patch.vpsTrackerUrl
|
||||
@@ -201,6 +229,26 @@ export function updateAppSettings(
|
||||
patch.healthWorkerToken.trim() !== ""
|
||||
? patch.healthWorkerToken
|
||||
: current.health_worker_token,
|
||||
health_worker_account_id:
|
||||
patch.healthWorkerAccountId !== undefined
|
||||
? patch.healthWorkerAccountId?.trim() || null
|
||||
: current.health_worker_account_id,
|
||||
health_worker_kv_namespace_id:
|
||||
patch.healthWorkerKvNamespaceId !== undefined
|
||||
? patch.healthWorkerKvNamespaceId?.trim() || null
|
||||
: current.health_worker_kv_namespace_id,
|
||||
health_worker_error:
|
||||
patch.healthWorkerError !== undefined
|
||||
? patch.healthWorkerError?.trim() || null
|
||||
: current.health_worker_error,
|
||||
health_worker_deployed_at:
|
||||
patch.healthWorkerDeployedAt !== undefined
|
||||
? patch.healthWorkerDeployedAt
|
||||
: current.health_worker_deployed_at,
|
||||
health_worker_last_ingest_at:
|
||||
patch.healthWorkerLastIngestAt !== undefined
|
||||
? patch.healthWorkerLastIngestAt
|
||||
: current.health_worker_last_ingest_at,
|
||||
updated_at: new Date().toISOString(),
|
||||
})
|
||||
.where(eq(appSettings.id, SETTINGS_ID))
|
||||
|
||||
Reference in new issue
Block a user