` : ''}
@@ -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.
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.