diff --git a/backend/agent-socket-handlers/docker-socket-handler.ts b/backend/agent-socket-handlers/docker-socket-handler.ts index 81746019..eb0713f4 100644 --- a/backend/agent-socket-handlers/docker-socket-handler.ts +++ b/backend/agent-socket-handlers/docker-socket-handler.ts @@ -1,7 +1,7 @@ import { AgentSocketHandler } from "../agent-socket-handler"; import { DockgeServer } from "../dockge-server"; import { callbackError, callbackResult, checkLogin, DockgeSocket, ValidationError } from "../util-server"; -import { Stack } from "../stack"; +import { DeleteOptions, Stack } from "../stack"; import { AgentSocket } from "../../common/agent-socket"; export class DockerSocketHandler extends AgentSocketHandler { @@ -40,7 +40,7 @@ export class DockerSocketHandler extends AgentSocketHandler { } }); - agentSocket.on("deleteStack", async (name : unknown, callback) => { + agentSocket.on("deleteStack", async (name : unknown, deleteOptions: unknown, callback) => { try { checkLogin(socket); if (typeof(name) !== "string") { @@ -49,7 +49,7 @@ export class DockerSocketHandler extends AgentSocketHandler { const stack = await Stack.getStack(server, name); try { - await stack.delete(socket); + await stack.delete(socket, deleteOptions as DeleteOptions); } catch (e) { server.sendStackList(); throw e; diff --git a/backend/stack.ts b/backend/stack.ts index fbce5002..1defb253 100644 --- a/backend/stack.ts +++ b/backend/stack.ts @@ -20,6 +20,10 @@ import { InteractiveTerminal, Terminal } from "./terminal"; import childProcessAsync from "promisify-child-process"; import { Settings } from "./settings"; +export interface DeleteOptions { + deleteStackFiles: boolean +} + export class Stack { name: string; @@ -215,18 +219,20 @@ export class Stack { return exitCode; } - async delete(socket: DockgeSocket) : Promise { + async delete(socket: DockgeSocket, options: DeleteOptions) : Promise { const terminalName = getComposeTerminalName(socket.endpoint, this.name); let exitCode = await Terminal.exec(this.server, socket, terminalName, "docker", [ "compose", "down", "--remove-orphans" ], this.path); if (exitCode !== 0) { throw new Error("Failed to delete, please check the terminal output for more information."); } - // Remove the stack folder - await fsAsync.rm(this.path, { - recursive: true, - force: true - }); + if (options.deleteStackFiles) { + // Remove the stack folder + await fsAsync.rm(this.path, { + recursive: true, + force: true + }); + } return exitCode; } diff --git a/frontend/src/lang/en.json b/frontend/src/lang/en.json index 06362264..6b0adf31 100644 --- a/frontend/src/lang/en.json +++ b/frontend/src/lang/en.json @@ -25,6 +25,7 @@ "saveStackDraft": "Save", "notAvailableShort": "N/A", "deleteStackMsg": "Are you sure you want to delete this stack?", + "deleteStackFilesConfirmation": "delete all stack files", "stackNotManagedByDockgeMsg": "This stack is not managed by Dockge.", "primaryHostname": "Primary Hostname", "general": "General", diff --git a/frontend/src/pages/Compose.vue b/frontend/src/pages/Compose.vue index 5c632c94..214c48cc 100644 --- a/frontend/src/pages/Compose.vue +++ b/frontend/src/pages/Compose.vue @@ -55,6 +55,7 @@ +