SSD Nodes Learn Hosting plans →
คู่มือ Matt Connorโดย Matt Connor

วิธีตั้งค่า Minecraft Server บน VPS Ubuntu 24.04

คู่มือการติดตั้ง Paper Minecraft Server บน Ubuntu 24.04 อย่างละเอียด ตั้งแต่การเลือก RAM การติดตั้ง Java 25 การตั้งค่า systemd ไปจนถึงการเปิดพอร์ต 25565 และการสำรองข้อมูล

สิ่งที่คุณกำลังสร้าง

เซิร์ฟเวอร์ Minecraft Java Edition ที่ทำงานได้อย่างต่อเนื่อง: ใช้ Paper บน Ubuntu 24.04 โดยรันในฐานะผู้ใช้ minecraft เฉพาะกิจภายใต้ systemd พร้อมด้วย Restart=on-failure, เปิดใช้งาน whitelist, เปิดพอร์ต 25565 ใน ufw และในไฟร์วอลล์เครือข่ายของผู้ให้บริการ (หากมีการเปิดใช้งาน) รวมถึงการสำรองข้อมูลด้วยวิธีที่ไม่ทำให้ world เสียหาย ตัวเซิร์ฟเวอร์เองประกอบด้วยไฟล์ jar หนึ่งไฟล์และคำสั่ง java หนึ่งคำสั่ง สิ่งที่ทำให้เซิร์ฟเวอร์ที่เพื่อนของคุณเล่นได้นานเป็นปีแตกต่างจากเซิร์ฟเวอร์ที่ล่มตั้งแต่สุดสัปดาห์แรก คือสิ่งที่อยู่รอบคำสั่งนั้น และนั่นคือเนื้อหาที่คู่มือนี้ครอบคลุม

คำเตือนตามตรงสองประการก่อนที่คุณจะเสียเงิน ประการแรก Minecraft กินหน่วยความจำสูงและส่วนใหญ่ทำงานแบบ single-threaded: VPS ขนาด 1 GB ไม่สามารถรันเซิร์ฟเวอร์ที่เล่นได้จริง และ CPU ที่มี core ความเร็วสูงหนึ่ง core นั้นดีกว่าสี่ core ที่ช้า ประการที่สอง นี่คือ Java Edition ผู้เล่น Bedrock, คอนโซล, โทรศัพท์, แอป Windows Bedrock ไม่สามารถเข้าร่วมเซิร์ฟเวอร์ Java ได้ Bedrock ต้องการซอฟต์แวร์เซิร์ฟเวอร์ที่แตกต่างกันบนพอร์ต UDP 19132 หรือใช้ปลั๊กอิน Geyser ซึ่งอยู่นอกเหนือขอบเขตของคู่มือนี้

คุณต้องมี Ubuntu 24.04 KVM VPS ใหม่ที่เข้าถึงด้วยสิทธิ์ root หรือ sudo และใช้เวลาประมาณสามสิบนาที

การจัดสรรทรัพยากร: สิ่งที่เซิร์ฟเวอร์สำหรับกลุ่มเพื่อนจำเป็นต้องใช้จริง

RAM คือตัวเลขที่สำคัญที่สุด และตัวเลขที่แท้จริงนั้นต่ำกว่าที่ฟอรัมของ modpack แนะนำไว้:

  • 2 GB สามารถรัน vanilla สำหรับผู้เล่น 2–5 คนที่ระยะการมองเห็น (view distance) ปานกลางได้ ถือว่าเล่นได้แต่ไม่มีพื้นที่เหลือให้ระบบ
  • 4 GB คือขนาดที่เหมาะสมสำหรับเซิร์ฟเวอร์กลุ่มเพื่อน: รองรับผู้เล่นพร้อมกันประมาณ 10 คนบน Paper พร้อมปลั๊กอินจำนวนหนึ่ง และมีทรัพยากรเหลือเพียงพอสำหรับ OS
  • 8 GB ขึ้นไป เป็นระดับสำหรับ modpack และผู้เล่นมากกว่า 20 คน ซึ่งคุณควรให้ความสำคัญกับความเร็ว CPU แบบ single-core ด้วย เนื่องจากลูปหลักของเกมทำงานบนเธรดเดียว

