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

Cách chạy server FiveM trên VPS Ubuntu

Cài FXServer trên Ubuntu, ghim artifact build, thêm licence key Cfx.re và mở cổng 30120 TCP/UDP. Giữ txAdmin ngoài Internet public để giảm rủi ro.

Máy chủ FiveM trên VPS cần gì

Máy chủ FiveM trên VPS cần một user Linux không có quyền đặc biệt, một artifact build từ Cfx.re, một licence key và một cổng được mở cho cả TCP lẫn UDP. Cài đặt mất khoảng mười phút. Phần còn lại của hướng dẫn này tập trung vào những yếu tố quyết định máy chủ có thể chơi ổn định hay không: tốc độ của một CPU core, lượng memory mà các resource cần và một management panel không bao giờ nên để mở trên địa chỉ public.

Có 3 điều kiện tiên quyết cố định. Các binary của máy chủ, được gọi là artifact, lấy từ danh sách build chính thức của Cfx.re. Licence key lấy từ portal Cfx.re tại portal.cfx.re, dịch vụ mà các hướng dẫn cũ gọi là keymaster. Key này gắn với địa chỉ của máy dùng nó. Mỗi player kết nối đều cần một bản GTA V (Grand Theft Auto V) hợp lệ của riêng mình trên Steam, Rockstar Games Launcher hoặc Epic Games, cùng một tài khoản Cfx.re miễn phí. Client kiểm tra quyền sở hữu game khi khởi động. Vì vậy, server được xây dựng trên bất kỳ nền tảng nào khác sẽ không hoạt động, và nội dung dùng để workaround dưới bất kỳ hình thức nào không nằm trong phạm vi của hướng dẫn này.

Host server là một công việc khác với chơi game trên máy đó. Vấn đề bạn có thể chạy chính game trên VPS hay không là một câu hỏi riêng và có câu trả lời khác.

Vì sao tốc độ một core quyết định cảm giác khi chơi trên server FiveM

FXServer, binary server của FiveM, chạy logic game trên một main thread. Mọi resource script, event handler và state update đều đi qua loop duy nhất đó. Các core bổ sung giúp kernel, database và network stack. Chúng không chia nhỏ game loop. Vì vậy, một máy 4 vCPU có core chậm có thể bị giật khi tải tăng, trong khi máy 2 vCPU có core nhanh vẫn chạy mượt.

Điều này trái với thói quen chọn VPS thông thường, trong đó số core là con số được chú ý đầu tiên. Hãy kiểm tra tốc độ trên từng core trước khi thanh toán. Bắt đầu bằng model CPU:

lscpu | grep -E 'Model name|MHz'

Sau đó tra điểm single thread được công bố cho model đó. Điểm single thread của PassMark và điểm single-core của Geekbench đều là số liệu công khai. Cả hai đều đo hiệu năng của một core khi xử lý, đúng với chỉ số cần quan tâm ở đây. Tiếp theo, đo chính máy bạn được cấp:

sudo apt update && sudo apt install -y sysbench
sysbench cpu --cpu-max-prime=20000 --threads=1 run

Đọc dòng events per second. Chạy cùng command trên hai nhà cung cấp đang cân nhắc để so sánh công bằng, vì workload giống nhau và chỉ chạy trên một core. Chạy benchmark VPS có thể lặp lại giải thích cách giữ các số liệu này có thể so sánh giữa các máy.

Tiếp theo, kiểm tra xem core đó có thực sự dành cho bạn không:

vmstat 1 5

Cột cuối cùng, st, là steal time: tỷ lệ thời gian vCPU của bạn đã sẵn sàng chạy nhưng hypervisor buộc phải chờ. Giá trị ổn định trên 1 hoặc 2 cho thấy bạn đang dùng chung một core vật lý với các máy khác có tải cao. Game loop sẽ lập tức thể hiện điều đó qua hiện tượng rubber banding. Steal time do máy khác gây tải giải thích cách đọc cột này và cách xử lý.

Dung lượng memory phụ thuộc vào các resource bạn chạy, không chỉ phụ thuộc vào số slot. Dữ liệu server cơ bản của Cfx.re chỉ dùng vài trăm megabyte. Một roleplay framework có bốn mươi hoặc năm mươi resource cùng database MariaDB trên một máy là cấu hình khác hẳn: 4 GB là mức tối thiểu hợp lý, còn 8 GB sẽ thoải mái với 32 đến 64 slot. Đây là các con số điển hình được những setup trong cộng đồng công bố. Hãy xem chúng là điểm bắt đầu và monitor free -m khi có tải player thực tế.

Tạo user và cài dependency

