Skip to content

Commit 2e8e2dc

Browse files
authored
Merge pull request #2956 from Harikrishnan1367709/Change-backup-file-naming-structure-#2955
Feat : Fix backup file naming for Windows 11 compatibility (#2955)
2 parents 435d812 + fd2097e commit 2e8e2dc

9 files changed

Lines changed: 53 additions & 16 deletions

File tree

packages/server/src/utils/backups/compose.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ import { findEnvironmentById } from "@dokploy/server/services/environment";
88
import { findProjectById } from "@dokploy/server/services/project";
99
import { sendDatabaseBackupNotifications } from "../notifications/database-backup";
1010
import { execAsync, execAsyncRemote } from "../process/execAsync";
11-
import { getBackupCommand, getS3Credentials, normalizeS3Path } from "./utils";
11+
import {
12+
getBackupCommand,
13+
getBackupTimestamp,
14+
getS3Credentials,
15+
normalizeS3Path,
16+
} from "./utils";
1217

1318
export const runComposeBackup = async (
1419
compose: Compose,
@@ -19,7 +24,7 @@ export const runComposeBackup = async (
1924
const project = await findProjectById(environment.projectId);
2025
const { prefix, databaseType, serviceName } = backup;
2126
const destination = backup.destination;
22-
const backupFileName = `${new Date().toISOString()}.${databaseType === "mongo" ? "bson" : "sql"}.gz`;
27+
const backupFileName = `${getBackupTimestamp()}.${databaseType === "mongo" ? "bson" : "sql"}.gz`;
2328
const s3AppName = serviceName ? `${appName}_${serviceName}` : appName;
2429
const bucketDestination = `${s3AppName}/${normalizeS3Path(prefix)}${backupFileName}`;
2530
const deployment = await createDeploymentBackup({

packages/server/src/utils/backups/libsql.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ import type { Libsql } from "@dokploy/server/services/libsql";
88
import { findProjectById } from "@dokploy/server/services/project";
99
import { sendDatabaseBackupNotifications } from "../notifications/database-backup";
1010
import { execAsync, execAsyncRemote } from "../process/execAsync";
11-
import { getBackupCommand, getS3Credentials, normalizeS3Path } from "./utils";
11+
import {
12+
getBackupCommand,
13+
getBackupTimestamp,
14+
getS3Credentials,
15+
normalizeS3Path,
16+
} from "./utils";
1217

1318
export const runLibsqlBackup = async (
1419
libsql: Libsql,
@@ -25,7 +30,7 @@ export const runLibsqlBackup = async (
2530
});
2631
const { prefix } = backup;
2732
const destination = backup.destination;
28-
const backupFileName = `${new Date().toISOString()}.sql.gz`;
33+
const backupFileName = `${getBackupTimestamp()}.sql.gz`;
2934
const bucketDestination = `${appName}/${normalizeS3Path(prefix)}${backupFileName}`;
3035
try {
3136
const rcloneFlags = getS3Credentials(destination);

packages/server/src/utils/backups/mariadb.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ import type { Mariadb } from "@dokploy/server/services/mariadb";
88
import { findProjectById } from "@dokploy/server/services/project";
99
import { sendDatabaseBackupNotifications } from "../notifications/database-backup";
1010
import { execAsync, execAsyncRemote } from "../process/execAsync";
11-
import { getBackupCommand, getS3Credentials, normalizeS3Path } from "./utils";
11+
import {
12+
getBackupCommand,
13+
getBackupTimestamp,
14+
getS3Credentials,
15+
normalizeS3Path,
16+
} from "./utils";
1217

1318
export const runMariadbBackup = async (
1419
mariadb: Mariadb,
@@ -19,7 +24,7 @@ export const runMariadbBackup = async (
1924
const project = await findProjectById(environment.projectId);
2025
const { prefix } = backup;
2126
const destination = backup.destination;
22-
const backupFileName = `${new Date().toISOString()}.sql.gz`;
27+
const backupFileName = `${getBackupTimestamp()}.sql.gz`;
2328
const bucketDestination = `${appName}/${normalizeS3Path(prefix)}${backupFileName}`;
2429
const deployment = await createDeploymentBackup({
2530
backupId: backup.backupId,

packages/server/src/utils/backups/mongo.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,20 @@ import type { Mongo } from "@dokploy/server/services/mongo";
88
import { findProjectById } from "@dokploy/server/services/project";
99
import { sendDatabaseBackupNotifications } from "../notifications/database-backup";
1010
import { execAsync, execAsyncRemote } from "../process/execAsync";
11-
import { getBackupCommand, getS3Credentials, normalizeS3Path } from "./utils";
11+
import {
12+
getBackupCommand,
13+
getBackupTimestamp,
14+
getS3Credentials,
15+
normalizeS3Path,
16+
} from "./utils";
1217

1318
export const runMongoBackup = async (mongo: Mongo, backup: BackupSchedule) => {
1419
const { environmentId, name, appName } = mongo;
1520
const environment = await findEnvironmentById(environmentId);
1621
const project = await findProjectById(environment.projectId);
1722
const { prefix } = backup;
1823
const destination = backup.destination;
19-
const backupFileName = `${new Date().toISOString()}.bson.gz`;
24+
const backupFileName = `${getBackupTimestamp()}.bson.gz`;
2025
const bucketDestination = `${appName}/${normalizeS3Path(prefix)}${backupFileName}`;
2126
const deployment = await createDeploymentBackup({
2227
backupId: backup.backupId,

packages/server/src/utils/backups/mysql.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,20 @@ import type { MySql } from "@dokploy/server/services/mysql";
88
import { findProjectById } from "@dokploy/server/services/project";
99
import { sendDatabaseBackupNotifications } from "../notifications/database-backup";
1010
import { execAsync, execAsyncRemote } from "../process/execAsync";
11-
import { getBackupCommand, getS3Credentials, normalizeS3Path } from "./utils";
11+
import {
12+
getBackupCommand,
13+
getBackupTimestamp,
14+
getS3Credentials,
15+
normalizeS3Path,
16+
} from "./utils";
1217

1318
export const runMySqlBackup = async (mysql: MySql, backup: BackupSchedule) => {
1419
const { environmentId, name, appName } = mysql;
1520
const environment = await findEnvironmentById(environmentId);
1621
const project = await findProjectById(environment.projectId);
1722
const { prefix } = backup;
1823
const destination = backup.destination;
19-
const backupFileName = `${new Date().toISOString()}.sql.gz`;
24+
const backupFileName = `${getBackupTimestamp()}.sql.gz`;
2025
const bucketDestination = `${appName}/${normalizeS3Path(prefix)}${backupFileName}`;
2126
const deployment = await createDeploymentBackup({
2227
backupId: backup.backupId,

packages/server/src/utils/backups/postgres.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ import type { Postgres } from "@dokploy/server/services/postgres";
88
import { findProjectById } from "@dokploy/server/services/project";
99
import { sendDatabaseBackupNotifications } from "../notifications/database-backup";
1010
import { execAsync, execAsyncRemote } from "../process/execAsync";
11-
import { getBackupCommand, getS3Credentials, normalizeS3Path } from "./utils";
11+
import {
12+
getBackupCommand,
13+
getBackupTimestamp,
14+
getS3Credentials,
15+
normalizeS3Path,
16+
} from "./utils";
1217

1318
export const runPostgresBackup = async (
1419
postgres: Postgres,
@@ -25,7 +30,7 @@ export const runPostgresBackup = async (
2530
});
2631
const { prefix } = backup;
2732
const destination = backup.destination;
28-
const backupFileName = `${new Date().toISOString()}.sql.gz`;
33+
const backupFileName = `${getBackupTimestamp()}.sql.gz`;
2934
const bucketDestination = `${appName}/${normalizeS3Path(prefix)}${backupFileName}`;
3035
try {
3136
const rcloneFlags = getS3Credentials(destination);

packages/server/src/utils/backups/utils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ export const removeScheduleBackup = (backupId: string) => {
5656
currentJob?.cancel();
5757
};
5858

59+
export const getBackupTimestamp = () =>
60+
new Date().toISOString().replace(/[:.]/g, "-");
61+
5962
export const normalizeS3Path = (prefix: string) => {
6063
// Trim whitespace and remove leading/trailing slashes
6164
const normalizedPrefix = prefix.trim().replace(/^\/+|\/+$/g, "");

packages/server/src/utils/backups/web-server.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
import { findDestinationById } from "@dokploy/server/services/destination";
1212
import { sendDokployBackupNotifications } from "../notifications/dokploy-backup";
1313
import { execAsync } from "../process/execAsync";
14-
import { getS3Credentials, normalizeS3Path } from "./utils";
14+
import { getBackupTimestamp, getS3Credentials, normalizeS3Path } from "./utils";
1515

1616
function formatBytes(bytes?: number) {
1717
if (bytes === undefined) return "Unknown size";
@@ -37,7 +37,7 @@ export const runWebServerBackup = async (backup: BackupSchedule) => {
3737
try {
3838
const destination = await findDestinationById(backup.destinationId);
3939
const rcloneFlags = getS3Credentials(destination);
40-
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
40+
const timestamp = getBackupTimestamp();
4141
const { BASE_PATH } = paths();
4242
const tempDir = await mkdtemp(join(tmpdir(), "dokploy-backup-"));
4343
const backupFileName = `webserver-backup-${timestamp}.zip`;

packages/server/src/utils/volume-backups/backup.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ import path from "node:path";
22
import { paths } from "@dokploy/server/constants";
33
import { findComposeById } from "@dokploy/server/services/compose";
44
import type { findVolumeBackupById } from "@dokploy/server/services/volume-backups";
5-
import { getS3Credentials, normalizeS3Path } from "../backups/utils";
5+
import {
6+
getBackupTimestamp,
7+
getS3Credentials,
8+
normalizeS3Path,
9+
} from "../backups/utils";
610

711
export const getVolumeServiceAppName = (
812
volumeBackup: Awaited<ReturnType<typeof findVolumeBackupById>>,
@@ -32,7 +36,7 @@ export const backupVolume = async (
3236
const { VOLUME_BACKUPS_PATH, VOLUME_BACKUP_LOCK_PATH } = paths(!!serverId);
3337
const destination = volumeBackup.destination;
3438
const s3AppName = getVolumeServiceAppName(volumeBackup);
35-
const backupFileName = `${volumeName}-${new Date().toISOString()}.tar`;
39+
const backupFileName = `${volumeName}-${getBackupTimestamp()}.tar`;
3640
const bucketDestination = `${s3AppName}/${normalizeS3Path(prefix || "")}${backupFileName}`;
3741
const rcloneFlags = getS3Credentials(volumeBackup.destination);
3842
const rcloneDestination = `:s3:${destination.bucket}/${bucketDestination}`;

0 commit comments

Comments
 (0)