Skip to content

Commit a295534

Browse files
committed
fix(deploy): docker
1 parent 4ca76f2 commit a295534

3 files changed

Lines changed: 30 additions & 1 deletion

File tree

app/api/server.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { getContainers, restartContainer, stopContainer, startContainer, removeC
1010
import { checkWebsites } from './services/http.js';
1111
import { reload as reloadNginx, readConfig, writeConfig, parseApps, parseConfigMeta, addApp, removeApp } from './services/nginx.js';
1212
import { listApps, cloneApp, updateApp, deleteApp, getAppStatus, writeEnvFile, readEnvFile, readEnvExample } from './services/deploy.js';
13-
import { composeUp, composeRebuild, getAllServiceNames, ensureInfraInclude } from './services/compose.js';
13+
import { composeUp, composeRebuild, composeFullRestart, getAllServiceNames, ensureInfraInclude } from './services/compose.js';
1414

1515
const __dirname = dirname(fileURLToPath(import.meta.url));
1616

@@ -278,6 +278,16 @@ app.put('/api/deploy/apps/:name/env', requireAuth, async (req, res) => {
278278
}
279279
});
280280

281+
app.post('/api/deploy/apps/:name/full-restart', requireAuth, async (req, res) => {
282+
const { name } = req.params;
283+
try {
284+
res.json({ ok: true, restarting: true });
285+
composeFullRestart(name).catch((err) => console.error(`[full-restart] ${name} failed:`, err.message));
286+
} catch (err) {
287+
res.status(500).json({ error: err.message });
288+
}
289+
});
290+
281291
app.post('/api/deploy/update', requireAuth, async (req, res) => {
282292
const { name } = req.body;
283293
if (!name) return res.status(400).json({ error: 'name requis' });

app/api/services/compose.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,15 @@ export async function composeRebuild(serviceNames, forceBuild = false) {
114114
await execFile('docker', args, { cwd: APPS_ROOT });
115115
}
116116

117+
export async function composeFullRestart(appName) {
118+
const allServices = await getAllServiceNames(appName);
119+
// Suppression de tous les containers de l'app (y compris bases de données)
120+
await execFile('docker', ['compose', '-f', MAIN_COMPOSE, 'rm', '-sf', ...allServices], { cwd: APPS_ROOT }).catch(() => {});
121+
await Promise.all(allServices.map((n) => execFile('docker', ['rm', '-f', n]).catch(() => {})));
122+
// Redémarrage avec rebuild pour les services qui ont un Dockerfile
123+
await execFile('docker', ['compose', '-f', MAIN_COMPOSE, 'up', '-d', '--build', ...allServices], { cwd: APPS_ROOT });
124+
}
125+
117126
const INFRA_COMPOSE_CONTENT = `services:
118127
mongo:
119128
image: mongo:7

app/public/app.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ function renderDeployApps(apps) {
251251
<div class="card-actions">
252252
${a.deployed
253253
? `<button onclick="updateDeployApp('${a.name}', this)">Mettre à jour</button>
254+
<button onclick="fullRestartApp('${a.name}', this)" title="Redémarre tous les containers (backend, frontend, BDD…) sur le même réseau">Redémarrage complet</button>
254255
<button onclick="openEnvModal('${a.name}')">Éditer .env</button>`
255256
: `<button onclick="promptClone('${a.name}')">Déployer</button>`
256257
}
@@ -290,6 +291,15 @@ async function updateDeployApp(name, btn) {
290291
setTimeout(() => loadDeploy(), 1500);
291292
}
292293

294+
async function fullRestartApp(name, btn) {
295+
if (!confirm(`Redémarrer tous les containers de "${name}" ? (BDD incluse — quelques secondes d'interruption)`)) return;
296+
btn.disabled = true;
297+
btn.textContent = '…';
298+
const res = await fetch(`/api/deploy/apps/${encodeURIComponent(name)}/full-restart`, { method: 'POST' });
299+
btn.textContent = res.ok ? '✅' : '❌';
300+
setTimeout(() => { btn.disabled = false; btn.textContent = 'Redémarrage complet'; loadDeploy(); }, 3000);
301+
}
302+
293303
function toggleEnvSection() {
294304
const show = document.getElementById('clone-has-env').checked;
295305
document.getElementById('clone-env-section').classList.toggle('hidden', !show);

0 commit comments

Comments
 (0)