mirror of
https://github.com/Dokploy/dokploy.git
synced 2026-06-19 14:15:21 +02:00
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.dump.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;
|
|
};
|