mirror of
https://github.com/Dokploy/dokploy.git
synced 2026-06-20 06:35:22 +02:00
- Modified the restore command functions for PostgreSQL, MariaDB, MySQL, and MongoDB to ensure that database user credentials are enclosed in single quotes. This change enhances command execution reliability and prevents potential issues with special characters in usernames and passwords.
132 lines
3.3 KiB
TypeScript
132 lines
3.3 KiB
TypeScript
import {
|
|
getComposeContainerCommand,
|
|
getServiceContainerCommand,
|
|
} from "../backups/utils";
|
|
|
|
export const getPostgresRestoreCommand = (
|
|
database: string,
|
|
databaseUser: string,
|
|
) => {
|
|
return `docker exec -i $CONTAINER_ID sh -c "pg_restore -U '${databaseUser}' -d ${database} -O --clean --if-exists"`;
|
|
};
|
|
|
|
export const getMariadbRestoreCommand = (
|
|
database: string,
|
|
databaseUser: string,
|
|
databasePassword: string,
|
|
) => {
|
|
return `docker exec -i $CONTAINER_ID sh -c "mariadb -u '${databaseUser}' -p'${databasePassword}' ${database}"`;
|
|
};
|
|
|
|
export const getMysqlRestoreCommand = (
|
|
database: string,
|
|
databasePassword: string,
|
|
) => {
|
|
return `docker exec -i $CONTAINER_ID sh -c "mysql -u root -p'${databasePassword}' ${database}"`;
|
|
};
|
|
|
|
export const getMongoRestoreCommand = (
|
|
database: string,
|
|
databaseUser: string,
|
|
databasePassword: string,
|
|
) => {
|
|
return `docker exec -i $CONTAINER_ID sh -c "mongorestore --username '${databaseUser}' --password '${databasePassword}' --authenticationDatabase admin --db ${database} --archive"`;
|
|
};
|
|
|
|
export const getComposeSearchCommand = (
|
|
appName: string,
|
|
type: "stack" | "docker-compose" | "database",
|
|
serviceName?: string,
|
|
) => {
|
|
if (type === "database") {
|
|
return getServiceContainerCommand(appName || "");
|
|
}
|
|
return getComposeContainerCommand(appName || "", serviceName || "", type);
|
|
};
|
|
|
|
interface DatabaseCredentials {
|
|
database: string;
|
|
databaseUser?: string;
|
|
databasePassword?: string;
|
|
}
|
|
|
|
const generateRestoreCommand = (
|
|
type: "postgres" | "mariadb" | "mysql" | "mongo",
|
|
credentials: DatabaseCredentials,
|
|
) => {
|
|
const { database, databaseUser, databasePassword } = credentials;
|
|
switch (type) {
|
|
case "postgres":
|
|
return getPostgresRestoreCommand(database, databaseUser || "");
|
|
case "mariadb":
|
|
return getMariadbRestoreCommand(
|
|
database,
|
|
databaseUser || "",
|
|
databasePassword || "",
|
|
);
|
|
case "mysql":
|
|
return getMysqlRestoreCommand(database, databasePassword || "");
|
|
case "mongo":
|
|
return getMongoRestoreCommand(
|
|
database,
|
|
databaseUser || "",
|
|
databasePassword || "",
|
|
);
|
|
}
|
|
};
|
|
|
|
const getMongoSpecificCommand = (
|
|
rcloneCommand: string,
|
|
restoreCommand: string,
|
|
backupFile: string,
|
|
): string => {
|
|
const tempDir = "/tmp/dokploy-restore";
|
|
const fileName = backupFile.split("/").pop() || "backup.sql.gz";
|
|
const decompressedName = fileName.replace(".gz", "");
|
|
return `
|
|
rm -rf ${tempDir} && \
|
|
mkdir -p ${tempDir} && \
|
|
${rcloneCommand} ${tempDir} && \
|
|
cd ${tempDir} && \
|
|
gunzip -f "${fileName}" && \
|
|
${restoreCommand} < "${decompressedName}" && \
|
|
rm -rf ${tempDir}
|
|
`;
|
|
};
|
|
|
|
interface RestoreOptions {
|
|
appName: string;
|
|
type: "postgres" | "mariadb" | "mysql" | "mongo";
|
|
restoreType: "stack" | "docker-compose" | "database";
|
|
credentials: DatabaseCredentials;
|
|
serviceName?: string;
|
|
rcloneCommand: string;
|
|
backupFile?: string;
|
|
}
|
|
|
|
export const getRestoreCommand = ({
|
|
appName,
|
|
type,
|
|
restoreType,
|
|
credentials,
|
|
serviceName,
|
|
rcloneCommand,
|
|
backupFile,
|
|
}: RestoreOptions) => {
|
|
const containerSearch = getComposeSearchCommand(
|
|
appName,
|
|
restoreType,
|
|
serviceName,
|
|
);
|
|
const restoreCommand = generateRestoreCommand(type, credentials);
|
|
let cmd = `CONTAINER_ID=$(${containerSearch})`;
|
|
|
|
if (type !== "mongo") {
|
|
cmd += ` && ${rcloneCommand} | ${restoreCommand}`;
|
|
} else {
|
|
cmd += ` && ${getMongoSpecificCommand(rcloneCommand, restoreCommand, backupFile || "")}`;
|
|
}
|
|
|
|
return cmd;
|
|
};
|