ขนาดของโลกจะเพิ่มขึ้นบนดิสก์ตามการสำรวจของผู้เล่น โลกในโหมด survival ที่มีการเดินทางบ่อยครั้งอาจมีขนาดถึงหลายกิกะไบต์ ดังนั้นควรเผื่อพื้นที่ว่างไว้สำหรับตัวโลก และ ไฟล์สำรองข้อมูลด้วย

Vanilla หรือ Paper? Paper เป็นตัวแทนที่สามารถนำมาใช้แทนไฟล์ jar ทางการได้ทันที: ใช้โลกเดิมได้, ใช้ไคลเอนต์เดิมได้ และไม่จำเป็นต้องติดตั้ง mod ฝั่งไคลเอนต์เพิ่ม มันทำการเขียนโค้ดส่วนที่ทำงานช้าที่สุดของเซิร์ฟเวอร์ใหม่ เช่น การโหลด chunk, การประมวลผล entity, hoppers และเพิ่ม API สำหรับปลั๊กอิน เหตุผลเดียวที่คุณควรใช้ vanilla คือหากคุณต้องการกลไกที่ตรงตามต้นฉบับทุกประการสำหรับฟาร์ม redstone เชิงเทคนิคที่การปรับแต่งของ Paper อาจส่งผลกระทบได้ สำหรับผู้ใช้ทั่วไป Paper ช่วยให้รองรับผู้เล่นได้มากขึ้นต่อปริมาณ RAM หนึ่งกิกะไบต์ ทุกขั้นตอนด้านล่างนี้สามารถใช้ได้กับทั้งสองแบบ

ขั้นตอนที่ 1: ติดตั้ง Java 25

Minecraft 26.1 และทุกรุ่นที่ปล่อยออกมาหลังจากนี้จำเป็นต้องใช้ Java 25 ส่วน Java 21 รองรับเฉพาะรุ่นเก่าตั้งแต่ 1.20 ถึง 1.21.11 เท่านั้น Ubuntu 24.04 มี Java 25 ให้ติดตั้งผ่านคลังเก็บซอฟต์แวร์อัปเดตและความปลอดภัย ติดตั้ง JRE แบบเต็ม ไม่ใช่รุ่น -headless เพราะคู่มือการติดตั้ง Java ของ Paper ได้เตือนไว้ว่าอย่าใช้รุ่น headless เนื่องจากขาด dependency ที่ Paper จำเป็นต้องใช้

sudo apt update && sudo apt install -y openjdk-25-jre
java -version

ผลลัพธ์ที่ถูกต้องคือบรรทัดแรกต้องแสดงเป็น openjdk version "25.0.x" หากแสดงเป็น 21, 17 หรือ 11 แสดงว่ามี JRE รุ่นอื่นติดตั้งอยู่และถูกเรียกใช้งานแทน ให้แก้ไขด้วยคำสั่ง sudo update-alternatives --config java แล้วเลือกรายการที่มี java-25

การข้ามขั้นตอนตรวจสอบนี้จะนำไปสู่ข้อผิดพลาดของเซิร์ฟเวอร์ Minecraft ที่ถูกค้นหามากที่สุดในภายหลัง หากใช้ Java 21 ตัวไฟล์ 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 69.0),
	this version of the Java Runtime only recognizes class file versions up to 65.0

ตัวเลขเหล่านี้ระบุถึงความไม่เข้ากันของเวอร์ชัน: class file version 69.0 คือ Java 25, 65.0 คือ Java 21 และ 61.0 คือ Java 17 ไม่ว่าคุณจะพบตัวเลขคู่ใด วิธีแก้ไขคือวิธีเดียวกัน คือติดตั้ง JRE รุ่นที่ใหม่กว่าแล้วรันคำสั่ง update-alternatives อีกครั้ง

ขั้นตอนที่ 2: สร้างผู้ใช้เฉพาะงาน ห้ามใช้ root

เซิร์ฟเวอร์จะประมวลผลโค้ดของปลั๊กอินและวิเคราะห์ข้อมูลเครือข่ายจากทุกคนที่เข้าถึงพอร์ตได้ หากเกิดข้อผิดพลาดขึ้น การถูกเจาะระบบในขณะที่รันด้วยสิทธิ์ root จะทำให้ผู้บุกรุกยึดครอง VPS ของคุณได้ทั้งหมด แต่หากรันด้วยสิทธิ์ minecraft ผู้บุกรุกจะยึดครองได้เพียงโลกของเกมเท่านั้น

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

