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

Cách cài Minecraft server trên VPS Ubuntu

Hướng dẫn chạy Paper Minecraft trên Ubuntu 24.04 dùng Java 21 và systemd. Cách mở port 25565, cấu hình RAM và backup world an toàn cho VPS của bạn.

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

Một server Minecraft Java Edition hoạt động ổn định: chạy Paper trên Ubuntu 24.04, chạy dưới quyền user minecraft riêng biệt bằng systemd với Restart=on-failure, bật whitelist, mở port 25565 trên cả hai firewall nằm giữa người chơi và JVM, và thực hiện backup sao cho không làm hỏng thế giới cần bảo vệ. Bản thân server chỉ gồm một file jar và một lệnh java; mọi yếu tố giúp một server có thể chạy liên tục cả năm thay vì sập ngay cuối tuần đầu tiên đều nằm ở lệnh đó, và đây là nội dung hướng dẫn này.

Hai cảnh báo thực tế trước khi bạn chi tiền. Thứ nhất, Minecraft rất ngốn RAM và chủ yếu chạy đơn luồng: một VPS 1 GB sẽ không chạy được server ổn định, và một core tốc độ cao sẽ tốt hơn bốn core tốc độ chậm. Thứ hai, đây là bản Java Edition. Người chơi Bedrock — trên console, điện thoại, ứng dụng Windows Bedrock — không thể tham gia server Java; Bedrock cần phần mềm server khác chạy trên UDP 19132, hoặc plugin Geyser, những thứ không nằm trong phạm vi hướng dẫn này.

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

Sizing: cấu hình thực tế mà server của bạn cần

RAM là thông số quan trọng nhất, và con số thực tế thường thấp hơn những gì các forum modpack gợi ý:

  • 2 GB đủ để chạy vanilla cho 2–5 người chơi với view distance trung bình. Có thể chơi được, nhưng không có dư dung lượng.
  • 4 GB là mức lý tưởng cho server chơi cùng bạn bè: khoảng mười người chơi cùng lúc trên Paper với một vài plugin, vẫn còn đủ RAM cho OS.
  • 8 GB trở lên dành cho modpack và server trên 20 người chơi; khi đó bạn cũng cần quan tâm đến tốc độ single-core của CPU, vì main game loop chạy trên một thread duy nhất.

Dữ liệu thế giới cũng sẽ tăng dần trên disk khi người chơi đi khám phá — một thế giới survival đã được khai phá kỹ có thể nặng tới vài gigabytes — vì vậy hãy để dư dung lượng cho cả thế giới các bản backup của nó.

Vanilla hay Paper? Paper là bản thay thế trực tiếp cho file jar chính thức: cùng thế giới, cùng client, không cần mod phía client. Nó viết lại các tiến trình server chậm nhất — chunk loading, entity ticking, hoppers — và bổ sung thêm một plugin API. Lý do duy nhất để chạy vanilla là nếu bạn cần các cơ chế vanilla chính xác tuyệt đối 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 tất cả những người khác, Paper giúp chạy được nhiều người chơi hơn trên mỗi gigabyte. Tất cả các cấu hình dưới đây đều hoạt động tốt cho cả hai.

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

Minecraft 1.20.5 và mọi phiên bản sau đó (tất cả các bản 1.21.x) đều yêu cầu Java 21. Ubuntu 24.04 đã có sẵn trong các repo mặc định, và bản headless sẽ bỏ qua các thư viện desktop mà server không bao giờ dùng đến:

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 nó hiển thị 17 hoặc 11, nghĩa là một JRE khác đang được cài đặt và được ưu tiên; hãy sửa lỗi bằng sudo update-alternatives --config java và chọn dòng có chứa java-21.

Nếu bỏ qua bước kiểm tra này, bạn sẽ gặp lỗi Minecraft server phổ biến nhất khi tìm kiếm trên Google sau này. Với Java 17, server jar sẽ bị lỗi ngay lập tức với thông báo:

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 con số này cho biết sự không khớp phiên bản: 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 sửa đều giống nhau — hãy cài đặt JRE mới hơn và chạy lại update-alternatives.

