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 <[email protected]>
73 lines
2.5 KiB
TypeScript
73 lines
2.5 KiB
TypeScript
import type { FastifyInstance } from "fastify";
|
|
import { appSettingsPatchSchema } from "@cfdm/shared";
|
|
import {
|
|
getAppSettings,
|
|
updateAppSettings,
|
|
} from "@cfdm/db";
|
|
import { pingVpsTracker } from "../services/vps-tracker-sync.js";
|
|
import { AppError } from "../errors.js";
|
|
import {
|
|
assertValidHealthCron,
|
|
healthEngineFallbacksFromConfig,
|
|
} from "../services/health-check-scheduler.js";
|
|
import { ensureHealthWorker } from "../services/health/health-worker-deploy.js";
|
|
|
|
export async function settingsRoutes(app: FastifyInstance) {
|
|
app.get("/settings", async (request) => {
|
|
return getAppSettings(
|
|
request.server.db,
|
|
healthEngineFallbacksFromConfig(request.server.config),
|
|
);
|
|
});
|
|
|
|
app.patch("/settings", async (request) => {
|
|
const parsed = appSettingsPatchSchema.safeParse(request.body);
|
|
if (!parsed.success) {
|
|
throw AppError.validation(
|
|
parsed.error.issues[0]?.message ?? "некорректные настройки",
|
|
);
|
|
}
|
|
const body = parsed.data;
|
|
if (body.healthCheckCron) {
|
|
assertValidHealthCron(body.healthCheckCron);
|
|
}
|
|
const fallbacks = healthEngineFallbacksFromConfig(request.server.config);
|
|
const current = getAppSettings(request.server.db, fallbacks);
|
|
const nextDegraded =
|
|
body.healthDegradedFailures ?? current.healthDegradedFailures;
|
|
const nextDown = body.healthDownFailures ?? current.healthDownFailures;
|
|
if (nextDown < nextDegraded) {
|
|
throw AppError.validation(
|
|
"ошибок до down не меньше, чем до degraded",
|
|
);
|
|
}
|
|
updateAppSettings(request.server.db, body, fallbacks);
|
|
if (body.healthCheckCron !== undefined) {
|
|
request.server.reloadHealthCheckJob?.();
|
|
const after = getAppSettings(request.server.db, fallbacks);
|
|
if (after.healthWorkerKvNamespaceId) {
|
|
try {
|
|
await ensureHealthWorker(
|
|
request.server.db,
|
|
request.server.cf,
|
|
fallbacks,
|
|
);
|
|
} catch {
|
|
// error stored in settings
|
|
}
|
|
}
|
|
}
|
|
return getAppSettings(request.server.db, fallbacks);
|
|
});
|
|
|
|
app.post("/settings/health/worker/ensure", async (request) => {
|
|
const fallbacks = healthEngineFallbacksFromConfig(request.server.config);
|
|
await ensureHealthWorker(request.server.db, request.server.cf, fallbacks);
|
|
return getAppSettings(request.server.db, fallbacks);
|
|
});
|
|
|
|
app.post("/settings/vps-tracker/test", async (request) => {
|
|
return pingVpsTracker(request.server.db);
|
|
});
|
|
}
|