From 78e374b0dbdd66ef86fa046beb302aafaeec6456 Mon Sep 17 00:00:00 2001 From: Manus Deploy Date: Fri, 24 Jul 2026 13:37:16 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20startContainer=20cr=C3=A9e=20le=20conten?= =?UTF-8?q?eur=20via=20docker=20compose=20up=20si=20inexistant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/docker.js | 33 ++++++++++++++++++++++++++++++--- backend/src/routes.js | 2 +- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/backend/src/docker.js b/backend/src/docker.js index 3245e27..7122a79 100644 --- a/backend/src/docker.js +++ b/backend/src/docker.js @@ -139,11 +139,38 @@ function gitPull(appConfig) { /** * Démarrer un conteneur Docker */ -async function startContainer(containerName) { +async function startContainer(containerName, appId) { try { + // Tenter d'abord un docker start (conteneur existant mais arrêté) const container = docker.getContainer(containerName); - await container.start(); - return { success: true, message: `Conteneur ${containerName} démarré` }; + const info = await container.inspect().catch(() => null); + if (info) { + // Le conteneur existe, on le démarre + if (!info.State.Running) { + await container.start(); + } + return { success: true, message: `Conteneur ${containerName} démarré` }; + } + // Le conteneur n'existe pas : docker compose up dans le répertoire de l'app + const id = appId || containerName; + const appsBasePath = config.appsBasePath || process.env.APPS_BASE_PATH || '/opt/manus-deploy/apps'; + const appDir = path.join(appsBasePath, id); + const fs = require('fs'); + const composeFile = fs.existsSync(path.join(appDir, 'docker-compose.yml')) + ? path.join(appDir, 'docker-compose.yml') + : fs.existsSync(path.join(appDir, 'docker-compose.prod.yml')) + ? path.join(appDir, 'docker-compose.prod.yml') + : null; + if (!composeFile) { + return { success: false, message: `Aucun docker-compose.yml trouvé dans ${appDir}` }; + } + await new Promise((resolve, reject) => { + exec(`docker compose -f ${composeFile} up -d`, { cwd: appDir }, (err, stdout, stderr) => { + if (err) reject(new Error(stderr || err.message)); + else resolve(stdout); + }); + }); + return { success: true, message: `Conteneur ${containerName} créé et démarré via docker compose` }; } catch (err) { return { success: false, message: err.message }; } diff --git a/backend/src/routes.js b/backend/src/routes.js index b4eb6d2..fbdd2e4 100644 --- a/backend/src/routes.js +++ b/backend/src/routes.js @@ -482,7 +482,7 @@ router.post('/apps/:id/start', authMiddleware, async (req, res) => { const app = config.apps.find((a) => a.id === req.params.id); if (!app) return res.status(404).json({ error: 'Application non trouvée' }); const containerName = app.containerName || app.id; - const result = await startContainer(containerName); + const result = await startContainer(containerName, app.id); res.json(result); } catch (err) { res.status(500).json({ error: err.message });