fix(deploy): respawn supervisor ב-start.sh — הקונטיינר לא ייוותר חצי-חי אחרי reboot #181

Merged
chaim merged 1 commits from harden-entrypoint into main 2026-06-11 06:57:45 +00:00
Owner

הבעיה (production outage 2026-06-10)

אחרי עדכון הקרנל (6.17.0-1016-oracle) + reboot, הקונטיינר של legal-ai עלה running:unhealthy: ה-Next.js (:3000) רץ, אבל ה-FastAPI (:8000) לאECONNREFUSED 127.0.0.1:8000 על /api/health → Traefik החזיר 503 no available server. כתוצאה גם ה-plugin של Paperldip נכשל כל 15 דק' (Legal API 503). תוקן זמנית ב-restart ידני דרך Coolify.

שורש: start.sh הריץ את uvicorn ברקע, בדק פעם אחת אחרי 2 שניות, ואם מת — רק הדפיס שגיאה והמשיך. Next.js ב-foreground שמר את הקונטיינר "חי" → Docker/Coolify לא הפעילו restart, וה-backend נשאר מת. ב-boot, uvicorn לא הספיק להגיע ל-Postgres (:5433) שעוד עלה → נפל ונשאר נפול.

התיקון

start.sh הוא כעת סופרוייזר אמיתי:

  • כל תהליך (uvicorn ו-node) רץ בלולאת respawn עם capped backoff (1→2→…→30s, מתאפס אחרי 30s up). → race מול Postgres ב-boot נפתר מעצמו, uvicorn ינסה שוב עד שה-DB מוכן.
  • trap על TERM/INT → shutdown נקי. (PID 1 sh מתעלם מ-SIGTERM בלי trap → גם redeploy נעשה מהיר יותר.)
  • אם סופרוייזר מת באופן בלתי-צפוי → exit 1 כדי ש-Docker יפעיל restart מלא.

נבדק: sh -n עובר; smoke-test מאמת respawn + backoff (1→2→4→8) + יציאה נקייה על SIGTERM.

Invariants

  • X3 (integration/deploy), X16 (pipeline-durability — עמידות-הרצה).
  • לא יוצר מסלול מקביל (G2); לא בולע שגיאות — כל restart מתועד ל-stdout (כלל-הנדסה §6).

🤖 Generated with Claude Code

## הבעיה (production outage 2026-06-10) אחרי עדכון הקרנל (`6.17.0-1016-oracle`) + reboot, הקונטיינר של legal-ai עלה `running:unhealthy`: ה-Next.js (:3000) רץ, אבל ה-FastAPI (:8000) **לא** — `ECONNREFUSED 127.0.0.1:8000` על `/api/health` → Traefik החזיר `503 no available server`. כתוצאה גם ה-plugin של Paperldip נכשל כל 15 דק' (`Legal API 503`). תוקן זמנית ב-restart ידני דרך Coolify. **שורש**: `start.sh` הריץ את uvicorn ברקע, בדק **פעם אחת** אחרי 2 שניות, ואם מת — רק הדפיס שגיאה והמשיך. Next.js ב-foreground שמר את הקונטיינר "חי" → Docker/Coolify לא הפעילו restart, וה-backend נשאר מת. ב-boot, uvicorn לא הספיק להגיע ל-Postgres (:5433) שעוד עלה → נפל ונשאר נפול. ## התיקון `start.sh` הוא כעת **סופרוייזר אמיתי**: - כל תהליך (uvicorn ו-node) רץ בלולאת **respawn** עם **capped backoff** (1→2→…→30s, מתאפס אחרי 30s up). → race מול Postgres ב-boot נפתר מעצמו, uvicorn ינסה שוב עד שה-DB מוכן. - `trap` על TERM/INT → shutdown נקי. (PID 1 `sh` מתעלם מ-SIGTERM בלי trap → גם redeploy נעשה מהיר יותר.) - אם סופרוייזר מת באופן בלתי-צפוי → `exit 1` כדי ש-Docker יפעיל restart מלא. נבדק: `sh -n` עובר; smoke-test מאמת respawn + backoff (1→2→4→8) + יציאה נקייה על SIGTERM. ## Invariants - **X3** (integration/deploy), **X16** (pipeline-durability — עמידות-הרצה). - לא יוצר מסלול מקביל (G2); לא בולע שגיאות — כל restart מתועד ל-stdout (כלל-הנדסה §6). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-11 06:57:37 +00:00
fix(deploy): respawn supervisor ב-start.sh כדי שהקונטיינר לא ייוותר חצי-חי
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 6s
c504a61d49
הבאג: start.sh הריץ את uvicorn ברקע, בדק פעם אחת אחרי 2 שניות, ואם הוא מת
רק הדפיס שגיאה והמשיך. Next.js רץ ב-foreground אז הקונטיינר נשאר "חי" עם
backend מת — Docker/Coolify לא מפעילים restart, ו-/api/health מחזיר 503.
זה בדיוק מה שקרה אחרי עדכון הקרנל + reboot ב-2026-06-10: uvicorn לא הצליח
להגיע ל-Postgres בשניות הראשונות וה-backend נשאר מת עד restart ידני.

התיקון: start.sh הוא כעת סופרוייזר אמיתי — כל תהליך (uvicorn ו-node)
רץ בלולאת respawn עם capped backoff (1→2→…→30s, מתאפס אחרי 30s up).
race מול Postgres ב-boot נפתר מעצמו. trap על TERM/INT מבצע shutdown
נקי (PID 1 sh מתעלם מ-SIGTERM בלי trap → redeploy מהיר יותר). אם
סופרוייזר מת באופן בלתי-צפוי — exit 1 כדי ש-Docker יפעיל restart מלא.

Invariants: X3 (integration/deploy), X16 (pipeline-durability — עמידות
הרצה). לא נוגע ב-G1/G2 (אין מסלול מקביל), לא בולע שגיאות (כל restart
מתועד ל-stdout).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chaim merged commit e2e42f850d into main 2026-06-11 06:57:45 +00:00
chaim deleted branch harden-entrypoint 2026-06-11 06:57:45 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ezer-mishpati/legal-ai#181