--system จะสร้างบัญชีผู้ใช้ที่ไม่มีรหัสผ่านและไม่สามารถล็อกอินผ่าน SSH ได้ โดยมี /opt/minecraft เป็นไดเรกทอรีหลักและไดเรกทอรีทำงาน คำสั่งทุกคำสั่งที่เกี่ยวข้องกับเซิร์ฟเวอร์นับจากนี้จะรันด้วยผู้ใช้รายนี้

ขั้นตอนที่ 3: ดาวน์โหลดไฟล์ server jar จากแหล่งที่มาอย่างเป็นทางการ

คุณควรรับไฟล์ server jar จากแหล่งที่เชื่อถือได้เพียงสองแห่งเท่านั้น ได้แก่ หน้าดาวน์โหลดเซิร์ฟเวอร์อย่างเป็นทางการที่ minecraft.net สำหรับเวอร์ชัน vanilla และหน้าดาวน์โหลดที่ papermc.io สำหรับ Paper เว็บไซต์ "ศูนย์รวมการดาวน์โหลด" ของบุคคลที่สามที่นำไฟล์ server jar มาบรรจุใหม่เป็นช่องทางแพร่กระจายมัลแวร์ที่มีมาอย่างยาวนาน โปรดจำไว้ว่าไฟล์ server jar คือโค้ดที่สามารถทำงานได้ตามอำเภอใจ ซึ่งคุณกำลังจะนำไปรันตลอด 24 ชั่วโมงบนเครื่องที่เชื่อมต่อกับอินเทอร์เน็ต

คัดลอกลิงก์ดาวน์โหลดสำหรับ build ปัจจุบันจากหน้าเว็บไซต์ทางการ (URL จะเปลี่ยนไปตามเวอร์ชันและ build ดังนั้นการระบุ URL แบบตายตัวในที่นี้จะทำให้ข้อมูลล้าสมัย) จากนั้นดำเนินการดังนี้:

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

ผลลัพธ์ที่ถูกต้อง: ไฟล์ server.jar ขนาดประมาณ 60 MB ที่มีเจ้าของเป็น minecraft ซึ่งตรวจสอบความถูกต้องได้ด้วย ls -lh /opt/minecraft/server.jar

ขั้นตอนที่ 4: การรันครั้งแรก, EULA และการกำหนดสิทธิ์ op ให้ตัวเอง

ให้รันเซิร์ฟเวอร์แบบโต้ตอบ (interactive) หนึ่งครั้งก่อนที่จะจัดการผ่าน systemd เนื่องจากการรันครั้งแรกมีสองงานที่คอนโซลแบบสดเท่านั้นที่ทำได้ดี

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

เซิร์ฟเวอร์จะปิดตัวลงภายในไม่กี่วินาที โดย Paper จะใช้เวลาเพิ่มขึ้นเล็กน้อยในการปรับใช้แพตช์ของตนเองก่อน และ log จะสิ้นสุดด้วยบรรทัดที่ทุกคนต้องเจอ:

[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 ตามลิงก์หากคุณยังไม่ได้อ่าน จากนั้นให้เปลี่ยนค่า flag:

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

รันคำสั่ง java เดิมอีกครั้ง ครั้งนี้เซิร์ฟเวอร์จะสร้างโลก (world) ซึ่งใช้เวลาประมาณหนึ่งหรือสองนาทีในการบูตครั้งแรก และจะหยุดนิ่งที่:

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

ตอนนี้คุณมีคอนโซลแบบสดแล้ว ให้ใช้มันสำหรับงานที่สอง: พิมพ์ op YourMinecraftName (ชื่อผู้ใช้ในเกมของคุณให้ถูกต้อง) แล้วเซิร์ฟเวอร์จะบันทึกชื่อคุณลงใน ops.json เพื่อให้ในภายหลังเมื่อไม่มีคอนโซลเชื่อมต่ออยู่ คุณจะสามารถรันคำสั่งผู้ดูแลระบบทุกคำสั่งได้จากภายในเกม จากนั้นพิมพ์ stop เพื่อบันทึกและปิดเซิร์ฟเวอร์อย่างถูกต้อง

ขั้นตอนที่ 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) หมายความว่าเซิร์ฟเวอร์จะเชื่อชื่อที่ไคลเอนต์ส่งมาโดยไม่มีการตรวจสอบ ใครก็ตามสามารถเข้ามาในชื่อใดก็ได้ รวมถึงชื่อของคุณ และเนื่องจากสิทธิ์ operator และ whitelist อ้างอิงจากชื่อผู้ใช้ ผู้บุกรุกจึงสามารถเข้ามาพร้อมกับสิทธิ์ operator ของคุณได้ เหตุผลเดียวที่ถูกต้องในการตั้งค่าเป็น false คือเมื่ออยู่หลัง proxy ที่ทำหน้าที่ยืนยันตัวตนอย่าง Velocity ซึ่งทำหน้าที่ตรวจสอบผู้เล่นแทนแล้ว สำหรับเซิร์ฟเวอร์ทั่วไป ค่านี้ต้องเป็น true เท่านั้น

