{
  "recordedAt": "2026-10-09T20:45:10.736919+00:00",
  "scope": "Local recovery drill of a synthetic Ubuntu application and PostgreSQL database into a separate clean VM",
  "environment": {
    "os": "Ubuntu 24.04.5 LTS",
    "kernel": "6.8.0-146-generic",
    "python": "3.12.3",
    "postgresql": "16.15 (Ubuntu 16.15-0ubuntu0.24.04.1)",
    "packages": {
      "nginx": "1.24.0-2ubuntu7.18",
      "postgresql-16": "16.15-0ubuntu0.24.04.1",
      "python3-psycopg2": "2.9.9-1build1"
    },
    "virtualization": "QEMU 11.1.0, TCG software emulation on Windows",
    "vCPU": 2,
    "memoryMiB": 1536,
    "virtualDiskGiB": 8
  },
  "backup": {
    "format": "PostgreSQL custom-format logical dump plus application, uploads and service configuration archive; secret supplied separately",
    "rows": 1001,
    "uploadFiles": 3,
    "bytes": 10655,
    "sha256": "8ae34eec368181c057e667856ffd2d2fdd3772897cc19e58673f3b6566ef0c9d",
    "backupSeconds": 6.093073699856177,
    "dataSHA256": "20616ebe452c49bd7adb3d702f075cb2f61271456c74df39a98b72ddcf0ddb46",
    "sequence": [
      1001,
      true
    ]
  },
  "checks": {
    "cleanUbuntuTarget": true,
    "sourceOfflineBeforeRestore": true,
    "differentMachineIds": true,
    "installedPackageVersionsMatch": true,
    "allRowsHashMatch": true,
    "applicationAndUploadHashesAndPermissionsMatch": true,
    "corruptedArchiveRejected": true,
    "postBackupSourceWriteAbsent": true,
    "unauthorizedWriteRejected": true,
    "newTransactionId": 1002,
    "newTransactionSurvivedReboot": true,
    "servicesStartedAfterReboot": true,
    "secretsExcludedFromArchive": true,
    "guestsPoweredOff": true
  },
  "timing": {
    "environmentRecreationAndRestoreSeconds": 481.01055020000786,
    "restoreCommandSeconds": 42.673106299946085,
    "definition": "Environment time starts on the already booted clean target and includes package installation, backup transfer, restore and first checks. Restore-command time covers the saved restore script. Neither is a production RTO."
  },
  "http": [
    {
      "path": "/health",
      "status": 200,
      "body": {
        "rows": 1001,
        "status": "ok"
      }
    },
    {
      "path": "/notes/1",
      "status": 200,
      "body": {
        "attachment": "sample-a.txt",
        "body": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "id": 1,
        "title": "note-1"
      }
    },
    {
      "path": "/notes/1000",
      "status": 200,
      "body": {
        "attachment": null,
        "body": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "id": 1000,
        "title": "note-1000"
      }
    },
    {
      "path": "/notes/1001",
      "status": 200,
      "body": {
        "attachment": null,
        "body": "Created through the application before the backup.",
        "id": 1001,
        "title": "before-backup"
      }
    },
    {
      "path": "/uploads/sample-a.txt",
      "status": 200,
      "body": {
        "name": "sample-a.txt",
        "text": "Synthetic upload a for the recovery demonstration.\n"
      }
    },
    {
      "path": "/uploads/sample-b.txt",
      "status": 200,
      "body": {
        "name": "sample-b.txt",
        "text": "Synthetic upload b for the recovery demonstration.\n"
      }
    },
    {
      "path": "/uploads/sample-c.txt",
      "status": 200,
      "body": {
        "name": "sample-c.txt",
        "text": "Synthetic upload c for the recovery demonstration.\n"
      }
    },
    {
      "path": "/notes/1002",
      "status": 404,
      "meaning": "source write after backup absent"
    },
    {
      "path": "/notes",
      "status": 403,
      "meaning": "unauthorized write refused"
    },
    {
      "path": "/notes",
      "method": "POST",
      "status": 201,
      "id": 1002
    },
    {
      "path": "/notes/1002",
      "status": 200,
      "body": {
        "attachment": null,
        "body": "A new transaction committed after recovery.",
        "id": 1002,
        "title": "after-recovery"
      }
    }
  ],
  "limitations": [
    "Synthetic example, not a restored production database of this static website",
    "Environment recreated from a clean image and recorded package versions; not a provider disk snapshot recovery",
    "One local software-emulated run; timings do not predict VPS speed or outage duration",
    "No provider backup-panel restore, DNS/TLS cutover, external integration or production RPO/RTO demonstrated"
  ],
  "spend": 0
}