SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor

Cài server Minecraft Paper trên VPS Ubuntu 24.04

Hướng dẫn chạy Paper Minecraft trên VPS Ubuntu 24.04: chọn RAM, dùng Java 25, tạo systemd, mở 25565 trong ufw, backup world an toàn và sửa lỗi cụ thể.

Bạn sẽ xây dựng gì

Một server Minecraft Java Edition chạy ổn định: Paper trên Ubuntu 24.04, chạy bằng user minecraft riêng dưới systemd với Restart=on-failure, đã bật whitelist, mở cổng 25565 trong ufw và trong network firewall của nhà cung cấp nếu có bật, đồng thời có backup được thực hiện theo cách không làm hỏng world mà chúng cần bảo vệ. Bản thân server chỉ gồm một jar và một lệnh java; mọi yếu tố quyết định một server để bạn bè chơi suốt một năm thay vì chết ngay cuối tuần đầu tiên đều nằm xung quanh lệnh đó. Đó là nội dung của hướng dẫn này.

Có 2 cảnh báo thực tế trước khi bạn chi tiền. Thứ nhất, Minecraft cần nhiều memory và phần lớn chạy trên một thread: VPS 1 GB không thể chạy server đủ để chơi được, còn 1 core nhanh tốt hơn 4 core chậm. Thứ hai, đây là Java Edition. Người chơi Bedrock, console, điện thoại và ứng dụng Windows Bedrock không thể tham gia server Java; Bedrock cần server software khác chạy trên UDP 19132 hoặc plugin Geyser, nằm ngoài phạm vi của hướng dẫn này.

Bạn cần một KVM VPS Ubuntu 24.04 mới cài, có root hoặc sudo, và khoảng 30 phút.

Cấu hình phần cứng: server cho bạn bè thực sự cần gì

RAM là yếu tố quan trọng nhất, và các con số thực tế thấp hơn những gì các diễn đàn modpack thường đề xuất:

  • 2 GB chạy vanilla cho 2–5 người chơi ở khoảng cách hiển thị vừa phải. Có thể chơi được nhưng không còn dư tài nguyên.
  • 4 GB là mức phù hợp cho server của nhóm bạn: khoảng 10 người chơi đồng thời trên Paper với một số plugin, đồng thời vẫn đủ RAM cho hệ điều hành.
  • 8 GB trở lên phù hợp với modpack và hơn 20 người chơi. Khi đó, bạn cũng nên chú ý đến tốc độ CPU đơn nhân vì vòng lặp chính của game chạy trên một thread.

Thế giới cũng chiếm thêm dung lượng disk khi người chơi khám phá. Một thế giới survival được khám phá nhiều có thể đạt vài gigabyte, vì vậy hãy chừa dung lượng cho cả world và backup.

Vanilla hay Paper? Paper là bản thay thế có thể dùng trực tiếp cho file jar chính thức: dùng cùng world, cùng client và không cần mod phía client. Paper viết lại các phần chậm nhất của server, gồm việc tải chunk, xử lý entity và hopper, đồng thời cung cấp plugin API. Lý do duy nhất để chạy vanilla là khi bạn cần cơ chế vanilla chính xác đến từng bit cho các farm redstone kỹ thuật mà các tối ưu hóa của Paper có thể làm thay đổi. Với mọi trường hợp khác, Paper hỗ trợ nhiều người chơi hơn trên mỗi gigabyte. Tất cả nội dung bên dưới đều áp dụng cho cả hai.

Bước 1: cài đặt Java 25

Minecraft 26.1 và mọi bản phát hành từ đó yêu cầu Java 25; Java 21 chỉ hỗ trợ dòng phiên bản cũ hơn, từ 1.20 đến 1.21.11. Ubuntu 24.04 cung cấp Java 25 trong các repository cập nhật và bảo mật. Cài đặt JRE đầy đủ, không phải bản build -headless: hướng dẫn cài đặt Java của Paper cảnh báo không dùng các biến thể headless vì chúng thiếu các dependency mà Paper cần.

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

Kết quả đúng: dòng đầu tiên hiển thị openjdk version "25.0.x". Nếu hiển thị 21, 17 hoặc 11, một JRE khác đang được cài đặt và được ưu tiên; hãy sửa bằng sudo update-alternatives --config java rồi chọn entry chứa java-25.

Bỏ qua bước kiểm tra này sẽ gây ra lỗi Minecraft server được tìm kiếm nhiều nhất ở bước sau. Với Java 21, server jar sẽ dừng ngay lập tức với lỗi:

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

