Backend-agnostic disaster-recovery backup engine that runs on the current storage backend (no storage cutover required): - Full-bundle export: db.dump (pg_dump custom) + every storage blob + manifest.json with per-object SHA-256, streamed as a tar. Entry points: admin UI download, GET /api/v1/admin/backup/export, scripts/create-full-backup.ts. - Admin-configurable push destinations (backup_destinations table, migration 0091): SFTP/SSH, S3-compatible (reuses the minio client), and mounted path/NAS behind one transport interface (test/push/prune). Secrets AES-GCM at rest; API returns only *IsSet markers. - Opt-in per-destination AES-256 bundle encryption (scrypt KDF, streamed) + scripts/decrypt-backup.ts for restore. - Wired the previously-dead database-backup cron to runScheduledBackupPush (push to enabled destinations, prune to retention, alert super-admins on failure). Tests: 1608 unit/integration pass; tsc + lint clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
18 lines
643 B
TypeScript
18 lines
643 B
TypeScript
import { BackupAdminPanel } from '@/components/admin/backup-admin-panel';
|
|
import { BackupDestinationsCard } from '@/components/admin/backup-destinations-card';
|
|
import { PageHeader } from '@/components/shared/page-header';
|
|
|
|
export default function BackupManagementPage() {
|
|
return (
|
|
<div className="space-y-6">
|
|
<PageHeader
|
|
title="Backup & Restore"
|
|
eyebrow="ADMIN"
|
|
description="Download a full backup, configure where automated backups are pushed, and browse history. Restore steps live in docs/backup-restore-runbook.md."
|
|
/>
|
|
<BackupAdminPanel />
|
|
<BackupDestinationsCard />
|
|
</div>
|
|
);
|
|
}
|