feat: central services heartbeat senden
All checks were successful
Build and Push Docker Images / build-backend (push) Successful in 26s
Build and Push Docker Images / build-frontend (push) Successful in 16s
Build and Push Docker Images / build-website (push) Successful in 16s
Build and Push Docker Images / build-central-services-api (push) Successful in 21s
Build and Push Docker Images / build-central-services-admin (push) Successful in 41s
Build and Push Docker Images / build-docs (push) Successful in 16s

This commit is contained in:
2026-08-05 13:49:22 +02:00
parent de36589822
commit d18ba16f8a
6 changed files with 82 additions and 1 deletions

View File

@@ -0,0 +1,55 @@
import type { FastifyInstance } from "fastify"
import { centralServicesClient } from "./push-server.client"
import { secrets } from "../utils/secrets"
const DEFAULT_HEARTBEAT_INTERVAL_MS = 5 * 60 * 1000
function instanceBaseUrl() {
if (!secrets.API_BASE_URL) return undefined
try {
return new URL(secrets.API_BASE_URL).origin
} catch {
console.warn("⚠️ Central Services Heartbeat: API_BASE_URL ist keine gültige URL")
return undefined
}
}
export function startCentralServicesHeartbeat(server: FastifyInstance) {
if (!centralServicesClient.configured()) {
console.log(" Central Services Heartbeat deaktiviert: Instanzzugangsdaten fehlen")
return
}
const configuredInterval = Number(secrets.FEDEO_CENTRAL_HEARTBEAT_INTERVAL_MS)
const intervalMs = Number.isFinite(configuredInterval) && configuredInterval >= 30_000
? configuredInterval
: DEFAULT_HEARTBEAT_INTERVAL_MS
let timer: NodeJS.Timeout | undefined
let stopped = false
const sendHeartbeat = async () => {
try {
const response = await centralServicesClient.heartbeat({
fedeoVersion: secrets.FEDEO_VERSION || "selfhost",
baseUrl: instanceBaseUrl(),
})
console.log(`✅ Central Services Heartbeat: ${response.instanceId} (${response.status})`)
} catch (error: any) {
console.error(`❌ Central Services Heartbeat fehlgeschlagen: ${error?.message || error}`)
} finally {
if (!stopped) {
timer = setTimeout(() => void sendHeartbeat(), intervalMs)
timer.unref()
}
}
}
server.addHook("onClose", async () => {
stopped = true
if (timer) clearTimeout(timer)
})
console.log(` Central Services Heartbeat gestartet (${Math.round(intervalMs / 1000)} Sekunden)`)
void sendHeartbeat()
}

View File

@@ -30,6 +30,12 @@ export type SendPushServerMessageInput = {
data?: Record<string, unknown>
}
export type CentralServicesHeartbeatInput = {
fedeoVersion?: string
baseUrl?: string
capabilities?: string[]
}
function configured() {
return Boolean(secrets.PUSH_SERVER_URL && secrets.PUSH_SERVER_INSTANCE_ID && secrets.PUSH_SERVER_SECRET)
}
@@ -105,6 +111,15 @@ export const pushServerClient = {
export const centralServicesClient = {
configured,
heartbeat(input: CentralServicesHeartbeatInput) {
return requestPushServer<{
status: string
instanceId: string
payloadMode: string
capabilities: string[]
}>("POST", "/v1/instances/heartbeat", input)
},
aiChatCompletions(payload: Record<string, unknown>) {
return requestPushServer<any>("POST", "/v1/services/ai/chat-completions", payload)
},