import "dotenv/config"; import { isBackupQueueEnabled } from "../src/server/backup/queue"; import { startBackupWorker, shutdownBackupWorker } from "../src/server/backup/worker"; /** * Einstiegspunkt des Backup-/DSGVO-Ops-Workers (`npm run worker:backup`). * * Eigener Prozess/Container neben der App (analog Mail-Worker), damit der * destruktive Portal-Restore, „Export jetzt" und die DSGVO-Zustellung unabhängig * vom Web-Request-Lebenszyklus laufen (Timeouts/Progress/Audit). Ohne `REDIS_URL` * gibt es keinen Worker-Betrieb — die Enqueue-Action meldet das und führt NICHTS * inline aus (Restore ist destruktiv, KONZEPT §4). */ async function main() { if (!isBackupQueueEnabled()) { console.error( "[backup-worker] REDIS_URL ist nicht gesetzt. Ohne Redis gibt es keinen Backup-Worker; " + "Portal-Restore/Export/DSGVO können nicht ausgeführt werden.", ); process.exit(1); } const worker = startBackupWorker(); console.info("[backup-worker] bereit — Queue 'backup-ops' (Restore/Export/DSGVO, seriell)."); let shuttingDown = false; const stop = async (signal: string) => { if (shuttingDown) return; shuttingDown = true; console.info(`[backup-worker] ${signal} — fahre herunter…`); await shutdownBackupWorker(worker); process.exit(0); }; process.on("SIGTERM", () => void stop("SIGTERM")); process.on("SIGINT", () => void stop("SIGINT")); } main().catch((err) => { console.error("[backup-worker] Start fehlgeschlagen:", err); process.exit(1); });