מכונה וירטואלית מלאה, באחד מ-17 גדלים, בלי שום דבר משלנו מותקן עליה.
VPS של Xuda הוא לא קונטיינר. proxmox_create_server שולחת POST /nodes/<node>/qemu/<template_vmid>/clone עם full: 1, העתק שלם של תבנית QEMU אל חומרה של Xuda, ו-deploy_module מבצעת 84 קריאות לנתיבי /qemu/ ואפס לנתיבי /lxc/. הגודל שבוחרים מועתק כמות שהוא ולא מתפרש: slug_to_farm_spec מחזירה { cores: s.cpu, ram_gb: s.ram, disk_gb: s.disk }, היצירה כותבת cores ו-memory בתור ram_gb כפול 1024 MB, ואז מגדילה את scsi0 ל-disk_gb. יש 17 גדלים תחת קבוצת השרתים vps, בארבעה טיפוסים, מ-1 vCPU עם 0.5 GB ו-10 GB ב-$2.50 לחודש ועד 32 vCPU עם 256 GB ו-7200 GB ב-$2606. ברגע שהעותק עולה, הפלטפורמה עוצרת. ענף ההתקנה חסום מאחורי if (_conf.is_debug && !isVpsApp), ולכן VPS של לקוח לא מקבל שום סביבת ריצה, שום סוכן ושום סטאק מותקן עליו: זו תמונת ענן חשופה שמחזיקה את המפתחות שסיפקתם. proxmox_apply_firewall חוזרת מוקדם עם המחרוזת vps: customer-managed firewall, ומסמך חומת האש שנכתב אחריה לכל אפליקציה נושא מערכי inbound ו-outbound ריקים עם אכיפה כבויה. deploy_vps לא מצהירה על min_plan, ולכן כל חשבון, כולל חשבון חינמי, יכול ליצור אחד. מה שקונים כאן הוא המכונה והחומרה שמתחתיה, לא פלטפורמה מנוהלת מעליה.

