מודול 2 · בשרת — שיעור 4 מתוך 5

בדיקות בריאות וגרסאות

10 דקות קריאה

התחברו כדי שההתקדמות בקורס תישמר בחשבון.

"הפורט פתוח" זה לא "האפליקציה עובדת"

אפליקציה יכולה להאזין ולענות 500 לכל בקשה. בדיקת בריאות טובה בודקת את מה שבאמת נדרש כדי לשרת: התהליך חי, התלויות זמינות, והגרסה הנכונה עלתה.

שני נתיבים שונים, ושני שימושים

app.get("/healthz", (req, res) => res.send("ok"));           // liveness: התהליך חי
app.get("/readyz", async (req, res) => {                      // readiness: אפשר לשרת
  try {
    await db.query("SELECT 1");
    res.json({ ok: true, version: BUILD_VERSION });
  } catch {
    res.status(503).json({ ok: false });
  }
});
  • liveness משמש את המנהל (Docker/PM2/K8s) להחליט אם להרוג את התהליך. הוא חייב להיות זול ולא תלוי בשום שירות חיצוני — אחרת כשל של בסיס נתונים יגרום לריסטארטים אינסופיים שלא פותרים כלום.
  • readiness משמש את מאזן העומס להחליט אם לשלוח בקשות. הוא יכול וצריך לבדוק תלויות.

גרסה: לדעת מה רץ

export const BUILD_VERSION = process.env.BUILD_VERSION ?? "dev";
app.get("/version", (req, res) => res.json({ version: BUILD_VERSION, env: process.env.NODE_ENV }));

מזגו את ה-commit (או מספר בנייה) לתוך משתנה סביבה בזמן הפריסה. בלי זה, בשאלה "האם התיקון עלה?" אין תשובה — יש רק השערות. שימו לב לא להסתמך על git בזמן ריצה: בתמונת Docker אין .git.

פיקוח מבחוץ

בדיקה שרצה מבחוץ לשרת היא היחידה שתופסת:

  • הפרוקסי מחזיר 502.
  • ה-DNS הפסיק להצביע.
  • התעודה פגה.
  • ה-firewall נסגר.

תזמון סביר: כל דקה ל-/readyz, והתראה בערוץ שמישהו באמת קורא. בדיקה שמתריעה למייל שאיש לא קורא היא לא ניטור.

מה כן לתעד

  • מהי הבדיקה, מה בדיוק היא בודקת, ומה פירוש כישלון שלה.
  • מי מקבל התראה ומתי מפעילים בן אדם בלילה (כמעט אף פעם — עדיף שקט עם תיקון בבוקר מאשר ערנות יתר).