Bước 2: sử dụng user riêng biệt, không bao giờ dùng root

Server thực thi mã plugin và phân tích dữ liệu mạng từ bất kỳ ai có thể kết nối tới port. Nếu xảy ra lỗi, một cuộc tấn công chiếm quyền điều khiển chạy dưới quyền root sẽ chiếm toàn bộ VPS của bạn; nếu chạy dưới quyền minecraft, kẻ tấn công chỉ chiếm được một thế giới game.

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

--system tạo một tài khoản không cần password và không thể đăng nhập qua SSH, với /opt/minecraft là thư mục home và thư mục làm việc. Mọi câu lệnh tác động lên server từ thời điểm này sẽ chạy dưới quyền user này.

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

Chỉ có hai nơi duy nhất cung cấp server jar an toàn: trang tải server chính thức tại minecraft.net cho bản vanilla, và trang tải xuống tại papermc.io cho Paper. Các "download hub" của bên thứ ba chuyên đóng gói lại server jar là nguồn lây nhiễm malware lâu đời — một server jar thực chất là mã thực thi tùy ý mà bạn sẽ chạy 24/7 trên một máy chủ kết nối internet.

Sao chép link tải của build hiện tại từ trang chính thức (URL sẽ thay đổi theo từng version và build, nên không nên dùng link cố định ở đây), sau đó:

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

Kết quả đúng: một server.jar 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: lần chạy đầu tiên, EULA, và cấp quyền admin cho chính bạn

Hãy chạy server ở chế độ tương tác một lần trước khi thiết lập systemd — lần chạy đầu tiên có hai tác vụ mà chỉ console trực tiếp mới xử lý tốt được.

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

Server sẽ thoát sau vài giây — Paper mất thêm một chút thời gian để áp dụng các bản patch — và log sẽ kết thúc bằng dòng mà ai cũng gặp phải:

