mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-06-11 19:07:01 +00:00
306 lines
13 KiB
JSON
306 lines
13 KiB
JSON
{
|
|
"$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"] },
|
|
"memory_kb": { "type": "integer", "minimum": 0 },
|
|
"subscription_status": { "type": ["string", "null"] }
|
|
}
|
|
},
|
|
|
|
"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"] }
|
|
}
|
|
}
|
|
}
|
|
}
|