Chạy server bằng một user thông thường, không bao giờ chạy bằng root. Có hai lý do. Dùng root là thói quen không an toàn trên mọi service public Internet. Ngoài ra, artifact Linux chạy bên trong một root filesystem Alpine Linux đi kèm, nên các file được root giải nén sẽ không thể được user khác thực thi. Đây là lý do phổ biến nhất khiến bản cài mới không khởi động.

sudo adduser --disabled-password --gecos "" fivem
sudo apt update
sudo apt install -y git xz-utils curl tcpdump
sudo -iu fivem

Toàn bộ các bước bên dưới được chạy bằng user fivem. Cần có xz-utils vì bản download là một archive .tar.xz, còn git được dùng để clone dữ liệu server cơ sở.

Tải bản build artifact đã ghim

Bản build Linux nằm trong channel build_proot_linux của artifact server Cfx.re. Danh sách đánh dấu một build là bản được khuyến nghị mới nhất, và nhãn đó chuyển sang build mới sau mỗi vài tuần. Thay vào đó, hãy ghim thư mục có số hiệu. Khi rebuild server vào tháng sau, bạn vẫn nhận được cùng binary đã kiểm thử trong tháng này. Việc upgrade trở thành quyết định có chủ đích.

mkdir -p ~/FXServer/server
cd ~/FXServer/server
curl -fLO https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/25770-8ddccd4e4dfd6a760ce18651656463f961cc4761/fx.tar.xz
tar xf fx.tar.xz
ls

Build 25770 mang nhãn được khuyến nghị khi tôi xem danh sách vào tháng 8 năm 2026. Mở cùng thư mục bằng trình duyệt để xem build hiện tại, rồi dán tên thư mục đó vào URL. Tên này gồm số build và commit hash.

ls bây giờ phải hiển thị run.sh và một thư mục alpine. Thư mục đó là phần cốt lõi: Linux artifact đi kèm một root filesystem Alpine nhỏ và khởi động server bên trong filesystem này bằng proot, một công cụ userspace mô phỏng chroot mà không cần quyền root. Vì vậy, một bản download có thể chạy trên Ubuntu, Debian và Rocky mà không cần các package riêng cho từng distribution.

Bây giờ hãy clone dữ liệu server cơ sở. Dữ liệu này chứa các resource mặc định mà server.cfg sẽ khởi động:

git clone https://github.com/citizenfx/cfx-server-data.git ~/FXServer/server-data

Lấy licence key và viết server.cfg

Đăng nhập vào portal.cfx.re bằng tài khoản Cfx.re của bạn rồi tạo server key. Portal yêu cầu địa chỉ IP của máy sẽ sử dụng key này, và key được bind với địa chỉ đó. Khi chuyển sang VPS mới, bạn phải sửa key trong portal, không tạo key thứ hai. Thay đổi có hiệu lực ngay, nhưng FXServer chỉ xác thực lại khi khởi động lại.

Ghi ~/FXServer/server-data/server.cfg:

endpoint_add_tcp "0.0.0.0:30120"
endpoint_add_udp "0.0.0.0:30120"

ensure mapmanager
ensure chat
ensure spawnmanager
ensure sessionmanager
ensure basic-gamemode
ensure hardcap

sv_hostname "My FiveM server"
sv_maxclients 48
set onesync on
sv_scriptHookAllowed false

sv_licenseKey ChangeMe

add_ace group.admin command allow
add_principal identifier.fivem:1 group.admin

sv_maxclients nhận giá trị từ 1 đến 2048. Giá trị từ 32 trở lên cần đặt onesync thành on hoặc legacy, còn giá trị trên 64 cần on. OneSync là chế độ nhận biết trạng thái của server. Đây là cơ chế cho phép server vượt qua số slot nhỏ mặc định của game. Đặt 128 slot khi tắt OneSync không cung cấp 128 slot; nó tạo ra một cấu hình bị server từ chối.

sv_licenseKey nhận key không có dấu ngoặc kép và không có khoảng trắng ở cuối. FXServer tách dòng đó theo khoảng trắng, nên chỉ một ký tự thừa cũng làm việc xác thực thất bại và khiến server không khởi động.

rcon_password cố ý không có trong file này. RCON (remote console) chỉ được bật khi biến này được đặt, và khi đó nó sẽ listen trên cùng UDP port với game. RCON password trên một public port tạo ra một kênh điều khiển từ xa vào server của bạn. Hãy để biến này unset nếu bạn không có nhu cầu cụ thể. Nếu cần dùng, hãy đặt password dài và ngẫu nhiên.