[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à lỗi; đây là bước kiểm tra license. Lần chạy này đã tạo ra file eula.txt cạnh file jar. Hãy đọc EULA trong link nếu bạn chưa đọc, sau đó bật flag:

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

Chạy lại lệnh java tương tự. Lần này server sẽ khởi tạo world — mất khoảng một đến hai phút ở lần boot đầu tiên — và dừng lại ở dòng:

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

Bây giờ bạn đã có console trực tiếp. Hãy dùng nó cho tác vụ thứ hai: gõ op YourMinecraftName (chính xác username trong game của bạn) và server sẽ ghi tên bạn vào ops.json, để sau này — khi không còn console kết nối — bạn có thể chạy mọi lệnh admin ngay trong game. Sau đó gõ stop để lưu và thoát an toàn.

Bước 5: server.properties, và lý do tại sao online-mode luôn là true

Lần chạy đầu tiên cũng đã tạo ra file server.properties. Hầu hết các thiết lập mặc định đều ổn; đây là những dòng bạn cần cân nhắc kỹ:

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 bắt server phải xác thực mọi username khi người chơi tham gia thông qua session server của Mojang, nhằm chứng minh người chơi đó sở hữu tài khoản. Nếu đặt thành false — chế độ "cracked server" — server sẽ chấp nhận mọi thông tin danh tính từ client: bất kỳ ai cũng có thể vào game bằng bất kỳ tên nào, kể cả tên của bạn. Vì các quyền op và whitelist được quản lý theo tên, kẻ mạo danh có thể chiếm quyền operator của bạn. Lý do hợp lệ duy nhất để đặt là false là khi bạn dùng một proxy xác thực như Velocity, nơi tự thực hiện việc xác thực người chơi. Trên một server bình thường, hãy luôn để nó là true.

view-distance là thông số ảnh hưởng lớn nhất đến hiệu năng trong file này — mức tiêu thụ CPU và RAM sẽ tăng tỉ lệ thuận với bình phương của nó. 8 là mức mặc định hợp lý cho VPS; 10 là mức mặc định của vanilla và nặng hơn rõ rệt.

white-list=true cộng với enforce-whitelist=true sẽ chặn các người lạ truy cập, điều mà phần bảo mật bên dưới sẽ lập luận là bắt buộc. Hãy thêm người chơi bằng lệnh /whitelist add TheirName trong game khi bạn đang là op.

Bước 6: memory flags — tại sao nên để -Xms và -Xmx bằng nhau

JVM cấp phát heap trong khoảng từ -Xms (kích thước bắt đầu) đến -Xmx (giới hạn tối đa). Trên một game server chuyên dụng, hãy đặt chúng cùng một giá trị: heap cuối cùng cũng sẽ chạm mức giới hạn, và việc tăng dần kích thước sẽ chỉ làm tăng tải cho garbage-collector khi đang chơi. Trên một VPS 4 GB, cặp tham số hợp lý là:

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

-Xmx không phải là tổng lượng memory mà process sử dụng. JVM sẽ tốn thêm off-heap overhead — thread stacks, JIT caches, direct buffers — khoảng nửa gigabyte hoặc hơn, và bản thân Ubuntu cũng cần dung lượng trống. Quy tắc thực tế: -Xmx tối đa bằng RAM của VPS trừ đi 1 GB. Nếu đặt quá mức, bạn sẽ gặp một trong hai lỗi sau. Nếu việc cấp phát thất bại ngay từ đầu, server sẽ không khởi động được và báo lỗi:

Error: Could not reserve enough space for object heap

Lỗi này thông báo rất rõ ràng và tức thì. Lỗi nghiêm trọng hơn là server khởi động bình thường nhưng bị sập vài giờ sau đó, khi heap bị đầy dưới tải cao và kernel's OOM killer chọn process chiếm nhiều tài nguyên nhất — chính là JVM. Không có gì xuất hiện trong server log; bằng chứng nằm trong sudo dmesg | grep -i oom, một dòng như Out of memory: Killed process 1234 (java). Nếu service của bạn bị restart "ngẫu nhiên", hãy kiểm tra ở đó trước, và giảm -Xmx xuống.

Đối với Paper, dự án khuyến nghị sử dụng Aikar's flags — một bộ G1GC đã được tinh chỉnh (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 và một loạt tham số khác) giúp làm mượt các đợt pause của garbage-collection trên các heap lớn. Hãy lấy đầy đủ dòng lệnh từ tài liệu của Paper; với heap từ 2–4 GB thì hiệu quả không quá lớn nhưng các flags này hoàn toàn an toàn.

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

Một server chạy bằng tay sẽ bị tắt khi bạn ngắt SSH session và sẽ không tự khởi động 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), và journal — lúc này đã chứa output console của server — kết thúc tại dòng Done.

Có hai lựa chọn có chủ đích trong unit đó. Restart=on-failure giúp server tự khởi động lại sau khi crash nhưng không tự chạy lại sau khi shutdown sạch sẽ (clean stop), giúp bạn vẫn có thể thực hiện bảo trì. Và TimeoutStopSec=120 quan trọng hơn vẻ ngoài của nó: systemctl stop gửi tín hiệu SIGTERM, Minecraft server sẽ nhận tín hiệu này và lưu mọi world trước khi thoát, và với một world lớn thì việc lưu dữ liệu này mất thời gian. Timeout mặc định của systemd có thể gửi SIGKILL vào giữa quá trình lưu của JVM, đây chính là nguyên nhân gây lỗi file region. Hãy để cho nó 2 phút.

Nếu service bị flap (bật/tắt liên tục) 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ó thứ gì đó đang chiếm giữ port 25565 — hầu hết luôn là một tiến trình chạy foreground trước đó vẫn còn sống trong một SSH session khác. Hãy tìm nó bằng sudo ss -tlnp | grep 25565 và stop bản copy đó; đừng bao giờ chạy hai server trên cùng một port.

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

