SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-08-07

Cách host server Minecraft trên VPS Ubuntu 24.04

Chạy Paper Minecraft trên VPS Ubuntu 24.04 với Java 21, systemd, whitelist và hai firewall mở cổng 25565; kèm cách backup world an toàn và lỗi chính xác.

Những gì bạn sẽ xây dựng

Một server Minecraft Java Edition hoạt động ổn định: Paper trên Ubuntu 24.04, chạy dưới user chuyên dụng minecraft bằng systemd với Restart=on-failure, bật whitelist, mở cổng 25565 trên cả hai firewall nằm giữa người chơi và JVM, đồng thời tạo backup theo cách không làm hỏng world mà backup 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 trong một năm thay vì chết ngay cuối tuần đầu tiên đều xoay quanh lệnh đó, và đó là nội dung của hướng dẫn này.

Có hai cảnh báo cần nói rõ 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òn một core nhanh tốt hơn bốn 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ể vào server Java; Bedrock cần server software khác chạy trên UDP 19132 hoặc plugin Geyser, nhưng 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ó quyền root hoặc sudo, và khoảng ba mươi 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 21

Minecraft 1.20.5 và mọi bản phát hành từ phiên bản này trở đi, bao gồm toàn bộ 1.21.x, yêu cầu Java 21. Ubuntu 24.04 có sẵn phiên bản này trong repository mặc định. Bản headless không cài các thư viện desktop mà server không sử dụng:

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

Kết quả đúng: dòng đầu tiên hiển thị openjdk version "21.0.x". Nếu hiển thị 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 mục chứa java-21.

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

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

Các số cho biết sự không tương thích: class file version 65.0 là Java 21, 61.0 là Java 17, 60.0 là Java 16. Dù bạn thấy cặp số nào, cách khắc phục vẫn như 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 đã tồn tại lâu năm. Server jar là mã tùy ý mà bạn sắp chạy 24/7 trên một máy chủ có kết nối Internet.

Sao chép liên kết tải xuống của build hiện tại từ trang chính thức, rồi 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 50 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ùng cho query protocol tùy chọn và mặc định đang tắt). Trên VPS:

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

Đó là firewall thứ nhất. Hầu hết nhà cung cấp VPS chạy thêm một firewall ở cấp mạng trong control panel, và đây là firewall mọi người thường quên. Hãy mở TCP 25565 ở đó nữa. Nếu chỉ mở một trong hai firewall, triệu chứng sẽ rất khó xác định: client treo ở trạng thái "Connecting to the server..." rồi báo lỗ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ì packet chưa bao giờ đến được máy chủ. 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à cả hai firewall đều đã mở, còn nếu kết nối bị treo thì ít nhất một firewall vẫn chưa mở.

Trong lúc đang cấu hình ufw, hãy nhớ máy này đang chạy SSH trên một public IP và log sẽ bắt đầu có nhiều dòng brute-force chỉ sau 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 đã cấp quyền op cho tài khoản của mình ở bước 4, các lệnh trong game sẽ hoạt động ngay; dùng /whitelist add FriendName cho từng người chơi, hoặc /gamemode creative nếu đó là kế hoạch.

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 toàn bộ thế giới

Quy tắc duy nhất: không bao giờ copy thư mục world trong khi server đang ghi dữ liệu vào đó. Các file region 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 chưa được ghi hoàn chỉnh. Khi bạn khôi phục archive đó, đúng vào lúc backup cần hoạt động nhất, log sẽ đầy lỗi tải chunk và địa hình sẽ xuất hiện các khoảng trống. Có 2 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 1 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 world_nether world_the_end
sudo systemctl start minecraft

(Paper tách các dimension thành world, world_netherworld_the_end; server vanilla lưu tất cả trong world, vì vậy hãy bỏ 2 thư mục còn lại vào đó.)

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 dữ liệu ra 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 backup. Hãy scp hoặc rclone các archive ra khỏi máy và giữ nhiều bản. Vì bạn sẽ không ngồi nhìn console khi có sự cố, hãy đặt một 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

Về cơ bản, cài plugin chỉ là chép một file jar vào /opt/minecraft/plugins/ rồi restart. Chỉ lấy plugin từ trang chính thức của dự án đó (Hangar, Modrinth, SpigotMC), vì lý do tương tự 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 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 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 cũng thường chưa hỗ trợ ngay bản Minecraft mới và có thể cần vài ngày hoặc vài tuần. Vì vậy, hãy kiểm tra compatibility trước khi cập nhật ngay trong ngày phát hành.

Nếu muốn quản lý toàn bộ việc này dưới dạng container, đặt version pinning, chấp nhận EULA và memory flags bằng các 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 đó bằng Docker Compose trên VPS của bạn, với cùng nguyên tắc về 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 phù hợp cho máy chủ dành cho khoảng mười người bạn, chạy 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 âm thầm kill tiến trình do OOM.

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

Client bị treo rồi kết thúc bằng Connection timed out: no further information gần như luôn là do firewall. Có 2 firewall: ufw trên VPS và network firewall của nhà cung cấp trong control panel. TCP 25565 phải được mở trên cả 2 firewall. Xác nhận máy chủ 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.

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

Không. Với online-mode=false, máy chủ bỏ qua hoàn toàn việc xác thực của Mojang, nên 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 kế thừa quyền của người đó; skin và UUID ổn định cũng 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, proxy này tự xác minh người chơi. Với máy chủ thông thường, giá trị này phải giữ là true.

Paper có tốt hơn máy chủ Minecraft vanilla không?

Với gần như mọi người, câu trả lời là có: Paper là một jar có thể thay thế trực tiếp, tải được world vanilla, chấp nhận client chưa 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 đến từng bit, vì một số tối ưu hóa của Paper làm thay đổi hành vi đó. Trên VPS nhỏ, hiệu quả của Paper gần như tương đương với việc có thêm RAM miễn phí.

Làm cách 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 máy chủ vẫn đ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 và chỉ phát hiện được khi restore. Bạn có thể dừng máy chủ, tar các thư mục world rồi khởi động lại; hoặc giữ máy chủ đang chạy bằng save-off, save-all flush, tar và save-on qua RCON. Sau đó chuyển archive ra khỏi VPS.