Các số cho biết sự không tương thích: class file version 69.0 là Java 25, 65.0 là Java 21, còn 61.0 là Java 17. Dù bạn thấy cặp số nào, cách sửa vẫn giống nhau: cài JRE mới hơn rồi chạy lại update-alternatives.

Bước 2: dùng user riêng, không bao giờ dùng root

Server thực thi code của plugin và phân tích dữ liệu mạng từ bất kỳ ai có thể truy cập cổng này. Nếu xảy ra sự cố, một phiên bị breach chạy dưới quyền root sẽ kiểm soát toàn bộ VPS; còn phiên chạy dưới quyền minecraft chỉ kiểm soát một game world.

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

--system tạo một account không có password và không thể đăng nhập qua SSH, với /opt/minecraft làm thư mục home và thư mục làm việc. Từ đây trở đi, mọi command thao tác với server đều chạy dưới user này.

Bước 3: tải server jar từ nguồn chính thức

Chỉ có 2 nơi được phép cung cấp server jar: trang tải server chính thức tại minecraft.net cho vanilla và trang tải xuống tại papermc.io cho Paper. Các “download hub” bên thứ ba đóng gói lại server jar là một kênh phát tán malware lâu nay. Server jar chứa mã tùy ý mà bạn sắp chạy 24/7 trên một máy chủ có thể truy cập từ Internet.

Sao chép link tải của build hiện tại từ trang chính thức. URL thay đổi theo từng version và build, nên hardcode một URL cố định ở đây sẽ nhanh chóng lỗi thời. Sau đó chạy:

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

Kết quả đúng: một server.jar có dung lượng khoảng 60 MB, thuộc sở hữu của minecraft, được xác nhận bằng ls -lh /opt/minecraft/server.jar.

Bước 4: chạy lần đầu, EULA và tự cấp quyền operator

Chạy server ở chế độ tương tác một lần trước khi cấu hình systemd. Lần chạy đầu có đúng hai việc mà chỉ console trực tiếp mới thực hiện tốt.

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

Server sẽ thoát trong vài giây. Paper sẽ mất thêm một lúc để áp dụng các bản vá trước. Sau đó log kết thúc bằng dòng mà mọi người đều gặp:

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

Đây không phải lỗi mà là bước xác nhận license. Lần chạy này đã tạo eula.txt bên cạnh file jar. Nếu chưa đọc, hãy đọc EULA được liên kết, rồi bật flag này:

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

Chạy lại chính lệnh java. Lần này server sẽ tạo world. Lần boot đầu có thể mất một hoặc hai phút. Sau đó server sẽ dừng ở:

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

Bây giờ bạn đã có một console đang hoạt động. Dùng console này cho việc thứ hai: nhập op YourMinecraftName (đúng username trong game của bạn). Server sẽ ghi bạn vào ops.json. Sau này, khi không có console được gắn vào server, bạn có thể chạy mọi admin command từ trong game. Sau đó nhập stop để lưu và thoát đúng cách.

Bước 5: server.properties và lý do online-mode luôn giữ giá trị true

Lần chạy đầu tiên cũng đã ghi server.properties. Hầu hết giá trị mặc định đều phù hợp. Bạn chỉ cần cân nhắc kỹ các dòng sau:

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 khiến server xác minh mọi username đăng nhập với session server của Mojang để chứng minh người chơi sở hữu tài khoản đó. Đặt thành false, tức bật chế độ “cracked server”, nghĩa là server chấp nhận danh tính do client tự khai báo: bất kỳ ai cũng có thể vào bằng bất kỳ tên nào, kể cả tên của bạn. Vì ops và whitelist được xác định theo tên, kẻ giả mạo có thể đăng nhập với quyền operator của bạn. Lý do hợp lệ duy nhất để đặt giá trị này thành false là khi server chạy sau một proxy có chức năng xác thực như Velocity, nơi proxy tự xác minh người chơi. Với server thông thường, giá trị này luôn giữ là true.

view-distance là tùy chọn ảnh hưởng lớn nhất đến hiệu năng trong file này. Chi phí CPU và RAM tăng gần tương ứng với bình phương giá trị này. 8 là giá trị mặc định hợp lý cho VPS; 10 là giá trị mặc định của vanilla và nặng hơn thấy rõ.