Minecraft Java chỉ sử dụng TCP 25565 (UDP chỉ là giao thức query tùy chọn, mặc định là 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 các nhà cung cấp VPS đều chạy một firewall thứ hai ở cấp độ mạng trong control panel, và đây là phần mà mọi người hay quên. Hãy mở cả TCP 25565 ở đó. Triệu chứng khi chỉ mới mở một trong hai firewall rất khó xác định: client sẽ bị treo ở dòng "Connecting to the server..." và báo lỗi Connection timed out: no further information — không bị từ chối kết nối, không có lỗi server, không có gì trong journal, đơn giản là vì các packet không bao giờ tới được. Hãy kiểm tra từ một máy ngoài VPS bằng nc -vz your.server.ip 25565; succeeded nghĩa là cả hai firewall đã mở, còn nếu bị treo nghĩa là ít nhất một cái chưa mở.

Trong khi bạn đang cấu hình ufw, chính máy chủ này cũng đang chạy SSH trên IP công khai, và các log brute-force sẽ xuất hiện chỉ sau vài giờ — hãy thiết lập Fail2ban cho SSH trên Ubuntu 24.04 trước khi bạn 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 chính mình ở bước 4, các lệnh trong game sẽ có hiệu lực ngay lập tức — /whitelist add FriendName cho mỗi người chơi, /gamemode creative nếu đó là kế hoạch của bạn.

Bước 9: whitelist, vì internet sẽ quét thấy port 25565

Để một Minecraft server mở công khai trên internet là rủi ro thực tế: các trình quét tự động liên tục quét toàn bộ không gian IPv4 để tìm port 25565 — các dự án phá hoại (griefing) đã quét được hàng trăm nghìn server mở theo cách này — và một server không có whitelist sẽ có người lạ truy cập chỉ trong vài ngày, thậm chí vài giờ. Giải pháp là dùng whitelist từ bước 5: online-mode=true dùng để xác minh danh tính, còn whitelist giúp giới hạn quyền truy cập chỉ cho những danh tính bạn đã chọn. Cặp cơ chế này chính là mô hình bảo mật hoàn chỉnh và nó đủ dùng cho một server chơi cùng bạn bè.

Để truy cập console mà không cần mở game — như chạy script backup hoặc cron job — hãy bật RCON trong server.properties (enable-rcon=true, một rcon.password mạnh, port 25575) và tự build client mcrcon nhỏ gọn từ mã nguồn GitHub ngay trên VPS; gói này không có sẵn trong repo của Ubuntu. Không mở port 25575 trên bất kỳ firewall nào: RCON gửi password dưới dạng cleartext, vì vậy chỉ nên để nó chạy ở loopback-only.

Bước 10: backup không làm hỏng dữ liệu

Quy tắc duy nhất: không bao giờ copy thư mục world khi server đang ghi dữ liệu. Các file region được ghi lại liên tục trong khi chơi; một tar xảy ra tình trạng race condition với tiến trình ghi sẽ tạo ra bản archive chứa các chunk chưa được ghi xong hoàn toàn. Khi bạn restore — thời điểm duy nhất mà backup phải hoạt động — log sẽ tràn ngập lỗi loading chunk và địa hình sẽ bị thủng. Có hai phương pháp để tránh việc này.

Stop-copy-start là cách đơn giản nhất, nhưng bạn sẽ mất một phút 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 world_nether world_the_end
sudo systemctl start minecraft

(Paper chia các dimension thành world, world_nether, và world_the_end; server vanilla giữ mọi thứ trong world, vì vậy hãy đưa hai cái còn lại vào đó.)

Save-off là backup trực tiếp: qua RCON, chạy lệnh save-off (dừng autosaver), sau đó là save-all flush (ép ghi mọi thứ xuống disk và chờ), lấy file tar, rồi chạy save-on. Đây là phương pháp để thiết lập trong cron vào lúc 5 giờ sáng.

Dù dùng cách nào, một bản backup nằm cùng VPS với server thì không được coi là backup — hãy scp hoặc rclone các archive ra khỏi máy, và hãy giữ nhiều hơn một bản. Vì bạn sẽ không ngồi canh console khi có sự cố, hãy thiết lập một trình 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 vào port 25565 sẽ báo cho bạn biết server đã down trước khi người chơi kịp nhận ra.

Plugins và nâng cấp

Với Paper, cài đặt một plugin chỉ đơn giản là bỏ file jar vào /opt/minecraft/plugins/ rồi restart — thế là xong. Bạn chỉ nên tải plugin từ các trang chính thức của dự án (Hangar, Modrinth, SpigotMC). Lý do cũng giống như khi bạn dùng server jar: mỗi plugin đều là mã code tùy ý chạy dưới quyền user minecraft.

Để nâng cấp server: stop, backup, thay thế server.jar bằng bản build của phiên bản Minecraft mới, rồi start. Có hai lưu ý. Nâng cấp world là quá trình một chiều — một world đã mở bằng phiên bản mới hơn sẽ không thể mở lại bằng phiên bản cũ hơn, vì vậy bạn cần phải có backup. Ngoài ra, các plugin thường trễ hơn phiên bản Minecraft mới vài ngày hoặc vài tuần, nên hãy kiểm tra tính tương thích trước khi vội vàng nâng cấp ngay ngày đầu ra mắt.

Nếu bạn muốn quản lý tất cả thông qua container — như chốt phiên bản (version pinning), chấp nhận EULA, và thiết lập memory flags dưới dạng environment variables — thì image itzg/minecraft-server rất phổ biến. Nó chạy cùng một server Paper đó dưới Docker Compose trên VPS của bạn với các quy tắc về firewall và backup tương tự.

FAQ

Minecraft server cần bao nhiêu RAM?

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

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

Nếu client bị treo và kết thúc bằng lỗi Connection timed out: no further information thì hầu hết luôn là do firewall, và có hai lớp: ufw trên VPS và network firewall của nhà cung cấp trong control panel. Cần mở TCP 25565 ở cả hai nơi. Hãy xác nhận server đang thực sự lắng nghe bằng sudo ss -tlnp | grep 25565 trên máy, 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 sẽ bỏ qua hoàn toàn việc xác thực của Mojang, do đó bất kỳ ai cũng có thể tham gia với bất kỳ username nào — bao gồm cả tên của op để chiếm quyền quản trị — đồng thời skins và UUID ổn định sẽ bị lỗi. Cách dùng hợp lệ duy nhất là chạy sau một proxy xác thực như Velocity (nơi tự xác thực người chơi). Đối với server thông thường, hãy để nó là true.

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

Với hầu hết mọi người là có: Paper là một file jar thay thế trực tiếp, có thể load các thế giới vanilla, chấp nhận các client không chỉnh sửa, xử lý tick entity và load chunk hiệu quả hơn nhiều, đồng thời bổ sung hệ sinh thái plugin. Ngoại lệ là các cộng đồng kỹ thuật redstone cần hành vi vanilla chính xác tuyệt đối, vì một số tối ưu hóa của Paper có thể làm thay đổi điều này. Trên một VPS nhỏ, hiệu suất của Paper tương đương với việc có thêm RAM miễn phí.

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

Đừng bao giờ nén thư mục world khi server đang ghi dữ liệu — việc copy trong khi region-file đang được ghi sẽ tạo ra các chunk bị lỗi mà bạn chỉ phát hiện ra khi restore. Bạn nên dừng server, tar các thư mục world rồi khởi động lại, hoặc giữ server chạy và dùng save-off, save-all flush, tar, save-on qua RCON. Sau đó, hãy chuyển file archive ra khỏi VPS.

#minecraft#game-server#java#ubuntu#tự lưu trữ