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
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:
55
backend/src/modules/central-services-heartbeat.service.ts
Normal file
55
backend/src/modules/central-services-heartbeat.service.ts
Normal 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()
|
||||
}
|
||||
@@ -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)
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user