fix(update): v2.7.1 avoid transient Nginx 502 error during 1-click web update
This commit is contained in:
1 parent
64b8339d14
commit
5cb3900c67
4 files changed
+59
-31
No files matched your search
@@ -2621,6 +2621,7 @@ try {
|
||||
break;
|
||||
|
||||
case 'run_update':
|
||||
@set_time_limit(300);
|
||||
$output = [];
|
||||
$code = 0;
|
||||
exec("sudo /var/www/nexus-pbx/scripts/update.sh 2>&1", $output, $code);
|
||||
|
||||
+38
-25
@@ -6412,11 +6412,29 @@ async function executeSystemUpdate() {
|
||||
|
||||
showToast("Mise à jour en cours d'exécution en arrière-plan...", 'info');
|
||||
|
||||
// Pause du polling métriques pour éviter un 502 Nginx pendant le reload php-fpm/nginx
|
||||
stopMetricsPolling();
|
||||
|
||||
// Purge préventive du cache local
|
||||
localStorage.removeItem('nexus_update_last_check_ts');
|
||||
localStorage.removeItem('nexus_update_cached_data');
|
||||
|
||||
function finalizeUpdateSuccess(newVer) {
|
||||
async function probeUpdateReady(maxAttempts = 6, delayMs = 1500) {
|
||||
for (let i = 0; i < maxAttempts; i++) {
|
||||
await new Promise(r => setTimeout(r, delayMs));
|
||||
try {
|
||||
const probeRes = await fetch('/api.php?action=check_update&_t=' + Date.now());
|
||||
if (!probeRes.ok) continue;
|
||||
const probeData = await probeRes.json();
|
||||
if (probeData && probeData.success && probeData.current_version) {
|
||||
return probeData;
|
||||
}
|
||||
} catch (_) {}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
async function finalizeUpdateSuccess(newVer) {
|
||||
newVer = String(newVer || '').replace(/^v/, '');
|
||||
localStorage.setItem('nexus_update_last_check_ts', Date.now().toString());
|
||||
localStorage.setItem('nexus_update_cached_data', JSON.stringify({
|
||||
@@ -6449,10 +6467,11 @@ async function executeSystemUpdate() {
|
||||
btnModalConfirm.innerHTML = '✓ Mise à jour terminée ! Rechargement...';
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
closeUpdateConfirmModal();
|
||||
window.location.href = window.location.origin + window.location.pathname + '?_t=' + Date.now();
|
||||
}, 1800);
|
||||
// Attendre que le reload différé php-fpm/nginx soit terminé avant de recharger la page
|
||||
await new Promise(r => setTimeout(r, 2500));
|
||||
await probeUpdateReady(5, 1000);
|
||||
closeUpdateConfirmModal();
|
||||
window.location.href = window.location.origin + window.location.pathname + '?_t=' + Date.now();
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -6476,18 +6495,15 @@ async function executeSystemUpdate() {
|
||||
}
|
||||
|
||||
// Si la réponse n'était pas un JSON valide ou a été interrompue par le rechargement de php-fpm/nginx,
|
||||
// on sonde le serveur pour vérifier si la mise à jour a en réalité bien été appliquée sur le disque
|
||||
await new Promise(r => setTimeout(r, 2000));
|
||||
try {
|
||||
const probeRes = await fetch('/api.php?action=check_update&_t=' + Date.now());
|
||||
const probeData = await probeRes.json();
|
||||
if (probeData && probeData.success && probeData.current_version) {
|
||||
finalizeUpdateSuccess(probeData.current_version);
|
||||
return;
|
||||
}
|
||||
} catch (_) {}
|
||||
// on sonde le serveur à plusieurs reprises pour laisser Nginx/PHP-FPM terminer leur reload
|
||||
const probeData = await probeUpdateReady(6, 1500);
|
||||
if (probeData) {
|
||||
await finalizeUpdateSuccess(probeData.current_version);
|
||||
return;
|
||||
}
|
||||
|
||||
// En cas d'échec réel avéré
|
||||
startMetricsPolling();
|
||||
closeUpdateConfirmModal();
|
||||
const errMsg = (data && (data.output || data.message)) ? (data.output || data.message) : (rawText.slice(0, 150) || "Erreur inconnue");
|
||||
alert("Erreur lors de la mise à jour :\n\n" + errMsg);
|
||||
@@ -6503,17 +6519,14 @@ async function executeSystemUpdate() {
|
||||
|
||||
} catch (e) {
|
||||
// En cas d'interruption réseau du socket (Safari WebKit DOMException ou timeout),
|
||||
// on vérifie avant d'alerter si le serveur a quand même réussi à déployer les fichiers
|
||||
await new Promise(r => setTimeout(r, 2000));
|
||||
try {
|
||||
const probeRes = await fetch('/api.php?action=check_update&_t=' + Date.now());
|
||||
const probeData = await probeRes.json();
|
||||
if (probeData && probeData.success && probeData.current_version) {
|
||||
finalizeUpdateSuccess(probeData.current_version);
|
||||
return;
|
||||
}
|
||||
} catch (_) {}
|
||||
// on vérifie à plusieurs reprises si le serveur a quand même réussi à déployer les fichiers
|
||||
const probeData = await probeUpdateReady(6, 1500);
|
||||
if (probeData) {
|
||||
await finalizeUpdateSuccess(probeData.current_version);
|
||||
return;
|
||||
}
|
||||
|
||||
startMetricsPolling();
|
||||
closeUpdateConfirmModal();
|
||||
alert("Erreur réseau lors de la mise à jour : " + (e.message || "Connexion interrompue"));
|
||||
if (btnRun) {
|
||||
|
||||
Reference in new issue
Block a user