sv_scriptHookAllowed vẫn là false. Tài liệu chính thức đánh dấu tùy chọn này là không nên dùng, vì cho phép client Script Hook V sẽ mở server cho hành vi lạm dụng từ phía client.

add_principal identifier.fivem:1 cấp quyền admin cho Cfx.re account ID 1. Thay 1 bằng numeric ID của bạn. Nếu không, bạn đã cấp quyền admin cho tài khoản của người khác và không cấp quyền cho chính mình.

Khởi động một lần bằng tay:

cd ~/FXServer/server-data
bash ~/FXServer/server/run.sh +exec server.cfg

Từ một SSH session thứ hai, yêu cầu server tự báo trạng thái:

curl -s http://127.0.0.1:30120/info.json | head -c 200

JSON chứa tên các biến và resource của server cho biết FXServer đã bind và đang trả lời. Connection refused nghĩa là server chưa bind được port, vì vậy hãy đọc output trên console thay vì đoán nguyên nhân.

Server không có key sẽ in thông báo này rồi dừng:

This server does not have a license key specified. Please set the sv_licenseKey console variable to a key from https://keymaster.fivem.net/.

Thông báo vẫn hiển thị địa chỉ keymaster cũ. Địa chỉ đó dẫn đến cùng portal Cfx.re. Nếu đã đặt key nhưng server vẫn không chạy, nguyên nhân thường gặp là địa chỉ IP đã đăng ký với key không còn khớp với máy này.

Cần mở những port nào cho server FiveM?

Port 30120 trên cả TCP (transmission control protocol) và UDP (user datagram protocol). FiveM dùng cùng một số port cho hai giao thức và cần cả hai. Nếu chỉ mở TCP, triệu chứng sẽ khó hiểu: http://your.ip:30120/info.json phản hồi trong browser nên server có vẻ vẫn hoạt động, nhưng game client dừng ở Failed to get info from server và không bao giờ join được vì query của client và game traffic đều chạy qua UDP.

sudo ufw allow OpenSSH
sudo ufw allow 30120/tcp
sudo ufw allow 30120/udp
sudo ufw enable
sudo ufw status verbose

Giữ một phiên SSH thứ hai mở khi bật firewall. Kiến thức cơ bản về ufw cho VPS giải thích chính sách deny mặc định, nhờ đó các rule trên đã đủ để hoạt động độc lập.

Hầu hết provider cũng chạy một network firewall bên ngoài guest, được điều khiển từ panel thay vì shell. Một rule ufw không chứng minh được layer đó đã cho phép traffic. Khi TCP phản hồi từ bên ngoài nhưng người chơi vẫn không thể kết nối, hãy monitor network traffic trong lúc có người thử kết nối:

sudo tcpdump -ni any udp port 30120

Nếu packet đến được server, outer firewall đang hoạt động bình thường và lỗi nằm bên trong server. Nếu không có packet, có thành phần phía trước server đang drop chúng; hãy kiểm tra panel của provider tiếp theo.

Quản trị server bằng txAdmin mà không expose nó

txAdmin được tích hợp trong artifact bạn đã tải xuống. Khởi động run.sh mà không có tham số +exec. Lệnh này sẽ mở web panel trên TCP port 40120, sau đó in URL của panel và một PIN có thời hạn ngắn ra console. Bạn chỉ dùng PIN đó một lần để liên kết tài khoản Cfx.re. Sau đó, bạn đăng nhập bằng admin account mà txAdmin tạo.

txAdmin không có password mặc định, nên rủi ro không nằm ở việc bạn quên đổi credential. Rủi ro nằm ở chính panel này: đó là một remote console. Nó có thể restart server, chỉnh sửa server.cfg, deploy dữ liệu server và chạy command với quyền của server user. Nếu để 40120 có thể truy cập từ Internet, bạn đang public một login page cho toàn bộ chức năng đó. Các scanner có thể tìm thấy những panel port đang mở chỉ trong vài giờ. Không mở 40120 trên firewall. Hãy truy cập nó qua SSH tunnel từ máy của bạn:

ssh -N -L 40120:127.0.0.1:40120 fivem@YOUR_SERVER_IP

Sau đó mở http://127.0.0.1:40120 trong browser. Traffic của panel chạy bên trong kết nối SSH, còn port này vẫn đóng với mọi máy khác.

