diff --git a/containers/libreportal/frontend/html/apps-unified-layout.html b/containers/libreportal/frontend/html/apps-unified-layout.html index 25fea05..ae3cc8d 100755 --- a/containers/libreportal/frontend/html/apps-unified-layout.html +++ b/containers/libreportal/frontend/html/apps-unified-layout.html @@ -181,7 +181,7 @@

💾 Backups

-

Snapshots for this app across all configured repositories.

+

Backups for this app across all configured locations.

Loading…
diff --git a/containers/libreportal/frontend/html/backup-content.html b/containers/libreportal/frontend/html/backup-content.html index 9149243..6945117 100644 --- a/containers/libreportal/frontend/html/backup-content.html +++ b/containers/libreportal/frontend/html/backup-content.html @@ -134,7 +134,7 @@
-

Cross-host migrate ℹ️

+

Cross-host migrate ℹ️

Restore an app from another LibrePortal
-
Snapshot ID: ${this.escape(sid)}
+
Backup ID: ${this.escape(sid)}
Location: ${this.escape(s.locName)}
When: ${this.escape(this._fmtFull(s.time))}
${s.hostname ? `
Host: ${this.escape(s.hostname)}
` : ''} @@ -213,7 +213,7 @@ class BackupAppCard { async restoreSnapshot(locIdx, snapshot) { const locName = this.locationsByIdx[locIdx]?.name || `Location ${locIdx}`; - if (!confirm(`Restore ${this.appName} from backup ${snapshot} at ${locName}? The app will be stopped, its folder wiped, the backup restored in place, then the app started again.`)) return; + if (!confirm(`Restore ${this.appName} from backup ${snapshot} at ${locName}?\n\nThe app will be stopped, its folder wiped, the backup restored in place, then the app started again.`)) return; if (!this.taskManager) return; await this.taskManager.createTask(`libreportal restore app start ${this.appName} ${snapshot} ${locIdx}`, 'restore', this.appName); } diff --git a/containers/libreportal/frontend/js/components/backup/backup-page.js b/containers/libreportal/frontend/js/components/backup/backup-page.js index 706be4f..3642e11 100644 --- a/containers/libreportal/frontend/js/components/backup/backup-page.js +++ b/containers/libreportal/frontend/js/components/backup/backup-page.js @@ -14,7 +14,7 @@ const BACKUP_RETENTION_PRESETS = { const BACKUP_RETENTION_PRESET_META = { 'inherit-global': { label: 'Inherit global retention', hint: 'Use whatever the Configuration tab specifies. Pick something else here only when this location needs a different policy.' }, 'self-hosting': { label: 'Self-hosting', hint: '30 days of daily backups. Plenty for a homelab — covers accidental deletes and app screw-ups.' }, - 'personal': { label: 'Personal', hint: '30 days of daily backups plus 6 monthly snapshots. Good for personal data where "what did this look like last summer" matters.' }, + 'personal': { label: 'Personal', hint: '30 days of daily backups plus 6 monthly backups. Good for personal data where "what did this look like last summer" matters.' }, 'enterprise': { label: 'Enterprise', hint: '30 daily + 12 monthly + 5 yearly. Compliance-style retention with multi-year history.' }, 'custom': { label: 'Custom…', hint: 'Define each retention tier yourself.' } }; @@ -44,11 +44,11 @@ const BACKUP_LOC_FIELD_DEFS = { B2_ACCOUNT_KEY: { title: 'B2 account key', description: '' }, APPEND_ONLY: { title: 'Append-only', description: 'Ransomware-safe — refuse forget/prune for this location even if LibrePortal itself is compromised. Trades off automatic retention cleanup.' }, CUSTOM_RETENTION: { title: 'Use custom retention', description: 'Otherwise this location inherits the global retention.' }, - KEEP_LAST: { title: 'Keep last', description: 'Snapshots to always retain.' }, - KEEP_DAILY: { title: 'Keep daily', description: 'One snapshot per day for this many days.' }, - KEEP_WEEKLY: { title: 'Keep weekly', description: 'One snapshot per week for this many weeks.' }, - KEEP_MONTHLY: { title: 'Keep monthly', description: 'One snapshot per month for this many months.' }, - KEEP_YEARLY: { title: 'Keep yearly', description: 'One snapshot per year for this many years.' } + KEEP_LAST: { title: 'Keep last', description: 'Backups to always retain.' }, + KEEP_DAILY: { title: 'Keep daily', description: 'One backup per day for this many days.' }, + KEEP_WEEKLY: { title: 'Keep weekly', description: 'One backup per week for this many weeks.' }, + KEEP_MONTHLY: { title: 'Keep monthly', description: 'One backup per month for this many months.' }, + KEEP_YEARLY: { title: 'Keep yearly', description: 'One backup per year for this many years.' } }; // Fallback for the per-type field schema. The live source is the generator- @@ -504,7 +504,7 @@ class BackupPage { subtitleFor(tab) { return { dashboard: "Check what's protected — and when it last ran.", - backups: 'Every snapshot across every enabled location.', + backups: 'Every backup across every enabled location.', locations: 'Where backups are stored. Add, edit, or remove destinations.', migrate: 'Restore an app from another LibrePortal that shares one of your backup locations.', configuration: 'Schedule, retention, and engine settings.' @@ -1113,7 +1113,7 @@ class BackupPage {
Keep your LibrePortal config backed up offline. - Repository passwords live inside the config directory. Without that backup, snapshots cannot be decrypted by anyone — including you. + Repository passwords live inside the config directory. Without that backup, the others cannot be decrypted by anyone — including you.
- ${this.formInput(`${prefix}KEEP_LAST`, 'Keep last', values.last, 'number', '', 'snapshots')} + ${this.formInput(`${prefix}KEEP_LAST`, 'Keep last', values.last, 'number', '', 'backups')} ${this.formInput(`${prefix}KEEP_DAILY`, 'Keep daily', values.daily, 'number', '', 'days')} ${this.formInput(`${prefix}KEEP_WEEKLY`, 'Keep weekly', values.weekly, 'number', '', 'weeks')} ${this.formInput(`${prefix}KEEP_MONTHLY`, 'Keep monthly', values.monthly, 'number', '', 'months')} @@ -1837,7 +1837,7 @@ class BackupPage { if (!modal || !body) return; body.innerHTML = `

Restore ${this.escape(app)} from backup ${this.escape(snapshot)} at ${this.escape(locName)}?

-

The app will be stopped, its folder wiped, the snapshot restored in place, then the app started again. App-specific pre/post-restore hooks run if present.

+

The app will be stopped, its folder wiped, the backup restored in place, then the app started again. App-specific pre/post-restore hooks run if present.

`; modal.dataset.app = app; modal.dataset.locIdx = locIdx;