From cbf5d219fc2c5222d8315f061a64dafe77c75a88 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 9 Apr 2026 19:50:17 +0000 Subject: [PATCH] Add health check after deploy - confirms Arbiter restarted successfully --- services/arbiter-3.0/src/views/layout.ejs | 44 ++++++++++++++++++++--- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/services/arbiter-3.0/src/views/layout.ejs b/services/arbiter-3.0/src/views/layout.ejs index dd7ebc3..fcfbb5d 100644 --- a/services/arbiter-3.0/src/views/layout.ejs +++ b/services/arbiter-3.0/src/views/layout.ejs @@ -149,11 +149,47 @@ const data = await response.json(); if (data.success) { - icon.textContent = '✅'; - text.textContent = 'Deployed!'; - result.textContent = data.message; + // Deploy triggered, now wait for restart and check health + icon.textContent = '🔄'; + text.textContent = 'Restarting...'; + result.textContent = 'Waiting for Arbiter to come back online...'; result.classList.remove('hidden', 'text-red-500'); - result.classList.add('text-green-500'); + result.classList.add('text-yellow-500'); + + // Wait 4 seconds for restart, then check health + await new Promise(resolve => setTimeout(resolve, 4000)); + + // Poll for health (up to 3 attempts) + let healthy = false; + for (let i = 0; i < 3; i++) { + try { + const healthRes = await fetch('/admin/system/status', { + headers: { 'CSRF-Token': '<%= csrfToken %>' } + }); + const healthData = await healthRes.json(); + if (healthData.arbiter === 'running') { + healthy = true; + break; + } + } catch (e) { + // Server still restarting, wait and retry + await new Promise(resolve => setTimeout(resolve, 2000)); + } + } + + if (healthy) { + icon.textContent = '✅'; + text.textContent = 'Deployed!'; + result.textContent = 'Arbiter restarted successfully'; + result.classList.remove('text-yellow-500', 'text-red-500'); + result.classList.add('text-green-500'); + } else { + icon.textContent = '⚠️'; + text.textContent = 'Check Status'; + result.textContent = 'Deploy triggered but could not confirm restart. Check logs.'; + result.classList.remove('text-yellow-500', 'text-green-500'); + result.classList.add('text-red-500'); + } } else { icon.textContent = '❌'; text.textContent = 'Deploy Failed';