view-distance เป็นตัวแปรสำคัญที่สุดในการปรับแต่งประสิทธิภาพในไฟล์นี้ โดยภาระงานของ CPU และ RAM จะเพิ่มขึ้นตามค่ากำลังสองของตัวเลขนี้ ค่า 8 เป็นค่าเริ่มต้นที่เหมาะสมสำหรับ VPS ส่วนค่า 10 เป็นค่าเริ่มต้นของตัวเกมปกติซึ่งกินทรัพยากรมากกว่าอย่างเห็นได้ชัด

white-list=true และ enforce-whitelist=true จะปิดกั้นไม่ให้คนแปลกหน้าเข้าสู่เซิร์ฟเวอร์ ซึ่งในส่วนความปลอดภัยด้านล่างได้ระบุไว้ว่าไม่ใช่ทางเลือกเสริม คุณสามารถเพิ่มผู้เล่นได้ด้วยคำสั่ง /whitelist add TheirName ภายในเกมในฐานะ op

ขั้นตอนที่ 6: แฟล็กหน่วยความจำ เหตุผลที่ควรตั้งค่า -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, stack ของ thread, JIT cache และ direct buffer เพิ่มเติมอีกประมาณครึ่งกิกะไบต์หรือมากกว่านั้น อีกทั้งตัวระบบปฏิบัติการ Ubuntu เองก็ต้องการหน่วยความจำด้วย กฎการใช้งานคือ: ตั้งค่า -Xmx ไม่เกิน RAM ของ VPS ลบด้วย 1 GB หากตั้งค่าเกิน คุณจะพบความล้มเหลวอย่างใดอย่างหนึ่ง หากการจัดสรรหน่วยความจำล้มเหลวตั้งแต่ต้น เซิร์ฟเวอร์จะปฏิเสธการเริ่มทำงานพร้อมข้อความ:

Error: Could not reserve enough space for object heap

ข้อความนั้นตรงไปตรงมาและเกิดขึ้นทันที แต่กรณีที่เลวร้ายกว่าคือเซิร์ฟเวอร์เริ่มทำงานได้ปกติแล้วมาหยุดทำงานในอีกหลายชั่วโมงต่อมา เมื่อ heap เต็มภายใต้ภาระงานหนักและ OOM killer ของ kernel เลือกกระบวนการที่ใหญ่ที่สุดในเครื่องซึ่งก็คือ JVM จะไม่มีข้อมูลปรากฏใน log ของเซิร์ฟเวอร์ หลักฐานจะอยู่ใน sudo dmesg | grep -i oom โดยจะมีบรรทัดที่ระบุว่า Out of memory: Killed process 1234 (java) หากบริการของคุณรีสตาร์ทเอง "แบบสุ่ม" ให้ตรวจสอบที่นั่นก่อนและลดค่า -Xmx ลง

สำหรับ Paper ทางโครงการได้จัดทำเอกสารเกี่ยวกับ Aikar's flags ซึ่งเป็นชุดค่าปรับแต่ง G1GC (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 และแฟล็กอื่นๆ อีกนับสิบ) ที่ช่วยลดการหยุดชะงักจากการทำงานของ garbage collector ใน heap ขนาดใหญ่ คุณสามารถสร้างบรรทัดคำสั่งทั้งหมดได้จากเอกสารของ Paper สำหรับ heap ขนาด 2–4 GB ผลลัพธ์ที่ได้อาจไม่มากนัก แต่การใช้แฟล็กเหล่านี้ไม่มีผลเสียใดๆ

ขั้นตอนที่ 7: การสร้าง systemd unit ด้วย Restart=on-failure