white-list=true cùng với enforce-whitelist=true ngăn người lạ truy cập server. Phần bảo mật bên dưới giải thích vì sao đây không phải tùy chọn. Thêm người chơi bằng /whitelist add TheirName trong game khi đang là op.

Bước 6: các flag bộ nhớ, vì sao -Xms và -Xmx nên giống nhau

JVM cấp phát heap trong khoảng từ -Xms (kích thước ban đầu) đến -Xmx (giới hạn trên). Trên một game server chuyên dụng, hãy đặt hai giá trị này bằng nhau: heap trước sau cũng sẽ đạt giới hạn trên, còn việc tăng heap theo từng bước chỉ làm garbage collector hoạt động nhiều hơn trong lúc chơi. Trên VPS 4 GB, cặp giá trị phù hợp là:

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

-Xmx không phải là tổng bộ nhớ mà process sử dụng. JVM còn cần thêm phần overhead ngoài heap, thread stack, JIT cache và direct buffer, thường từ khoảng nửa gigabyte trở lên; Ubuntu cũng cần có bộ nhớ riêng. Quy tắc thực tế là: -Xmx tối đa bằng RAM của VPS trừ 1 GB. Nếu đặt quá cao, bạn sẽ gặp một trong hai lỗi. Nếu cấp phát thất bại ngay từ đầu, server sẽ không khởi động và hiển thị:

Error: Could not reserve enough space for object heap

Lỗi này rõ ràng và xảy ra ngay lập tức. Trường hợp nghiêm trọng hơn là server khởi động bình thường rồi dừng sau vài giờ, khi heap đầy dưới tải và OOM killer của kernel chọn process lớn nhất trên máy, tức JVM. Server log không ghi lại gì; bằng chứng nằm trong sudo dmesg | grep -i oom, với một dòng như Out of memory: Killed process 1234 (java). Nếu service của bạn tự restart “ngẫu nhiên”, hãy kiểm tra phần này trước và giảm -Xmx.

Đối với Paper, project có tài liệu về Aikar's flags, một bộ flag G1GC đã được tinh chỉnh (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 và một tá flag liên quan) để giảm độ dao động của các lần tạm dừng garbage collection trên heap lớn. Hãy tạo dòng đầy đủ từ tài liệu Paper; với heap 2–4 GB, mức cải thiện không lớn nhưng các flag này không gây hại.

Bước 7: unit systemd với Restart=on-failure

Server được khởi động thủ công sẽ dừng cùng phiên SSH của bạn và vẫn không chạy lại sau khi reboot. Hãy viết /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

Kết quả đúng: status hiển thị active (running), còn journal, hiện đã ghi cả output của server, kết thúc lại tại dòng Done.

Unit này có 2 lựa chọn có chủ ý. Restart=on-failure khởi động lại server sau khi crash nhưng không khởi động lại sau stop bình thường, để vẫn có thể bảo trì. TimeoutStopSec=120 cũng quan trọng hơn bạn nghĩ: systemctl stop gửi SIGTERM, Minecraft server bắt tín hiệu này và lưu mọi world trước khi thoát, mà việc lưu một world lớn cần thời gian. Timeout mặc định của systemd có thể gửi SIGKILL cho JVM khi đang lưu, đây chính là nguyên nhân làm hỏng các region file. Hãy đặt timeout là 2 phút.

Nếu service liên tục khởi động rồi dừng và journal hiển thị:

