Worker- und PDF-Dienst
Der Worker hängt am Discord-Gateway und schreibt alle 30 Sekunden sein Lebenszeichen in die Datenbank, damit /api/health im Web-Container den Gateway-Zustand kennt, ohne selbst mit Discord zu sprechen. healthcheck.js prüft genau dieses Lebenszeichen. Der eigentliche Rollen-Abgleich kommt in Phase 1. Der PDF-Dienst rendert die Druckansicht über Playwright. Kein PDF-Layout von Hand, die Gestaltung kommt aus @media print der Seite selbst. Er kennt keine Rechte: wer darf, entscheidet die Web-App, bevor sie hier anfragt, und schickt das Sitzungs-Cookie des Abrufers mit, damit die gerenderte Seite dessen Freigabestufe sieht.
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* Der Worker teilt sich die .env mit der Web-App, braucht aber nur einen Teil
|
||||
* davon. Fehlt etwas, stirbt der Prozess sofort mit klarer Meldung, damit der
|
||||
* Fehler in Dockge am roten Container sichtbar wird und nicht im Lograuschen.
|
||||
*/
|
||||
export type WorkerEnv = {
|
||||
databaseUrl: string
|
||||
discordBotToken: string
|
||||
discordGuildId: string
|
||||
/** Voll-Abgleich als Sicherheitsnetz, siehe docs/02-architektur.md. */
|
||||
fullSyncIntervalMs: number
|
||||
heartbeatIntervalMs: number
|
||||
adminChannelId?: string
|
||||
}
|
||||
|
||||
function required(name: string): string {
|
||||
const value = process.env[name]
|
||||
if (!value) throw new Error(`Konfiguration unvollständig: ${name} fehlt`)
|
||||
return value
|
||||
}
|
||||
|
||||
export function loadEnv(): WorkerEnv {
|
||||
return {
|
||||
databaseUrl: required('DATABASE_URL'),
|
||||
discordBotToken: required('DISCORD_BOT_TOKEN'),
|
||||
discordGuildId: required('DISCORD_GUILD_ID'),
|
||||
fullSyncIntervalMs: Number(process.env.WORKER_FULL_SYNC_MS ?? 5 * 60_000),
|
||||
heartbeatIntervalMs: Number(process.env.WORKER_HEARTBEAT_MS ?? 30_000),
|
||||
adminChannelId: process.env.DISCORD_ADMIN_CHANNEL_ID,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user