Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f7b594c8ca |
No files matched your search
@@ -30,8 +30,9 @@ needed to restore encrypted integration credentials.
|
|||||||
Select a Homarr backup ZIP. The browser previews entity counts, board names, and required database migrations before
|
Select a Homarr backup ZIP. The browser previews entity counts, board names, and required database migrations before
|
||||||
the archive is uploaded.
|
the archive is uploaded.
|
||||||
|
|
||||||
Restoring replaces the current SQLite database and cannot be undone. After a successful restore, the Next.js process
|
Restoring replaces the current SQLite database and cannot be undone. It also invalidates the current database session.
|
||||||
restarts and the page reloads when Homarr is ready.
|
After a successful management restore, Homarr waits for the restarted server and sends the administrator to sign in
|
||||||
|
again. The first-run onboarding restore keeps its existing board destination.
|
||||||
|
|
||||||
A backup can be restored on another Homarr instance. When its `SECRET_ENCRYPTION_KEY` differs, Homarr re-encrypts stored
|
A backup can be restored on another Homarr instance. When its `SECRET_ENCRYPTION_KEY` differs, Homarr re-encrypts stored
|
||||||
integration secrets for the target instance. Version metadata is used to apply compatible migrations.
|
integration secrets for the target instance. Version metadata is used to apply compatible migrations.
|
||||||
|
|||||||
@@ -204,8 +204,12 @@ export const DatabaseRestoreFlow = ({ variant = "card", onRestoreComplete }: Dat
|
|||||||
}
|
}
|
||||||
|
|
||||||
onRestoreComplete?.();
|
onRestoreComplete?.();
|
||||||
const destination =
|
let destination: string | null = null;
|
||||||
variant === "standalone" && homeBoardName ? `/boards/${encodeURIComponent(homeBoardName)}` : null;
|
if (variant === "standalone" && homeBoardName) {
|
||||||
|
destination = `/boards/${encodeURIComponent(homeBoardName)}`;
|
||||||
|
} else if (variant === "card") {
|
||||||
|
destination = "/auth/login";
|
||||||
|
}
|
||||||
startReadinessCheck(restartAfterMs, destination);
|
startReadinessCheck(restartAfterMs, destination);
|
||||||
}, [file, onRestoreComplete, startReadinessCheck, t, variant]);
|
}, [file, onRestoreComplete, startReadinessCheck, t, variant]);
|
||||||
|
|
||||||
@@ -317,6 +321,7 @@ export const DatabaseRestoreFlow = ({ variant = "card", onRestoreComplete }: Dat
|
|||||||
<RestoreProgressPanel
|
<RestoreProgressPanel
|
||||||
active
|
active
|
||||||
status={restoreStatus}
|
status={restoreStatus}
|
||||||
|
reloginRequired={variant === "card"}
|
||||||
onRetry={() => startReadinessCheck(0)}
|
onRetry={() => startReadinessCheck(0)}
|
||||||
onReload={() => window.location.reload()}
|
onReload={() => window.location.reload()}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -11,11 +11,18 @@ export type RestoreProgressStatus = "restoring" | "restarting" | "timedOut";
|
|||||||
interface RestoreProgressPanelProps {
|
interface RestoreProgressPanelProps {
|
||||||
active: boolean;
|
active: boolean;
|
||||||
status: RestoreProgressStatus;
|
status: RestoreProgressStatus;
|
||||||
|
reloginRequired?: boolean;
|
||||||
onRetry: () => void;
|
onRetry: () => void;
|
||||||
onReload: () => void;
|
onReload: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const RestoreProgressPanel = ({ active, status, onRetry, onReload }: RestoreProgressPanelProps) => {
|
export const RestoreProgressPanel = ({
|
||||||
|
active,
|
||||||
|
status,
|
||||||
|
reloginRequired = false,
|
||||||
|
onRetry,
|
||||||
|
onReload,
|
||||||
|
}: RestoreProgressPanelProps) => {
|
||||||
const t = useI18n("management.page.tool.backup.restore");
|
const t = useI18n("management.page.tool.backup.restore");
|
||||||
const tCommon = useI18n("common");
|
const tCommon = useI18n("common");
|
||||||
const reduceMotion = useReducedMotion();
|
const reduceMotion = useReducedMotion();
|
||||||
@@ -63,6 +70,12 @@ export const RestoreProgressPanel = ({ active, status, onRetry, onReload }: Rest
|
|||||||
</div>
|
</div>
|
||||||
</Group>
|
</Group>
|
||||||
|
|
||||||
|
{reloginRequired && !isRestoring ? (
|
||||||
|
<Text size="sm" c="dimmed">
|
||||||
|
{t("progress.relogin")}
|
||||||
|
</Text>
|
||||||
|
) : null}
|
||||||
|
|
||||||
{isTimedOut ? (
|
{isTimedOut ? (
|
||||||
<Group>
|
<Group>
|
||||||
<Button variant="light" onClick={onRetry} leftSection={<IconRefresh size={16} />}>
|
<Button variant="light" onClick={onRetry} leftSection={<IconRefresh size={16} />}>
|
||||||
|
|||||||
@@ -6456,7 +6456,8 @@
|
|||||||
},
|
},
|
||||||
"progress": {
|
"progress": {
|
||||||
"title": "Restoring database...",
|
"title": "Restoring database...",
|
||||||
"restarting": "Restarting server"
|
"restarting": "Restarting server",
|
||||||
|
"relogin": "Restoring the database invalidated your current session. Homarr will send you to sign in when the server is ready."
|
||||||
},
|
},
|
||||||
"timeout": {
|
"timeout": {
|
||||||
"title": "Server did not come back online",
|
"title": "Server did not come back online",
|
||||||
|
|||||||
Reference in new issue
Block a user