diff --git a/dashcaddy-api/__tests__/health-endpoints.test.js b/dashcaddy-api/__tests__/health-endpoints.test.js index 5e01b8e..e8c2c48 100644 --- a/dashcaddy-api/__tests__/health-endpoints.test.js +++ b/dashcaddy-api/__tests__/health-endpoints.test.js @@ -105,10 +105,7 @@ function buildApp({ configOk = true, servicesOk = true, dockerOk = true, caddyOk try { const caddyUrl = config.CADDY_ADMIN_URL || 'http://localhost:2019'; - const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), 3000); - const response = await fetch(`${caddyUrl}/config/`, { signal: controller.signal }); - clearTimeout(timeout); + const response = await fetch(`${caddyUrl}/config/apps/http/servers/srv0/listen`, { signal: AbortSignal.timeout(10000) }); checks.caddy = { ok: response.ok, status: response.status }; if (!response.ok) allOk = false; } catch (e) { diff --git a/dashcaddy-api/__tests__/health-probe-aliases.test.js b/dashcaddy-api/__tests__/health-probe-aliases.test.js index 50683e8..bc0d263 100644 --- a/dashcaddy-api/__tests__/health-probe-aliases.test.js +++ b/dashcaddy-api/__tests__/health-probe-aliases.test.js @@ -109,10 +109,7 @@ function buildApp({ configOk = true, servicesOk = true, dockerOk = true } = {}) } try { const caddyUrl = config.CADDY_ADMIN_URL || 'http://localhost:2019'; - const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), 3000); - const response = await fetch(`${caddyUrl}/config/`, { signal: controller.signal }); - clearTimeout(timeout); + const response = await fetch(`${caddyUrl}/config/apps/http/servers/srv0/listen`, { signal: AbortSignal.timeout(10000) }); checks.caddy = { ok: response.ok, status: response.status }; if (!response.ok) allOk = false; } catch (e) { diff --git a/dashcaddy-api/src/app.js b/dashcaddy-api/src/app.js index 552a64c..e1cca0f 100644 --- a/dashcaddy-api/src/app.js +++ b/dashcaddy-api/src/app.js @@ -727,14 +727,14 @@ async function createApp() { } // Check 4: Caddy admin API reachable + // Use fetchT() (NOT native fetch) because undici fetch rejects Caddy admin + // on :2019, and probe the LIGHTEST endpoint (srv0/listen = 9 bytes) to avoid + // head-of-line blocking when /load or another config mutation is in flight. + // A previous `/config/` probe hit the 3s AbortController timeout with + // "This operation was aborted" while Caddy was actually healthy. try { const caddyUrl = config.CADDY_ADMIN_URL || 'http://localhost:2019'; - const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), 3000); - const response = await fetch(`${caddyUrl}/config/`, { - signal: controller.signal - }); - clearTimeout(timeout); + const response = await fetchT(`${caddyUrl}/config/apps/http/servers/srv0/listen`, {}, 10000); checks.caddy = { ok: response.ok, status: response.status }; if (!response.ok) allOk = false; } catch (e) {