diff --git a/index.js b/index.js index 19bbf25471e1aab654cb4fcb7611abfa0a43d0e5..55c84f7f665a5c05a027ec3da4a8cf99418e6234 100644 --- a/index.js +++ b/index.js @@ -1,28 +1,42 @@ const express = require("express"); const bodyParser = require("body-parser"); const cors = require("cors"); +const http = require("http"); + const { emptyCustomCodeDatabase } = require("./src/functions/helperFunctions"); -const { startRabbitmq } = require("./src/docker/dockerManager"); +const { startRabbitmq, dockerCleanUp } = require("./src/docker/dockerManager"); const customCodeRouter = require("./src/routes/customCodeRouter"); const deployRouter = require("./src/routes/deployRouter"); -const server = express(); +const app = express(); const PORT = 3001; -server.use(cors()); -server.use(bodyParser.json()); -server.use("/customCode", customCodeRouter); -server.use("/deploy", deployRouter); +app.use(cors()); +app.use(bodyParser.json()); +app.use("/customCode", customCodeRouter); +app.use("/deploy", deployRouter); -server.get("/", (req, res) => { +app.get("/", (req, res) => { res.send("Hello World"); }); emptyCustomCodeDatabase(); // clearDocker(); +const server = http.createServer(app); + server.listen(PORT, () => { console.log(`Server listening on port ${PORT}`); startRabbitmq(); }); + +process.on("SIGINT", () => { + console.log("SIGINT empfangen. Server wird beendet..."); + dockerCleanUp(); + + server.close(() => { + console.log("HTTP-Server geschlossen"); + process.exit(0); + }); +}); diff --git a/src/docker/dockerManager.js b/src/docker/dockerManager.js index d1f78b45e932c3d7aa833573f2ed60382b05d6f1..d6ce291ae83bffcd80772db08d710d29342cc9b4 100644 --- a/src/docker/dockerManager.js +++ b/src/docker/dockerManager.js @@ -215,6 +215,120 @@ function unpauseDockerContainer(containerId) { console.log(`::Docker container ${containerId} has been unpaused`); } +function dockerCleanUp() { + console.log("::Start removing all Docker containers"); + + // Alle Docker-Container abrufen + let listContainersProcess = spawnSync("docker ps -aq", [], { + shell: true, + encoding: "utf-8", + stdio: ["pipe", "pipe", "pipe"], + }); + + if (listContainersProcess.stderr && listContainersProcess.stderr.length > 0) { + console.log("::Failed to retrieve Docker containers"); + throw new Error(listContainersProcess.stderr); + } + + const containerIds = listContainersProcess.stdout + .trim() + .split("\n") + .filter(Boolean); + + if (containerIds.length > 0) { + console.log(`::Removing ${containerIds.length} Docker containers`); + + // Alle Docker-Container stoppen + let stopContainersProcess = spawnSync("docker stop $(docker ps -aq)", [], { + shell: true, + encoding: "utf-8", + stdio: ["inherit", "inherit", "pipe"], + }); + + if ( + stopContainersProcess.stderr && + stopContainersProcess.stderr.length > 0 + ) { + console.log("::Failed to stop Docker containers"); + throw new Error(stopContainersProcess.stderr); + } + + // Alle Docker-Container entfernen + let removeContainersProcess = spawnSync("docker rm $(docker ps -aq)", [], { + shell: true, + encoding: "utf-8", + stdio: ["inherit", "inherit", "pipe"], + }); + + if ( + removeContainersProcess.stderr && + removeContainersProcess.stderr.length > 0 + ) { + console.log("::Failed to remove Docker containers"); + throw new Error(removeContainersProcess.stderr); + } + + console.log("::All Docker containers have been removed"); + } else { + console.log("::No Docker containers found"); + } + + console.log("::Start removing all Docker images"); + + // Alle Docker-Images abrufen + let listImagesProcess = spawnSync("docker images -aq", [], { + shell: true, + encoding: "utf-8", + stdio: ["pipe", "pipe", "pipe"], + }); + + if (listImagesProcess.stderr && listImagesProcess.stderr.length > 0) { + console.log("::Failed to retrieve Docker images"); + throw new Error(listImagesProcess.stderr); + } + + const imageIds = listImagesProcess.stdout.trim().split("\n").filter(Boolean); + + if (imageIds.length > 0) { + console.log(`::Removing ${imageIds.length} Docker images`); + + // Alle Docker-Images entfernen + let removeImagesProcess = spawnSync( + "docker rmi -f $(docker images -aq)", + [], + { + shell: true, + encoding: "utf-8", + stdio: ["inherit", "inherit", "pipe"], + } + ); + + if (removeImagesProcess.stderr && removeImagesProcess.stderr.length > 0) { + console.log("::Failed to remove Docker images"); + throw new Error(removeImagesProcess.stderr); + } + + console.log("::All Docker images have been removed"); + } else { + console.log("::No Docker images found"); + } + console.log("::Start pruning unused Docker networks"); + + // Unbenutzte Docker-Netzwerke bereinigen + let pruneNetworksProcess = spawnSync("docker network prune -f", [], { + shell: true, + encoding: "utf-8", + stdio: ["inherit", "inherit", "pipe"], + }); + + if (pruneNetworksProcess.stderr && pruneNetworksProcess.stderr.length > 0) { + console.log("::Failed to prune Docker networks"); + throw new Error(pruneNetworksProcess.stderr); + } + + console.log("::All unused Docker networks have been pruned"); +} + function buildAndRunDocker( path, dockerImageName, @@ -240,4 +354,5 @@ module.exports = { removeDockerImage, pauseDockerContainer, unpauseDockerContainer, + dockerCleanUp, };