Có một điểm dễ nhầm bạn cần biết trước khi thử xử lý theo cách khác. txAdmin đọc TXHOST_INTERFACE (mặc định là 0.0.0.0) để quyết định bind vào interface nào. Tài liệu cũng nêu rõ rằng cùng giá trị này sẽ được áp dụng cho FXServer. Nếu đặt thành 127.0.0.1 để ẩn panel, bạn cũng bind game server vào loopback. Khi đó player sẽ không thể truy cập server. Hãy đóng panel port bằng firewall, không dùng biến đó. Muốn chuyển panel sang port khác, hãy đặt TXHOST_TXA_PORT. Giá trị này chấp nhận mọi port ngoại trừ 30120. Convar cũ +set txAdminPort xuất hiện trong nhiều guide. Tài liệu của txAdmin đánh dấu nó là deprecated và cho biết nó sẽ ngừng hoạt động trong một release tương lai.

Giữ server chạy sau khi bạn đăng xuất

bash run.sh sẽ dừng cùng với phiên SSH của bạn. tmux phù hợp khi bạn đang kiểm thử: chạy tmux new -s fivem, khởi động server, nhấn Ctrl-b rồi d để detach, và dùng tmux attach -t fivem để quay lại. Một phiên tmux không tồn tại sau khi reboot, vì vậy mọi thứ bạn cần duy trì phải được đặt trong một systemd unit.

Tạo /etc/systemd/system/fivem.service:

[Unit]
Description=FiveM FXServer
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=fivem
Environment=HOME=/home/fivem
WorkingDirectory=/home/fivem/FXServer/server-data
ExecStart=/bin/bash /home/fivem/FXServer/server/run.sh +exec server.cfg
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now fivem
systemctl status fivem
journalctl -u fivem -f

enable --now thực hiện 2 việc: khởi động service ngay lập tức và khởi động lại service sau khi reboot. Server được khởi động thủ công sẽ dừng sau lần cập nhật kernel tiếp theo. journalctl -u fivem -f hiện là console của bạn, vì systemd service không có terminal để bạn nhập lệnh. Nếu bạn quản lý server thông qua txAdmin, hãy xóa +exec server.cfg khỏi ExecStart và trỏ WorkingDirectory đến /home/fivem/FXServer/server, vì txAdmin tự khởi động game server và giữ data folder của server cạnh run.sh.

Cần backup gì và dữ liệu nằm ở đâu

Không cần backup các artifact, vì bạn có thể tải lại build đã ghim trong một phút. Có 4 loại dữ liệu chỉ thuộc về bạn.

  • ~/FXServer/server-data/resources: mọi resource bạn đã cài đặt, mua hoặc tự viết.
  • server.cfg, dù nằm ở đâu: toàn bộ cấu hình server, bao gồm các principal quản trị của bạn.
  • ~/FXServer/server/txData: cấu hình, danh sách admin và log của txAdmin. Với artifact Linux, thư mục này được tạo cùng cấp với run.sh.
  • Database MariaDB hoặc MySQL, nếu framework của bạn sử dụng. Character, tiền, phương tiện và inventory nằm trong đó, không nằm ở nơi nào khác. Vì vậy, backup resource nhưng không có database dump sẽ khôi phục một thế giới trống.
mkdir -p ~/backups
mysqldump -u fivem -p --single-transaction fivem_db > ~/backups/fivem-$(date +%F).sql

Một dump nằm trên cùng disk với server không phải là backup, vì chính disk đó có thể bị lỗi. Hãy đẩy bản backup ra khỏi máy theo lịch định kỳ. Đây là mục đích của restic backup từ VPS.

Các dạng lỗi và chuỗi thông báo bạn sẽ thấy

Không có quyền trên loader. Server thoát ngay lập tức và hiển thị một dòng tương tự:

run.sh: line 8: /home/fivem/FXServer/server/alpine/opt/cfx-server/ld-musl-x86_64.so.1: Permission denied

Lỗi này xảy ra vì archive được giải nén bằng sudo, nên mọi thứ bên dưới alpine/ đều thuộc về root và user fivem không thể thực thi loader bên trong đó. Sửa ownership bằng sudo chown -R fivem:fivem /home/fivem/FXServer, hoặc xóa thư mục rồi giải nén lại bằng fivem.

tar từ chối mở file download. tar (child): xz: Cannot exec: No such file or directory có nghĩa là thiếu package xz-utils, nên tar không thể giải nén archive .tar.xz. Cài package đó rồi giải nén lại. Một download hoàn tất nhanh bất thường thường là trang lỗi HTML được lưu thành fx.tar.xz, và tar báo file đó là archive bị hỏng.

Server chạy nhưng không ai kết nối được. Trước tiên, hãy kiểm tra các port theo thứ tự này: rule ufw cho cả TCP và UDP trên 30120, firewall network riêng của nhà cung cấp, rồi IP đã đăng ký với licence key. Dùng curl đối chiếu với info.json từ bên ngoài máy chủ để phân biệt lỗi network với lỗi server chỉ bằng một command.

