docs(web): fix Backup & Restore drift found in docs audit

This commit is contained in:
Manuel Escalante
2026-11-03 19:52:20 +01:00
parent e51553ada8
commit e9272c90a0
15 changed files with 25 additions and 96 deletions
@@ -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 })}
</p>
<h3 className="text-lg font-semibold mt-6 mb-3 text-gray-900">
{t.rich("included.globalTitle", { code })}
</h3>
<ul className="mb-6 space-y-1">
{globalItems.map((_, idx) => (
<li key={idx} className="text-gray-800 leading-relaxed pl-1">
<span className="text-gray-400 mr-2">•</span>
{t.rich(`included.globalItems.${idx}`, { code })}
</li>
))}
</ul>
<h3 className="text-lg font-semibold mt-6 mb-3 text-gray-900">
{t.rich("included.rootTitle", { code })}
</h3>
@@ -125,13 +125,6 @@
"included": {
"heading": "Was reingeht und was draußen bleibt",
"intro": "Jeder Pfad im aufgelösten Profil (Standard + persistente Extras + Custom-Mode-Auswahl) wird mit <code>rsync -aAXH --numeric-ids</code> 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": [
"<code>images/</code> — Image Dumps.",
"<code>dump/</code> — Ausgaben von vzdump.",
"<code>tmp/</code> — temporäre Dateien.",
"<code>*.log</code> — Protokolldateien."
],
"rootTitle": "<code>/root/</code> Ausschlüsse",
"rootBody": "<code>/root/</code> ist Teil des Standardprofils, sodass Benutzerskripte und Konfigurationen im Archiv landen. Flüchtige Subpfade werden fallen gelassen:",
"rootItems": [
@@ -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 <code>backup_menu</code> in <code>backup_host.sh</code>."
"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 <code>backup_menu</code> in <code>backup_host.sh</code>."
},
{
"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 <code>hb_default_profile_paths</code> (documented in <em>How it works</em> under <em>Path categories</em>) plus every entry in the persistent extras file <code>/usr/local/share/proxmenux/backup-extra-paths.txt</code>. 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 <code>hb_default_profile_paths</code> (documented in <em>How it works</em> under <em>Path categories</em>) plus every entry in the persistent extras file <code>/usr/local/share/proxmenux/backup-extra-paths.txt</code>. 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 <code>[+]</code>). The user ticks the set for this run and can press <em>Add custom path</em> to append a new absolute path. Any path added inline is persisted to <code>backup-extra-paths.txt</code> 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 <em>Manage custom paths</em> 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 <code>rsync -aAXH --numeric-ids</code>. A shared exclusion list applies to every path, and two directories carry additional path-specific exclusions.",
"globalTitle": "Global exclusions (applied to every path)",
"globalItems": [
"<code>images/</code> — image dumps.",
"<code>dump/</code> — vzdump outputs.",
"<code>tmp/</code> — temporary files.",
"<code>*.log</code> — log files."
],
"intro": "Every path in the resolved profile (default + persistent extras + custom-mode selection) is copied with <code>rsync -aAXH --numeric-ids</code>. There is no global exclusion list; a few directories carry path-specific exclusions.",
"rootTitle": "<code>/root/</code> exclusions",
"rootBody": "<code>/root/</code> is part of the default profile so user scripts and config land in the archive. Volatile subpaths are dropped:",
"rootItems": [
@@ -160,16 +153,16 @@
"<strong><code>/home/USER</code></strong> — 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 <code>backup-extra-paths.txt</code> goes through the same <code>rsync</code> pipeline as default-profile paths. Global exclusions apply. If the custom path happens to be under <code>/root/</code> or <code>/usr/local/share/proxmenux/</code>, the path-specific exclusions above still apply. Every archived path — default or custom — is recorded in <code>metadata/paths_archived.txt</code>. Paths that do not exist on the source are recorded in <code>metadata/missing_paths.txt</code> without stopping the backup."
"customPathsBody": "A custom path added inline in Custom mode or persisted in <code>backup-extra-paths.txt</code> goes through the same <code>rsync</code> pipeline as default-profile paths. If the custom path happens to be under <code>/root/</code> or <code>/usr/local/share/proxmenux/</code>, the path-specific exclusions above still apply. Every archived path — default or custom — is recorded in <code>metadata/selected_paths.txt</code>. Paths that do not exist on the source are recorded in <code>metadata/missing_paths.txt</code> without stopping the backup, and paths that fail to copy in <code>metadata/failed_paths.txt</code>."
},
"archiveStructure": {
"heading": "Archive structure",
"intro": "The staging directory produced by every backend follows the same layout regardless of destination. The tarball, PBS <code>.pxar</code> 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 <code>trap</code> 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 <code>trap</code> hook set on the backend function and no partial data reaches the destination."
},
"writing": {
"heading": "Writing to the destination",
@@ -18,11 +18,11 @@
},
"targetConfig": {
"heading": "Configuring the target directory",
"intro": "The local destination is a <strong>single persisted target directory</strong> — not a list. ProxMenux stores the user's choice at <code>/usr/local/share/proxmenux/local-target.conf</code> and reads it on every backup. When no target has been configured, the default <code>HB_LOCAL_TARGET_DEFAULT = /var/lib/vz/dump</code> is used (the same directory Proxmox uses for its own <code>vzdump</code> outputs). The target is configured from <em>Configure backup destinations → Local destinations</em>:",
"intro": "The local destination is a <strong>single persisted target directory</strong> — not a list. ProxMenux stores the user's choice at <code>/usr/local/share/proxmenux/local-target.conf</code> and reads it on every backup. When no target has been configured, the default <code>HB_LOCAL_TARGET_DEFAULT = /var/lib/vz/dump</code> is used (the same directory Proxmox uses for its own <code>vzdump</code> outputs). The target is configured from <em>Configure backup destinations → Local archive targets → Manage local backup target</em>:",
"options": [
"<strong>Use default (<code>/var/lib/vz/dump</code>).</strong> 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.",
"<strong>Enter a custom path.</strong> Any absolute filesystem path can be used: an NFS mount, an SMB share mounted via <code>fstab</code>, a dedicated ZFS dataset, a second internal disk. ProxMenux validates that the path exists and is a directory before persisting it.",
"<strong>Pick a USB drive.</strong> Opens the USB submenu (below), which detects removable devices and offers to mount or format one."
"<strong>Use a custom path.</strong> Any absolute filesystem path can be used: an NFS mount, an SMB share mounted via <code>fstab</code>, a dedicated ZFS dataset, a second internal disk. ProxMenux validates that the path exists and is a directory before persisting it.",
"<strong>Use a USB disk.</strong> 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 <code>hb_mount_usb_partition</code>: creates <code>/mnt/backup-LABEL</code> (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 <code>hb_mount_usb_partition</code>: creates <code>/mnt/proxmenux-backup-LABEL</code> (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: <code>HOSTNAME-TIMESTAMP.tar.zst.proxmenux.json</code>, written next to the archive by <code>hb_write_archive_sidecar</code>. 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: <code>hostcfg-HOSTNAME-TIMESTAMP.tar.zst.proxmenux.json</code>, written next to the archive by <code>hb_write_archive_sidecar</code>. 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 (<code>kind</code>), the job ID for scheduled runs, the profile mode used (<code>default</code> or <code>custom</code>), 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 <code>*.proxmenux.json</code> sidecars — not for <code>*.tar.zst</code> files — because a <code>.tar.zst</code> 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."
@@ -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 <em>Configure backup destinations → PBS destinations → Add PBS</em>. Prompts for a name, username (<code>root@pam</code> or <code>user@pbs!token</code>), 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 <em>Configure backup destinations → Proxmox Backup Server (PBS) destinations → + Add new PBS manually</em>. Prompts for a name, username (<code>root@pam</code> or <code>user@pbs!token</code>), 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",
@@ -20,7 +20,7 @@
"heading": "Archive layout",
"intro": "Every archive follows the same tree layout regardless of destination. The <code>metadata/</code> subdirectory holds the structured payloads; the <code>rootfs/</code> 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": "<code>_rs_prepare_pending_restore</code> stages risky paths under <code>/var/lib/proxmenux/pending-restore/</code>, writes <code>plan.env</code>, <code>apply-on-boot.list</code> and <code>rs-skip-paths.txt</code>, and enables <code>proxmenux-restore-onboot.service</code> to fire on the next boot."
"action": "<code>_rs_prepare_pending_restore</code> stages risky paths under <code>/var/lib/proxmenux/restore-pending/&lt;restore_id&gt;/</code> (linked as <code>current</code>), writes <code>plan.env</code>, <code>apply-on-boot.list</code> and <code>rs-skip-paths.txt</code>, and enables <code>proxmenux-restore-onboot.service</code> to fire on the next boot."
},
{
"stage": "3b",
@@ -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."
},
File diff suppressed because one or more lines are too long
@@ -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: <code>systemctl enable/disable --now</code> the timer. Attach mode: flips the <code>ENABLED</code> 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 <code>/var/log/proxmenux/backup-jobs/JOB_ID-YYYYMMDD_HHMMSS.log</code> — one log file per run. The runner also emits a compact status line to journald under the systemd service."
}
]
@@ -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 <code>rsync -aAXH --numeric-ids</code>. 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": [
"<code>images/</code> — dumps de imágenes.",
"<code>dump/</code> — salidas de vzdump.",
"<code>tmp/</code> — ficheros temporales.",
"<code>*.log</code> — ficheros de log."
],
"rootTitle": "Exclusiones de <code>/root/</code>",
"rootBody": "<code>/root/</code> 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": [
@@ -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 <code>rsync -aAXH --numeric-ids</code>. 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": [
"<code>images/</code> — images de disque exportées.",
"<code>dump/</code> — sorties vzdump.",
"<code>tmp/</code> — fichiers temporaires.",
"<code>*.log</code> — fichiers journaux."
],
"rootTitle": "Exclusions de <code>/root/</code>",
"rootBody": "<code>/root/</code> 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": [
@@ -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 <code>rsync -aAXH --numeric-ids</code>. 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": [
"<code>images/</code> — dump immagine.",
"<code>dump/</code> — output di vzdump.",
"<code>tmp/</code> — file temporanei.",
"<code>*.log</code> — file di registro."
],
"rootTitle": "<code>/root/</code> esclusioni",
"rootBody": "<code>/root/</code> fa parte del profilo predefinito per includere nell’archivio gli script e la configurazione dell’utente. Sono esclusi i sottopercorsi volatili:",
"rootItems": [
@@ -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 <code>rsync -aAXH --numeric-ids</code>. 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": [
"<code>images/</code> — dumps de imagens.",
"<code>dump/</code> — saídas vzdump.",
"<code>tmp/</code> — ficheiros temporários.",
"<code>*.log</code> — ficheiros de registo."
],
"rootTitle": "Exclusões <code>/root/</code>",
"rootBody": "<code>/root/</code> 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": [
@@ -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 <code>rsync -aAXH --numeric-ids</code>. 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": [
"<code>images/</code> — výpisy obrazov.",
"<code>dump/</code> — výstupy vzdump.",
"<code>tmp/</code> - dočasné súbory.",
"<code>*.log</code> — súbory záznamov."
],
"rootTitle": "Výnimky <code>/root/</code>",
"rootBody": "<code>/root/</code> 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": [
@@ -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 <code>rsync -aAXH --numeric-ids</code>. 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": [
"<code>images/</code> - bilddumpar.",
"<code>dump/</code> — utdata från vzdump.",
"<code>tmp/</code> - tillfälliga filer.",
"<code>*.log</code> loggfiler."
],
"rootTitle": "<code>/root/</code>-uteslutningar",
"rootBody": "<code>/root/</code> ingår i standardprofilen så att användarens skript och konfiguration sparas i arkivet. Flyktiga undersökvägar utesluts:",
"rootItems": [