เซิร์ฟเวอร์ที่เริ่มทำงานด้วยมือจะหยุดลงเมื่อคุณปิด SSH session และไม่ทำงานต่อหลังจากรีบูตเครื่อง ให้เขียน /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 อีกครั้ง

มีการตัดสินใจที่ตั้งใจไว้สองประการใน unit นี้ 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 และหยุดการทำงานของเซิร์ฟเวอร์ตัวนั้นเสีย อย่ารันเซิร์ฟเวอร์สองตัวบนพอร์ตเดียวกันเด็ดขาด

ขั้นตอนที่ 8: เปิดพอร์ต 25565 บนไฟร์วอลล์ทั้งสองชั้น

Minecraft Java ใช้โปรโตคอล TCP 25565 เท่านั้น (UDP เป็นเพียงโปรโตคอล query เสริมซึ่งปกติจะปิดไว้) บน VPS:

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

นั่นคือไฟร์วอลล์ชั้นแรก ผู้ให้บริการ VPS หลายรายยังมีไฟร์วอลล์ระดับเครือข่ายชั้นที่สองในแผงควบคุม ซึ่งมักเป็นจุดที่ผู้ใช้งานลืมเปิดใช้งาน หากใช้ SSD Nodes จะเป็นส่วนเสริม Advanced Firewall Groups ซึ่งเป็นบริการเสริมที่ต้องเลือกตอนชำระเงินหรือตั้งค่าจากแดชบอร์ด หากเซิร์ฟเวอร์ของคุณมีไฟร์วอลล์นี้ ให้เปิดพอร์ต TCP 25565 ที่นั่นด้วย อาการเมื่อกฎไฟร์วอลล์ชั้นใดชั้นหนึ่งขาดหายไปนั้นระบุสาเหตุได้ยาก: ไคลเอนต์จะค้างอยู่ที่หน้า "Connecting to the server..." และล้มเหลวด้วยข้อความ Connection timed out: no further information โดยไม่มีการปฏิเสธการเชื่อมต่อ ไม่มีข้อผิดพลาดจากเซิร์ฟเวอร์ และไม่มีบันทึกใดๆ ใน journal เนื่องจากแพ็กเก็ตไม่เคยเดินทางไปถึงเซิร์ฟเวอร์ ให้ตรวจสอบจากเครื่องที่อยู่ ภายนอก VPS ด้วยคำสั่ง nc -vz your.server.ip 25565 หากผลลัพธ์คือ succeeded แสดงว่าไฟร์วอลล์ทุกชั้นในเส้นทางเปิดอยู่ หากการเชื่อมต่อค้าง มักหมายความว่ายังมีไฟร์วอลล์สักชั้นที่ดรอปแพ็กเก็ตอยู่ อย่างไรก็ตาม เซิร์ฟเวอร์ที่ยุ่งเกินกว่าจะรับการเชื่อมต่อก็อาจทำให้เกิด timeout ได้เช่นกัน ดังนั้นควรยืนยันว่าเซิร์ฟเวอร์กำลังฟังพอร์ตอยู่จริงด้วยคำสั่ง ss บนเครื่องนั้น

ในระหว่างที่คุณใช้งาน ufw เครื่องเดียวกันนี้กำลังรัน SSH บน public IP ซึ่งจะเริ่มมี log การพยายาม brute-force เข้ามาภายในไม่กี่ชั่วโมง ตั้งค่า Fail2ban สำหรับ SSH บน Ubuntu 24.04 ก่อนที่คุณจะลืม

ตอนนี้ให้ทำการเชื่อมต่อ: ไปที่ Multiplayer, Direct Connection แล้วใส่ IP ของเซิร์ฟเวอร์ เนื่องจากคุณได้ให้สิทธิ์ op ตัวเองในขั้นตอนที่ 4 แล้ว คำสั่งในเกมจะใช้งานได้ทันที ใช้ /whitelist add FriendName สำหรับผู้เล่นแต่ละคน หรือ /gamemode creative หากนั่นคือสิ่งที่คุณวางแผนไว้

ขั้นตอนที่ 9: การใช้ whitelist เนื่องจากอินเทอร์เน็ตสแกนพบพอร์ต 25565

