SSD Nodes Learn Hosting plans →
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-08-07

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

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

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

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

คำเตือนตามตรงสองข้อก่อนที่คุณจะเสียเงิน ข้อแรก Minecraft กินหน่วยความจำสูงและส่วนใหญ่ทำงานแบบ single-threaded: VPS ขนาด 1 GB ไม่สามารถรันเซิร์ฟเวอร์ที่เล่นได้จริง และ CPU หนึ่งคอร์ที่เร็วจะดีกว่าสี่คอร์ที่ช้า ข้อสอง นี่คือ 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 21

Minecraft 1.20.5 และทุกรุ่นที่ปล่อยออกมาหลังจากนั้น (รวมถึง 1.21.x ทั้งหมด) จำเป็นต้องใช้ Java 21 โดย Ubuntu 24.04 มี Java 21 มาให้ใน repository มาตรฐาน และรุ่น headless จะตัดไลบรารีสำหรับเดสก์ท็อปที่เซิร์ฟเวอร์ไม่ได้ใช้งานออกไป:

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 ที่ถูกค้นหามากที่สุดในภายหลัง หากใช้ Java 17 ตัวเซิร์ฟเวอร์ 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 อีกครั้ง

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

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

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

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

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

คุณควรดาวน์โหลดไฟล์ server jar จากแหล่งที่มาเพียง 2 แห่งเท่านั้น ได้แก่ หน้าดาวน์โหลดเซิร์ฟเวอร์อย่างเป็นทางการที่ 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 ขนาดประมาณ 50 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 ส่วนใหญ่จะมีไฟร์วอลล์ระดับเครือข่ายชั้นที่สองอยู่ในแผงควบคุม ซึ่งเป็นจุดที่ผู้ใช้มักลืมเปิดใช้งาน ให้เปิดพอร์ต TCP 25565 ที่นั่นด้วย อาการของการเปิดไฟร์วอลล์ไม่ครบทั้งสองชั้นนั้นระบุสาเหตุได้ยากมาก: ไคลเอนต์จะค้างอยู่ที่หน้า "Connecting to the server..." และล้มเหลวด้วยข้อความ Connection timed out: no further information โดยไม่มีการปฏิเสธการเชื่อมต่อ ไม่มีข้อผิดพลาดจากเซิร์ฟเวอร์ และไม่มีข้อมูลใน journal เนื่องจากแพ็กเก็ตไม่เคยส่งไปถึงปลายทาง ให้ตรวจสอบจากเครื่องที่อยู่ ภายนอก VPS ด้วยคำสั่ง nc -vz your.server.ip 25565 หากได้ผลลัพธ์เป็น succeeded แสดงว่าไฟร์วอลล์ทั้งสองชั้นเปิดใช้งานแล้ว แต่ถ้าค้างแสดงว่ามีอย่างน้อยหนึ่งชั้นที่ยังไม่ได้เปิด

ในระหว่างที่คุณใช้งาน 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) เป็นวิธีที่ง่ายที่สุด แต่ต้องแลกกับการหยุดให้บริการชั่วคราวประมาณหนึ่งนาที:

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 ดังนั้นให้ตัดสองโฟลเดอร์หลังออกหากใช้ vanilla)

การปิดการบันทึก (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) ด้วยเหตุผลเดียวกับการเลือกใช้ server jar นั่นคือปลั๊กอินแต่ละตัวคือโค้ดที่ทำงานในฐานะผู้ใช้ minecraft

การอัปเกรดเซิร์ฟเวอร์มีขั้นตอนคือ: หยุดการทำงาน, สำรองข้อมูล, แทนที่ server.jar ด้วย build สำหรับ Minecraft เวอร์ชันใหม่ แล้วเริ่มการทำงานใหม่ มีข้อควรระวังสองประการ ประการแรก การอัปเกรดโลกเป็นแบบทางเดียว โลกที่ถูกเปิดด้วยเวอร์ชันที่ใหม่กว่าจะไม่สามารถเปิดด้วยเวอร์ชันที่เก่ากว่าได้ ซึ่งนี่เป็นเหตุผลที่ต้องมีการสำรองข้อมูล ประการที่สอง ปลั๊กอินมักจะรองรับ Minecraft เวอร์ชันใหม่ล่าช้ากว่าการปล่อยอัปเกรดจริงหลายวันหรือหลายสัปดาห์ ดังนั้นควรตรวจสอบความเข้ากันได้ก่อนที่จะรีบอัปเกรดในวันแรกที่ปล่อยเวอร์ชันใหม่

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

FAQ

Minecraft server ต้องใช้ RAM เท่าไหร่?

การรัน vanilla สำหรับผู้เล่น 2–5 คนใช้ RAM 2 GB ส่วน 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 server ของฉันไม่ได้?

หาก client ค้างและจบลงด้วย Connection timed out: no further information มักเกิดจาก firewall ซึ่งมีอยู่สองจุดคือ ufw บน VPS และ network firewall ของผู้ให้บริการในแผงควบคุม ต้องเปิดพอร์ต TCP 25565 ในทั้งสองจุด ตรวจสอบว่าเซิร์ฟเวอร์กำลังฟังพอร์ตอยู่จริงด้วย 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 ดีกว่า Minecraft server แบบ vanilla หรือไม่?

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

จะสำรองข้อมูล Minecraft world อย่างไรไม่ให้ไฟล์เสียหาย?

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