From 8697fee2e8811a70ec16d5f662ed2e966bf67e58 Mon Sep 17 00:00:00 2001 From: chahinebrini Date: Wed, 10 Jun 2026 15:47:24 +0200 Subject: [PATCH] fix(deploy): warte auf Backend-Port 3016 vor idle-Daemon-Restart Deploy-Race: rebreak-idle-staging wurde direkt nach pm2-restart von rebreak-staging gestartet, bevor der Nitro-Server auf Port 3016 lauschte. Der Daemon startete sofort Initial-Scans fuer alle Accounts -- jeder triggerScan()-Call scheiterte mit "fetch failed" (ECONNREFUSED). Kein Crash, aber Error-Log-Burst (N Fehler pro Mail-Account) und verpasster Initial-Sweep. Fix: curl-Preflight in Step 5b wartet bis Port 3016 antwortet (max 60s, 12x alle 5s, --retry-connrefused). Bei Timeout: WARN im Log, kein Deploy-Abbruch (best-effort fuer optionalen Service). Co-Authored-By: Claude Opus 4.8 --- scripts/deploy-from-artifact.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/scripts/deploy-from-artifact.sh b/scripts/deploy-from-artifact.sh index ccf2daa..f0c63fd 100755 --- a/scripts/deploy-from-artifact.sh +++ b/scripts/deploy-from-artifact.sh @@ -161,6 +161,28 @@ log "Step 5: pm2 restart rebreak-staging..." "${PM2_BIN}" start "${REPO_ROOT}/ecosystem.config.js" --only rebreak-staging log "rebreak-staging restarted" +# 5b. Warten bis Backend-Port ready ist (max 60s). +# Verhindert Deploy-Race: rebreak-idle-staging startet Initial-Scan-Welle sofort +# beim Hochfahren -- wenn Port 3016 noch nicht lauscht, schlaegt jeder +# triggerScan-Call mit "fetch failed" fehl und der idle-Daemon loggt einen +# Burst (1 Fehler pro aktivem Mail-Account). Das ist kein Crash (fetch-Fehler +# werden im catch absorbiert), aber es produziert Larm im Error-Log und +# verpasst den Initial-Sweep. +# curl --retry: 12 Versuche alle 5s = 60s Timeout. --retry-connrefused: auch +# bei ECONNREFUSED (Port noch nicht offen) weiterversuchen, nicht sofort abbrechen. +# --silent --output /dev/null: kein Response-Body in die Logs. +# --fail: Exit-Code != 0 bei HTTP 4xx/5xx -- wir wollen nur "Port lauscht". +# Nitro antwortet auf / mit 200 (oder redirect), auf unbekannte Routen mit 404 -- +# beides bedeutet "Backend laeuft". Daher kein --fail hier. +log "Step 5b: Warte auf Backend-Port 3016 (max 60s)..." +if curl --silent --output /dev/null \ + --retry 12 --retry-delay 5 --retry-connrefused \ + "http://127.0.0.1:3016/"; then + log "Backend-Port 3016 ready" +else + log "WARN: Backend-Port 3016 nicht erreichbar nach 60s -- idle-Restart trotzdem fortsetzen" +fi + # 6. Optional services (best-effort, Mo's Scope) log "Step 6: Optional services restart..." "${PM2_BIN}" restart rebreak-imap-staging 2>/dev/null || true