การเปิดเซิร์ฟเวอร์ Minecraft ทิ้งไว้บนอินเทอร์เน็ตไม่ใช่ความเสี่ยงเชิงทฤษฎี แต่เป็นความเสี่ยงจริง เนื่องจากมีเครื่องมือสแกนจำนวนมากที่กวาดหาพอร์ต 25565 ทั่วทั้ง IPv4 space อย่างต่อเนื่อง โครงการก่อกวน (griefing) ของผู้ที่ชื่นชอบได้ทำแผนที่เซิร์ฟเวอร์ที่เปิดสาธารณะไว้หลายแสนแห่งด้วยวิธีนี้ และเซิร์ฟเวอร์ที่ไม่ได้เปิดใช้งาน whitelist มักจะมีผู้บุกรุกที่ไม่ได้รับเชิญเข้ามาภายในเวลาไม่กี่วัน หรือบางครั้งก็เพียงไม่กี่ชั่วโมงเท่านั้น การใช้ whitelist จากขั้นตอนที่ 5 คือวิธีแก้ไขปัญหา: online-mode=true จะทำหน้าที่ยืนยันตัวตน และ whitelist จะจำกัดการเข้าถึงเฉพาะตัวตนที่คุณเลือกไว้เท่านั้น ทั้งสองส่วนนี้คือรูปแบบความปลอดภัยทั้งหมดของระบบ ซึ่งเพียงพอแล้วสำหรับเซิร์ฟเวอร์ที่เล่นกับกลุ่มเพื่อน

สำหรับการเข้าถึงคอนโซลโดยไม่ต้องผ่านตัวเกม, การทำสคริปต์สำรองข้อมูล หรือการตั้งค่า cron job ให้เปิดใช้งาน RCON ใน server.properties (enable-rcon=true, ใช้ rcon.password ที่รัดกุม, พอร์ต 25575) และคอมไพล์ไคลเอนต์ mcrcon ขนาดเล็กจากซอร์สโค้ดบน GitHub โดยตรงบน VPS เนื่องจากไม่มีอยู่ใน repository ของ Ubuntu ห้ามเปิดพอร์ต 25575 ใน firewall ใดๆ ทั้งสิ้น: เนื่องจาก RCON ส่งรหัสผ่านแบบ cleartext จึงต้องจำกัดให้ใช้งานได้เฉพาะผ่าน loopback เท่านั้น

ขั้นตอนที่ 10: การสำรองข้อมูลโดยไม่ทำให้โลกเสียหาย

กฎข้อเดียวคือ: ห้ามคัดลอกไดเรกทอรีของโลกในขณะที่เซิร์ฟเวอร์กำลังเขียนข้อมูลลงไป ไฟล์ Region จะถูกเขียนทับอย่างต่อเนื่องระหว่างการเล่น หากใช้ tar ที่ทำงานแข่งกับการเขียนข้อมูล จะได้ไฟล์เก็บถาวรที่มี chunk ที่เขียนไม่สมบูรณ์ และเมื่อคุณกู้คืนข้อมูลในเวลาที่จำเป็นต้องใช้งานจริง log จะเต็มไปด้วยข้อผิดพลาดในการโหลด chunk และภูมิประเทศจะมีช่องโหว่ คุณสามารถหลีกเลี่ยงปัญหานี้ได้ด้วยสองวิธี

