SSD Nodes Learn
מדריכים Matt Connorמאת Matt Connor · עודכן 2026-07-24

איך להקים שרת Minecraft ב-VPS

מדריך להרצת Paper Minecraft על Ubuntu 24.04 עם Java 21. כולל הגדרת systemd, פתיחת פורט 25565 ב-firewall ושיטות גיבוי בטוחות לעולם המשחק.

מה אתם בונים

שרת Minecraft Java Edition יציב: Paper על Ubuntu 24.04, הרצה כמשתמש minecraft ייעודי תחת systemd עם Restart=on-failure, רשימת מורשים (whitelist) פעילה, ופורט 25565 פתוח בשני ה-firewalls הנמצאים בין השחקנים ל-JVM. בנוסף, גיבויים יבוצעו בצורה שלא תגרום לשחיתות של העולם שהם נועדו להגן עליו. השרת עצמו מורכב מקובץ jar אחד ופקודת java אחת; כל מה שמבדיל שרת שחברים ישחקו בו במשך שנה לבין שרת שקורס בסוף השבוע הראשון הוא סביב הפקודה הזו, וזה מה שמדריך זה מכסה.

שתי אזהרות כנות לפני שתשקיעו כסף. ראשית, Minecraft צורך זיכרון רב ופועל לרוב ב-single-threaded: שרת VPS עם 1 GB לא יריץ שרת שניתן לשחק בו, וליבה אחת מהירה עדיפה על ארבע ליבות איטיות. שנית, מדובר ב-Java Edition. שחקני Bedrock — קונסולות, טלפונים, ואפליקציית Windows Bedrock — לא יכולים להתחבר לשרת Java; Bedrock דורש תוכנת שרת שונה על UDP 19132, או את התוסף Geyser, שאינו בתחום מדריך זה.

אתם זקוקים ל-Ubuntu 24.04 KVM VPS חדש עם הרשאות root או sudo, וכשלושים דקות של זמן.

Sizing: מה השרת של החברים באמת צריך

כמות ה-RAM היא המדד החשוב ביותר, והנתונים האמיתיים נמוכים יותר ממה שמופיע בפורומים של modpacks:

  • 2 GB מספיק ל-vanilla עבור 2–5 שחקנים עם מרחק ראייה (view distance) צנוע. ניתן למשחק, אך אין עתודת זיכרון פנויה.
  • 4 GB הוא הגודל הנוח לשרת חברים: כעשרה שחקנים בו-זמנית על Paper עם מספר plugins, עם מספיק זיכרון פנוי למערכת ההפעלה.
  • 8 GB ומעלה מיועד ל-modpacks ולמעלה מ-20 שחקנים. במקרה זה יש לשים לב גם למהירות ה-single-core של ה-CPU, מכיוון ש-main game loop רץ על thread אחד.

גודל הקבצים בעסק (disk) גדל ככל שהשחקנים חוקרים — עולם survival שעבר מסע רב יכול להגיע לכמה gigabytes — לכן יש להשאיר עתודת מקום עבור העולם וגם עבור ה-backups שלו.

Vanilla או Paper? Paper הוא תחליף ישיר ל-official jar: אותו עולם, אותם clients, ללא צורך ב-client-side mods. הוא משכתב את נתיבי השרת האיטיים ביותר — chunk loading, entity ticking, hoppers — ומוסיף plugin API. הסיבה היחידה להריץ vanilla היא אם דרושות מכניקות vanilla מדויקות לחלוטין עבור technical redstone farms ש-optimisations של Paper עלולים לשנות; עבור כל שאר המשתמשים, Paper מספק יותר שחקנים לכל gigabyte. כל מה שצוין למטה תקף לשניהם.

שלב 1: התקנת Java 21

Minecraft 1.20.5 וכל גרסה מאז (כל גרסאות 1.21.x) דורשות Java 21. ב-Ubuntu 24.04 החבילה זמינה במאגרי ברירת המחדל, והגרסה ה-headless מחלצת את ספריות ה-desktop ששרת לעולם לא ישתמש בהן:

