วิธีตั้งค่า Minecraft Server บน VPS Ubuntu 24.04
สอนติดตั้ง Paper Minecraft บน Ubuntu 24.04 ใช้ Java 21 และ systemd พร้อมวิธีเปิด port 25565 และการสำรองข้อมูลโลกอย่างปลอดภัยเพื่อป้องกันข้อมูลเสียหาย
สิ่งที่คุณกำลังสร้าง
เซิร์ฟเวอร์ Minecraft Java Edition ที่มีความเสถียร โดยใช้ Paper บน Ubuntu 24.04 รันด้วย user minecraft แยกต่างหากภายใต้ systemd พร้อม Restart=on-failure เปิดใช้งาน whitelist และเปิด port 25565 ใน firewall ทั้งสอง ตัวที่กั้นระหว่างผู้เล่นและ JVM รวมถึงมีการสำรองข้อมูลในรูปแบบที่ไม่ทำให้ข้อมูลโลกเสียหาย คู่มือนี้จะครอบคลุมทุกอย่างที่ทำให้เซิร์ฟเวอร์ของคุณแตกต่างจากเซิร์ฟเวอร์ทั่วไปที่ล่มตั้งแต่สุดสัปดาห์แรก โดยหัวใจสำคัญคือไฟล์ jar หนึ่งไฟล์และคำสั่ง java หนึ่งคำสั่ง
คำเตือนสำคัญสองประการก่อนเริ่มใช้งาน First, Minecraft ใช้หน่วยความจำสูงและทำงานแบบ single-threaded เป็นหลัก ดังนั้น VPS ขนาด 1 GB ไม่สามารถรันเซิร์ฟเวอร์ที่เล่นได้จริง และ CPU ที่มีความเร็วต่อคอร์สูงหนึ่งคอร์มีประสิทธิภาพดีกว่า CPU ที่มีความเร็วต่ำสี่คอร์ Second, นี่คือ Java Edition ผู้เล่นในเวอร์ชัน Bedrock (คอนโซล, มือถือ, Windows Bedrock app) ไม่สามารถเข้าร่วมเซิร์ฟเวอร์ Java ได้ หากต้องการให้เล่นด้วยกันได้ต้องใช้ซอฟต์แวร์เซิร์ฟเวอร์อื่นบน UDP 19132 หรือใช้ Geyser plugin ซึ่งไม่อยู่ในขอบเขตของคู่มือนี้
คุณต้องมี Ubuntu 24.04 KVM VPS ที่ติดตั้งใหม่พร้อมสิทธิ์ root หรือ sudo และใช้เวลาประมาณ 30 นาที
Sizing: ความต้องการทรัพยากรที่แท้จริงสำหรับเซิร์ฟเวอร์สำหรับเพื่อน
RAM คือตัวเลขที่สำคัญที่สุด และตัวเลขที่ใช้งานได้จริงนั้นต่ำกว่าที่ระบุไว้ในฟอรัมของ modpack:
- 2 GB สามารถรัน vanilla สำหรับผู้เล่น 2–5 คน โดยใช้ระยะการมองเห็น (view distance) ระดับปานกลาง สามารถเล่นได้แต่ไม่มีทรัพยากรสำรองเหลือ
- 4 GB คือขนาดที่เหมาะสมสำหรับเซิร์ฟเวอร์สำหรับเพื่อน: รองรับผู้เล่นพร้อมกันประมาณ 10 คนบน Paper พร้อมปลั๊กอินจำนวนหนึ่ง และมีทรัพยากรเหลือเพียงพอสำหรับ OS
- 8 GB ขึ้นไป เหมาะสำหรับ modpack และเซิร์ฟเวอร์ที่มีผู้เล่นมากกว่า 20 คน ในระดับนี้คุณควรให้ความสำคัญกับความเร็วของ CPU ต่อหนึ่งคอร์ (single-core CPU speed) เนื่องจาก game loop หลักทำงานบน thread เดียว
ขนาดของไฟล์โลกจะเพิ่มขึ้นบน disk เมื่อผู้เล่นสำรวจพื้นที่ — โลก survival ที่มีการสำรวจอย่างกว้างขวางอาจมีขนาดหลาย gigabytes — ดังนั้นควรเผื่อพื้นที่ว่างไว้สำหรับตัวโลก และ ไฟล์ backup
Vanilla หรือ Paper? Paper สามารถใช้แทน official jar ได้ทันที: ใช้โลกเดิมได้ ใช้ client เดิมได้ และไม่จำเป็นต้องติดตั้ง client-side mods Paper ปรับปรุงกระบวนการทำงานที่ช้าที่สุดของเซิร์ฟเวอร์ใหม่ เช่น การโหลด chunk, การประมวลผล entity ticking และ hoppers พร้อมทั้งเพิ่ม plugin API เหตุผลเดียวที่จะใช้ vanilla คือหากคุณต้องการกลไกแบบ vanilla ที่แม่นยำทุกรายละเอียดสำหรับเทคนิค redstone farms ซึ่งการปรับแต่งของ Paper อาจทำให้เกิดการเปลี่ยนแปลง สำหรับผู้ใช้งานทั่วไป Paper จะรองรับจำนวนผู้เล่นต่อ gigabyte ได้มากกว่า ทุกอย่างที่ระบุไว้ด้านล่างนี้สามารถใช้งานได้กับทั้งสองระบบ
Step 1: ติดตั้ง Java 21
Minecraft 1.20.5 และเวอร์ชันที่ใหม่กว่าทั้งหมด (ทุกเวอร์ชันในตระกูล 1.21.x) จำเป็นต้องใช้ Java 21 สำหรับ Ubuntu 24.04 มีแพ็กเกจนี้ใน repository มาตรฐาน โดยเวอร์ชัน headless จะไม่มีไลบรารีสำหรับ desktop ซึ่งไม่จำเป็นต่อการใช้งาน server:
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 ที่ถูกค้นหาบ่อยที่สุดในภายหลัง หากใช้ 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: การใช้ user เฉพาะทาง ห้ามใช้ root
Server จะรัน code ของ plugin และประมวลผล network input จากทุกคนที่สามารถเชื่อมต่อผ่าน port ได้ หากเกิดข้อผิดพลาดขึ้น การถูกเจาะระบบโดย user root จะทำให้ VPS ของคุณถูกควบคุมทั้งหมด แต่หากถูกเจาะระบบโดย user minecraft จะส่งผลกระทบเพียงแค่ภายใน game world เท่านั้น
sudo adduser --system --group --home /opt/minecraft minecraft--system จะสร้าง account แบบไม่ต้องใช้ password และไม่สามารถ login ผ่าน SSH ได้ โดยกำหนดให้ /opt/minecraft เป็น home และ working directory ทุกคำสั่งที่ติดต่อกับ server หลังจากนี้จะทำงานภายใต้ user นี้
Step 3: download the server jar from the official source
มีเพียงสองแหล่งเท่านั้นที่ควรใช้ดาวน์โหลด server jar: หน้าดาวน์โหลด server อย่างเป็นทางการที่ minecraft.net สำหรับ vanilla และหน้า downloads ที่ papermc.io สำหรับ Paper แหล่งดาวน์โหลดของบุคคลที่สาม (third-party "download hubs") ที่นำ server jar มาแพ็กใหม่เป็นช่องทางแพร่กระจายมัลแวร์ที่มีมาอย่างยาวนาน เนื่องจาก server jar คือ code ที่คุณต้องรันบนเครื่องที่เชื่อมต่ออินเทอร์เน็ตตลอด 24 ชั่วโมง
คัดลอกลิงก์ดาวน์โหลดของ 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, และการกำหนดสิทธิ์ผู้ดูแลระบบ
รัน server แบบ interactive หนึ่งครั้งก่อนเริ่มใช้งาน systemd เนื่องจากมีงานสำคัญสองอย่างที่ต้องทำผ่าน console โดยตรงเท่านั้น
cd /opt/minecraft
sudo -u minecraft java -Xms1G -Xmx1G -jar server.jar noguiโปรแกรมจะปิดตัวลงภายในไม่กี่วินาที — Paper จะใช้เวลาเพิ่มเล็กน้อยในการติดตั้ง patches — และ log จะสิ้นสุดลงด้วยบรรทัดที่ทุกคนต้องพบ:
[ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.นี่ไม่ใช่ข้อผิดพลาด แต่เป็นขั้นตอนการยอมรับใบอนุญาต (license gate) การรันครั้งนี้ได้สร้างไฟล์ eula.txt ไว้ข้างไฟล์ jar หากคุณยังไม่ได้อ่าน EULA ที่แนบไว้ ให้ดำเนินการอ่าน จากนั้นให้เปลี่ยนค่า flag ดังนี้:
sudo -u minecraft sed -i 's/eula=false/eula=true/' /opt/minecraft/eula.txtรันคำสั่ง java เดิมอีกครั้ง ครั้งนี้ระบบจะทำการสร้าง world ซึ่งอาจใช้เวลาประมาณ 1 ถึง 2 นาทีในการเริ่มระบบครั้งแรก และจะหยุดอยู่ที่:
[Server thread/INFO]: Done (9.204s)! For help, type "help"ขณะนี้คุณมี console ที่ใช้งานได้แล้ว ให้ใช้เพื่อทำหน้าที่ที่สอง: พิมพ์ op YourMinecraftName (ชื่อผู้ใช้ในเกมของคุณ) เพื่อให้ server บันทึกชื่อคุณลงใน ops.json ซึ่งจะทำให้คุณสามารถใช้คำสั่ง admin ทุกอย่างจากภายในเกมได้ในภายหลังเมื่อไม่มี console เชื่อมต่ออยู่ จากนั้นพิมพ์ 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 knowonline-mode=true ทำให้ server ตรวจสอบ username ของผู้เล่นทุกคนที่เข้าร่วมผ่าน session servers ของ Mojang เพื่อยืนยันว่าผู้เล่นเป็นเจ้าของ account นั้นจริง การตั้งค่าเป็น false หรือการเปิด "cracked server" หมายความว่า server จะเชื่อข้อมูลตัวตนที่ client ส่งมาเท่านั้น ผู้เล่นสามารถใช้ชื่อใดก็ได้เพื่อเข้าร่วม รวมถึงชื่อของคุณด้วย และเนื่องจากสิทธิ์ op และ whitelist ผูกติดกับชื่อผู้เล่น ผู้แอบอ้างจึงสามารถเข้ามาพร้อมสิทธิ์ operator ของคุณได้ เหตุผลเดียวที่ควรตั้งค่าเป็น false คือการใช้งานผ่าน authenticating proxy เช่น Velocity ซึ่งทำหน้าที่ตรวจสอบผู้เล่นด้วยตนเอง สำหรับ server ทั่วไปควรตั้งค่าเป็น true เท่านั้น
view-distance เป็นตัวแปรที่มีผลต่อ performance มากที่สุดในไฟล์นี้ โดยค่าใช้บการ CPU และ RAM จะเพิ่มขึ้นตามกำลังสองของค่านี้ การตั้งค่าเป็น 8 เหมาะสมสำหรับ VPS ส่วนค่า 10 คือค่าเริ่มต้นของ vanilla ซึ่งใช้ทรัพยากรมากกว่าอย่างเห็นได้ชัด
white-list=true ร่วมกับ enforce-whitelist=true ใช้สำหรับปิดกั้นไม่ให้บุคคลภายนอกเข้า server ซึ่งส่วนความปลอดภัยด้านล่างจะระบุว่าการตั้งค่านี้จำเป็นอย่างยิ่ง คุณสามารถเพิ่มผู้เล่นได้โดยใช้คำสั่ง /whitelist add TheirName ภายในเกมในฐานะ op
Step 6: memory flags — ทำไม -Xms และ -Xmx ควรมีค่าเท่ากัน
JVM จะจัดสรร heap ระหว่าง -Xms (ขนาดเริ่มต้น) และ -Xmx (ขนาดสูงสุด) สำหรับ dedicated game server ควรตั้งค่าทั้งสองให้เป็นค่าเดียวกัน เนื่องจาก heap จะขยายไปจนถึงขนาดสูงสุดอยู่แล้ว การขยายขนาดแบบเป็นขั้นตอนจะทำให้เกิด garbage-collector churn ในระหว่างการเล่น สำหรับ VPS ขนาด 4 GB ค่าที่เหมาะสมคือ:
/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui-Xmx ไม่ใช่ หน่วยความจำทั้งหมดที่ process ใช้งาน JVM จะมีการใช้ memory ส่วนอื่นนอกเหนือจาก heap (off-heap overhead) เช่น thread stacks, JIT caches และ direct buffers ซึ่งใช้พื้นที่ประมาณครึ่ง gigabyte หรือมากกว่านั้น และระบบ Ubuntu เองก็ต้องการพื้นที่ใช้งานด้วย กฎการใช้งานคือ: ให้ตั้งค่า -Xmx ไม่เกิน RAM ของ VPS ลบออก 1 GB หากตั้งค่าเกินจะเกิดปัญหาอย่างใดอย่างหนึ่ง หากการจัดสรรหน่วยความจำล้มเหลวตั้งแต่เริ่มต้น server จะไม่สามารถเริ่มทำงานได้พร้อมข้อความ:
Error: Could not reserve enough space for object heapข้อผิดพลาดนี้จะแจ้งให้ทราบทันที หากเป็นกรณีที่แย่กว่าคือ server เริ่มทำงานได้ปกติแต่จะหยุดทำงานหลังจากผ่านไปหลายชั่วโมง เมื่อ heap เต็มขณะใช้งานหนัก และ kernel's OOM killer เลือกกำจัด process ที่ใช้ทรัพยากรมากที่สุด ซึ่งก็คือ JVM กรณีนี้จะไม่ปรากฏใน server log แต่สามารถตรวจสอบหลักฐานได้ใน sudo dmesg | grep -i oom โดยจะมีบรรทัดลักษณะอย่าง Out of memory: Killed process 1234 (java) หาก service ของคุณ restart "แบบสุ่ม" ให้ตรวจสอบที่นั่นเป็นอันดับแรก และลดค่า -Xmx ลง
สำหรับ Paper ทางโปรเจกต์แนะนำให้ใช้ Aikar's flags ซึ่งเป็นชุดค่า G1GC ที่ปรับแต่งมาแล้ว (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 และค่าอื่นๆ อีกหลายค่า) เพื่อช่วยลดการหยุดชะงักจากการทำ garbage-collection บน heap ขนาดใหญ่ ให้คัดลอกคำสั่งทั้งหมดจากเอกสารของ Paper สำหรับ heap ขนาด 2–4 GB แม้จะเห็นผลลัพธ์ไม่ชัดเจนนัก แต่การใช้ flags เหล่านี้ไม่มีข้อเสียใดๆ
Step 7: การใช้ systemd unit พร้อม Restart=on-failure
หากเริ่มการทำงานของ server ด้วยตนเอง (manually) เมื่อคุณปิด SSH session โปรแกรมจะหยุดทำงาน และ server จะไม่เริ่มทำงานใหม่หลังจาก 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.targetsudo systemctl daemon-reload
sudo systemctl enable --now minecraft
systemctl status minecraft
journalctl -u minecraft -fผลลัพธ์ที่ถูกต้อง: status จะแสดง active (running) และ journal — ซึ่งทำหน้าที่เก็บ console output ของ server — จะสิ้นสุดที่บรรทัด Done อีกครั้ง
การตั้งค่าใน unit นี้มีสองจุดที่สำคัญ การใช้ Restart=on-failure จะช่วยให้ server เริ่มทำงานใหม่หลังจากเกิดการ crash แต่จะไม่เริ่มใหม่หากเป็นการปิดแบบปกติ (clean stop) เพื่อให้ยังสามารถบำรุงรักษาระบบได้ และ TimeoutStopSec=120 มีความสำคัญมากกว่าที่เห็น: systemctl stop จะส่งสัญญาณ SIGTERM ซึ่ง Minecraft server จะรับสัญญาณนี้เพื่อบันทึกข้อมูลโลก (world) ทั้งหมดก่อนปิดตัวลง สำหรับโลกที่มีขนาดใหญ่ การบันทึกข้อมูลต้องใช้เวลา หากใช้ค่า timeout เริ่มต้นของ systemd อาจเกิดการส่ง SIGKILL ไปยัง JVM ในขณะที่กำลังบันทึกข้อมูล ซึ่งเป็นสาเหตุที่ทำให้ไฟล์ region เสียหาย (corrupt) จึงควรตั้งค่าไว้ที่ 2 นาที
หาก service เกิดการทำงานสลับไปมา (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?แสดงว่ามีโปรแกรมอื่นใช้งาน port 25565 อยู่ ซึ่งมักเกิดจากการที่มีการรัน server ทิ้งไว้ใน SSH session อื่น ให้ค้นหาโปรแกรมดังกล่าวด้วย sudo ss -tlnp | grep 25565 และสั่งหยุดการทำงานนั้น ห้ามรัน server สองตัวบน port เดียวกันโดยเด็ดขาด
Step 8: เปิดพอร์ต 25565 บน firewall ทั้งสองระบบ
Minecraft Java ใช้เพียง TCP 25565 เท่านั้น (UDP ใช้สำหรับ query protocol ซึ่งเป็นทางเลือกและถูกปิดไว้โดยค่าเริ่มต้น) สำหรับบน VPS:
sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enableนั่นคือ firewall ตัวแรก ผู้ให้บริการ VPS ส่วนใหญ่จะมี firewall ระดับเครือข่ายอีกตัวหนึ่งใน control panel ซึ่งเป็นจุดที่คนมักลืม ให้เปิด TCP 25565 ที่นั่นด้วย อาการเมื่อเปิดพอร์ตไม่ครบทั้งสองระบบนั้นระบุสาเหตุได้ยาก คือ client จะค้างที่ข้อความ "Connecting to the server..." และล้มเหลวด้วยข้อผิดพลาด Connection timed out: no further information โดยไม่มีการปฏิเสธการเชื่อมต่อ (refusal) ไม่มีข้อผิดพลาดจาก server และไม่มีข้อมูลใน journal เนื่องจาก packet ส่งไปไม่ถึง ให้ตรวจสอบจากเครื่องที่อยู่ ภายนอก VPS ด้วย nc -vz your.server.ip 25565; หากได้ผลลัพธ์เป็น succeeded แสดงว่าเปิด firewall ทั้งสองระบบแล้ว หากค้างแสดงว่ามีอย่างน้อยหนึ่งระบบที่ยังไม่ได้เปิด
ในขณะที่ใช้งาน ufw เครื่องเซิร์ฟเวอร์จะเปิด SSH บน public IP และจะเริ่มมี log การโจมตีแบบ brute-force ภายในไม่กี่ชั่วโมง ให้ ตั้งค่า Fail2ban สำหรับ SSH บน Ubuntu 24.04 ไว้ก่อนที่จะลืม
ขั้นตอนการเชื่อมต่อ: เลือก Multiplayer, Direct Connection, แล้วใส่ IP ของ server เนื่องจากคุณได้เพิ่มสิทธิ์ให้ตัวเองแล้วในขั้นตอนที่ 4 คำสั่งภายในเกมจึงสามารถใช้งานได้ทันที — ใช้ /whitelist add FriendName สำหรับผู้เล่นแต่ละคน หรือ /gamemode creative หากต้องการทำเช่นนั้น
Step 9: การทำ whitelist เนื่องจากอินเทอร์เน็ตมีการสแกนหา port 25565
การเปิด Minecraft server ทิ้งไว้บนอินเทอร์เน็ตมีความเสี่ยงจริง: มีการใช้ mass scanners สแกนหา port 25565 ทั่วทั้ง IPv4 space อย่างต่อเนื่อง — โครงการ griefing ต่างๆ ได้ระบุตำแหน่ง server ที่เปิดอยู่หลายแสนเครื่องด้วยวิธีนี้ — server ที่ไม่ได้ทำ whitelist จะมีผู้บุกรุกเข้ามาภายในไม่กี่วันหรือบางครั้งเพียงไม่กี่ชั่วโมง การใช้ whitelist จาก step 5 คือวิธีแก้ไข: online-mode=true ใช้เพื่อยืนยันตัวตน และ whitelist จะจำกัดสิทธิ์การเข้าถึงเฉพาะตัวตนที่คุณเลือกเท่านั้น ระบบความปลอดภัยนี้เพียงพอแล้วสำหรับ server ที่เล่นกับเพื่อน
สำหรับการเข้าถึง console โดยไม่ผ่านเกม — เช่น การทำ scripted backups หรือ cron job — ให้เปิดใช้งาน RCON ใน server.properties (enable-rcon=true, ซึ่งเป็น rcon.password ที่มีความปลอดภัยสูง, port 25575) และทำการ build mcrcon client จาก source code บน GitHub ภายใน VPS โดยตรง เนื่องจากไม่มีใน repos ของ Ubuntu ห้าม เปิด port 25575 ใน firewall: เนื่องจาก RCON ส่งรหัสผ่านแบบ cleartext จึงควรจำกัดการใช้งานไว้เฉพาะ loopback-only เท่านั้น
Step 10: การสำรองข้อมูลที่ไม่ทำให้ข้อมูลเสียหาย
กฎข้อเดียวคือ: ห้ามคัดลอก directory ของ world ในขณะที่ server กำลังเขียนข้อมูล ไฟล์ Region จะถูกเขียนใหม่ตลอดเวลาขณะเล่น หากเกิด tar ในขณะที่มีการเขียนข้อมูล จะทำให้ไฟล์ archive มี chunk ที่เขียนไม่เสร็จสมบูรณ์ และเมื่อคุณทำการ restore ซึ่งเป็นขั้นตอนที่สำคัญที่สุด จะพบข้อผิดพลาดในการโหลด chunk จำนวนมากและภูมิประเทศจะมีช่องโหว่ วิธีการสองวิธีต่อไปนี้สามารถป้องกันปัญหานี้ได้
Stop-copy-start เป็นวิธีที่ง่ายที่สุด แต่ต้องแลกด้วยการหยุดให้บริการ (downtime) ประมาณ 1 นาที:
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 จะแยก dimension ออกเป็น world, world_nether และ world_the_end; ส่วน vanilla server จะเก็บทุกอย่างไว้ใน world ดังนั้นให้ย้ายอีกสองส่วนไปไว้ที่นั่น)
Save-off คือการสำรองข้อมูลขณะที่ server กำลังทำงาน: ให้ส่งคำสั่ง save-off (เพื่อหยุด autosaver) ผ่าน RCON จากนั้นส่งคำสั่ง save-all flush (เพื่อบังคับให้เขียนข้อมูลลง disk ทั้งหมดแล้วรอ) จากนั้นจึงทำการ tar และส่งคำสั่ง save-on วิธีนี้เหมาะสำหรับการตั้งค่าใน cron ตอนเวลา 5 a.m.
ไม่ว่าจะใช้วิธีใด การเก็บไฟล์สำรองไว้บน VPS เครื่องเดียวกับ server ไม่ถือเป็นการสำรองข้อมูลที่ปลอดภัย — ให้ใช้ scp หรือ rclone เพื่อย้ายไฟล์ archive ออกจากเครื่อง และควรเก็บไฟล์สำรองไว้มากกว่าหนึ่งชุด นอกจากนี้ เนื่องจากคุณไม่ได้เฝ้าหน้าจอ console ตลอดเวลาเมื่อเกิดปัญหา ควรตั้งระบบตรวจสอบพอร์ตจากภายนอก: การใช้ Uptime Kuma บนเครื่องอื่น เพื่อทำ TCP check ไปยังพอร์ต 25565 จะช่วยแจ้งเตือนว่า server ล่มก่อนที่ผู้เล่นจะทราบ
Plugins and upgrades
สำหรับการใช้งาน Paper การติดตั้ง plugin ทำได้เพียงนำไฟล์ jar ไปวางไว้ใน /opt/minecraft/plugins/ แล้วทำการ restart server เท่านั้น ให้ดาวน์โหลด plugin จากหน้าโปรเจกต์อย่างเป็นทางการเท่านั้น (Hangar, Modrinth, SpigotMC) ด้วยเหตุผลเดียวกับการเลือกใช้ server jar เนื่องจาก plugin แต่ละตัวคือ code ที่ทำงานภายใต้สิทธิ์ของ user minecraft
การอัปเกรด server มีขั้นตอนคือ: หยุดการทำงาน, ทำการ backup, แทนที่ไฟล์ server.jar ด้วย build ของ Minecraft version ใหม่, และเริ่มการทำงานใหม่ มีข้อควรระวัง 2 ประการ การอัปเกรด world เป็นแบบทางเดียว หาก world ถูกเปิดด้วย version ที่ใหม่กว่า จะไม่สามารถเปิดด้วย version ที่เก่ากว่าได้ จึงจำเป็นต้องใช้ไฟล์ backup เข้าช่วย นอกจากนี้ plugin มักจะออกตามหลัง Minecraft version ใหม่เป็นเวลาหลายวันหรือหลายสัปดาห์ ดังนั้นควรตรวจสอบความเข้ากันได้ก่อนตัดสินใจอัปเกรดทันทีที่มีการปล่อย version ใหม่
หากคุณต้องการจัดการสิ่งเหล่านี้ในรูปแบบ container เช่น การกำหนด version pinning, การยอมรับ EULA และการตั้งค่า memory flags ผ่าน environment variables คุณสามารถใช้ image itzg/minecraft-server ซึ่งเป็นที่นิยม โดยสามารถรัน Paper server ตัวเดียวกันนี้ผ่าน Docker Compose บน VPS ของคุณ ด้วยการตั้งค่า firewall และระเบียบการ backup แบบเดียวกัน
FAQ
Minecraft server ต้องใช้ RAM เท่าไหร่?
2 GB เพียงพอสำหรับ vanilla เมื่อมีผู้เล่น 2–5 คน; 4 GB เหมาะสำหรับเซิร์ฟเวอร์เล่นกับเพื่อนประมาณ 10 คนที่ใช้ Paper และมี plugin เล็กน้อย; สำหรับ modpacks และผู้เล่นมากกว่า 20 คน ควรใช้ 8 GB หรือมากกว่านั้น ไม่ว่า VPS จะมีขนาดเท่าใด ให้ตั้งค่า -Xmx ให้ไม่เกินจำนวน RAM ทั้งหมดลบออก 1 GB เนื่องจาก JVM ใช้หน่วยความจำนอกเหนือจาก heap และหากตั้งค่าเกินจะทำให้เกิด Error: Could not reserve enough space for object heap หรือถูกระบบสั่ง kill เนื่องจาก OOM
ทำไมเพื่อนถึงเชื่อมต่อเข้า Minecraft server ของฉันไม่ได้?
หาก client ค้างและจบด้วย Connection timed out: no further information มักเกิดจาก firewall ซึ่งมีอยู่ 2 ส่วนคือ ufw บน VPS และ network firewall ของผู้ให้บริการใน 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 ซึ่งจะทำให้ได้รับสิทธิ์นั้นไปด้วย นอกจากนี้จะทำให้ skin และ UUID ไม่เสถียร การใช้งานที่ถูกต้องมีเพียงกรณีเดียวคือการใช้งานผ่าน proxy ที่ทำหน้าที่ตรวจสอบสิทธิ์อย่าง Velocity สำหรับเซิร์ฟเวอร์ทั่วไปควรตั้งค่าเป็น true
Paper ดีกว่า vanilla Minecraft server หรือไม่?
สำหรับผู้ใช้ส่วนใหญ่คือดีกว่า Paper เป็นไฟล์ jar ที่สามารถใช้แทนที่ได้ทันทีโดยโหลดโลก vanilla และรองรับ client ที่ไม่ได้ดัดแปลงได้ Paper จัดการเรื่อง entity ticks และการโหลด chunks ได้มีประสิทธิภาพมากกว่ามาก และยังมีระบบ plugin รองรับ ข้อยกเว้นคือกลุ่มผู้เล่นสาย technical-redstone ที่ต้องการพฤติกรรมแบบ vanilla ที่แม่นยำ 100% เนื่องจาก Paper มีการปรับแต่งบางอย่างที่อาจเปลี่ยนพฤติกรรมดังกล่าว สำหรับ VPS ขนาดเล็ก ประสิทธิภาพของ Paper จะช่วยประหยัด RAM ได้อย่างมาก
ฉันจะสำรองข้อมูล (back up) โลก Minecraft อย่างไรไม่ให้ไฟล์เสีย?
ห้ามทำ archive โฟลเดอร์โลกในขณะที่เซิร์ฟเวอร์กำลังเขียนข้อมูลลงในนั้น การคัดลอกไฟล์ในขณะที่ region-file กำลังถูกเขียนจะทำให้ chunk เสียหาย ซึ่งจะตรวจพบเมื่อตอนกู้คืนข้อมูลเท่านั้น วิธีที่ถูกต้องคือหยุดการทำงานของเซิร์ฟเวอร์แล้ว tar โฟลเดอร์โลกก่อนเริ่มใหม่ หรือหากต้องการให้เซิร์ฟเวอร์ทำงานต่อเนื่อง ให้ใช้ save-off, save-all flush, tar และ save-on ผ่าน RCON จากนั้นจึงย้ายไฟล์ archive ออกจาก VPS