Files
craftvia/scripts/backup-worker.ts
msolarczekandClaude Opus 5 c8e6f30a27
CI / build-and-check (push) Canceled after 0s
CI / audit (push) Canceled after 0s
CI / sbom (push) Canceled after 0s
Basis: Certvia dev@a48c5fb als Fundament für Craftvia
Unveränderter Stand von certvia/dev (a48c5fb) plus Craftvia-Spezifikation
und Brandbook unter docs/craftvia/. ISMS-Module werden im Folgecommit entfernt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 11:05:39 +02:00

42 lines
1.5 KiB
TypeScript

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);
});