@paroicms/server
Version:
The ParoiCMS server
56 lines • 2.51 kB
JavaScript
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