2026-06-09 00:13:24 +02:00
{
"$schema" : "https://json-schema.org/draft/2020-12/schema" ,
"$id" : "https://proxmenux.dev/schemas/host-backup-manifest/v1.json" ,
"title" : "ProxMenux Host Backup Manifest" ,
"description" : "Recipe-style manifest embedded inside every ProxMenux host backup. Generated at backup time and consumed by the restore wizard for compatibility checks, driver reinstallation via ProxMenux installers, and hardware/storage validation before applying any file. Schema designed against the .55 fixture (AMD homelab, LVM, vfio passthrough, NFS+CIFS) and the .89 production target (NVIDIA Quadro + ZFS)." ,
"type" : "object" ,
"required" : [ "proxmenux_backup_manifest" ] ,
"additionalProperties" : false ,
"properties" : {
"proxmenux_backup_manifest" : {
"type" : "object" ,
"required" : [ "schema_version" , "created_at" , "source_host" ] ,
"additionalProperties" : false ,
"properties" : {
"schema_version" : {
"type" : "integer" ,
"minimum" : 1 ,
"description" : "Manifest schema version. Bumped on breaking field changes."
} ,
"created_at" : {
"type" : "string" ,
"format" : "date-time" ,
"description" : "ISO8601 timestamp of backup creation."
} ,
"created_by" : {
"type" : "string" ,
"description" : "Tool + version, e.g. 'proxmenux-host-backup/1.3.0'."
} ,
"source_host" : { "$ref" : "#/$defs/source_host" } ,
"hardware_inventory" : { "$ref" : "#/$defs/hardware_inventory" } ,
"storage_inventory" : { "$ref" : "#/$defs/storage_inventory" } ,
"proxmenux_installed_components" : {
"type" : "array" ,
"items" : { "$ref" : "#/$defs/installed_component" }
} ,
"kernel_params" : { "$ref" : "#/$defs/kernel_params" } ,
"vms_lxcs_at_backup" : { "$ref" : "#/$defs/guests_inventory" } ,
"backup_metadata" : { "$ref" : "#/$defs/backup_metadata" }
}
}
} ,
"$defs" : {
"source_host" : {
"type" : "object" ,
"required" : [ "hostname" , "kernel" , "roles" , "boot_mode" , "cpu_arch" , "memory_kb" ] ,
"additionalProperties" : false ,
"properties" : {
"hostname" : { "type" : "string" , "minLength" : 1 } ,
"pve_version" : { "type" : [ "string" , "null" ] , "description" : "Short version like 9.2.2." } ,
"pve_version_full" : { "type" : [ "string" , "null" ] , "description" : "Full pveversion line." } ,
"pbs_version" : { "type" : [ "string" , "null" ] , "description" : "Present only if proxmox-backup-server is installed." } ,
"roles" : {
"type" : "array" ,
"items" : { "enum" : [ "pve" , "pbs" ] } ,
"minItems" : 1 ,
"uniqueItems" : true ,
"description" : "Domain roles present on the host. Drives recipe selection at restore."
} ,
"kernel" : { "type" : "string" } ,
"boot_mode" : { "enum" : [ "efi" , "bios" ] } ,
"root_fs" : { "enum" : [ "ext4" , "xfs" , "btrfs" , "zfs" ] } ,
"cpu_model" : { "type" : "string" } ,
"cpu_arch" : { "enum" : [ "x86_64" , "aarch64" ] } ,
2026-07-04 21:37:39 +02:00
"memory_kb" : { "type" : "integer" , "minimum" : 0 }
2026-06-09 00:13:24 +02:00
}
} ,
"hardware_inventory" : {
"type" : "object" ,
"additionalProperties" : false ,
"properties" : {
"gpu" : { "type" : "array" , "items" : { "$ref" : "#/$defs/gpu" } } ,
"tpu" : { "type" : "array" , "items" : { "$ref" : "#/$defs/tpu" } } ,
"nic" : { "type" : "array" , "items" : { "$ref" : "#/$defs/nic" } } ,
"wireless" : { "type" : "array" , "items" : { "$ref" : "#/$defs/wireless" } }
}
} ,
"gpu" : {
"type" : "object" ,
"required" : [ "vendor" , "pci_address" , "pci_id" ] ,
"additionalProperties" : false ,
"properties" : {
"vendor" : { "enum" : [ "AMD" , "NVIDIA" , "Intel" , "Other" ] } ,
"model" : { "type" : "string" } ,
"pci_address" : { "type" : "string" , "pattern" : "^[0-9a-f]{4}:[0-9a-f]{2}:[0-9a-f]{2}\\.[0-9a-f]$" } ,
"pci_id" : { "type" : "string" , "pattern" : "^[0-9a-f]{4}:[0-9a-f]{4}$" } ,
"kernel_driver" : { "type" : [ "string" , "null" ] } ,
"passthrough_eligible" : { "type" : "boolean" } ,
"proxmenux_installer" : { "type" : [ "string" , "null" ] , "description" : "Relative path to the installer script, e.g. 'scripts/gpu_tpu/nvidia_installer.sh'. Null if no installer is applicable (AMD iGPU, etc.)." } ,
"installed_driver_version" : { "type" : [ "string" , "null" ] }
}
} ,
"tpu" : {
"type" : "object" ,
"required" : [ "vendor" ] ,
"additionalProperties" : false ,
"properties" : {
"vendor" : { "enum" : [ "Google" , "Other" ] } ,
"model" : { "type" : "string" } ,
"bus" : { "enum" : [ "PCIe" , "USB" ] } ,
"pci_address" : { "type" : [ "string" , "null" ] } ,
"proxmenux_installer" : { "type" : [ "string" , "null" ] } ,
"installed_version" : { "type" : [ "string" , "null" ] }
}
} ,
"nic" : {
"type" : "object" ,
"required" : [ "ifname" , "mac" ] ,
"additionalProperties" : false ,
"properties" : {
"ifname" : { "type" : "string" } ,
"mac" : { "type" : "string" , "pattern" : "^[0-9a-f:]{17}$" } ,
"kernel_driver" : { "type" : [ "string" , "null" ] } ,
"in_bridges" : { "type" : "array" , "items" : { "type" : "string" } } ,
"operstate" : { "enum" : [ "UP" , "DOWN" , "UNKNOWN" ] }
}
} ,
"wireless" : {
"type" : "object" ,
"required" : [ "ifname" , "mac" ] ,
"additionalProperties" : false ,
"properties" : {
"ifname" : { "type" : "string" } ,
"mac" : { "type" : "string" }
}
} ,
"storage_inventory" : {
"type" : "object" ,
"additionalProperties" : false ,
"properties" : {
"zfs_pools" : { "type" : "array" , "items" : { "$ref" : "#/$defs/zfs_pool" } } ,
"lvm" : { "$ref" : "#/$defs/lvm_state" } ,
"physical_disks" : { "type" : "array" , "items" : { "$ref" : "#/$defs/physical_disk" } } ,
"pve_storage_cfg" : { "type" : "array" , "items" : { "$ref" : "#/$defs/storage_entry" } } ,
"mounts" : { "type" : "array" , "items" : { "$ref" : "#/$defs/mount" } }
}
} ,
"zfs_pool" : {
"type" : "object" ,
"required" : [ "name" ] ,
"additionalProperties" : false ,
"properties" : {
"name" : { "type" : "string" } ,
"type" : { "enum" : [ "mirror" , "raidz1" , "raidz2" , "raidz3" , "stripe" , "single" ] } ,
"devices_by_id" : { "type" : "array" , "items" : { "type" : "string" } , "description" : "Disks referenced by stable /dev/disk/by-id paths. Restore validates these exist before importing." } ,
"mountpoint" : { "type" : "string" } ,
"compression" : { "type" : "string" } ,
"size_bytes" : { "type" : "integer" } ,
"health" : { "enum" : [ "ONLINE" , "DEGRADED" , "FAULTED" , "OFFLINE" , "UNAVAIL" , "REMOVED" ] }
}
} ,
"lvm_state" : {
"type" : "object" ,
"additionalProperties" : false ,
"properties" : {
"vgs" : { "type" : "array" , "items" : { "$ref" : "#/$defs/lvm_vg" } }
}
} ,
"lvm_vg" : {
"type" : "object" ,
"required" : [ "name" ] ,
"additionalProperties" : false ,
"properties" : {
"name" : { "type" : "string" } ,
"size_bytes" : { "type" : "integer" } ,
"thin_pools" : {
"type" : "array" ,
"items" : {
"type" : "object" ,
"additionalProperties" : false ,
"properties" : {
"lv_name" : { "type" : "string" } ,
"size_bytes" : { "type" : "integer" }
}
}
}
}
} ,
"physical_disk" : {
"type" : "object" ,
"required" : [ "name" ] ,
"additionalProperties" : false ,
"properties" : {
"name" : { "type" : "string" } ,
"model" : { "type" : [ "string" , "null" ] } ,
"size_bytes" : { "type" : "integer" } ,
"by_id" : { "type" : [ "string" , "null" ] , "description" : "Stable /dev/disk/by-id symlink target if available. Used to detect the same disk on different controller layouts." }
}
} ,
"storage_entry" : {
"type" : "object" ,
"required" : [ "id" , "type" ] ,
"description" : "additionalProperties is intentionally TRUE here. PVE's storage.cfg accepts driver-specific options (sparse, krbd, fingerprint, datacenter, fs-name, nodes, prune-backups, …) that vary across releases and we don't want to play whack-a-mole on the schema every time someone uses a flag we haven't seen." ,
"properties" : {
"id" : { "type" : "string" } ,
"type" : { "enum" : [ "dir" , "lvm" , "lvmthin" , "zfs" , "zfspool" , "btrfs" , "nfs" , "cifs" , "iscsi" , "rbd" , "cephfs" , "pbs" , "esxi" ] } ,
"path" : { "type" : [ "string" , "null" ] } ,
"server" : { "type" : [ "string" , "null" ] } ,
"export" : { "type" : [ "string" , "null" ] } ,
"share" : { "type" : [ "string" , "null" ] } ,
"thinpool" : { "type" : [ "string" , "null" ] } ,
"vgname" : { "type" : [ "string" , "null" ] } ,
"pool" : { "type" : [ "string" , "null" ] } ,
"content" : { "type" : "array" , "items" : { "type" : "string" } }
}
} ,
"mount" : {
"type" : "object" ,
"required" : [ "target" , "source" , "fstype" ] ,
"additionalProperties" : false ,
"properties" : {
"target" : { "type" : "string" } ,
"source" : { "type" : "string" } ,
"fstype" : { "type" : "string" } ,
"options" : { "type" : [ "string" , "null" ] }
}
} ,
"installed_component" : {
"type" : "object" ,
"required" : [ "id" ] ,
"additionalProperties" : false ,
"properties" : {
"id" : { "type" : "string" , "description" : "Stable identifier matching ProxMenux managed_installs registry." } ,
"type" : { "type" : "string" , "description" : "Type from registry, e.g. nvidia_xfree86, coral, oci_app, tailscale." } ,
"version_at_backup" : { "type" : [ "string" , "null" ] } ,
"proxmenux_installer" : { "type" : [ "string" , "null" ] , "description" : "Installer script relative to scripts/, called with --auto-from-manifest at restore." } ,
"applied_settings" : { "type" : "array" , "items" : { "type" : "string" } , "description" : "Named tweaks applied (log2ram, memory_settings, etc.). Reapplied via post-install scripts at restore." }
}
} ,
"kernel_params" : {
"type" : "object" ,
"additionalProperties" : false ,
"properties" : {
"cmdline_extra" : { "type" : "array" , "items" : { "type" : "string" } , "description" : "Extra entries in /proc/cmdline beyond the default PVE set (BOOT_IMAGE, root, ro). Used to detect iommu, hugepages, custom GRUB tunings." } ,
"modules_loaded_at_boot" : { "type" : "array" , "items" : { "type" : "string" } , "description" : "Contents of /etc/modules." } ,
"modprobe_d_files" : { "type" : "array" , "items" : { "type" : "string" } , "description" : "Paths under /etc/modprobe.d/ that contain user-defined options/blacklists." }
}
} ,
"guests_inventory" : {
"type" : "object" ,
"additionalProperties" : false ,
"properties" : {
"vms" : {
"type" : "array" ,
"items" : {
"type" : "object" ,
"required" : [ "vmid" , "name" ] ,
"additionalProperties" : false ,
"properties" : {
"vmid" : { "type" : "integer" , "minimum" : 100 , "maximum" : 999999999 } ,
"name" : { "type" : "string" } ,
"memory_mb" : { "type" : "integer" } ,
"bootdisk_gb" : { "type" : "number" } ,
"status" : { "enum" : [ "running" , "stopped" , "paused" ] } ,
"config_file" : { "type" : [ "string" , "null" ] , "description" : "Relative path inside the backup archive where the .conf was captured." }
}
}
} ,
"lxcs" : {
"type" : "array" ,
"items" : {
"type" : "object" ,
"required" : [ "vmid" , "name" ] ,
"additionalProperties" : false ,
"properties" : {
"vmid" : { "type" : "integer" , "minimum" : 100 , "maximum" : 999999999 } ,
"name" : { "type" : "string" } ,
"status" : { "enum" : [ "running" , "stopped" ] } ,
"config_file" : { "type" : [ "string" , "null" ] }
}
}
}
}
} ,
"backup_metadata" : {
"type" : "object" ,
"additionalProperties" : false ,
"properties" : {
"encrypted" : { "type" : "boolean" } ,
"encryption_format" : { "type" : [ "string" , "null" ] , "enum" : [ null , "age" , "gpg" ] } ,
"compression" : { "enum" : [ "none" , "gzip" , "zstd" ] } ,
"paths_archived" : { "type" : [ "array" , "null" ] , "items" : { "type" : "string" } , "description" : "Snapshot of every host path that ended up inside the archive. Used by restore to drive selective category extraction." } ,
"sha256_archive" : { "type" : [ "string" , "null" ] , "pattern" : "^[0-9a-f]{64}$" } ,
"size_bytes" : { "type" : [ "integer" , "null" ] }
}
}
}
}