הליבה של WIZZO CMS (התיקייה system/core באתר) מתעדכנת מתוך האתר עצמו: האתר שואל את השרת הראשי של Wizzo מה הגרסה הנוכחית, מוריד ZIP, מחליף את תיקיית הליבה ומסנכרן סכמת בסיס נתונים, פאנלים ומשימות cron. הדף הזה מתאר את התהליך שלב אחר שלב, מה נבדק לפני ואחרי ההחלפה, מתי מתבצעת חזרה אוטומטית אחורה, ומה בדיוק נוגעים בו ומה לא.
הרכיבים#
| רכיב | קובץ | רץ על | תפקיד |
|---|---|---|---|
השרת הראשי, check_version | controllers/check_version.php | wizzocms40.wizzo.co.il בלבד | עונה "מה הגרסה", בונה ומגיש את ה-ZIP, מייצא סכמת בסיס נתונים, פאנלים, cron ו-JS, ומפיק הערות שחרור |
| הלקוח, "מרכז עדכונים" | admin/wizzo_update.php (ADMINMODULE_wizzo_update) | כל אתר | מבצע את ההחלפה והסנכרונים, מנהל את הלוג וממשק הפאנל |
core_ping | controllers/core_ping.php | כל אתר | GET /system/core_ping מחזיר {ok, version, db, php} בלי מטמון. זה מבחן ה"האם הליבה החדשה עלתה" |
| גשר הסוכנים | controllers/agent_mcp.php, פעולה wizzo_update | כל אתר | מאפשר לשרת הסוכנים להפעיל את אותו תהליך עם channel ו-check_only. ראו גשר agent_mcp |
version.txt | system/core/version.txt | כל אתר | מחרוזת הגרסה, למשל 5.0.115. ראו גרסאות |
הקובץ check_version.php מוחרג מה-ZIP עצמו, ולכן אתר לקוח לעולם לא מקבל את קוד השרת הראשי ולא את טוקן ה-GitHub שמונח רק אצלו. הערות השחרור (מה נכנס) מגיעות לאתר כתשובה מהשרת הראשי, לא מ-.git מקומי.
איך מפעילים עדכון#
| דרך | פרטים |
|---|---|
| הפאנל | {admin}/wizzo_update, כפתור "עדכון גרסה". הפאנל קורא ל-{admin}/wizzo_update/get בלי channel, כלומר לערוץ latest |
| ערוץ מפורש | {admin}/wizzo_update/get?channel=stable (דרך סשן מנהל) |
| שרת הסוכנים | פעולת wizzo_update ב-agent_mcp עם channel, check_only ו-force |
הפלט של get הוא טקסט: true בהצלחה, false בכישלון. כל מילה נוספת שנדפסת אחריו (למשל שגיאת יצירת טבלה מהסנכרון) גורמת לממשק להציג שגיאה, למרות שהחלפת הליבה עצמה כבר בוצעה.
get הוא בקשת GET בלי אסימון CSRF. מנהל מחובר שפותח כתובת מתוך דף זדוני יכול להפעיל עדכון. זה ממצא ידוע בביקורת. כל עוד הוא פתוח, אל תשאירו מנהלים מחוברים בדפדפן שגולש לאתרים לא מהימנים.התהליך שלב אחר שלב#
ADMINMODULE_wizzo_update::get() מבצע את הרצף הבא:
- רישום עוגן. יוצר את
CRM_wizzo_update_logאם חסרה, קורא אתhead_shaשל העדכון המוצלח הקודם, ושואל את השרת הראשי (/head) מה ה-sha הנוכחי. ה-sha נרשם ללוג רק אחרי הצלחה. כשל בשלב הזה לא עוצר עדכון. - מה מוצע.
GET {MASTER}/get?ver=<מותקן>&format=json&channel=latest|stableמחזיר{ok, version, channel, url, sha256, size, php_floor}, או{ok, up_to_date: true}. מאסטר ישן שעונה טקסט מקבל את המסלול הישן (כתובת ZIP גולמית, בלי חתימה). - עדכון לא נדרש. אם אין גרסה חדשה בערוץ, לא יורד ZIP ולא מוחלפת ליבה, אבל שלב 11 (הסנכרונים) עדיין רץ. כך "הרצה כפויה" מסנכרנת טבלאות ופאנלים גם בלי גרסה חדשה.
- בדיקה מקדימה (preflight). נכשל עם סיבה קצרה ביומן, ושום קובץ לא נוגע:
php_too_old <יש> < <נדרש>,no_zip_extension,disk_full <פנוי> < <נדרש>(הנדרש הוא הגדול מבין 64MB ופי 4 מגודל ה-ZIP),db_unreachable. - הורדה.
copy()בזרימה (timeout של 600 שניות) לקובץ ZIP בתיקיית העבודה. קובץ קטן מ-1KB נחשב כשל. - אימות sha256. במסלול ה-JSON, אי-התאמה היא
zip_checksum_mismatchוהקובץ נמחק. - פריסה בצד. הפריסה היא לתיקייה
core_new_<ts>לצד הליבה החיה, שממשיכה לשרת. אם חסריםcore.phpאוversion.txt, היא נמחקת (broken_extraction). - החלפה. שני
rename:coreאלcore_bup_<ts>, ואזcore_new_<ts>אלcore. אם השני נכשל, הראשון מוחזר מיד (swap_in_failed). - בדיקה אחרי (postflight). בקשה לאתר עצמו,
{env_url}/system/core_ping?_wz=<rand>(עד 60 שניות, ללא מטמון). תשובה 5xx, גוף שאינו ה-JSON שלcore_ping,db: false, או גרסה שונה מהצפויה, מחזירות את הליבה הישנה אוטומטית ביומןpostflight_failed ... (rolled back to <גרסה>). אם אין תשובת HTTP בכלל (DNS, חומת אש פנימית), הבדיקה נחשבת עוברת, כי הליבה לא נשפטת על רשת השרת. - הצלחה. מדפיס
true, רושם ל-CRM_wizzo_update_log(status=success), ושומר את חמשת גיבוייcore_bup_*האחרונים. - סנכרונים. בסדר:
protect_system_folder()(שותל את.htaccessשל/system/),update_db(),update_panel(),update_cron_system(),update_js(). אחריהםattaches_versionעולה ב-1 (שובר מטמון נכסים בדפדפנים), מטמוןparamsמנוקה, ו-external_mcp::flush()מנקה את רשימת הכלים שה-gateway מגיש.
בדיקת מצב בלי לגעת בכלום: GET https://wizzocms40.wizzo.co.il/system/check_version/check?ver=<גרסה>&format=json&channel=stable מחזיר installed, latest, stable, channel, target, stable_fallback, update_available, php_floor ו-php_master. בלי format=json התשובה היא הגרסה או up_to_date.
// maintenance script: is an update waiting, and can this PHP take it?
$ver = trim(file_get_contents(CONFIG::$core_path . "/version.txt"));
$ctx = stream_context_create(["http" => ["timeout" => 20, "ignore_errors" => true]]);
$j = json_decode((string)@file_get_contents(
"https://wizzocms40.wizzo.co.il/system/check_version/check?ver=" . rawurlencode($ver)
. "&format=json&channel=stable", false, $ctx), true);
if (!empty($j["update_available"]) && version_compare(PHP_VERSION, $j["php_floor"], ">="))
{
// run the update itself only from the panel: {admin}/wizzo_update
}
ערוצים: latest ו-stable#
| ערוץ | מה הוא | מתי |
|---|---|---|
latest (ברירת מחדל) | version.txt החי של השרת הראשי ברגע הבקשה. ה-ZIP נבנה פעם אחת לכל גרסה וטביעת אצבע של העץ, תחת נעילת flock | כל פרסום לשרת הראשי מגיע מיד |
stable | הגרסה ש-promote הקפיא: releases/stable.txt ו-releases/core-<ver>.zip עם .sha256 | אתרים שמבקשים אותו במפורש |
אם אין גרסה קפואה או שה-ZIP שלה חסר, stable נופל ל-latest והתשובה כוללת stable_fallback: true. ההקפאה (promote) דורשת סוד בוט ומקפיאה רק את הגרסה שהשרת הראשי מריץ באותו רגע (נשמרות חמש גרסאות אחרונות). פרסום גרסה לכל הצי הוא החלטה של אדם, לא של סשן אוטומטי.
אין באתר פרמטר קבוע שבוחר ערוץ: הערוץ נבחר בבקשה. סביבת פיתוח מקומית בדרך כלל לא מריצה את הפאנל כלל, אלא מציבה את api/core כ-symlink או checkout של הריפו.
מה מוחלף ומה לא#
- מוחלפת רק התיקייה
system/core(שהיאapi/coreבריפו).application/,themes/,storage/,CONFIG_USER, המטמון ו-system/market_settings.jsonלא נוגעים. system/jsמוחלפת בשלמותה בתהליך נפרד (update_js), ובלי גיבוי אטומי: התיקייה הישנה עוברת ל-js_bup_<ts>לפני הפריסה, ואם הפריסה נכשלת לא חוזרים אליה אוטומטית.- שינויים מקומיים בתוך
core/נמחקים בעדכון הבא, והם נשארים רק בגיבויcore_bup_<ts>לחמישה עדכונים. אין מנגנון patch או overlay, ולכן כל התאמה שייכת ל-application/. - בסיס נתונים:
update_db()רק מוסיף טבלאות, עמודות ואינדקסים (טבלה חדשה בקידודutf8mb4). הוא לא מוחק, ומרחיב עמודה רק כשזו הרחבה בטוחה. - פאנלים:
update_panel()מעדכן שורות ב-adminPanel_panelsלפיpanel_name(טקסט, אייקון,extra_perms,perm_developer), מוסיף אפשרויות חסרות, ויוצר קטגוריה רק לפאנל חדש. - משימות cron:
update_cron_system()הוא מקור אמת: משימות בקטגוריה 1 ("מערכת") שאינן בשרת הראשי נמחקות מהאתר. שדות ריצה (last_run,next_run,runs_count) נשמרים. משימות שלכם שייכות לקטגוריה אחרת.
אל תוסיפו משימות cron מותאמות בקטגוריה 1: העדכון הבא ימחק אותן. ואל תערכו קבצים בתוך system/core באתר חי: העדכון הבא ידרוס אותם.
סנכרוני בסיס הנתונים, הפאנלים וה-cron אינם ניתנים להרצה "יבשה" או לחזרה אחורה. הדברים היחידים שיש להם חזרה אוטומטית הם החלפת הליבה עצמה. בדקו מקום פנוי בדיסק לפני עדכון: core_bup_* שנשמרים (חמישה) הם עותקים מלאים של הליבה.
טבלאות ופרמטרים#
| מה | איפה | תוכן |
|---|---|---|
CRM_wizzo_update_log | האתר | id, date_created, admin_id (0 = אוטומטי), status (success או failed), error_text, from_version, to_version, head_sha, prev_sha, commits_count, ai_summary, ai_summary_date |
CRM_params.wizzo_update_pending | האתר | מטמון ה-HTML של "מה מחכה", מפתח <גרסה>|<sha> |
CRM_params.attaches_version | האתר | מונה לשבירת מטמון נכסים, עולה ב-1 בכל עדכון |
core_bup_<ts>/, core_new_<ts>/, core_failed_<ts>/, js_bup_<ts>/ | system/ באתר | גיבויים ותיקיות ביניים. נשמרים חמישה אחרונים מכל סוג גיבוי |
CRM_params.github_api_token, bot_api_secret, מטמוני wizzo_update_changes_cache ו-wizzo_update_version_bumps | השרת הראשי בלבד | טוקן קריאה ל-GitHub, סוד הבוט להקפאה ולאימות טוקן, ומטמוני סיכומי ה-AI |
SELECT date_created, status, from_version, to_version, error_text
FROM CRM_wizzo_update_log
ORDER BY id DESC
LIMIT 5
קודי השגיאה שמופיעים ב-error_text: master_unreachable, php_too_old, no_zip_extension, disk_full, db_unreachable, zip_download_failed, zip_checksum_mismatch, cannot_open_zip, broken_extraction, swap_out_failed, swap_in_failed, postflight_failed.
הערות שחרור בפאנל#
לשונית "מה מחכה" שואלת את השרת הראשי: GET {MASTER}/changes?ver=<מותקן>&from_sha=<קודם> מחזיר רשימת commits מסוכמת, עם סיכום שנוצר ב-WizzoAI ונשמר פעם אחת בשרת הראשי עבור כל הצי. נושא commit שמסומן [security] או [breaking] מדליק דגל מודגש בפאנל. כל תשובה מהרשת מפורקת ומורכבת מחדש לפני שהיא נכנסת לעמוד כ-HTML.
הסיכום של הערות השחרור שולח לשירות AI את נושאי ה-commits של הליבה (לא קוד האתר שלכם). ראו מארחים חיצוניים.
ראו גם#
- גרסאות, מבנה מספר הגרסה ותהליך הפרסום
- גשר agent_mcp, הפעלת עדכון משרת הסוכנים
- בריאות וביצועים ו-אבחון קוד
- מארחים חיצוניים
- הקשחה