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

Worker сам ходит на origin по Cron Trigger; CFDM кладёт цели в KV и забирает результаты без POST /probe.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
DenozordecandCursor committed 2026-08-19 17:22:07 +07:00
1 parent 2c92e78b24
commit 4c4908558b
38 files changed
+1941 -555

No files matched your search

+5
View File
@@ -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')`),
+49 -1
View File
@@ -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))