sudo apt update && sudo apt install -y openjdk-21-jre-headless
java -version

תוצאה תקינה: השורה הראשונה קוראת openjdk version "21.0.x". אם מופיע 17 או 11, מותקנת גרסת JRE אחרת והיא נבחרת; תקנו זאת באמצעות sudo update-alternatives --config java ובחרו את השורה המכילה את java-21.

דילוג על בדיקה זו יגרום לשגיאת ה-Minecraft server הנפוצה ביותר בחיפושי Google בהמשך. עם Java 17, קובץ ה-server jar יקרוס מיד עם השגיאה:

Error: LinkageError occurred while loading main class net.minecraft.bundler.Main
	java.lang.UnsupportedClassVersionError: net/minecraft/bundler/Main has been
	compiled by a more recent version of the Java Runtime (class file version 65.0),
	this version of the Java Runtime only recognizes class file versions up to 61.0

המספרים מפרשים את חוסר ההתאמה: class file version 65.0 הוא Java 21, 61.0 הוא Java 17, 60.0 הוא Java 16. בכל מקרה שיופיע, הפתרון זהה — התקינו את ה-JRE החדש והריצו מחדש את update-alternatives.

Step 2: משתמש ייעודי, לעולם לא root

השרת מריץ קוד של תוספים ומנתח קלט רשת מכל מי שיכול להגיע ל-port. אם תתרחש פריצה, תוקף עם הרשאות root ישלוט ב-VPS שלך; תוקף עם הרשאות minecraft ישלוט בעולם משחק בלבד.

sudo adduser --system --group --home /opt/minecraft minecraft

--system יוצר חשבון ללא סיסמה שאינו יכול להתחבר דרך SSH, כאשר /opt/minecraft הוא ה-home וה-working directory שלו. כל פקודה שתפעל על השרת מעתה והלאה תרוץ תחת משתמש זה.

Step 3: הורדת ה-server jar מהמקור הרשמי

קובץ server jar צריך להגיע אך ורק משני מקורות: דף ההורדה הרשמי ב-minecraft.net עבור vanilla, או דף ההורדות ב-papermc.io עבור Paper. "מרכזיות הורדה" (download hubs) של צד שלישי המארזות מחדש קובצי server jar הן ערוץ ותיק לתוכנות זדוניות — server jar הוא קוד שניתן להריץ 24/7 על שרת הפונה לאינטרנט.

העתיקו את קישור ההורדה של ה-build הנוכחי מהדף הרשמי (ה-URL משתנה בכל גרסה ו-build, לכן קידוד קבוע כאן יהיה לא רלוונטי), ולאחר מכן:

cd /opt/minecraft
sudo -u minecraft wget -O server.jar 'PASTE-THE-COPIED-URL-HERE'

תוצאה תקינה: server.jar של כ-50 MB בבעלות minecraft, מאומת באמצעות ls -lh /opt/minecraft/server.jar.

Step 4: הרצה ראשונה, ה-EULA, ומתן הרשאות מנהל לעצמך

הרץ את השרת במצב אינטראקטיבי פעם אחת לפני השימוש ב-systemd — להרצה הראשונה יש שתי משימות שרק קונסולה חיה יכולה לבצע היטב.

cd /opt/minecraft
sudo -u minecraft java -Xms1G -Xmx1G -jar server.jar nogui

התהליך מסתיים תוך שניות — Paper מבצעת כמה פעולות של החלת patches — והלוג מסתיים בשורה שכולם נתקלים בה:

[ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

זו אינה שגיאה; זהו שלב אישור רישיון. ההרצה יצרה את הקובץ eula.txt ליד ה-jar. אם טרם קראת, קרא את ה-EULA המקושר, ולאחר מכן הפעל את הדגל:

sudo -u minecraft sed -i 's/eula=false/eula=true/' /opt/minecraft/eula.txt

הרץ שוב את אותה פקודת java. הפעם היא תיצור את העולם — תהליך זה לוקח דקה או שתיים בהפעלה הראשונה — והתהליך ייעצר ב:

[Server thread/INFO]: Done (9.204s)! For help, type "help"

כעת יש לך קונסולה חיה. השתמש בה למשימה השנייה: הקלד op YourMinecraftName (שם המשתמש המדויק שלך במשחק) והשרת ירשום אותך לתוך ops.json, כך שבהמשך — כאשר לא תהיה קונסולה מחוברת — תוכל להריץ כל פקודת מנהל מתוך המשחק. לאחר מכן הקלד stop כדי לשמור ולצאת בצורה מסודרת.

Step 5: server.properties, ומה הסיבה ש-online-mode נשאר true

ההרצה הראשונה גם יצרה את server.properties. רוב ההגדרות الافتراضيות תקינות; אלו הן השורות שמומלץ להחליט עליהן במכוון:

online-mode=true
white-list=true
enforce-whitelist=true
view-distance=8
max-players=10
motd=A private server for people I actually know

online-mode=true גורמת לשרת לאמת כל שם משתמש המתחבר מול שרתי ה-session של Mojang, כדי להוכיח שהשחקן מחזיק בחשבון. הגדרתו כ-false — המתג ל-"cracked server" — משמעותה שהשרת מקבל כל הצהרה של הלקוח לגבי זהותו: כל אחד יכול להתחבר עם כל שם, כולל השם שלך. מכיוון שרשימות ה-ops וה-whitelists מבוססות על שם המשתמש, מתחזה יוכל להיכנס עם הרשאות ה-operator שלך. הסיבה הלגיטימית היחידה להגדירו כ-false היא מאחורי Proxy מאמת כמו Velocity, אשר מאמת את השחקנים בעצמו. בשרת רגיל, ההגדרה נשארת true, וזהו.

view-distance הוא כלי הביצועים המשמעותי ביותר בקובץ — צריכת ה-CPU וה-RAM גדלה בקירוב בריבוע של הערך הזה. 8 הוא ערך VPS הגיוני; 10 הוא ברירת המחדל של vanilla והוא כבד משמעותית.

white-list=true בתוספת enforce-whitelist=true חוסמים את השרת בפני זרים, דבר שסעיף האבטחה להלן טוען כי אינו אופציונלי. הוסיפו שחקנים באמצעות /whitelist add TheirName בתוך המשחק כ-op.

Step 6: memory flags — מדוע -Xms ו-Xmx חייבים להיות זהים

ה-JVM מקצה את ה-heap שלו בין -Xms (גודל התחלתי) לבין -Xmx (תקרה). בשרת משחק ייעודי, הגדר אותם לאותו ערך: ה-heap יגיע בכל מקרה לתקרה, והגדלה הדרגתית שלו רק תגרום לעומס מיותר על ה-garbage-collector במהלך המשחק. ב-VPS עם 4 GB, הזוג המתאים הוא:

/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui

-Xmx אינו סך כל הזיכרון שהתהליך משתמש בו. ה-JVM מוסיף overhead מחוץ ל-heap — thread stacks, JIT caches, direct buffers — של בערך חצי ג'יגהבייט או יותר, וגם ל-Ubuntu עצמה נדרש שטח פנוי. הכלל המנחה: -Xmx לכל היותר, פחות 1 GB מה-RAM של ה-VPS. אם תעבור את הגבול, תיתקל באחת משתי תקלות. אם ההקצאה נכשלת בתחילה, השרת יסרב לעלות עם השגיאה:

Error: Could not reserve enough space for object heap

זו שגיאה ישירה וברורה. הגרסה הבעייתית יותר מתחילה לעבוד כראוי וקורסת שעות לאחר מכן, כאשר ה-heap מתמלא תחת עומס וה-OOM killer של ה-kernel בוחר בתהליך הגדול ביותר במערכת — ה-JVM. שום דבר לא יופיע בלוג של השרת; הראיות נמצאות ב-sudo dmesg | grep -i oom, בשורה בסגנון Out of memory: Killed process 1234 (java). אם השירות שלך מבצע ריסטארט "באופן אקראי", בדוק שם קודם, והורד את -Xmx.

עבור Paper, הפרויקט ממליץ על Aikar's flags — סט מותאם של G1GC (כולל -XX:+UseG1GC -XX:MaxGCPauseMillis=200 ועוד עשרות פרמטרים) המייצב את השהיות ה-garbage-collection ב-heaps גדולים. צור את השורה המלאה מתוך התיעוד של Paper; ב-heap של 2–4 GB השיפור הוא מורגש אך קטן, והדגלים אינם מזיקים.

Step 7: a systemd unit with Restart=on-failure

שרת שהופעל ידנית ייסגר עם סיום ה-SSH session ויישאר כבוי גם לאחר reboot. כתבו את /etc/systemd/system/minecraft.service:

[Unit]
Description=Minecraft server (Paper)
After=network-online.target
Wants=network-online.target

[Service]
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft
ExecStart=/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui
Restart=on-failure
RestartSec=10
TimeoutStopSec=120

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft
systemctl status minecraft
journalctl -u minecraft -f

תוצאה תקינה: status מציג את active (running), וה-journal — המכיל כעת את פלט הקונסול של השרת — מסתיים שוב בשורה Done.

ישנן שתי בחירות מכוונות ביחידה זו. Restart=on-failure מחזיר את השרת לאחר קריסה, אך לא לאחר stop מסודר, מה שמאפשר המשך תחזוקה. ו-TimeoutStopSec=120 חשוב יותר ממה שנראה: systemctl stop שולח SIGTERM, שרת ה-Minecraft קולט אותו ושומר כל עולם לפני היציאה; בעולם גדול, פעולת השמירה לוקחת זמן. ה-timeout الافتراضي של systemd עלול לשלוח SIGKILL ל-JVM באמצע השמירה, וזו הסיבה המדויקת לשחיתות של קבצי region. הגדירו לו שתי דקות.

אם השירות חזר על עצמו (flapping) וה-journal מציג:

[Server thread/WARN]: **** FAILED TO BIND TO PORT!
[Server thread/WARN]: The exception was: io.netty.channel.unix.Errors$NativeIoException: bind(..) failed: Address already in use
[Server thread/WARN]: Perhaps a server is already running on that port?

אזי תהליך כלשהו כבר תופס את פורט 25565 — כמעט תמיד מדובר בהרצה קודמת ב-foreground שעדיין חיה ב-SSH session אחר. מצאו אותה באמצעות sudo ss -tlnp | grep 25565 והפסיקו את העותק הזה; לעולם אל תריצו שני שרתים על אותו פורט.

Step 8: פתחו את פורט 25565 בשני החומות (firewalls)

Minecraft Java משתמש ב-TCP 25565 בלבד (UDP משמש רק עבור פרוטוקול ה-query האופציונלי, והוא כבוי כברירת מחדל). ב-VPS:

sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enable

זהו ה-firewall הראשון. רוב ספקי ה-VPS מפעילים firewall נוסף ברמת הרשת דרך לוח הבקרה, וזהו ה-firewall שאנשים נוטים לשכוח. פתחו גם שם את TCP 25565. התסמין של פתיחת רק אחד משני ה-firewalls אינו מפורט: ה-client נתקע על "Connecting to the server..." ונכשל עם Connection timed out: no further information — ללא דחייה, ללא שגיאת שרת, וללא תיעוד ב-journal, מכיוון שהחבילות (packets) מעולם לא הגיעו. בדקו ממכונה מחוץ ל-VPS באמצעות nc -vz your.server.ip 25565; succeeded פירושו ששני ה-firewalls פתוחים, בעוד שנתק (hang) פירושו שלפחות אחד מהם סגור.

בזמן שאתם משתמשים ב-ufw, אותה מכונה מריצה גם SSH על IP ציבורי, ורעש לוגים של brute-force מתחיל תוך שעות — הגדירו את Fail2ban עבור SSH ב-Ubuntu 24.04 לפני שתשכחו.

כעת התחברו: Multiplayer, Direct Connection, ואת ה-server IP. מכיוון שהוספתם את עצמכם ב-step 4, פקודות בתוך המשחק יעבדו באופן מיידי — /whitelist add FriendName לכל שחקן, /gamemode creative אם זו התוכנית.

Step 9: whitelist, because the internet finds port 25565

השארת שרת Minecraft פתוח לאינטרנט אינה סיכון תיאורטי: סורקים המבצעים סריקה רחבה על כל מרחב ה-IPv4 מחפשים את port 25565 ללא הרף. פרויקטים של griefing mapping מיפו מאות אלפי שרתים פתוחים בשיטה זו. שרת ללא whitelist יקבל מבקרים לא רצויים תוך ימים, ולעיתים תוך שעות. הפתרון הוא ה-whitelist משלב 5: online-mode=true מאמת את הזהות, וה-whitelist מגביל את הכניסה לזהויות שבחרת. השילוב הזה מהווה את מודל האבטחה המלא, והוא מספיק עבור שרת חברים.

לגישה דרך ה-console ללא המשחק — כגון גיבויים מתוזמנים או cron job — יש להפעיל את RCON ב-server.properties (enable-rcon=true, rcon.password חזק, port 25575) ולבנות את ה-mcrcon client הקטן ישירות על ה-VPS מתוך קוד המקור ב-GitHub; הוא אינו נמצא ב-repos של Ubuntu. אל תפתח את port 25575 בכל firewall: פרוטוקול RCON שולח את הסיסמה בטקסט גלוי (cleartext), לכן הוא חייב להישאר ב-loopback בלבד.

Step 10: גיבויים שלא משחיתים את העולם

כלל אחד: לעולם אין להעתיק ספריית עולם בזמן שהשרת כותב אליה. קבצי ה-Region נכתבים מחדש ללא הרף במהלך המשחק; תהליך tar שמתחרה בכתיבה יוצר ארכיון עם chunks חלקיים. כאשר תבצע שחזור — הרגע שבו הגיבוי חייב לעבוד — הלוג יתמלא בשגיאות טעינת chunks והשטח יכיל חורים. שתי שיטות מונעות זאת.

Stop-copy-start היא השיטה הפשוטה, במחיר של דקה של downtime:

sudo systemctl stop minecraft
sudo mkdir -p /opt/backups
sudo tar czf /opt/backups/world-$(date +%F-%H%M).tgz \
  -C /opt/minecraft world world_nether world_the_end
sudo systemctl start minecraft

(Paper מחלק את הממדים ל-world, world_nether, ו-world_the_end; שרת vanilla שומר הכל ב-world, לכן יש להעביר את השניים האחרים לשם.)

Save-off מבצע גיבוי בזמן אמת: דרך RCON, הרץ את הפקודה save-off (עצור את ה-autosaver), לאחר מכן את save-all flush (כפה כתיבה של הכל לדיסק והמתן), בצע tar, ואז save-on. זו הגרסה המתאימה להגדרה ב-cron בשעה 5:00 לפנות בוקר.

בכל מקרה, גיבוי שנמצא על אותו VPS כמו השרת אינו גיבוי — העבר את ה-archives אל מחוץ למכונה באמצעות scp או rclone, ושמור יותר מגיבוי אחד. מכיוון שלא תסתכל בקונסולה כשיקרה תקלה, הגדר בדיקה חיצונית לפורט: Uptime Kuma במכונה אחרת המבצעת בדיקת TCP מול פורט 25565, תודיע לך שהשרת למטה לפני שהשחקנים יבחינו בכך.

Plugins and upgrades

ב-Paper, התקנת plugin היא פשוט העתקת קובץ jar לתוך /opt/minecraft/plugins/ ולאחר מכן הפעלה מחדש של השרת. הורד plugins רק מהדפים הרשמיים של הפרויקטים (Hangar, Modrinth, SpigotMC). הסיבה לכך היא אותה סיבה כמו ב-server jar: כל plugin הוא קוד שרץ תחת המשתמש minecraft.

תהליך שדרוג השרת כולל: עצירה, גיבוי, החלפת server.jar בגרסה המתאימה ל-Minecraft החדשה, והפעלה מחדש. יש לשים לב לשני דברים: שדרוג עולם (world) הוא חד-כיווני — עולם שנפתח בגרסה חדשה יותר לא ייפתח בגרסה ישנה יותר, ולכן חשוב להשתמש בגיבויים. בנוסף, plugins מתעכבים לעיתים קרובות בימים או שבועות אחרי גרסת Minecraft חדשה, לכן יש לבדוק תאימות לפני שמתנסים בגרסה חדשה ביום היציאה שלה.

אם תרצו לנהל את כל התהליכים הללו כ-container — כולל קיבוע גרסאות (version pinning), אישור EULA ושימוש ב-memory flags כ-environment variables — ניתן להשתמש ב-image של itzg/minecraft-server. הוא מריץ את אותו שרת Paper תחת Docker Compose ב-VPS שלכם עם אותה שיטת גיבוי וחוקי firewall.

FAQ

כמה RAM דרוש לשרת Minecraft?

2 GB מספיקים ל-vanilla עבור 2–5 שחקנים; 4 GB מספקים חוויה נוחה לשרת חברים של כעשרה שחקנים ב-Paper עם מספר plugins; עבור modpacks ו-20 שחקנים ומעלה, יש צורך ב-8 GB או יותר. ללא קשר לגודל ה-VPS, הגדירו את -Xmx כך שלא יעלה על סך ה-RAM הכולל פחות 1 GB — ה-JVM משתמש בזיכרון מעבר ל-heap, וחריגה תגרום לError: Could not reserve enough space for object heap או ל-OOM kill שקט.

מדוע החברים שלי לא מצליחים להתחבר לשרת ה-Minecraft שלי?

תקיעה של ה-client המסתיימת ב-Connection timed out: no further information מעידה כמעט תמיד על חומת אש (firewall), וישנן שתיים: ufw ב-VPS וחומת האש של ספק הרשת ב-control panel. יש לפתוח את פורט TCP 25565 בשניהם. ודאו שהשרת אכן מאזין (listening) באמצעות sudo ss -tlnp | grep 25565 על המכונה, ולאחר מכן בדקו מבחוץ באמצעות nc -vz your.server.ip 25565.

האם כדאי להגדיר online-mode=false ב-server.properties?

לא. עם online-mode=false השרת מדלג לחלוטין על אימות Mojang, ולכן כל אחד יכול להצטרף תחת כל שם משתמש — כולל שם של op, מה שיעניק לו את ההרשאות שלו — בנוסף, skins ו-UUIDs יתקלקלו. השימוש הלגיטימי היחיד הוא מאחורי proxy מאמת כמו Velocity שבודק את השחקנים בעצמו. עבור שרת רגיל, ההגדרה תישאר true.

האם Paper עדיף משרת ה-vanilla Minecraft?

עבור כמעט כולם, כן: Paper הוא jar שניתן להחלפה ישירה, הוא טוען עולמות vanilla, מקבל clients ללא שינויים, מעבד entities וטוען chunks ביעילות גבוהה בהרבה, ומוסיף את מערכת ה-plugins. החריג הוא קהילות technical-redstone הזקוקות להתנהגות vanilla מדויקת לחלוטין, שכן חלק מהאופטימיזציות של Paper משנות אותה. ב-VPS קטן, היעילות של Paper מספקת RAM נוסף בחינם.

איך לגבות עולם Minecraft מבלי להفسד אותו?

לעולם אל תארזו (archive) את ספריית העולם בזמן שהשרת כותב אליה — העתקה המתרחשת במקביל לכתיבת region-file תייצר chunks פגומים שיתגלו רק בזמן השחזור. יש לעצור את השרת, לבצע tar לספריות העולם ולהפעיל מחדש, או להשאיר אותו פעיל באמצעות save-off, save-all flush, tar, ו-save-on דרך RCON. לאחר מכן, העבירו את הארכיון מחוץ ל-VPS.

#minecraft#game-server#java#ubuntu#self-hosting