diff --git a/web/app/[locale]/docs/backup-restore/creating-backups/page.tsx b/web/app/[locale]/docs/backup-restore/creating-backups/page.tsx index f7738a87..95a7dffe 100644 --- a/web/app/[locale]/docs/backup-restore/creating-backups/page.tsx +++ b/web/app/[locale]/docs/backup-restore/creating-backups/page.tsx @@ -58,7 +58,6 @@ export default async function CreatingBackupsPage({ matrix: { rows: MatrixRow[] } commonPipeline: { steps: StepRow[] } included: { - globalItems: string[] rootItems: string[] proxmenuxItems: string[] notInProfileItems: string[] @@ -71,7 +70,6 @@ export default async function CreatingBackupsPage({ const entryRows = cb.entryPoints.rows const matrixRows = cb.matrix.rows const pipelineSteps = cb.commonPipeline.steps - const globalItems = cb.included.globalItems const rootItems = cb.included.rootItems const proxmenuxItems = cb.included.proxmenuxItems const notInProfileItems = cb.included.notInProfileItems @@ -285,19 +283,6 @@ export default async function CreatingBackupsPage({ {t.rich("included.intro", { code })}
-rsync -aAXH --numeric-ids kopiert. Eine gemeinsame Ausschlussliste gilt für jeden Pfad, und zwei Verzeichnisse tragen zusätzliche pfadspezifische Ausschlüsse.",
- "globalTitle": "Globale Ausschlüsse (auf jeden Pfad angewendet)",
- "globalItems": [
- "images/ — Image Dumps.",
- "dump/ — Ausgaben von vzdump.",
- "tmp/ — temporäre Dateien.",
- "*.log — Protokolldateien."
- ],
"rootTitle": "/root/ Ausschlüsse",
"rootBody": "/root/ ist Teil des Standardprofils, sodass Benutzerskripte und Konfigurationen im Archiv landen. Flüchtige Subpfade werden fallen gelassen:",
"rootItems": [
diff --git a/web/messages/en/docs/backup-restore/creating-backups.json b/web/messages/en/docs/backup-restore/creating-backups.json
index b2a17ef5..1e4bebf9 100644
--- a/web/messages/en/docs/backup-restore/creating-backups.json
+++ b/web/messages/en/docs/backup-restore/creating-backups.json
@@ -21,8 +21,8 @@
"rows": [
{
"entry": "ProxMenux Scripts (TUI)",
- "path": "menu → Utilities → Host Config Backup",
- "detail": "Dialog-based flow, SSH-friendly. The main menu presents the six options directly. Uses backup_menu in backup_host.sh."
+ "path": "menu → Host Backup & Restore → Backup host configuration",
+ "detail": "Dialog-based flow, SSH-friendly. The main menu entry opens Host Config Backup / Restore; Backup host configuration leads to the six options. Uses backup_menu in backup_host.sh."
},
{
"entry": "ProxMenux Monitor (Web UI)",
@@ -83,7 +83,7 @@
"profiles": {
"heading": "Default vs Custom profile",
"defaultTitle": "Default profile",
- "defaultBody": "The default profile is the curated list from hb_default_profile_paths (documented in How it works under Path categories) plus every entry in the persistent extras file /usr/local/share/proxmenux/backup-extra-paths.txt. The user confirms the destination and encryption options and the backup proceeds without further path selection.",
+ "defaultBody": "The default profile is the curated list from hb_default_profile_paths (documented in How it works under Path categories) plus every entry in the persistent extras file /usr/local/share/proxmenux/backup-extra-paths.txt. The user picks the destination and encryption options and the backup proceeds without further path selection.",
"customTitle": "Custom profile",
"customBody": "The custom profile opens a checklist showing every path in the default profile (unchecked) and every persistent extra (pre-checked, prefixed with [+]). The user ticks the set for this run and can press Add custom path to append a new absolute path. Any path added inline is persisted to backup-extra-paths.txt so future backups pick it up automatically without re-adding it. Removing a persistent extra unticks it for this run but does not delete it from the file — deletion is a separate Manage custom paths action outside the backup flow.",
"customPickerAlt": "Custom profile checklist showing the default-profile paths (unchecked) and persistent extras (pre-checked with a [+] prefix), plus buttons to add a new path or confirm the selection.",
@@ -124,14 +124,7 @@
},
"included": {
"heading": "What goes in and what stays out",
- "intro": "Every path in the resolved profile (default + persistent extras + custom-mode selection) is copied with rsync -aAXH --numeric-ids. A shared exclusion list applies to every path, and two directories carry additional path-specific exclusions.",
- "globalTitle": "Global exclusions (applied to every path)",
- "globalItems": [
- "images/ — image dumps.",
- "dump/ — vzdump outputs.",
- "tmp/ — temporary files.",
- "*.log — log files."
- ],
+ "intro": "Every path in the resolved profile (default + persistent extras + custom-mode selection) is copied with rsync -aAXH --numeric-ids. There is no global exclusion list; a few directories carry path-specific exclusions.",
"rootTitle": "/root/ exclusions",
"rootBody": "/root/ is part of the default profile so user scripts and config land in the archive. Volatile subpaths are dropped:",
"rootItems": [
@@ -160,16 +153,16 @@
"/home/USER — not in the default profile. Add it as a custom path when a system carries user home directories that must survive a restore."
],
"customPathsTitle": "How custom paths are handled",
- "customPathsBody": "A custom path added inline in Custom mode or persisted in backup-extra-paths.txt goes through the same rsync pipeline as default-profile paths. Global exclusions apply. If the custom path happens to be under /root/ or /usr/local/share/proxmenux/, the path-specific exclusions above still apply. Every archived path — default or custom — is recorded in metadata/paths_archived.txt. Paths that do not exist on the source are recorded in metadata/missing_paths.txt without stopping the backup."
+ "customPathsBody": "A custom path added inline in Custom mode or persisted in backup-extra-paths.txt goes through the same rsync pipeline as default-profile paths. If the custom path happens to be under /root/ or /usr/local/share/proxmenux/, the path-specific exclusions above still apply. Every archived path — default or custom — is recorded in metadata/selected_paths.txt. Paths that do not exist on the source are recorded in metadata/missing_paths.txt without stopping the backup, and paths that fail to copy in metadata/failed_paths.txt."
},
"archiveStructure": {
"heading": "Archive structure",
"intro": "The staging directory produced by every backend follows the same layout regardless of destination. The tarball, PBS .pxar or Borg archive stores this tree verbatim.",
- "tree": "backup-[timestamp]/\n├── manifest.json # structured host state (kernel_params, hardware, storage, guests, components, source_host)\n├── metadata/\n│ ├── packages.manual.list # output of apt-mark showmanual\n│ ├── run_info.env # hostname, timestamp, kernel version, pmxcfs method\n│ ├── paths_archived.txt # exact list of paths that reached rootfs/\n│ └── missing_paths.txt # paths from the profile absent on source\n└── rootfs/\n ├── etc/ # /etc/pve, /etc/network, /etc/systemd/network, /etc/ssh, /etc/apt, ...\n ├── root/ # /root without volatile subpaths\n ├── usr/local/ # /usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux (state only)\n └── var/ # /var/lib/pve-cluster (config.db via sqlite3 .backup), /var/spool/cron/crontabs"
+ "tree": "backup-[timestamp]/\n├── manifest.json # structured host state (kernel_params, hardware, storage, guests, components, source_host)\n├── metadata/\n│ ├── packages.manual.list # output of apt-mark showmanual\n│ ├── run_info.env # hostname, timestamp, kernel version, pmxcfs method\n│ ├── selected_paths.txt # exact list of paths that reached rootfs/\n│ └── missing_paths.txt # paths from the profile absent on source\n└── rootfs/\n ├── etc/ # /etc/pve, /etc/network, /etc/systemd/network, /etc/ssh, /etc/apt, ...\n ├── root/ # /root without volatile subpaths\n ├── usr/local/ # /usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux (state only)\n └── var/ # /var/lib/pve-cluster (config.db via sqlite3 .backup), /var/spool/cron/crontabs"
},
"confirmation": {
"heading": "Confirmation summary",
- "body": "Before the backend writes anything to the destination, ProxMenux shows a summary dialog with the destination, backup ID or archive name, encryption state, and the list of paths being copied. Cancelling here aborts the backup cleanly — the staging directory is removed by the trap hook set on the backend function and no partial data reaches the destination."
+ "body": "Before the backend writes anything to the destination, ProxMenux prints a summary in the terminal with the destination, backup ID or archive name, encryption state, and the list of paths being copied. There is no confirm or cancel step at this point; the copy starts right after. If the backup fails or is interrupted, the staging directory is removed by the trap hook set on the backend function and no partial data reaches the destination."
},
"writing": {
"heading": "Writing to the destination",
diff --git a/web/messages/en/docs/backup-restore/destinations/local.json b/web/messages/en/docs/backup-restore/destinations/local.json
index be7c0fb8..0b57eefa 100644
--- a/web/messages/en/docs/backup-restore/destinations/local.json
+++ b/web/messages/en/docs/backup-restore/destinations/local.json
@@ -18,11 +18,11 @@
},
"targetConfig": {
"heading": "Configuring the target directory",
- "intro": "The local destination is a single persisted target directory — not a list. ProxMenux stores the user's choice at /usr/local/share/proxmenux/local-target.conf and reads it on every backup. When no target has been configured, the default HB_LOCAL_TARGET_DEFAULT = /var/lib/vz/dump is used (the same directory Proxmox uses for its own vzdump outputs). The target is configured from Configure backup destinations → Local destinations:",
+ "intro": "The local destination is a single persisted target directory — not a list. ProxMenux stores the user's choice at /usr/local/share/proxmenux/local-target.conf and reads it on every backup. When no target has been configured, the default HB_LOCAL_TARGET_DEFAULT = /var/lib/vz/dump is used (the same directory Proxmox uses for its own vzdump outputs). The target is configured from Configure backup destinations → Local archive targets → Manage local backup target:",
"options": [
"Use default (/var/lib/vz/dump). The Proxmox local storage. Present on every Proxmox install; the archive sits next to vzdump outputs and is picked up by the Monitor's Backups tab automatically.",
- "Enter a custom path. Any absolute filesystem path can be used: an NFS mount, an SMB share mounted via fstab, a dedicated ZFS dataset, a second internal disk. ProxMenux validates that the path exists and is a directory before persisting it.",
- "Pick a USB drive. Opens the USB submenu (below), which detects removable devices and offers to mount or format one."
+ "Use a custom path. Any absolute filesystem path can be used: an NFS mount, an SMB share mounted via fstab, a dedicated ZFS dataset, a second internal disk. ProxMenux validates that the path exists and is a directory before persisting it.",
+ "Use a USB disk. Opens the USB submenu (below), which detects removable devices and offers to mount or format one."
]
},
"usbFlow": {
@@ -38,7 +38,7 @@
{
"state": "unmounted",
"shown": "Size · label · [fstype] · (not mounted — will be mounted)",
- "action": "A filesystem is present but not mounted. On confirmation, ProxMenux runs hb_mount_usb_partition: creates /mnt/backup-LABEL (or a UUID-based path if there is no label), mounts the partition and persists the mount point as the local target."
+ "action": "A filesystem is present but not mounted. On confirmation, ProxMenux runs hb_mount_usb_partition: creates /mnt/proxmenux-backup-LABEL (UUID or device name if there is no label), mounts the partition and persists the mount point as the local target."
},
{
"state": "empty",
@@ -63,7 +63,7 @@
},
"sidecar": {
"heading": "The sidecar JSON",
- "intro": "Every successful local backup produces a companion file: HOSTNAME-TIMESTAMP.tar.zst.proxmenux.json, written next to the archive by hb_write_archive_sidecar. This small JSON file lets the ProxMenux Monitor identify the archive as a ProxMenux host backup even if it is later moved, renamed or archived elsewhere.",
+ "intro": "Every successful local backup produces a companion file: hostcfg-HOSTNAME-TIMESTAMP.tar.zst.proxmenux.json, written next to the archive by hb_write_archive_sidecar. This small JSON file lets the ProxMenux Monitor identify the archive as a ProxMenux host backup even if it is later moved, renamed or archived elsewhere.",
"contentTitle": "Sidecar contents",
"contentBody": "The sidecar stores the schema version, whether the backup came from an interactive run or a scheduled job (kind), the job ID for scheduled runs, the profile mode used (default or custom), the source hostname, the original archive basename, an ISO-8601 creation timestamp and the archive size in bytes.",
"whyBody": "The Monitor's Backups tab scans configured local directories for *.proxmenux.json sidecars — not for *.tar.zst files — because a .tar.zst without a sidecar might not be a ProxMenux backup at all. The scan is fast (JSON files are tiny) and the pairing is stable across renames of the archive as long as the sidecar is renamed to match."
diff --git a/web/messages/en/docs/backup-restore/destinations/pbs.json b/web/messages/en/docs/backup-restore/destinations/pbs.json
index 462436b3..8e7a4fd1 100644
--- a/web/messages/en/docs/backup-restore/destinations/pbs.json
+++ b/web/messages/en/docs/backup-restore/destinations/pbs.json
@@ -33,7 +33,7 @@
{
"source": "ProxMenux manual config",
"path": "/usr/local/share/proxmenux/pbs-manual-configs.txt + pbs-pass-NAME.txt + pbs-fingerprint-NAME.txt",
- "content": "Added from Configure backup destinations → PBS destinations → Add PBS. Prompts for a name, username (root@pam or user@pbs!token), host or IP, datastore and password. The password re-prompts on empty input — an empty save would otherwise persist silently and every subsequent backup would fail with an opaque authentication error. This path is used when the target PBS is not registered as Proxmox storage."
+ "content": "Added from Configure backup destinations → Proxmox Backup Server (PBS) destinations → + Add new PBS manually. Prompts for a name, username (root@pam or user@pbs!token), host or IP, datastore and password. The password re-prompts on empty input — an empty save would otherwise persist silently and every subsequent backup would fail with an opaque authentication error. This path is used when the target PBS is not registered as Proxmox storage."
}
],
"menuTitle": "Selection menu",
diff --git a/web/messages/en/docs/backup-restore/how-it-works.json b/web/messages/en/docs/backup-restore/how-it-works.json
index 450a8e11..e2864115 100644
--- a/web/messages/en/docs/backup-restore/how-it-works.json
+++ b/web/messages/en/docs/backup-restore/how-it-works.json
@@ -20,7 +20,7 @@
"heading": "Archive layout",
"intro": "Every archive follows the same tree layout regardless of destination. The metadata/ subdirectory holds the structured payloads; the rootfs/ subdirectory holds the filesystem copy.",
"treeCaption": "The staging directory laid out during a backup. Every destination receives the same tree (adapted to its native format: tar for local, PBS chunks for PBS, borg segments for Borg).",
- "tree": "backup-[timestamp]/\n├── manifest.json # structured host state\n├── metadata/\n│ ├── packages.manual.list # apt-mark showmanual\n│ ├── run_info.env # backup run identity + kernel version + pmxcfs method\n│ ├── paths_archived.txt # exact list of paths that reached rootfs/\n│ └── missing_paths.txt # paths from the profile absent on source\n└── rootfs/\n ├── etc/ # /etc/pve, /etc/network, /etc/systemd/network, /etc/ssh, …\n ├── root/ # /root (with volatile subdirs excluded)\n ├── usr/local/ # /usr/local/bin, /usr/local/share/proxmenux, …\n └── var/ # /var/lib/pve-cluster (config.db via sqlite3 .backup), /var/spool/cron/…"
+ "tree": "backup-[timestamp]/\n├── manifest.json # structured host state\n├── metadata/\n│ ├── packages.manual.list # apt-mark showmanual\n│ ├── run_info.env # backup run identity + kernel version + pmxcfs method\n│ ├── selected_paths.txt # exact list of paths that reached rootfs/\n│ └── missing_paths.txt # paths from the profile absent on source\n└── rootfs/\n ├── etc/ # /etc/pve, /etc/network, /etc/systemd/network, /etc/ssh, …\n ├── root/ # /root (with volatile subdirs excluded)\n ├── usr/local/ # /usr/local/bin, /usr/local/share/proxmenux, …\n └── var/ # /var/lib/pve-cluster (config.db via sqlite3 .backup), /var/spool/cron/…"
},
"rootfs": {
"heading": "The rootfs payload",
@@ -176,7 +176,7 @@
"stage": "3",
"name": "Pending prepare",
"reads": "rootfs/ (reboot + dangerous paths)",
- "action": "_rs_prepare_pending_restore stages risky paths under /var/lib/proxmenux/pending-restore/, writes plan.env, apply-on-boot.list and rs-skip-paths.txt, and enables proxmenux-restore-onboot.service to fire on the next boot."
+ "action": "_rs_prepare_pending_restore stages risky paths under /var/lib/proxmenux/restore-pending/<restore_id>/ (linked as current), writes plan.env, apply-on-boot.list and rs-skip-paths.txt, and enables proxmenux-restore-onboot.service to fire on the next boot."
},
{
"stage": "3b",
diff --git a/web/messages/en/docs/backup-restore/index.json b/web/messages/en/docs/backup-restore/index.json
index 1c10d79c..bfd1378f 100644
--- a/web/messages/en/docs/backup-restore/index.json
+++ b/web/messages/en/docs/backup-restore/index.json
@@ -50,7 +50,7 @@
"heading": "Two interfaces, one backend",
"intro": "Every step of the backup and restore workflow is available from two entry points. Both call the same shell library, produce identical archives, and read the same job registry.",
"cliLabel": "ProxMenux Scripts (TUI)",
- "cliDetail": "menu → Utilities →\nHost Backup / Restore\n\nDialog-based flow,\nSSH-friendly, scriptable\nfor unattended use.",
+ "cliDetail": "menu →\nHost Backup & Restore\n\nDialog-based flow,\nSSH-friendly, scriptable\nfor unattended use.",
"webLabel": "ProxMenux Monitor (Web UI)",
"webDetail": "Backups tab in the\nMonitor's Web interface.\n\nOne-click restore, live\nlog tail, integrated with\nnotifications and the\nrollback delta viewer."
},
diff --git a/web/messages/en/docs/backup-restore/restoring.json b/web/messages/en/docs/backup-restore/restoring.json
index cd16d81a..46c29680 100644
--- a/web/messages/en/docs/backup-restore/restoring.json
+++ b/web/messages/en/docs/backup-restore/restoring.json
@@ -92,11 +92,11 @@
"fullFlow": {
"heading": "The full restore workflow",
"intro": "The complete pipeline from archive selection to a working restored host. Each stage feeds the next; the state written by earlier stages is consumed by later ones.",
- "diagram": "┌─────────────────────────────────────────────────────────────────┐\n│ Archive → staging_root/ │\n│ manifest.json metadata/ rootfs/ │\n└──────────────────────────────┬──────────────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 1. hb_compat_check │\n │ · hardware drift → RS_SKIP_PATHS │\n │ · kernel direction → same / bk_newer / bk_older │\n │ · NIC remap plan │\n │ · hydration plan (bk_older only) │\n │ · rollback plan │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 2. Confirmation dialog │\n │ Shows: hot count, pending count, drift, hydration, │\n │ NIC remap, cross-kernel note, reinstalls preview │\n └──────────────────────────────┬──────────────────────────┘\n │ (accepted)\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 3. Apply hot paths → LIVE │\n │ _rs_apply rsyncs each hot path │\n │ from staging_root/rootfs to / │\n │ (skips paths in RS_SKIP_PATHS) │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4. _rs_prepare_pending_restore │\n │ /var/lib/proxmenux/pending-restore/ │\n │ ├── apply-on-boot.list │\n │ ├── plan.env │\n │ ├── rs-skip-paths.txt │\n │ └── rootfs/ (deferred paths) │\n │ Enable proxmenux-restore-onboot.service │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4b. _rs_import_data_pools │\n │ Imports non-root ZFS pools whose disks are all │\n │ present; retries with -f on foreign hostid; │\n │ skips with a warning when disks are missing. │\n │ Log: /var/log/proxmenux/restore-datapools-*.log │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 5. _rs_run_complete_extras │\n │ packages.manual.list │\n │ → cascade-safe filter │\n │ → apt-get install │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 6. REBOOT │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 7. apply_pending_restore.sh (on early boot) │\n │ Reads plan.env │\n │ Applies apply-on-boot.list (filtered) │\n │ Installs the postboot systemd unit │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 8. apply_cluster_postboot.sh (~10 minutes) │\n │ Runs after pve-cluster is up │\n │ · Applies /etc/pve entries to pmxcfs │\n │ · update-initramfs -u -k all │\n │ · update-grub / proxmox-boot-tool refresh │\n │ · component --auto-reinstall (nvidia, coral, ...) │\n │ · Boot sanity check │\n │ · Notification: \"Host restore finished\" │\n └─────────────────────────────────────────────────────────┘"
+ "diagram": "┌─────────────────────────────────────────────────────────────────┐\n│ Archive → staging_root/ │\n│ manifest.json metadata/ rootfs/ │\n└──────────────────────────────┬──────────────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 1. hb_compat_check │\n │ · hardware drift → RS_SKIP_PATHS │\n │ · kernel direction → same / bk_newer / bk_older │\n │ · NIC remap plan │\n │ · hydration plan (bk_older only) │\n │ · rollback plan │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 2. Confirmation dialog │\n │ Shows: hot count, pending count, drift, hydration, │\n │ NIC remap, cross-kernel note, reinstalls preview │\n └──────────────────────────────┬──────────────────────────┘\n │ (accepted)\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 3. Apply hot paths → LIVE │\n │ _rs_apply rsyncs each hot path │\n │ from staging_root/rootfs to / │\n │ (skips paths in RS_SKIP_PATHS) │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4. _rs_prepare_pending_restore │\n │ /var/lib/proxmenux/restore-pending/'<'id'>'/ │\n │ ├── apply-on-boot.list │\n │ ├── plan.env │\n │ ├── rs-skip-paths.txt │\n │ └── rootfs/ (deferred paths) │\n │ Enable proxmenux-restore-onboot.service │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4b. _rs_import_data_pools │\n │ Imports non-root ZFS pools whose disks are all │\n │ present; retries with -f on foreign hostid; │\n │ skips with a warning when disks are missing. │\n │ Log: /var/log/proxmenux/restore-datapools-*.log │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 5. _rs_run_complete_extras │\n │ packages.manual.list │\n │ → cascade-safe filter │\n │ → apt-get install │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 6. REBOOT │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 7. apply_pending_restore.sh (on early boot) │\n │ Reads plan.env │\n │ Applies apply-on-boot.list (filtered) │\n │ Installs the postboot systemd unit │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 8. apply_cluster_postboot.sh (~10 minutes) │\n │ Runs after pve-cluster is up │\n │ · Applies /etc/pve entries to pmxcfs │\n │ · update-initramfs -u -k all │\n │ · update-grub / proxmox-boot-tool refresh │\n │ · component --auto-reinstall (nvidia, coral, ...) │\n │ · Boot sanity check │\n │ · Notification: \"Host restore finished\" │\n └─────────────────────────────────────────────────────────┘"
},
"pendingMachinery": {
"heading": "The pending-restore machinery",
- "intro": "Paths classified as reboot or dangerous, and hydration writes, are staged for the next boot instead of being applied live. This is done through a small, self-contained set of files under /var/lib/proxmenux/pending-restore/:",
+ "intro": "Paths classified as reboot or dangerous, and hydration writes, are staged for the next boot instead of being applied live. This is done through a small, self-contained set of files under /var/lib/proxmenux/restore-pending/<restore_id>/:",
"rows": [
{
"file": "apply-on-boot.list",
@@ -115,7 +115,7 @@
"content": "The staged files themselves — the exact bytes that will be laid down. Kept on the same filesystem as / so the on-boot rsync is fast and does not depend on external storage still being reachable at boot."
}
],
- "unitBody": "The proxmenux-restore-onboot.service systemd unit is enabled at the end of the interactive step. It is a one-shot service that fires early on the next boot, calls apply_pending_restore.sh, then disables itself. The unit is gated by ConditionPathExists=/var/lib/proxmenux/pending-restore/state, so on any boot without a pending restore it is a no-op."
+ "unitBody": "The proxmenux-restore-onboot.service systemd unit is enabled at the end of the interactive step. It is a one-shot service that fires early on the next boot (before networking), calls apply_pending_restore.sh, then disables itself. The unit has no path condition: the script itself exits when /var/lib/proxmenux/restore-pending/current does not exist, so on any boot without a pending restore it is a no-op. The separate proxmenux-apply-cluster-postboot.service is gated by ConditionPathExists=/var/lib/proxmenux/cluster-apply-pending."
},
"postbootDispatcher": {
"heading": "The post-boot dispatcher — apply_cluster_postboot.sh",
@@ -238,11 +238,11 @@
"heading": "Where the logs live",
"rows": [
{
- "log": "/var/log/proxmenux/restore-YYYYMMDD_HHMMSS.log",
- "detail": "Written by the interactive step. Contains: compatibility results, drift filter, hydration plan, apply hot output, prepare pending output, package install."
+ "log": "/tmp/proxmenux-pbs, borg or local). Package reinstalls and data-pool steps also log to /var/log/proxmenux/restore-apt-*.log and restore-datapools-*.log."
},
{
- "log": "/var/log/proxmenux/apply-pending-YYYYMMDD_HHMMSS.log",
+ "log": "/var/log/proxmenux/proxmenux-restore-onboot-YYYYMMDD_HHMMSS.log",
"detail": "Written by apply_pending_restore.sh on early boot. Contains: sourced plan.env, apply-on-boot iteration, skip-paths filtering."
},
{
diff --git a/web/messages/en/docs/backup-restore/scheduled-jobs.json b/web/messages/en/docs/backup-restore/scheduled-jobs.json
index 309941ec..f31bf6b9 100644
--- a/web/messages/en/docs/backup-restore/scheduled-jobs.json
+++ b/web/messages/en/docs/backup-restore/scheduled-jobs.json
@@ -101,7 +101,7 @@
},
"management": {
"heading": "Managing jobs",
- "intro": "The scheduler menu (Scripts TUI) and the Monitor Backups tab expose the same actions on any job.",
+ "intro": "The scheduler menu in the Scripts TUI (Backup scheduler and retention) offers Run now, Enable / Disable and Delete, plus a list of jobs with their last run status. Edit and View log are only available in the Monitor Backups tab.",
"rows": [
{
"action": "Run now",
@@ -112,7 +112,7 @@
"detail": "New mode: systemctl enable/disable --now the timer. Attach mode: flips the ENABLED flag in the job env — the hook script honours it on the next PVE fire."
},
{
- "action": "Edit",
+ "action": "Edit (Monitor only)",
"detail": "Reopens the destination, schedule, profile and retention prompts and rewrites the job files. Preserves the job ID."
},
{
@@ -120,7 +120,7 @@
"detail": "Removes the job env, paths file, systemd timer + service (New mode), and disables the hook binding (Attach mode). Does not touch archives already on the destination."
},
{
- "action": "View log",
+ "action": "View log (Monitor only)",
"detail": "Streams /var/log/proxmenux/backup-jobs/JOB_ID-YYYYMMDD_HHMMSS.log — one log file per run. The runner also emits a compact status line to journald under the systemd service."
}
]
diff --git a/web/messages/es/docs/backup-restore/creating-backups.json b/web/messages/es/docs/backup-restore/creating-backups.json
index 21b9f6a2..3b1f43bd 100644
--- a/web/messages/es/docs/backup-restore/creating-backups.json
+++ b/web/messages/es/docs/backup-restore/creating-backups.json
@@ -125,13 +125,6 @@
"included": {
"heading": "Qué entra y qué se excluye",
"intro": "Cada ruta del perfil resuelto (default + extras persistentes + selección en modo Custom) se copia con rsync -aAXH --numeric-ids. Una lista de exclusiones compartida aplica a cada ruta, y dos directorios llevan exclusiones específicas adicionales.",
- "globalTitle": "Exclusiones globales (aplican a cada ruta)",
- "globalItems": [
- "images/ — dumps de imágenes.",
- "dump/ — salidas de vzdump.",
- "tmp/ — ficheros temporales.",
- "*.log — ficheros de log."
- ],
"rootTitle": "Exclusiones de /root/",
"rootBody": "/root/ forma parte del perfil por defecto para que los scripts y config del usuario entren en el archivo. Se descartan los subpaths volátiles:",
"rootItems": [
diff --git a/web/messages/fr/docs/backup-restore/creating-backups.json b/web/messages/fr/docs/backup-restore/creating-backups.json
index 8fcdb1fe..981af1ce 100644
--- a/web/messages/fr/docs/backup-restore/creating-backups.json
+++ b/web/messages/fr/docs/backup-restore/creating-backups.json
@@ -125,13 +125,6 @@
"included": {
"heading": "Ce qui entre et ce qui reste en dehors",
"intro": "Chaque chemin dans le profil résolu (par défaut + suppléments persistants + sélection en mode personnalisé) est copié avec rsync -aAXH --numeric-ids. Une liste d'exclusion partagée s'applique à chaque chemin, et deux répertoires comportent d'autres exclusions spécifiques au chemin.",
- "globalTitle": "Les exclusions globales (appliquées à chaque voie)",
- "globalItems": [
- "images/ — images de disque exportées.",
- "dump/ — sorties vzdump.",
- "tmp/ — fichiers temporaires.",
- "*.log — fichiers journaux."
- ],
"rootTitle": "Exclusions de /root/",
"rootBody": "/root/ fait partie du profil par défaut, de sorte que les scripts utilisateur et la configuration se trouvent dans l'archive. Les sous-chemins volatils sont abandonnés:",
"rootItems": [
diff --git a/web/messages/it/docs/backup-restore/creating-backups.json b/web/messages/it/docs/backup-restore/creating-backups.json
index c3446fd6..9fa6693e 100644
--- a/web/messages/it/docs/backup-restore/creating-backups.json
+++ b/web/messages/it/docs/backup-restore/creating-backups.json
@@ -125,13 +125,6 @@
"included": {
"heading": "Cosa entra e cosa rimane fuori",
"intro": "Ogni percorso nel profilo risolto (predefinito + extra persistenti + selezione personalizzata) viene copiato con rsync -aAXH --numeric-ids. Un elenco di esclusione condiviso si applica a ogni percorso, e due directory portano ulteriori esclusioni specifiche del percorso.",
- "globalTitle": "Esclusioni globali (applicate ad ogni percorso)",
- "globalItems": [
- "images/ — dump immagine.",
- "dump/ — output di vzdump.",
- "tmp/ — file temporanei.",
- "*.log — file di registro."
- ],
"rootTitle": "/root/ esclusioni",
"rootBody": "/root/ fa parte del profilo predefinito per includere nell’archivio gli script e la configurazione dell’utente. Sono esclusi i sottopercorsi volatili:",
"rootItems": [
diff --git a/web/messages/pt/docs/backup-restore/creating-backups.json b/web/messages/pt/docs/backup-restore/creating-backups.json
index 6386b9ab..83858111 100644
--- a/web/messages/pt/docs/backup-restore/creating-backups.json
+++ b/web/messages/pt/docs/backup-restore/creating-backups.json
@@ -125,13 +125,6 @@
"included": {
"heading": "O que entra e o que fica fora",
"intro": "Cada caminho no perfil resolvido (padrão + extras persistentes + seleção de modo personalizado) é copiado com rsync -aAXH --numeric-ids. Uma lista de exclusão compartilhada aplica-se a cada caminho, e dois diretórios carregam exclusões adicionais específicas do caminho.",
- "globalTitle": "Exclusões globais (aplicadas a cada caminho)",
- "globalItems": [
- "images/ — dumps de imagens.",
- "dump/ — saídas vzdump.",
- "tmp/ — ficheiros temporários.",
- "*.log — ficheiros de registo."
- ],
"rootTitle": "Exclusões /root/",
"rootBody": "/root/ faz parte do perfil padrão para incluir os scripts e a configuração do usuário no arquivo. Os subcaminhos voláteis são excluídos:",
"rootItems": [
diff --git a/web/messages/sk/docs/backup-restore/creating-backups.json b/web/messages/sk/docs/backup-restore/creating-backups.json
index 3fc89c76..05be844a 100644
--- a/web/messages/sk/docs/backup-restore/creating-backups.json
+++ b/web/messages/sk/docs/backup-restore/creating-backups.json
@@ -125,13 +125,6 @@
"included": {
"heading": "Čo ide dnu a čo zostane vonku",
"intro": "Každá cesta v určenom profile (predvolené + trvalé doplnky + výber vo vlastnom režime) je skopírovaná s rsync -aAXH --numeric-ids. Spoločný zoznam vylúčení sa vzťahuje na každú cestu a dva adresáre majú dodatočné výnimky špecifické pre jednotlivé trasy.",
- "globalTitle": "Globálne vylúčenia (uplatnené na každú cestu)",
- "globalItems": [
- "images/ — výpisy obrazov.",
- "dump/ — výstupy vzdump.",
- "tmp/ - dočasné súbory.",
- "*.log — súbory záznamov."
- ],
"rootTitle": "Výnimky /root/",
"rootBody": "/root/ je súčasťou predvoleného profilu, aby sa do archívu zahrnuli používateľské skripty a konfigurácia. Dočasné podcesty sa vynechajú:",
"rootItems": [
diff --git a/web/messages/sv/docs/backup-restore/creating-backups.json b/web/messages/sv/docs/backup-restore/creating-backups.json
index f11c2a6d..e9d8ef9f 100644
--- a/web/messages/sv/docs/backup-restore/creating-backups.json
+++ b/web/messages/sv/docs/backup-restore/creating-backups.json
@@ -125,13 +125,6 @@
"included": {
"heading": "Vad går in och vad stannar ut",
"intro": "Varje sökväg i den fastställda profilen (standard + beständiga tillägg + val i anpassat läge) kopieras med rsync -aAXH --numeric-ids. En delad uteslutningslista gäller för varje sökväg, och två kataloger har ytterligare sökvägsspecifika uteslutningar.",
- "globalTitle": "Globala uteslutningar (tillämpas varje väg)",
- "globalItems": [
- "images/ - bilddumpar.",
- "dump/ — utdata från vzdump.",
- "tmp/ - tillfälliga filer.",
- "*.log loggfiler."
- ],
"rootTitle": "/root/-uteslutningar",
"rootBody": "/root/ ingår i standardprofilen så att användarens skript och konfiguration sparas i arkivet. Flyktiga undersökvägar utesluts:",
"rootItems": [