[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?

thì đã có tiến trình khác chiếm cổng 25565, gần như chắc chắn là lần chạy foreground trước đó vẫn còn hoạt động trong một phiên SSH khác. Tìm tiến trình đó bằng sudo ss -tlnp | grep 25565 rồi dừng bản sao đó; không bao giờ chạy 2 server trên cùng một cổng.

Bước 8: mở cổng 25565 trên cả hai firewall

Minecraft Java chỉ sử dụng TCP 25565 (UDP chỉ dành cho query protocol tùy chọn và mặc định bị tắt). Trên VPS:

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

Đó là firewall thứ nhất. Nhiều nhà cung cấp VPS còn cung cấp firewall thứ hai ở cấp mạng trong control panel. Khi firewall này được bật, nhiều người thường quên cấu hình nó. Trên SSD Nodes, đó là add-on Advanced Firewall Groups, một tùy chọn trả phí được gán khi checkout hoặc trong dashboard. Nếu server của bạn có firewall này, hãy mở TCP 25565 tại đó.

Triệu chứng khi thiếu rule trên một trong hai firewall rất khó xác định: client treo ở trạng thái "Connecting to the server..." rồi thất bại với Connection timed out: no further information. Không có thông báo từ chối kết nối, không có lỗi từ server và không có gì trong journal vì các packet chưa bao giờ đến được server. Hãy kiểm tra từ một máy bên ngoài VPS bằng nc -vz your.server.ip 25565. succeeded nghĩa là mọi firewall trên đường truyền đều đã mở. Nếu kết nối vẫn treo, thường là một firewall vẫn đang drop packet. Tuy nhiên, host quá bận và không thể nhận kết nối cũng có thể gây timeout. Vì vậy, hãy xác nhận server đang listen bằng ss ngay trên máy chủ.

Trong lúc đang cấu hình ufw, hãy nhớ rằng chính máy này đang chạy SSH trên public IP. Log do brute-force sẽ bắt đầu tăng trong vài giờ. Hãy cấu hình Fail2ban cho SSH trên Ubuntu 24.04 trước khi quên.

Bây giờ hãy kết nối: Multiplayer, Direct Connection, nhập IP của server. Vì bạn đã tự cấp quyền op ở bước 4, các lệnh trong game hoạt động ngay lập tức, /whitelist add FriendName cho từng người chơi và /gamemode creative nếu đó là kế hoạch của bạn.

Bước 9: whitelist vì Internet luôn quét cổng 25565

Để Minecraft server mở trên Internet không phải là một rủi ro lý thuyết: các công cụ quét diện rộng liên tục quét toàn bộ không gian IPv4 để tìm cổng 25565, những dự án phá hoại mang tính giải trí đã lập bản đồ hàng trăm nghìn server mở theo cách này, và server không bật whitelist sẽ có người lạ truy cập trong vài ngày, đôi khi chỉ vài giờ. Whitelist ở bước 5 là cách xử lý: online-mode=true xác minh danh tính, còn whitelist giới hạn quyền truy cập vào những danh tính bạn đã chọn. Hai cơ chế này tạo thành toàn bộ mô hình bảo mật và đủ dùng cho server của nhóm bạn.

Để truy cập console mà không cần vào game, chạy backup bằng script hoặc dùng cron job, hãy bật RCON trong server.properties (enable-rcon=true, một rcon.password mạnh, cổng 25575) rồi build client mcrcon nhỏ từ source trên GitHub ngay trên VPS; client này không có trong repository của Ubuntu. Không mở cổng 25575 trên bất kỳ firewall nào: RCON gửi password dưới dạng cleartext, nên chỉ được phép lắng nghe trên loopback.

Bước 10: backup không làm hỏng world

Quy tắc duy nhất: không bao giờ copy thư mục world khi server đang ghi vào đó. Các region file liên tục được ghi lại trong lúc chơi; một tar chạy đồng thời với thao tác ghi sẽ tạo ra archive chứa các chunk bị ghi dở. Khi bạn khôi phục archive đó, đúng lúc backup cần hoạt động nhất, log sẽ đầy lỗi tải chunk và địa hình sẽ bị thủng. Có hai cách để tránh việc này.

Stop-copy-start là cách đơn giản, nhưng phải chấp nhận downtime khoảng một phút:

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

(Từ 26.1, Paper lưu cả ba dimension bên trong world/dimensions/, giống vanilla, nên world là toàn bộ world. Server Paper vẫn chạy 1.21.11 hoặc cũ hơn sẽ tách chúng thành world, world_nether và world_the_end; khi đó hãy thêm hai thư mục này vào tar.)

Save-off cho phép backup khi server vẫn đang chạy: qua RCON, chạy save-off (dừng autosaver), sau đó chạy save-all flush (buộc ghi mọi thứ xuống disk và chờ hoàn tất), tạo tar, rồi chạy save-on. Đây là phiên bản nên đưa vào cron lúc 5 giờ sáng.

Dù dùng cách nào, backup nằm trên cùng VPS với server thì không phải là backup. Hãy scp hoặc rclone các archive ra khỏi máy và giữ lại nhiều hơn một bản. Vì bạn sẽ không ngồi nhìn console khi có lỗi, hãy đặt một hệ thống kiểm tra bên ngoài cho port: Uptime Kuma trên một máy khác thực hiện TCP check đến 25565 để báo server đã down trước khi người chơi phát hiện.

Plugin và nâng cấp

Trên Paper, cài plugin chỉ là chép một file jar vào /opt/minecraft/plugins/ rồi restart. Không có bước nào khác. Chỉ lấy plugin từ trang chính thức của dự án, như Hangar, Modrinth hoặc SpigotMC, vì cùng lý do với server jar: mỗi plugin là mã tùy ý chạy dưới user minecraft.

Nâng cấp server gồm các bước: stop, backup, thay server.jar bằng bản build dành cho phiên bản Minecraft mới, rồi start. Có 2 điểm cần lưu ý. Nâng cấp world chỉ thực hiện được theo một chiều. World đã mở bằng phiên bản mới hơn sẽ không mở được bằng phiên bản cũ hơn. Đây là một lý do khác để luôn có backup. Plugin thường chưa hỗ trợ phiên bản Minecraft mới trong vài ngày hoặc vài tuần. Vì vậy, hãy kiểm tra tính tương thích trước khi cập nhật ngay trong ngày đầu tiên. Khi chuyển từ 1.21.11 sang 26.1 hoặc mới hơn, bạn cũng cần Java 25 (bước 1). Paper đồng thời chuyển các thư mục Nether và End vào world/dimensions/.

Nếu muốn quản lý toàn bộ việc này bằng container, đặt version pinning, chấp nhận EULA và các memory flag dưới dạng biến môi trường, image itzg/minecraft-server được sử dụng rộng rãi sẽ chạy cùng Paper server qua Docker Compose trên VPS của bạn, với cùng cách quản lý firewall và backup.

FAQ

Máy chủ Minecraft cần bao nhiêu RAM?

2 GB đủ chạy vanilla cho 2–5 người chơi; 4 GB đủ thoải mái cho server bạn bè khoảng 10 người chơi trên Paper với một vài plugin; modpack và hơn 20 người chơi cần 8 GB trở lên. Dù VPS có dung lượng bao nhiêu, hãy đặt -Xmx tối đa bằng tổng RAM trừ 1 GB, vì JVM còn dùng bộ nhớ ngoài heap; nếu đặt quá cao, hệ thống có thể kết thúc bằng Error: Could not reserve enough space for object heap hoặc OOM kill âm thầm.

Tại sao bạn bè không thể kết nối đến server Minecraft của tôi?

Client bị treo rồi kết thúc bằng Connection timed out: no further information thường cho thấy vấn đề ở firewall: ufw trên VPS và network firewall của nhà cung cấp nếu được bật trong control panel. TCP 25565 phải được mở trên mọi firewall trong đường đi. Xác nhận server thực sự đang listening bằng sudo ss -tlnp | grep 25565 trên máy chủ, sau đó kiểm tra từ bên ngoài bằng nc -vz your.server.ip 25565.

Tôi có nên đặt online-mode=false trong server.properties không?

Không. Với online-mode=false, server bỏ qua hoàn toàn bước xác thực của Mojang. Vì vậy, bất kỳ ai cũng có thể tham gia bằng bất kỳ username nào, kể cả tên của một op, rồi thừa hưởng quyền của người đó. Skins và UUID ổn định cũng sẽ bị lỗi. Trường hợp sử dụng hợp lệ duy nhất là chạy phía sau một proxy có xác thực như Velocity, nơi proxy tự xác minh người chơi. Với server thông thường, giá trị này phải giữ là true.

Paper có tốt hơn server Minecraft vanilla không?

Với gần như mọi người, có. Paper là một jar có thể thay trực tiếp, tải được world vanilla, chấp nhận client không chỉnh sửa, xử lý entity và tải chunk hiệu quả hơn nhiều, đồng thời cung cấp hệ sinh thái plugin. Ngoại lệ là các cộng đồng technical-redstone cần hành vi vanilla chính xác tuyệt đối theo từng bit, vì một số tối ưu của Paper làm thay đổi hành vi đó. Trên VPS nhỏ, hiệu suất của Paper gần như tương đương với việc có thêm RAM miễn phí.

Làm thế nào để backup world Minecraft mà không làm hỏng dữ liệu?

Không bao giờ archive thư mục world khi server đang ghi dữ liệu vào đó. Việc copy đồng thời với lúc ghi region file có thể tạo ra chunk bị hỏng, nhưng chỉ phát hiện được khi restore. Bạn có thể dừng server, tar các thư mục world rồi khởi động lại; hoặc giữ server đang chạy bằng save-off, save-all flush, tar và save-on qua RCON. Sau đó, chuyển archive ra khỏi VPS.