fix(maintenance mode): wait for valid server config on restart (#26456)

Signed-off-by: izzy <me@insrt.uk>
This commit is contained in:
Paul Makles
2026-03-04 11:16:21 +00:00
committed by GitHub
parent 5532f669eb
commit f94e0fbc39
3 changed files with 21 additions and 12 deletions

View File

@@ -87,6 +87,8 @@ export type Events = {
WorkflowDelete: [WorkflowResponseDto]; WorkflowDelete: [WorkflowResponseDto];
ReleaseEvent: [ReleaseEvent]; ReleaseEvent: [ReleaseEvent];
WebsocketConnect: [];
}; };
export const eventManager = new BaseEventManager<Events>(); export const eventManager = new BaseEventManager<Events>();

View File

@@ -62,7 +62,10 @@ export const websocketStore = {
export const websocketEvents = createEventEmitter(websocket); export const websocketEvents = createEventEmitter(websocket);
websocket websocket
.on('connect', () => websocketStore.connected.set(true)) .on('connect', () => {
eventManager.emit('WebsocketConnect');
websocketStore.connected.set(true);
})
.on('disconnect', () => websocketStore.connected.set(false)) .on('disconnect', () => websocketStore.connected.set(false))
.on('on_server_version', (serverVersion) => websocketStore.serverVersion.set(serverVersion)) .on('on_server_version', (serverVersion) => websocketStore.serverVersion.set(serverVersion))
.on('AppRestartV1', (mode) => websocketStore.serverRestarting.set(mode)) .on('AppRestartV1', (mode) => websocketStore.serverRestarting.set(mode))

View File

@@ -4,6 +4,7 @@
import { shortcut } from '$lib/actions/shortcut'; import { shortcut } from '$lib/actions/shortcut';
import DownloadPanel from '$lib/components/asset-viewer/download-panel.svelte'; import DownloadPanel from '$lib/components/asset-viewer/download-panel.svelte';
import ErrorLayout from '$lib/components/layouts/ErrorLayout.svelte'; import ErrorLayout from '$lib/components/layouts/ErrorLayout.svelte';
import OnEvents from '$lib/components/OnEvents.svelte';
import NavigationLoadingBar from '$lib/components/shared-components/navigation-loading-bar.svelte'; import NavigationLoadingBar from '$lib/components/shared-components/navigation-loading-bar.svelte';
import UploadPanel from '$lib/components/shared-components/upload-panel.svelte'; import UploadPanel from '$lib/components/shared-components/upload-panel.svelte';
import VersionAnnouncement from '$lib/components/VersionAnnouncement.svelte'; import VersionAnnouncement from '$lib/components/VersionAnnouncement.svelte';
@@ -19,6 +20,7 @@
import { copyToClipboard } from '$lib/utils'; import { copyToClipboard } from '$lib/utils';
import { maintenanceShouldRedirect } from '$lib/utils/maintenance'; import { maintenanceShouldRedirect } from '$lib/utils/maintenance';
import { isAssetViewerRoute } from '$lib/utils/navigation'; import { isAssetViewerRoute } from '$lib/utils/navigation';
import { getServerConfig } from '@immich/sdk';
import { import {
CommandPaletteDefaultProvider, CommandPaletteDefaultProvider,
TooltipProvider, TooltipProvider,
@@ -31,6 +33,7 @@
import { mdiAccountMultipleOutline, mdiBookshelf, mdiCog, mdiServer, mdiSync, mdiThemeLightDark } from '@mdi/js'; import { mdiAccountMultipleOutline, mdiBookshelf, mdiCog, mdiServer, mdiSync, mdiThemeLightDark } from '@mdi/js';
import { onMount, type Snippet } from 'svelte'; import { onMount, type Snippet } from 'svelte';
import { t } from 'svelte-i18n'; import { t } from 'svelte-i18n';
import { get } from 'svelte/store';
import '../app.css'; import '../app.css';
interface Props { interface Props {
@@ -120,19 +123,18 @@
if (maintenanceShouldRedirect(isRestarting.isMaintenanceMode, location)) { if (maintenanceShouldRedirect(isRestarting.isMaintenanceMode, location)) {
modalManager.show(ServerRestartingModal, {}).catch((error) => console.error('Error [ServerRestartBox]:', error)); modalManager.show(ServerRestartingModal, {}).catch((error) => console.error('Error [ServerRestartBox]:', error));
}
});
// we will be disconnected momentarily const onWebsocketConnect = async () => {
// wait for reconnect then reload const isRestarting = get(serverRestarting);
let waiting = false; if (isRestarting && maintenanceShouldRedirect(isRestarting.isMaintenanceMode, location)) {
websocketStore.connected.subscribe((connected) => { const { maintenanceMode } = await getServerConfig();
if (!connected) { if (maintenanceMode === isRestarting.isMaintenanceMode) {
waiting = true;
} else if (connected && waiting) {
location.reload(); location.reload();
} }
});
} }
}); };
const userCommands: ActionItem[] = [ const userCommands: ActionItem[] = [
{ {
@@ -182,6 +184,8 @@
const commands = $derived([...userCommands, ...adminCommands]); const commands = $derived([...userCommands, ...adminCommands]);
</script> </script>
<OnEvents {onWebsocketConnect} />
<CommandPaletteDefaultProvider name="Global" actions={commands} /> <CommandPaletteDefaultProvider name="Global" actions={commands} />
<VersionAnnouncement /> <VersionAnnouncement />