fix(GRO-2652): boot ECONNRESET resilience — retry-with-backoff in initAuth, server-first startup #222

Merged
Flea Flicker merged 5 commits from feature/GRO-2652-boot-econnreset-resilience into dev 2026-08-05 09:01:13 +00:00
Showing only changes of commit 095efb1cca - Show all commits
+22 -2
View File
@@ -292,14 +292,34 @@ api.route("/search", searchRouter);
api.route("/buffer-rules", bufferRulesRouter);
api.route("/routes", routesRouter);
// Start the HTTP server first so /health and public routes are available immediately.
// Auth initialization runs afterward with retry — a transient DB ECONNRESET at boot
// must not crash the process (GRO-2652). Auth routes return 503 until initAuth succeeds.
const port = Number(process.env.PORT ?? 3000);
await initAuth();
console.log(`API server listening on port ${port}`);
const server = serve({ fetch: app.fetch, port });
console.log(`API server listening on port ${port}`);
// Start background reminder scheduler (runs every minute to check for upcoming appointments)
startReminderScheduler();
let initAttempt = 0;
while (true) {
try {
await initAuth();
break;
} catch (err) {
initAttempt++;
const delay = Math.min(2 ** initAttempt * 500, 30_000);
console.error(`[auth] initAuth attempt ${initAttempt} failed: ${err}`);
if (initAttempt >= 10) {
console.error("[auth] auth init permanently failed — auth endpoints will serve 503");
break;
}
console.error(`[auth] retrying in ${delay}ms`);
await new Promise((r) => setTimeout(r, delay));
}
}
function shutdown() {
console.log("Shutting down gracefully...");
// SIGTERM/SIGINT → server.close() → callback → process.exit(0)