import { PageHeader } from '@/components/shared/page-header'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; export default function BackupManagementPage() { return (
Current backup posture Database snapshots run outside the app — there is no in-app trigger yet.

PostgreSQL: snapshotted by the platform’s nightly{' '} pg_dump job. Retention is set at the infrastructure layer (see{' '} docs/operations/ if a runbook exists). Restores are manual.

Object storage: when{' '} system_settings.storage_backend = ‘s3’, the bucket is versioned by the provider. When the filesystem backend is in use, the host’s snapshot policy is the only safety net — switch to s3 before relying on point-in-time recovery.

Redis / queue state: ephemeral. Failed jobs sit on the{' '} removeOnFail retention window (7 days) and then disappear. Anything durable belongs in PostgreSQL.

What this page will become Planned admin surface, prioritised in upcoming work.
  • List recent snapshot files with timestamp, size, and origin (cron vs manual).
  • “Take backup now” button that enqueues a maintenance job.
  • Per-port logical export (“give me everything for port-nimara”) for compliance.
  • Restore preview that shows row-counts that would change before commit.
  • GDPR per-client export bundled here.

Until this lands, treat ops/devops as the source of truth for backup state.

); }