21 מתודות פריסה, ו-10 מהן נושאות את הקוד שלך.
תרחיש שימוש בפלטפורמה הזאת אינו קטגוריה שיווקית, הוא שם של מתודה. config.json מצהיר על 21 מתודות בדיוק ששמן מתחיל ב-deploy_, config_dev.json מצהיר על אותן 21, וכל צורת פריסה ש-Xuda מציעה היא אחת מהרשומות האלה. עשר מהן שולחות גרסת בנייה של הפרויקט, ושדה אחד מגלה אילו עשר: אלה הרשומות שמקבלות data.release_doc_id. אחת עשרה האחרות מקצות תשתית או כותבות רשומה. אותן עשר מגדירות כולן את req.data.deploy_type ומעבירות לפונקציה משותפת אחת, deploy_app, שאינה מוצהרת בעצמה ב-cpi_methods, ולכן אין קריאת פריסה גנרית שאפשר לבצע. בוחרים דלת כניסה לפי שם, והקוד המשותף שמאחוריה קורא את הסוג מתוך הבקשה. רצפת המסלול כתובה על כל רשומה ולא בעמוד תמחור: deploy_mini_app היא המתודה היחידה בכל הקטלוג בן 1010 הרשומות שנושאת min_plan free, שתים עשרה מתודות deploy_ נושאות min_plan pro, שתיים נושאות agency, ושש אינן נושאות min_plan כלל, כלומר כולם עוברים את השער הזה. לפי שער המסלול לבדו, 7 מתוך 21 נגישות ב-Free, 19 ב-Pro, 19 ב-Team ו-21 ב-Agency, מול מחירי מנוי של $0, $49, $149 ו-$399 לחודש. העמוד הזה עובר על שמונת הדפוסים שאיתם אנשים באמת מגיעים, נוקב בשם המתודה שכל אחד מהם נפתר אליה, ונוקב גם באלה שנפתרים ללא כלום.