גדלי VPS, בארבעה טיפוסים, קבוצת שרתים אחת
גודל הכניסה: 1 vCPU, 0.5 GB זיכרון, 10 GB דיסק
תמונות מערכת הפעלה בחווה, ובלי חנות אפליקציות
שעות בחודש החיוב, ביחס יחסי לפי שעה
ארבעה טיפוסים, והטיפוס הוא מה שבוחר לכם את הדיסק.
17 ה-slugs של vps מקובצים לארבעה טיפוסים, והטיפוס הוא לא תווית שיווקית. הוא נקרא פעמיים. פעם אחת ב-config.json, שם PRICE_OBJ.server_types נושא את תיאור השורה האחת שכל טיפוס מגיע איתו, ופעם שנייה ב-deploy_module, שם SERVER_TYPE_DISK_PREF הופך את הטיפוס לרשימה מסודרת של מחלקות דיסק קבילות להקצאה. קראו כל כרטיס עם שני התגים שלו: זה שמימין הוא שרשרת הדיסקים שההקצאה עוברת עליה, וזה שמשמאל הוא טווח המחירים והגדלים שבתוכו. כל השאר במדרגה הוא חשבון פשוט על שלושה מספרים.
VPS, Full Stack VPS ו-Xucode הם אותו שכפול עם דגל עליו.
שלושה מוצרים בלוח הבקרה, פונקציה אחת מתחת. deploy_full_stack_vps חותמת app_type_override ומאצילה ל-deploy_vps. deploy_xucode עושה את אותו הדבר עם override אחר, והיא מסירה קודם את farm_spec ואת create_datacenter מהבקשה כדי שהגודל יגיע מההרשאה ולא מהקורא. הצורה הזאת מכוונת: app_type נפרד היה נופל מחוץ לענפי ה-vps של חומת האש, שינוי הגודל, ההפעלה, נתיב הרשת והסטטוס, ולכן הטעם רוכב על דגל במקום. קראו את הטבלה לאורך עמודה כדי לראות מה מקבלים, ולרוחב שורה כדי לראות כמה מעט באמת שונה.
VPS | Full Stack VPS | Xucode | |
|---|---|---|---|
| איך הוא נוצר | deploy_vps ישירות. בלי override. | deploy_full_stack_vps מגדירה app_type_override, ואז קוראת ל-deploy_vps. | deploy_xucode מגדירה את ה-override, כופה app_hosting_preference ל-global, ואז קוראת ל-deploy_vps. |
| מה Xuda מתקינה | כלום. ענף ההתקנה חסום מאחורי if (_conf.is_debug && !isVpsApp), והאפליקציה מסומנת פעילה ברגע שהמכונה מדווחת running. | אותה תמונה חשופה, ועוד שני דברים שנכתבים סביבה: מפתח API מוגבל היקף ל-CPI שנוצר לפני ההקצאה, ובסיס נתונים CouchDB לכל אפליקציה מתוך create_db. | אותו מסלול vps, עם מכונה אחת לחשבון במקום אחת לפרויקט. בקשה שנייה נענית במכונה הראשונה. |
| על מה מחייבים אתכם | מחיר ה-slug, יחסית לחודש קבוע של 730.5 שעות לפי חותמות הזמן של app_cost, עם מקטע מינימלי אחד לחיוב באורך שעה. בלי cron חיוב ובלי מסמך צובר. | אותו מחיר slug. לא המפתח ולא בסיס הנתונים מוסיפים שורה. | כלום בפנקס האחסון. cost.mjs מחזירה null עבור is_xucode, ושלושת ה-slugs של xucode מתומחרים ב-0, כי המסלול כבר חייב. |
| אילו גדלים מותר לכם לבחור | כל ה-17, מ-shared_vps_05 ועד large_vps_32. | לא shared. השרת דוחה כל slug שהטיפוס שלו הוא shared עם The shared server type is not available for a Full Stack VPS, בזמן שהבורר עדיין מציג את shared_managed_4 ואת shared_managed_8. | בלי בורר בכלל. ה-slug נקרא מתוך ההרשאה, וכל מה שהקורא שלח בעניין הגודל נזרק ולא ממוזג. |
| מי רשאי ליצור אחד | כל חשבון. deploy_vps לא נושאת min_plan, בשונה מ-deploy_datacenter שהיא clearance admin עם min_plan pro. | גם בלי min_plan, אבל הדחייה של shared למעלה היא רצפה בשם אחר. | מותנית ב-xucode.enabled, שהוא true ב-config_dev.json ו-false ב-config.json. |
| חומת אש | לא מוחלת. proxmox_apply_firewall חוזרת מוקדם ומסמך חומת האש של האפליקציה נוצר עם מערכי כללים ריקים ואכיפה כבויה. | אותו דבר. המפתח המוגבל מצמצם את מה שהמכונה רשאית לקרוא חזרה אל Xuda, לא את מה שרשאי להגיע אל המכונה. | היוצא מן הכלל היחיד: _xucode_sync_guard רושמת שומר מארח לכתובת של המכונה דרך fw_xucode_guard_set, וצריך להחיל מחדש את חומת האש של המארח כדי שזה ייכנס לתוקף. |
בחירת אזור מצמצמת שתי רשימות. היא לא בוחרת ספק, והיא לא בוחרת מכונה.
פקד האזור הוא לא בורר מרכזי נתונים. MACRO_REGIONS ב-deploy_module מחזיק חמישה מפתחות, africa, apac, na, latam ו-emea, וכל אחד נושא מערך farm_locations של קודי מטרופולין, מערך של קידומות slug ל-DigitalOcean ונקודת ציון מייצגת אחת. בחירת אזור מצמצמת את מאגר המועמדים לקודים האלה ומזינה את מיון המרחק בנקודת הציון הזאת. כל מה שקורה אחר כך הוא חשבון על קיבולת חיה של הצמתים, בסדר שלמטה, והצעד האחרון הוא זה שכדאי להכיר לפני שמתחייבים: כשהמאגר המצומצם חוזר ריק, הפריסה נדחית ולא מוזזת בשקט.
- האזור הוא זוג רשימות. apac מונה את sin, blr ו-syd; na מונה את ash, hil, sea, nyc, sfo ו-tor; emea מונה את hel, fsn, nbg, ams, lon ו-fra. אלה 15 מתוך 15 קודי המטרופולין ב-FARM_LOCATIONS. africa ו-latam לא מונים שום מיקום חווה ושום קידומת DigitalOcean משלהם, ולכן המאגר המצומצם שלהם ריק מעצם הבנייה ולא מעומס.
- כל מועמד נמדד מול הגודל שלכם ועוד 20 אחוז. ההקצאה מכפילה את הליבות, הזיכרון והדיסק המבוקשים ב-1 + proxmox.headroom_pct/100, ו-config.json מגדיר את headroom_pct ל-20. optimized_vps_4 של 4 vCPU, 16 GB ו-100 GB זקוק לכן ל-4.8 ליבות פנויות, 19.2 GB זיכרון פנוי ו-120 GB דיסק פנוי על צומת לפני שאותו צומת בכלל כשיר.
- אחר כך מחלקת הדיסק, ואחר כך המרחק. SERVER_TYPE_DISK_PREF מצמצם את performance ואת large ל-nvme בלבד, את optimized ל-ssd ואז nvme, ואת shared ל-hdd, ssd ואז nvme. צמתי חווה בלי תיוג נספרים כ-nvme, ולכן בצי כפי שהוא היום כל טיפוס נוחת על NVMe. הניצולים ממוינים לפי מרחק מעגל גדול מנקודת הציון של האזור, כך שהצומת הקרוב ביותר שמתאים מנצח.
- אזור מלא נענה, לא עוקפים אותו. proxmox.do_failover הוא false, ולכן get_region_hosting_options מחזירה provider farm או provider unavailable עם reason no_capacity כשלאזור יש מטרופולינים אבל אין מקום, ו-no_farm_region עבור africa ו-latam. DigitalOcean אף פעם לא מוחלף אוטומטית מתחתיכם: הוא נגיש רק כנעיצה מפורשת או מתוך רשימת האפשרויות המלאה.
שבעה שלבים מוצהרים. אחד מהם רץ.
config.json מצהיר על job_steps ב-deploy_vps, ו-register_job שומרת את המערך הזה כמות שהוא עם current_step 1 ו-total_steps 7. שבע המחרוזות האלה הן הטקסט המילולי של סרגל ההתקדמות שלקוח צופה בו במהלך פריסה. במסלול החווה היצירה היא farm_create_app, והיא לא פולטת שום עדכון משימה בכלל: ה-update_job היחיד בכל יצירת ה-VPS יושב ב-deploy_vps לפני שההקצאה נמסרת הלאה. שתי העמודות שלמטה עונות על אותן שבע שורות באותו סדר, ההצהרה מצד אחד והקוד מהצד השני, כי הפער ביניהם הוא כל העניין.
שלוש כתובות, ורק שתיים מהן שלכם להקליד.
ל-VPS בחווה בלי IPv4 ייעודי אין בכלל IPv4 ציבורי. הוא מחזיק כתובת VNet פנימית על הצומת שלו, /24 אחד לכל צומת, ובנוסף IPv6 ציבורי כשאותו צומת נושא /64 מנותב. הנגישות נבנית ולא מונחת מראש: בהפעלה הראשונה הפלטפורמה מקצה נתיב פרוקסי הפוך על שם מארח <sub>.xuda.app לדפדפן, ומנהרת WebSocket לפורט 22 למעטפת. ל-IPv4 ייעודי אין מדרגת מינימום והוא מותנה רק בקיבולת פנויה בצומת; אם אף צומת לא יכול לכבד אותו, הבקשה מוסרת והפריסה ממשיכה על שם המארח המשותף במקום להיכשל.
אזור, גודל, ומכאן המכונה שלכם.
deploy_vps לא נושאת min_plan, ולכן כל חשבון כולל חינמי יכול ליצור VPS, ו-deploy_datacenter שלידה היא clearance admin עם min_plan pro. חברות לא משנה אף מחיר: member_price_id קיים רק על מסלולי ai_workspace, ואף slug של שרת לא נושא מזהה מחיר ב-Stripe או תעריף חבר בכלל. האחסון נמדד ולא נרכש במנוי, ומחושב יחסית לחודש קבוע של 730.5 שעות עם מקטע מינימלי אחד לחיוב באורך שעה.
- 01
בוחרים אזור וגודל
סולם ה-VPS הוא 17 slugs בארבעה טיפוסים: shared מ-1 vCPU, 0.5 GB ו-10 GB ב-$2.50 ועד 8 vCPU, 16 GB ו-320 GB ב-$94; optimized מ-$66 עד $542; performance מ-$166 עד $1006 ומשם ל-32 vCPU, 256 GB ו-800 GB ב-$1342; large מ-$650 ועד 32 vCPU, 256 GB ו-7200 GB ב-$2606. הטיפוס הוא לא תווית שיווקית, הוא שרשרת מחלקות הדיסק שההקצאה תכבד. רשימת מערכות ההפעלה היא חמש תמונות, Ubuntu 24.04 LTS, Ubuntu 22.04 LTS, Debian 12, Rocky Linux 9 ו-AlmaLinux 9. אין חנות אפליקציות בחווה ואין קטלוג התקנה בקליק.
- 02
המכונה משתכפלת ועולה
מדרגה מועתקת כמות שהיא ולא מתפרשת: slug_to_farm_spec מחזירה cores, ram_gb ו-disk_gb מתוך ה-slug, היצירה משכפלת תבנית עם full: 1 כך שזו מכונת QEMU מלאה ולא קונטיינר או שכפול מקושר, מגדירה cores, מגדירה memory ל-ram_gb כפול 1024 MB, מגדילה את scsi0 ל-disk_gb ומפעילה אותה. ברגע שהמכונה מדווחת running האפליקציה מסומנת פעילה, כי עבור VPS גולמי אין יותר על מה לחכות. deploy_module מבצעת 84 קריאות לנתיבי /qemu/ ואפס לנתיבי /lxc/.
- 03
משתלטים עליה דרך נתיב הרשת והמנהרה
שם המארח לדפדפן וגישת ה-SSH מעל WebSocket שניהם מובטחים במהלך היצירה, ולכן המכונה נגישה עוד לפני שהגדרתם עליה משהו. משם היא שלכם במובן המילולי: הפלטפורמה לא מחילה שום חומת אש על VPS גולמי, לא מתחברת אליו, ולא מתקינה עליו כלום. שתי מגבלות לתכנן סביבן. שינוי הגודל הוא לא מקוון והדיסק גדל רק כלפי מעלה, ולכן farm_resize_app מסרבת אלא אם המכונה מדווחת stopped, לוקחת את הגדול מבין הדיסק הנוכחי והמבוקש, ומשאירה למערכת הקבצים באורח לגדול באתחול שאתם מבצעים. ואחסון בלוקים, למרות שנשלח, כבוי: proxmox.block_storage.nfs_mount ריק בשתי הקונפיגורציות, ולכן כל מתודת נפח עונה שאחסון בלוקים אינו מוגדר.
תשעה דברים ש-VPS של Xuda לא עושה, ארבעה מהם מובטחים בממשק שסביבו.
- שום דבר לא מותקן עליו. farm_create_app מסמנת VPS כפעיל ברגע שהמכונה מדווחת running, וענף ההתקנה שמתחת חסום מאחורי if (_conf.is_debug && !isVpsApp), ולכן במכונת לקוח הוא אף פעם לא רץ. מה שעולה הוא תמונת הענן החשופה עם מפתחות ה-SSH שסיפקתם. cpi/deploy_module/index.mjs שורות 13621 עד 13641.
- הפלטפורמה לא מחילה עליו חומת אש. proxmox_apply_firewall חוזרת מוקדם עם המחרוזת vps: customer-managed firewall בשורות 12369 עד 12372, ומסמך חומת האש שנכתב אחריה לכל אפליקציה נושא מערכי כללים ריקים ל-inbound ול-outbound עם אכיפה כבויה, ב-cpi/firewall_module/index.mjs שורות 551 עד 596. סגירת פורטים היא העבודה שלכם, ושום דבר במכונה לא עושה אותה בשבילכם.
- אחסון בלוקים נשלח וכבוי. proxmox.block_storage.nfs_mount הוא מחרוזת ריקה גם ב-config.json וגם ב-config_dev.json, ולכן כל שש מתודות farm_volume_, יצירה חיבור ניתוק שינוי גודל רשימה ומחיקה, עונות שאחסון בלוקים אינו מוגדר. index.mjs שורה 14022. הדיסק שלכם הוא מה שה-slug נושא ועוד מה שתגדילו אותו.
- הבורר של Full Stack VPS והשרת חלוקים. Power.vue שורה 219 מציג את קבוצת managed פחות שתי הרשומות הקטנות שלה, מה שמשאיר את shared_managed_4 ואת shared_managed_8 ניתנים לבחירה, ו-index.mjs שורה 1748 דוחה כל slug שהטיפוס שלו shared עם The shared server type is not available for a Full Stack VPS. ב-config.json גם אין בכלל בלוק full_stack_vps: 13 קבוצות הכלים ו-81 המתודות חיות רק ב-config_dev.json, ולכן בקונפיגורציית הייצור המפתח הזה מתרחב לרשימת היתרים ריקה.
- 58 ה-slugs מתנקזים ל-29 מזהי ספק נבדלים, ו-16 מהמזהים האלה נישאים על ידי יותר מ-slug אחד. lookup_server_info מנסה קודם את המפתח, ואז סורקת לפי .id ומחזירה את ההתאמה הראשונה, cost.mjs שורות 46 עד 54. עבור 12 מתוך ה-16 הרשומה הראשונה בקובץ היא זו מקבוצת deployment, ולכן מסמך ישן ששמר gd-2vcpu-8gb במקום optimized_vps_2 מחייב $73 לחודש על מכונה שרשומה ב-$66.
- ששת ה-slugs של service_hosting_, basic cpu general compute balanced memory, כולם נושאים disk 50 ומתומחרים מ-$24 עד $129 אך ורק לפי מעבד וזיכרון. הם מכונות מקבוצת deployment עבור שירותים שהנתונים שלהם חיים במרכז הנתונים, והם לא מוצעים בזרימת ה-VPS בכלל. config.json שורות 938 עד 991.
- ה-job_steps המוצהרים עבור deploy_vps מבטיחים setting vps firewall, setting vps backup plan, connecting to vps server, installing vps resources ו-activating the server. farm_create_app לא פולטת שום עדכון התקדמות משלה, ולכן במסלול החווה רק creating vps server מופיע אי פעם. ארבעת השלבים שאחריו הם הצהרה, לא עבודה.
- רשימת התכונות של vps בקונפיגורציה מצהירה על SSD-Based Servers, 1-Click App Install ו-Managed Backups. עדיפות הדיסק של shared היא hdd ואז ssd ואז nvme, החווה מציעה חמש תמונות מערכת הפעלה ובלי חנות אפליקציות, וגיבויים הם תוסף בהצטרפות מרצון של $10 לחודש. config.json שורות 781 עד 791.
- app_server_type הוא mandatory: false ב-deploy_vps. פריסה גלובלית בלי slug מקצה את הרצפה של 1 vCPU, 0.5 GB, 10 GB, לא כותבת app_cost, ואז is_billable מחזירה false, ולכן המכונה רצה ולא מחייבת כלום. בדיקת היתרה שהייתה תופסת את זה, validate_account_topup, מוערת כהערה ב-index.mjs שורה 1480.
שש השאלות שטבלת המחירים לא עונה עליהן
נענות מול הקוד שנשלח ומול מפתחות הקונפיגורציה שמכריעים אותו, כולל היכן שהתשובה היא לא.
לצפות בשכפול שהופך למכונה שרצה.
שכפול מלא של מכונת התבנית, ליבות וזיכרון נכתבים על ההעתק, scsi0 מוגדל לדיסק של ה-slug, ואז הסטטוס עובר לפעיל בשנייה שהמכונה מדווחת running. החלק המעניין הוא מה שלא קורה אחר כך: אין שלב התקנה, אין סוכן, אין מערכת כללים. מה שעולה הוא תמונת מערכת ההפעלה שבחרתם עם המפתחות שנתתם לה.
בוחרים slug ואזור, וההקצאה בוחרת את המכונה.
שבעה עשר slugs, מ-1 vCPU, 0.5 GB ו-10 GB ב-$2.50 לחודש ועד 32 vCPU, 256 GB ו-7200 GB ב-$2606, כל אחד מהם מכונה וירטואלית QEMU מלאה ששוכפלה עם full: 1 ולא קונטיינר. האזור שאתם בוחרים הוא מפתח מאקרו, לא ספק ולא מכונה: ההקצאה משאירה את צמתי החווה שעומדים בליבות, בזיכרון ובדיסק שלכם ועוד 20 אחוז מרווח, ממיינת את הניצולים לפי מרחק מעגל גדול, ולוקחת את הקרוב ביותר. אם באזור אין מקום, התשובה היא no_capacity, לא מעבר שקט ל-DigitalOcean, כי do_failover הוא false. החיוב רץ על המונה מהשעה שהיא עולה.