Tick time tăng khi người chơi tham gia. Panel hiệu năng của txAdmin hiển thị tick time của server. Khi tick time tăng theo số người chơi nhưng mức sử dụng CPU tổng thể vẫn thấp, một resource đang bão hòa main thread. Hãy nhớ cách tính: trên máy có 4 vCPU, một core chạy hết công suất chỉ hiển thị khoảng 25 phần trăm CPU tổng trong top. Nhìn qua có vẻ máy đang rảnh, nhưng thực tế không phải vậy. Dừng từng resource một và theo dõi tick time để tìm resource gây tải.

So sánh cấu hình này với các game server khác

Một FiveM server có thể chơi ổn cần một core đơn nhanh và đủ memory cho danh sách resource bạn thực sự chạy. Số slot phụ thuộc vào hai yếu tố đó, và thêm vCPU không thể khắc phục một core chậm. Chọn VPS cho game server phân tích sự đánh đổi này khi bạn vận hành nhiều loại server khác nhau, còn chạy Minecraft server trên VPS cũng có cùng đặc điểm bên dưới: một vòng lặp tick chính, nên tốc độ của từng core cũng quyết định giới hạn ở đó.

FAQ

Máy chủ FiveM cần bao nhiêu CPU và RAM?

Một core nhanh quan trọng hơn nhiều core chậm, vì FXServer chạy logic game trên một main thread duy nhất. So sánh single thread score được công bố của model CPU, sau đó xác nhận trên máy bằng sysbench cpu --threads=1 run và kiểm tra để vmstat cho thấy steal time gần bằng 0. Về memory, dữ liệu máy chủ Cfx.re cơ bản chỉ dùng vài trăm megabyte, còn roleplay framework có bốn mươi hoặc năm mươi resource cùng database cục bộ sẽ chạy ổn với 8 GB và bắt đầu thiếu khi dưới 4 GB. Đây chỉ là các con số điển hình trong cộng đồng, nên hãy theo dõi free -m khi tải đạt đỉnh thay vì hoàn toàn dựa vào chúng.

Người chơi có cần sở hữu GTA V để tham gia máy chủ FiveM của tôi không?

Có. Mỗi người chơi kết nối phải có bản sao GTA V hợp pháp, được cấp phép trên Steam, Rockstar Games Launcher hoặc Epic Games, cùng một tài khoản Cfx.re miễn phí. FiveM client kiểm tra quyền sở hữu game trước khi cho phép kết nối. Không có cách được hỗ trợ nào để bỏ qua yêu cầu này. Việc chạy máy chủ cố gắng vượt qua yêu cầu đó nằm ngoài phạm vi Cfx.re cho phép.

Máy chủ FiveM cần mở những port nào?

Cả TCP và UDP trên port 30120. Các HTTP endpoint như info.json và việc tải resource dùng TCP, còn game traffic của client dùng UDP. Chỉ mở TCP sẽ tạo ra tình huống khó hiểu: máy chủ trả lời khi truy cập bằng trình duyệt nhưng người chơi thấy Failed to get info from server. txAdmin cần TCP 40120, và port này nên được đóng với Internet.

Để txAdmin có thể truy cập tại port 40120 có an toàn không?

Không. txAdmin là remote console có thể restart máy chủ, chỉnh sửa cấu hình và chạy command, nên panel bị expose đồng nghĩa với control plane của toàn bộ game server bị expose. txAdmin không có password mặc định, nhưng một trang đăng nhập public sẽ tạo cơ hội cho các cuộc tấn công credential mà bạn không nhìn thấy. Hãy đóng 40120 trong firewall và truy cập panel qua SSH tunnel bằng ssh -N -L 40120:127.0.0.1:40120 user@server, sau đó mở http://127.0.0.1:40120 trong trình duyệt. Không bind txAdmin vào 127.0.0.1 bằng TXHOST_INTERFACE, vì thiết lập đó cũng buộc game server dùng loopback và không người chơi nào có thể kết nối.

Hãy cố định thư mục build có số phiên bản. Nhãn recommended thường xuyên chuyển sang build mới, nên script fetch build recommended có thể cung cấp một binary khác sau mỗi lần rebuild. Khi đó, một server chạy được hôm qua có thể fail sau khi redeploy vì các nguyên nhân không liên quan đến thay đổi của bạn. Hãy ghi lại build number và commit hash đã kiểm thử, chủ động nâng cấp, đồng thời giữ lại thư mục trước đó trên disk để có thể quay lại bằng cách sửa một path trong systemd unit.

#fivem#game-server#txadmin#single-thread#vps