fix: startContainer crée le conteneur via docker compose up si inexistant
This commit is contained in:
@@ -139,11 +139,38 @@ function gitPull(appConfig) {
|
|||||||
/**
|
/**
|
||||||
* Démarrer un conteneur Docker
|
* Démarrer un conteneur Docker
|
||||||
*/
|
*/
|
||||||
async function startContainer(containerName) {
|
async function startContainer(containerName, appId) {
|
||||||
try {
|
try {
|
||||||
|
// Tenter d'abord un docker start (conteneur existant mais arrêté)
|
||||||
const container = docker.getContainer(containerName);
|
const container = docker.getContainer(containerName);
|
||||||
await container.start();
|
const info = await container.inspect().catch(() => null);
|
||||||
return { success: true, message: `Conteneur ${containerName} démarré` };
|
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) {
|
} catch (err) {
|
||||||
return { success: false, message: err.message };
|
return { success: false, message: err.message };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -482,7 +482,7 @@ router.post('/apps/:id/start', authMiddleware, async (req, res) => {
|
|||||||
const app = config.apps.find((a) => a.id === req.params.id);
|
const app = config.apps.find((a) => a.id === req.params.id);
|
||||||
if (!app) return res.status(404).json({ error: 'Application non trouvée' });
|
if (!app) return res.status(404).json({ error: 'Application non trouvée' });
|
||||||
const containerName = app.containerName || app.id;
|
const containerName = app.containerName || app.id;
|
||||||
const result = await startContainer(containerName);
|
const result = await startContainer(containerName, app.id);
|
||||||
res.json(result);
|
res.json(result);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
res.status(500).json({ error: err.message });
|
res.status(500).json({ error: err.message });
|
||||||
|
|||||||
Reference in New Issue
Block a user