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 <noreply@anthropic.com>
This commit is contained in:
chahinebrini 2026-06-10 15:47:24 +02:00
parent 7ce5e58f8d
commit 8697fee2e8

View File

@ -161,6 +161,28 @@ log "Step 5: pm2 restart rebreak-staging..."
"${PM2_BIN}" start "${REPO_ROOT}/ecosystem.config.js" --only rebreak-staging "${PM2_BIN}" start "${REPO_ROOT}/ecosystem.config.js" --only rebreak-staging
log "rebreak-staging restarted" 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) # 6. Optional services (best-effort, Mo's Scope)
log "Step 6: Optional services restart..." log "Step 6: Optional services restart..."
"${PM2_BIN}" restart rebreak-imap-staging 2>/dev/null || true "${PM2_BIN}" restart rebreak-imap-staging 2>/dev/null || true