การหยุด-คัดลอก-เริ่มใหม่ (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
sudo systemctl start minecraft

(ตั้งแต่เวอร์ชัน 26.1 เป็นต้นไป Paper จะเก็บมิติทั้งสามไว้ภายใน world/dimensions/ เหมือนกับ vanilla ดังนั้น world จึงเป็นโลกทั้งหมด เซิร์ฟเวอร์ Paper ที่ยังใช้เวอร์ชัน 1.21.11 หรือเก่ากว่าจะแยกมิติออกเป็น world, world_nether และ world_the_end ให้เพิ่มสองโฟลเดอร์นั้นเข้าไปในคำสั่ง tar ด้วย)

การใช้ Save-off เป็นการสำรองข้อมูลขณะที่เซิร์ฟเวอร์ยังทำงานอยู่: ให้ส่งคำสั่ง save-off ผ่าน RCON (เพื่อหยุดการบันทึกอัตโนมัติ) จากนั้นใช้ save-all flush (เพื่อบังคับให้เขียนข้อมูลทั้งหมดลงดิสก์และรอจนเสร็จ) แล้วจึงทำการ tar ข้อมูล จากนั้นใช้ save-on วิธีนี้คือวิธีที่ควรนำไปตั้งค่าใน cron ตอนตี 5

ไม่ว่าจะใช้วิธีใด การสำรองข้อมูลที่เก็บไว้บน VPS เครื่องเดียวกับเซิร์ฟเวอร์ไม่ใช่การสำรองข้อมูลที่แท้จริง ควรใช้ scp หรือ rclone เพื่อย้ายไฟล์เก็บถาวรออกจากเครื่อง และควรเก็บสำรองไว้มากกว่าหนึ่งชุด และเนื่องจากคุณคงไม่ได้เฝ้าหน้าจอ console ตลอดเวลาเมื่อเกิดปัญหา ควรตั้งค่าการตรวจสอบพอร์ตจากภายนอกไว้: Uptime Kuma บนเครื่องอื่น ที่ทำการตรวจสอบ TCP กับพอร์ต 25565 จะแจ้งให้คุณทราบว่าเซิร์ฟเวอร์ล่มก่อนที่ผู้เล่นของคุณจะรู้ตัว

ปลั๊กอินและการอัปเกรด

ในทางทฤษฎี การติดตั้งปลั๊กอินทำได้เพียงแค่นำไฟล์ jar ไปวางไว้ใน /opt/minecraft/plugins/ แล้วรีสตาร์ทเซิร์ฟเวอร์เท่านั้น การติดตั้งก็เสร็จสิ้น ควรดาวน์โหลดปลั๊กอินจากหน้าเว็บไซต์หลักของโครงการเท่านั้น (เช่น Hangar, Modrinth, SpigotMC) ด้วยเหตุผลเดียวกับไฟล์เซิร์ฟเวอร์ jar นั่นคือ ปลั๊กอินแต่ละตัวคือโค้ดที่ทำงานด้วยสิทธิ์ของผู้ใช้ minecraft

การอัปเกรดเซิร์ฟเวอร์ทำได้โดย: หยุดการทำงาน, สำรองข้อมูล, แทนที่ไฟล์ server.jar ด้วย build สำหรับ Minecraft เวอร์ชันใหม่ แล้วเริ่มการทำงานใหม่ มีข้อควรระวังสองประการ ประการแรก การอัปเกรดโลกเป็นแบบทางเดียว โลกที่ถูกเปิดด้วยเวอร์ชันใหม่จะไม่สามารถเปิดด้วยเวอร์ชันเก่าได้ ซึ่งเป็นเหตุผลที่ต้องมีการสำรองข้อมูล ประการที่สอง ปลั๊กอินมักจะรองรับเวอร์ชันใหม่ของ Minecraft ล่าช้ากว่าหลายวันหรือหลายสัปดาห์ ดังนั้นควรตรวจสอบความเข้ากันได้ก่อนที่จะรีบอัปเกรดในวันแรกที่ปล่อยเวอร์ชันใหม่ การเปลี่ยนจาก 1.21.11 ไปเป็น 26.1 หรือใหม่กว่านั้น จำเป็นต้องใช้ Java 25 (ขั้นตอนที่ 1) และจะย้ายโฟลเดอร์ Nether และ End ของ Paper ไปไว้ใน world/dimensions/

หากคุณต้องการจัดการสิ่งเหล่านี้ผ่านคอนเทนเนอร์ โดยใช้การล็อกเวอร์ชัน (version pinning), การยอมรับ EULA และการตั้งค่า memory flags ผ่าน environment variables คุณสามารถใช้ image itzg/minecraft-server ที่ได้รับความนิยมเพื่อรัน Paper server ตัวเดียวกันได้ โดยดูรายละเอียดเพิ่มเติมที่ Docker Compose บน VPS ของคุณ ซึ่งยังคงต้องใช้มาตรการด้านไฟร์วอลล์และการสำรองข้อมูลที่เข้มงวดเช่นเดิม

FAQ

เซิร์ฟเวอร์ Minecraft ต้องการ RAM เท่าไร?

RAM ขนาด 2 GB เพียงพอสำหรับรัน vanilla ให้ผู้เล่น 2–5 คน, ขนาด 4 GB เหมาะสมสำหรับเซิร์ฟเวอร์กลุ่มเพื่อนประมาณ 10 คนที่ใช้ Paper พร้อมปลั๊กอินจำนวนหนึ่ง ส่วน modpack และผู้เล่นมากกว่า 20 คนควรใช้ 8 GB ขึ้นไป ไม่ว่า VPS จะมีขนาดเท่าใด ให้ตั้งค่า -Xmx ไว้ที่ไม่เกิน RAM รวมลบด้วย 1 GB เนื่องจาก JVM มีการใช้หน่วยความจำส่วนอื่นนอกเหนือจาก heap หากตั้งค่าเกินจะส่งผลให้เกิด Error: Could not reserve enough space for object heap หรือถูกระบบสั่ง OOM kill โดยไม่มีการแจ้งเตือน

ทำไมเพื่อนถึงเชื่อมต่อเข้าเซิร์ฟเวอร์ Minecraft ของฉันไม่ได้?

หากไคลเอนต์ค้างและจบลงด้วย Connection timed out: no further information มักเกิดจากปัญหาไฟร์วอลล์: ให้ตรวจสอบ ufw บน VPS และไฟร์วอลล์เครือข่ายของผู้ให้บริการหากมีการเปิดใช้งานในแผงควบคุม พอร์ต TCP 25565 ต้องเปิดอยู่ในทุกไฟร์วอลล์ที่เกี่ยวข้อง ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์กำลังฟังพอร์ตอยู่จริงด้วย sudo ss -tlnp | grep 25565 บนเครื่อง จากนั้นทดสอบจากภายนอกด้วย nc -vz your.server.ip 25565

ฉันควรตั้งค่า online-mode=false ใน server.properties หรือไม่?

ไม่ควร หากตั้งเป็น online-mode=false เซิร์ฟเวอร์จะข้ามการตรวจสอบสิทธิ์ของ Mojang ทั้งหมด ทำให้ใครก็ตามสามารถเข้าร่วมด้วยชื่อผู้ใช้ใดก็ได้ รวมถึงชื่อของ op ซึ่งจะทำให้ได้รับสิทธิ์ของผู้ดูแลระบบทันที อีกทั้งสกินและ UUID ที่เสถียรจะใช้งานไม่ได้ การใช้งานที่ถูกต้องเพียงอย่างเดียวคือการรันหลังพร็อกซีที่มีการตรวจสอบสิทธิ์ เช่น Velocity ซึ่งทำหน้าที่ตรวจสอบผู้เล่นแทน สำหรับเซิร์ฟเวอร์ทั่วไปควรตั้งค่าเป็น true ไว้เสมอ

Paper ดีกว่าเซิร์ฟเวอร์ Minecraft แบบ vanilla หรือไม่?

สำหรับผู้ใช้ส่วนใหญ่ คำตอบคือใช่: Paper เป็นไฟล์ jar ที่สามารถนำไปใช้แทนที่ vanilla ได้ทันที โดยรองรับโลกเดิมของผู้เล่นและไคลเอนต์ที่ไม่ผ่านการดัดแปลง อีกทั้งยังประมวลผลเอนทิตีและโหลด chunk ได้มีประสิทธิภาพมากกว่ามาก รวมถึงรองรับระบบปลั๊กอิน ข้อยกเว้นคือกลุ่มผู้เล่นสายเทคนิคที่เน้นระบบ redstone ซึ่งต้องการพฤติกรรมแบบ vanilla ที่แม่นยำในระดับบิต ซึ่งการปรับแต่งบางอย่างของ Paper อาจส่งผลกระทบต่อส่วนนี้ สำหรับ VPS ขนาดเล็ก ประสิทธิภาพของ Paper เปรียบเสมือนการเพิ่ม RAM ให้ฟรี

ฉันจะสำรองข้อมูลโลกของ Minecraft โดยไม่ให้ไฟล์เสียหายได้อย่างไร?

ห้ามบีบอัดไดเรกทอรีของโลกในขณะที่เซิร์ฟเวอร์กำลังเขียนข้อมูลลงไป เพราะการคัดลอกไฟล์ในขณะที่ระบบกำลังเขียน region-file จะทำให้เกิด chunk เสียหายซึ่งจะพบปัญหาเมื่อเรียกคืนข้อมูลเท่านั้น วิธีที่ถูกต้องคือหยุดเซิร์ฟเวอร์ก่อนแล้วจึงใช้ tar บีบอัดไดเรกทอรีของโลก จากนั้นจึงเริ่มเซิร์ฟเวอร์ใหม่ หรือหากต้องการให้เซิร์ฟเวอร์ทำงานต่อเนื่อง ให้ใช้ save-off, save-all flush, tar และ save-on ผ่าน RCON จากนั้นจึงย้ายไฟล์ที่บีบอัดออกจาก VPS