A távoli mentésre kijelölt alkalmazások legutóbbi pillanatképe egy külön ellenőrző mappába állítható vissza — a meglévő adatok nem változnak.
Válaszd ki az alkalmazást, és a következő oldalon döntsd el, mit szeretnél: ellenőrzést külön mappába, csak a hiányzó fájlok visszahozását, vagy teljes visszaállítást. Egyik sem indul el kérdés nélkül.
{{range .OffboxApps}}
{{if .Enabled}}
{{template "app_list_row" dict "Slug" .Slug "Name" .DisplayName}}
-
-
- {{if $.FullPrepApp}}{{if eq $.FullPrepApp .Name}}
-
- {{end}}{{end}}
- {{if $.OffboxScratchReady}}{{if index $.OffboxScratchReady .Name}}
-
-
A meglévő fájlokat nem írja felül. Adatbázist nem állít vissza — törölt tartalom ettől nem jelenik meg újra.
- {{$pair := index $.OffboxPairInfo .Name}}
-
-
A fájlokat a mentés szerinti változatra állítja vissza és az adatbázist is visszatölti. Semmit nem töröl: a mentés óta létrejött fájlok megmaradnak. A jelenlegi adatbázisról előtte biztonsági mentés készül.
- {{if $pair.Skewed}}
-
Az adatbázis-mentés régebbi{{if not $pair.DumpsAt.IsZero}} ({{fmtTime $pair.DumpsAt}}){{end}} — a fájlok és az adatbázis eltérő időpontból származnak.
- {{end}}
- {{if $pair.LooksEmpty}}
-
A mentett adatbázis üresnek tűnik (nincs benne felhasználói fiók) — elképzelhető, hogy a mentés korábbi, mint az adataid.
- {{end}}
- {{end}}{{end}}
+
+
Visszaállítás…
{{template "app_list_row_end"}}
{{end}}
{{end}}
@@ -235,26 +198,6 @@ function confirmDeleteVerifyCopy(btn){
});
});
}
-/* R-43: the true offsite restore overwrites live files and replays a database, so it double-confirms
- and — unlike the old missing-only merge — states the DB half's age and any warning BEFORE the
- customer commits. The honesty lines are already rendered under the button; repeating the decisive
- ones here means the person clicking "Igen" has read them. */
-function confirmFullRestore(btn){
- var app = btn.getAttribute('data-restore-app') || '';
- var when = btn.getAttribute('data-restore-when') || '';
- var skewed = btn.getAttribute('data-restore-skewed') === '1';
- var empty = btn.getAttribute('data-restore-empty') === '1';
- var q = 'Teljes visszaállítás: ' + app + (when ? ' — a mentés ideje: ' + when : '') + '.';
- if (skewed) { q += ' FIGYELEM: a fájlok és az adatbázis eltérő időpontból származnak.'; }
- if (empty) { q += ' FIGYELEM: a mentett adatbázis üresnek tűnik.'; }
- q += ' A fájlok a mentés szerinti változatra állnak vissza, semmi nem törlődik.';
- felhomConfirm(btn, q, function(){
- felhomConfirm(btn, 'UTOLSÓ MEGERŐSÍTÉS: az alkalmazás leáll, az adatbázis visszatöltődik, majd újraindul. A jelenlegi adatbázisról biztonsági mentés készül.', function(){
- var f = btn.closest('form');
- if (f) { if (f.requestSubmit) f.requestSubmit(); else f.submit(); }
- });
- });
-}
function fabStart(stack, next){
fetch('/api/export/download/start', {method:'POST', headers:Object.assign({'Content-Type':'application/json'}, csrfHeaders()), body: JSON.stringify({stack_name: stack, password: fabPassword()})})
.then(function(r){ return r.json(); })
diff --git a/controller/internal/web/templates/backups_restore_wizard.html b/controller/internal/web/templates/backups_restore_wizard.html
new file mode 100644
index 0000000..5f9deaa
--- /dev/null
+++ b/controller/internal/web/templates/backups_restore_wizard.html
@@ -0,0 +1,160 @@
+{{define "backups_restore_wizard"}}
+{{template "layout_start" .}}
+
+
+
+
+
+{{template "backups_flash" .}}
+{{template "restore_banner" .}}
+
+
+
+ Előkészítés
+ Megerősítés
+ Végrehajtás
+ Eredmény
+
+
+{{if eq (printf "%s" .Wizard.Step) "execution"}}
+
+
+
Végrehajtás
+
Jelenleg egy mentési vagy visszaállítási művelet fut{{with .RunningStack}} ({{.}}){{end}}. Amíg ez tart, új visszaállítás nem indítható.
+
Az állapot fent automatikusan frissül. A művelet befejezése után frissítsd az oldalt.
+
+
+
+{{else if eq (printf "%s" .Wizard.Step) "prepare-confirm"}}
+
+
+
Megerősítés — teljes visszaállítás előkészítése
+
A teljes visszaállításhoz a mentés teljes tartalmát le kell tölteni a távoli tárolóból{{with .FullPrepSize}} — a becsült méret: {{.}}{{end}}. A letöltés a meghajtón egy külön előkészítő mappába kerül; az élő adataid ebben a lépésben még nem változnak.
+
A letöltés a mérettől és a kapcsolat sebességétől függően hosszabb ideig is tarthat. Ha elkészült, ezen az oldalon választhatod ki, hogy csak a hiányzó fájlokat hozod vissza, vagy teljes visszaállítást kérsz.
+
+
+
+{{else}}
+
+
+
+
1. Ellenőrzés külön mappába
+
A mentés tartalma egy külön ellenőrző mappába kerül — az élő adataid nem változnak.
+
+
+
+
+
+
+
2. Hiányzó fájlok visszahozása
+
Csak a hiányzó fájlokat másolja vissza a meglévők közé. A meglévő fájlokat nem írja felül, adatbázist nem állít vissza — törölt tartalom ettől nem jelenik meg újra.
+ {{if .Wizard.PlaceEnabled}}
+
+
+
+ {{else}}
+
Ehhez előbb elő kell készíteni a teljes mentést — lásd a 3. pontot.
+ {{end}}
+
+
+
+
3. Teljes visszaállítás (fájlok + adatbázis)
+
A fájlokat a mentés szerinti változatra állítja vissza és az adatbázist is visszatölti. Semmit nem töröl: a mentés óta létrejött fájlok megmaradnak. A jelenlegi adatbázisról előtte biztonsági mentés készül.
+
+ {{if .Wizard.RestoreEnabled}}
+
+
+ Az előkészített mentés:
+ {{if not .Pair.DumpsAt.IsZero}}adatbázis-mentés ideje: {{fmtTime .Pair.DumpsAt}}.{{else}}az adatbázis-mentés ideje nem állapítható meg.{{end}}
+
+ {{if .Pair.Skewed}}
+
Az adatbázis-mentés régebbi{{if not .Pair.DumpsAt.IsZero}} ({{fmtTime .Pair.DumpsAt}}){{end}} — a fájlok és az adatbázis eltérő időpontból származnak.
+ {{end}}
+ {{if .Pair.LooksEmpty}}
+
A mentett adatbázis üresnek tűnik (nincs benne felhasználói fiók) — elképzelhető, hogy a mentés korábbi, mint az adataid.
+ {{end}}
+
+
+
+ {{else}}
+
A teljes visszaállításhoz először le kell tölteni a mentés teljes tartalmát. Az előkészítés megmutatja a méretet, mielőtt bármi elindulna — az élő adataid az előkészítés alatt nem változnak.
+
+
+
+ {{end}}
+
+{{end}}
+
+
+
+{{template "layout_end" .}}
+{{end}}
diff --git a/controller/internal/web/templates/style.css b/controller/internal/web/templates/style.css
index 29386ec..9f9b468 100644
--- a/controller/internal/web/templates/style.css
+++ b/controller/internal/web/templates/style.css
@@ -3421,3 +3421,27 @@ html::-webkit-scrollbar-track { background: var(--bg-0); }
/* Inline two-step confirm (drill F-11) — the in-place replacement for native confirm() */
.inline-confirm { display: inline-flex; align-items: center; gap: .5rem; flex-wrap: wrap; }
.inline-confirm-q { font-size: .8rem; color: var(--warn); }
+
+/* R-48 offsite restore wizard — scoped to the wizard page only.
+ The destructive intent card is marked by a critical-tone left rule, not a shouty background:
+ the exception-color principle applies to cards too, and the copy carries the warning. */
+.restore-wizard-phases {
+ display: flex;
+ flex-wrap: wrap;
+ gap: .35rem .75rem;
+ margin-bottom: 1.5rem;
+ font-size: .8rem;
+ color: var(--text-3);
+}
+.restore-wizard-phase + .restore-wizard-phase::before {
+ content: "·";
+ margin-right: .75rem;
+ color: var(--line);
+}
+.restore-wizard-phase.is-current {
+ color: var(--blue-bright);
+ font-weight: 600;
+}
+.restore-danger-card {
+ border-left: 2px solid var(--crit);
+}