@inherits LocalizableComponentBase @implements IAsyncDisposable @* The server's backups (/clientapi/admin/backups; owner decision 2026-10-07): made nightly, before each deploy and here, downloaded as one tar through a link good for ten minutes, uploaded again in pieces straight from the browser (js/transfer.js, never through .NET's memory), and restored: PrivaPub stops, restores the backup as it starts again, and everyone signs in again. A restore never undoes what protects. *@
@Localizer["The last restore, of {0}, was abandoned; nothing changed.", last.Backup]
@last.Error
} else {@Localizer["Restored {0}", last.Backup] @last.RestoredAt.GetPassedTime(Localizer) @Localizer["asked for by {0}", last.RequestedBy]
@Localizer["{0} documents in {1} collections; {2} media files brought back, {3} missing.", last.Documents, last.Collections, last.MediaRestored, last.MediaMissing]
@Localizer["Deleted again: {0} logins, {1} personas, {2} groups, {3} posts. Kept from since: {4} blocks, mutes, reports and other protective acts.", last.RootsDeleted, last.PersonasDeleted, last.GroupsDeleted, last.PostsDeleted, last.ProtectiveKept]
@if (last.RootsTombstoned.Count + last.PersonasTombstoned.Count + last.GroupsTombstoned.Count > 0) {@Localizer["Made after the backup, now deleted with their names kept: {0}.", string.Join(", ", last.RootsTombstoned.Concat(last.PersonasTombstoned).Concat(last.GroupsTombstoned))]
}@Localizer["{0} posts made since answer as deleted; {1} media went to the trash; {2} sessions ended. The server as it was before is the backup {3}.", last.PostsGone, last.MediaTrashed, last.SessionsEnded, last.PreRestore]
}@Localizer["Upload a backup downloaded from here (a .tar file):"]
@Localizer["{0} of {1}", uploaded.GetFileSize(Localizer), uploadSize.GetFileSize(Localizer)]
}@Localizer["No backup yet."]
} @foreach (var backup in backups.Backups) {@Localizer["{0} documents in {1} collections", backup.Documents, backup.Collections]; @(backup.DbOnly ? Localizer["{0} media files listed, kept by the nightly backups", backup.MediaFiles] : Localizer["{0} media files ({1})", backup.MediaFiles, backup.MediaBytes.GetFileSize(Localizer)]) @if (backup.MediaMissing > 0) { ; @Localizer["{0} missing", backup.MediaMissing] } @if (!backup.Consistent) { ; @Localizer["not read at one instant"] }
@if (backup.RootsDeletedSince > 0) {@Localizer["{0} logins were deleted since; a restore deletes them again.", backup.RootsDeletedSince]
}@Localizer["It holds every persona's private keys and private posts: keep it where only you can read it. Your password, to get a link:"]
@Localizer["The link works for ten minutes, for this backup only."]
@Localizer["Download {0}", ticketSize.GetFileSize(Localizer)] }@Localizer["PrivaPub stops, restores this backup and starts again, in a few minutes. Everyone signs in again."]
@Localizer["What was made since is lost: posts, edits, follows asked for, settings. What protects is not: deletions, blocks, mutes, server blocks, reports, filters and reserved names made since stay, and followers stay as they are now. Logins, personas and groups made since are deleted, keeping their names."]
@if (restoring?.RootsDeletedSince > 0) {@Localizer["{0} logins were deleted since; a restore deletes them again.", restoring.RootsDeletedSince]
}