UNPKG

@paroicms/server

Version:
56 lines 2.51 kB
import { createMediaStorage } from "@paroicms/server-database-media-storage"; import { join } from "node:path"; import { createOrOpenMainConnection } from "../../connector/db-init/db-init.js"; import { makeSiteBackup } from "../../connector/site-backup/backup.js"; import { cmsVersion } from "../../context.js"; import { processQueuedRequests, setRequestTrackerState, waitForPendingRequests, } from "../../request-tracking/request-state.js"; import { makeMediaStorageDependsOn } from "../../site-context/main-medias-databases.js"; export async function executeHardenedBackup(siteContext) { const { logger } = siteContext; logger.info("Starting hardened backup"); setRequestTrackerState(siteContext, "backupMode"); try { await waitForPendingRequests(siteContext, 30_000, { acceptOnePending: true }); const mediaDbPath = join(siteContext.dataDir, "medias.sqlite"); logger.debug("Closing database connections for backup"); await siteContext.cn.destroy(); await siteContext.mediaStorage.close(); let backupResult; try { backupResult = await makeSiteBackup(siteContext, { serverVersion: cmsVersion, }); logger.debug("Backup completed, reopening database connections"); } catch (backupError) { logger.error("Backup failed, attempting to reopen database connections", backupError); await reopenDatabaseConnections(siteContext, mediaDbPath, logger); throw backupError; } await reopenDatabaseConnections(siteContext, mediaDbPath, logger); return backupResult; } finally { setRequestTrackerState(siteContext, "normal"); processQueuedRequests(siteContext); logger.debug("Backup operation completed, normal operations resumed"); } } async function reopenDatabaseConnections(siteContext, mediaDbPath, logger) { const { cn: newCn, databaseId: mainDatabaseId } = await createOrOpenMainConnection(siteContext.dataDir, { canCreate: false, logger, }, { fqdn: siteContext.fqdn }); const newMediaStorage = await createMediaStorage({ canCreate: false, storage: { type: "sqlite", file: mediaDbPath, }, logger, dependsOn: makeMediaStorageDependsOn({ mainDatabaseId }), }); siteContext.cn = newCn; siteContext.mediaStorage = newMediaStorage; } //# sourceMappingURL=hardened-backup.service.js.map