התרחיש שאיתו מגיעים, והמתודה שהוא נפתר אליה.
אנשים לא מגיעים ומבקשים deploy_spa. הם מגיעים עם צורה בראש: אפליקציה ללקוחות, אתר בלי קוד מאחוריו, משימה שרצה בשלוש לפנות בוקר, עותק לבדוק מולו. כל אחת מהן נפתרת לרשומה אחת או שתיים בעלות שם ב-cpi_methods, והפתרון נקבע ברגע הקריאה ולא נבחר בזמן ריצה. כל שורה היא חלופה אחת, והתגיות לצידה הן הקריאות שהיא באמת עולה.
מתודות ששמן מתחיל ב-deploy_
מתוכן נגישות בחשבון Free
מתודות בקטלוג החסומות מתחת ל-Pro שהן פריסות
מתודות פריסה החסומות מתחת ל-Team
מה קריאת פריסה מבקשת, ומה היא עושה עם התשובה.
ל-21 הרשומות אין חתימה משותפת, אבל ארבעה שדות בהצהרה מספרים כמעט הכול על רשומה מסוימת עוד לפני פתיחת ה-handler שלה: אם היא מקבלת מזהה גרסה, אם היא מקבלת אזור, אם היא רצה כמשימה במעקב, ואיזה סקריפט אותה משימה מריצה. שני שדות נוספים קובעים מי בכלל רשאי לקרוא לה. 14 מתוך 21 דורשות הרשאת admin ו-7 דורשות הרשאת user, ו-20 מתוך 21 נושאות private: true, הדגל שאף מפתח API חיצוני אינו חוצה בשום מצב. פריסה היא פעולה של מפעיל מתוך סשן מחובר, לא משהו שאינטגרציה יורה.
- מזהה גרסה, או כלום. 10 מתוך 21 מקבלות data.release_doc_id, ואלה בדיוק העשר ששולחות גרסת בנייה של הפרויקט. שש מהן נקשרות לתוכנית Studio אחת דרך data.prog_id שהוא שדה חובה: embed, mini_app, preview, pwa, spa ו-user_group. deploy_mpa מקבלת data.route_id במקומו. אחת עשרה המתודות האחרות מקצות תשתית או כותבות רשומה ואינן נוגעות בגרסת בנייה כלל.
- אזור, בדרך כלל. 16 מתוך 21 מקבלות אזור. החמש שלא הן instance, marketplace, mini_app, site ו-static_website. שתיים מהן כותבות מסמך ב-xuda_master ואינן מקצות שרת, שתיים מפרסמות קבצים לאחסון, והחמישית היא הפריסה החינמית, שאינה מקבלת אזור ואינה מקבלת שדות create_datacenter כלל.
- משימה, בדרך כלל. 14 מתוך 21 רצות כמשימה במעקב עם job_timeout של 1800000 ms, שהם 30 דקות, ומדווחות התקדמות דרך ה-job_steps המוצהרים שלהן. השבע האחרות חוזרות בלי משימה: another, datacenter, instance, marketplace, site, static_website ו-xucode. קריאה שחוזרת מיד עושה ניירת, לא הקצאה.
- סקריפט אחד, תשע פעמים. api, cron, embed, emitter, mpa, preview, pwa, spa ו-user_group מריצות סקריפט זהה בן 12 שלבים עם החלפת שם הסוג: התחלת התהליך, ואז יצירה, חומת אש, תוכנית גיבוי, התחברות והתקנה עבור שרת מרכז הנתונים, ואז אותם חמישה עבור שרת הפריסה, ואז הפעלת השרת. קריאה אחת יוצרת אפוא שני שרתים ולא אחד, אלא אם מעבירים data.app_datacenter כדי לעשות שימוש חוזר במרכז נתונים קיים. השדה הזה אופציונלי, וכך גם שדות create_datacenter שלצידו.
ארבעה מחירים, ורק שניים מהם משנים מה אפשר לפרוס.
שער המסלול הוא ארבע שורות של חשבון. isValidPlan בקובץ cpi/http_module/index.mjs בשורות 542 עד 547 קורא את min_plan מתוך רשומת הקונפיגורציה, מחזיר true כשהמפתח חסר, ואחרת משווה שתי דרגות ב-PLAN_OBJ: free 0, pro 1, team 2, agency 3. בהחלה על 21 מתודות ה-deploy_*, זו כל הטבלה. בקטלוג יש 19 מתודות החסומות מתחת ל-Pro ו-12 מהן הן deploy_*, כך שמנוי Pro מוציא את רוב עצמו בדיוק כאן. ובדיוק מתודה אחת מכל 1010 הרשומות נושאת min_plan free, deploy_mini_app, הפריסה היחידה שחשבון חינמי יכול להתחיל. המחירים הם לחודש.
Free, $0 | Pro, $49 | Team, $149 | Agency, $399 | |
|---|---|---|---|---|
| מתודות deploy_* שעוברות את שער המסלול | 7 מתוך 21 | 19 מתוך 21 | 19 מתוך 21 | 21 מתוך 21 |
| מה הדרגה הזאת מוסיפה על זו שמתחתיה | 6 המתודות שאינן מצהירות min_plan כלל, ובנוסף deploy_mini_app | 12: another, api, cron, datacenter, embed, emitter, load_balancer, mpa, preview, pwa, spa, user_group | כלום. אף מתודת deploy_* אינה נושאת min_plan team | שתיים: deploy_instance ו-deploy_marketplace, ושתיהן כותבות מסמך ב-xuda_master בלי להקצות שרת |
| פריסות שנושאות גרסת בנייה של הפרויקט, אלה שמקבלות data.release_doc_id | 1 מתוך 10, deploy_mini_app | 10 מתוך 10 | 10 מתוך 10 | 10 מתוך 10 |
| קישור שמחלקים החוצה: spa, pwa, embed, preview | לא, כל הארבע הן pro | כן, משימה בת 12 שלבים לכל אחת | אותן 4 כמו ב-Pro | אותן 4 כמו ב-Pro |
| VPS, webserver, או full stack VPS עם ה-xuda CLI עליו | כן, כל השלוש אינן מצהירות min_plan | כן | כן | כן |
| haproxy מול הפריסות שלך מאותו סוג | לא | deploy_load_balancer, 6 שלבים | כן | כן |
| סביבה שנייה של אפליקציה שכבר רצה | לא | deploy_another, שם, אזור וסוג שרת חדשים | כן | כן |
קריאת פריסה אחת, שלושה יעדים, והראשון בונה שני שרתים.
עשר מתוך 21 המתודות פורסות גרסת בנייה של הפרויקט. הן אלה שמקבלות data.release_doc_id, כל אחת מהן מגדירה req.data.deploy_type, וכולן מעבירות לפונקציה משותפת אחת, deploy_app, בקובץ cpi/deploy_module/index.mjs שורה 116. deploy_app עצמה אינה מוצהרת ב-cpi_methods, ולכן אין קריאת פריסה גנרית: בוחרים דלת כניסה, והדלת היא שנוקבת בסוג. 11 האחרות מקצות מכונה או כותבות רשומה. כדאי לקרוא את הענף הראשון פעמיים, כי קריאת deploy_spa אחת מקצה שרת מרכז נתונים לפני שהיא מקצה את שלך.
שלוש פעולות, והאמצעית היא סרגל התקדמות שמסתכלים בו.
לא אשף. מה רשומת הקונפיגורציה מחייבת לספק, מה המשימה מדווחת בחזרה, ומה נשאר בידיים כשהשורה האחרונה אומרת הפעלת השרת.
- 01
בחירת דלת הכניסה, הגרסה והתוכנית
אין קריאת פריסה גנרית. deploy_app משותפת לכל 10 מתודות הגרסה אך אינה מוצהרת ב-cpi_methods, ולכן קוראים ל-deploy_spa, ל-deploy_pwa, ל-deploy_embed, ל-deploy_preview וכן הלאה, והבחירה הזאת מגדירה את deploy_type. כל אחת מהעשר מקבלת data.release_doc_id, גרסת הבנייה שנשלחת. שש מהן, embed, mini_app, preview, pwa, spa ו-user_group, מקבלות גם data.prog_id כשדה חובה שנוקב בתוכנית Studio האחת שאליה הפריסה נקשרת, ו-deploy_mpa מקבלת data.route_id במקומו. אזור הוא שדה ב-16 מתוך 21.
- 02
מעקב אחרי הסקריפט המוצהר בזמן שהוא רץ
job_steps אינו מכונת מצבים פנימית, הוא טקסט ההתקדמות כלשונו. 14 מתוך 21 רושמות משימה במעקב עם job_timeout 1800000 ms, תקרה של 30 דקות. פריסת קישור מדווחת 12 שורות, deploy_mini_app מדווחת 11, deploy_full_stack_vps 8, deploy_vps ו-deploy_webserver 7 כל אחת, deploy_load_balancer 6. השבע האחרות אינן מצהירות על שלבים ועונות בלי משימה: another, datacenter, instance, marketplace, site, static_website ו-xucode.
- 03
קבלת השרת המופעל
השלב האחרון בכל סקריפט הקצאה הוא הפעלת השרת, ומה שנשאר אחריו הוא מכונה עם האזור, חומת האש ותוכנית הגיבוי שאותו סקריפט קבע. משם deploy_load_balancer מציבה haproxy מול כמה פריסות מאותו סוג עם בדיקות תקינות ומעבר לגיבוי בכשל, ו-deploy_another פורסת מחדש את כל האפליקציה תחת שם, אזור וסוג שרת חדשים, ומתפשטת לפריסות הבנות שלה. שתיהן min_plan pro.
שתים עשרה שורות, ושש מהן הן מכונה שאיש לא נקב בשמה.
מערך ה-job_steps של deploy_spa לפי הסדר, בדיוק כפי ש-config.json מצהיר עליו וכפי שסרגל ההתקדמות מקריא אותו בחזרה. אותן 12 שורות, עם החלפת שם הסוג, מוצהרות גם על deploy_api, deploy_cron, deploy_embed, deploy_emitter, deploy_mpa, deploy_preview, deploy_pwa ו-deploy_user_group. כדאי לקרוא קודם את שורות 02 עד 06: הן שרת מרכז נתונים.
שמונה מגבלות, שלוש מהן מתודות שמוצהרות ובכל זאת מסרבות לרוץ.
- Router אינו נפרס. deploy_mpa מוצהרת, חסומה מתחת ל-pro, ומגדירה את req.data.deploy_type ל-mpa, ערך שחסר במערך deploy_type ב-config.json, ולכן deploy_app דוחה אותו עם קוד -2 בקובץ cpi/deploy_module/index.mjs בשורות 139 עד 141. config_dev.json כן מפרט את mpa, ומפרט אותו גם כ-beta, ולכן הוא נדחה ארבע שורות מאוחר יותר במקום. פריסת router מרובת עמודים אינה משהו שאפשר להתחיל היום.
- Emitter הוא beta בקונפיגורציה שנשלחת. המחרוזת emitter יושבת ב-deploy_type_in_beta בקובץ config.json, ולכן deploy_app מחזירה קוד -2 בקובץ cpi/deploy_module/index.mjs בשורות 143 עד 144. config_dev.json כבר הסיר אותה מהרשימה הזאת, כלומר דפוס ה-change feed רץ על dev ונדחה בעותק שבמאגר. המתודה מוצהרת וצינור ההקצאה שמאחוריה הוא אותו צינור ש-cron משתמשת בו. השער הוא רשומה אחת במערך.
- אף מתודה אינה בונה קובץ בינארי ל-iOS, ל-Android או ל-macOS. deploy_ios, deploy_android ו-deploy_macos קיימות בקובץ cpi/deploy_module/index.mjs בשורות 1388 עד 1405, ואף לא אחת מהשלוש מוצהרת ב-cpi_methods, ולכן שום דבר שמגיע דרך /cpi אינו יכול להגיע אליהן. דפוס אפליקציית המובייל הישן בוטל ולא נדחה למועד אחר.
- אין סוג פריסה של שיתוף פעולה בזמן אמת. אף אחת מ-21 המתודות אינה מקצה websocket, ערוץ נוכחות או משטח CRDT. הדבר הקרוב ביותר בקבוצה, deploy_emitter, הוא עבודת batch בצד השרת שמופעלת על ידי change feed של מסד נתונים, וממילא הוא נדחה כ-beta.
- MCP Server מופיע כסוג פריסה בשתי הקונפיגורציות, יושב ב-deploy_type_in_beta בשתיהן, ואין לו בכלל רשומת deploy_mcp ב-cpi_methods, ולכן אין למה לקרוא עוד לפני שער ה-beta. פריסת MCP לכל פרויקט אינה קיימת.
- Team עולה $149 מול Pro ב-$49 ואינו קונה דבר בעמוד הזה. אפס מתודות deploy_ נושאות min_plan team, ולכן גם Pro וגם Team מגיעים ל-19 מתוך 21. Agency ב-$399 מוסיף בדיוק שתיים נוספות, deploy_instance ו-deploy_marketplace, ושתיהן יוצרות מסמך ב-xuda_master ואינן מקצות שרת.
- deploy_xucode היא רשומת ה-deploy_ היחידה בלי מפתח microservice, ו-http_module חוזר מוקדם כשחסר microservice, בקובץ cpi/http_module/index.mjs בשורות 942 עד 944, ולכן הקריאה לעולם אינה מגיעה ל-handler שלה בקובץ cpi/deploy_module/index.mjs שורה 1777. היא גם היחידה מבין ה-21 שמשמיטה את private.
- פריסת אתר סטטי אינה מריצה קוד. deploy_static_website קוראת תיקיית Drive ומעבירה אותה ל-deploy_site, שמעלה את הקבצים ל-R2 ומחליפה מצביע KV באופן אטומי. בלי שרת, בלי cron, בלי API, בלי מסד נתונים. מטפל בטפסים או משימה מתוזמנת הם פריסה שנייה על שרת שני.
מה באמת ניתן לפריסה היום
שש תשובות שנקראו מתוך config.json ומתוך cpi/deploy_module/index.mjs, ולא מתוך האשף שיושב מעליהם.
צפייה בפריסה יוצאת לדרך.
שנים עשר שלבים, שני שרתים ומזהה משימה אחד עם timeout של 30 דקות עליו. אותו סקריפט שתשע מתוך 21 המתודות מריצות, עם החלפת שם הסוג.
קריאת הצהרת המתודה לפני בחירת הדרגה.
לכל אחת מ-21 רשומות ה-deploy_ יש חוזה משלה בקובץ config.json: השדות המוקלדים שהיא מקבלת, אם היא מקבלת release_doc_id, שלבי המשימה שהיא תעבור והתקרה שלהם, ההרשאה שהיא דורשת, ורצפת ה-min_plan שמתחתיה. הרשומה הזאת היא ההסכם, לא האשף שמצויר מעליה. כדאי לברר איזו צורה באמת נפרסת, לקרוא את אותה רשומה אחת, ואז לרכוש את הדרגה ש-min_plan שלה נוקב בה. שש מתוך 21 אינן נוקבות במסלול כלל, אחת נוקבת ב-free, שתים עשרה נוקבות ב-pro, שתיים נוקבות ב-agency, ואף פריסה בשום מקום אינה נוקבת ב-team.