VPS WINDOWS · LARAGON · CLOUDFLARE

HSOSKY PlayWeb — cài đặt từng bước

Làm đúng thứ tự từ trên xuống. Mỗi bước có phần “Phải thấy gì” — không thấy đúng như vậy thì dừng lại, đừng đi tiếp.

Hiểu trước 1 phút, đỡ rối cả buổi

hai thứ chạy song song trên VPS:

1. Apache (Laragon, đang chạy sẵn cho hsosky.com) — gửi file game cho trình duyệt.

2. bridge.mjs — một chương trình Node nhỏ. Trình duyệt không mở được kết nối TCP tới server game, nên nó phải nhờ chương trình này chuyển tiếp.

Thiếu cái số 2 thì web vẫn vào được, hình vẫn đẹp, nhưng bấm đăng nhập là đứng im. Nhớ chỗ này để lát khỏi hoang mang.

Trỏ tên miền

Đã xong

play.hsosky.com103.2.226.50, đã bật Proxied (đám mây cam). Không phải làm gì thêm.

Cloudflare lo HTTPS ở biên nên VPS không cần chứng chỉ SSL.

1

Chép thư mục lên VPS

2 phút

Chép nguyên thư mục playweb vào C:\laragon\www\ trên VPS (Remote Desktop rồi copy-paste là được).

Phải thấy gì

Mở Explorer, đường dẫn này phải tồn tại:

C:\laragon\www\playweb\public\index.html
C:\laragon\www\playweb\bridge.mjs
⚠ Đừng đổi cấu trúc thư mục

File game nằm trong public\, còn bridge.mjs nằm ngoài — cố ý như vậy để người ngoài không tải được nó về.

2

Cài Node.js

3 phút

Vào nodejs.org, tải bản LTS cho Windows, cài bình thường (Next → Next → Install).

Cài xong mở Command Prompt mới (cmd) và gõ:

node -v
Phải thấy gì
v20.11.1

Số có thể khác, miễn là từ v18 trở lên. Nếu báo 'node' is not recognized thì đóng cmd mở lại; vẫn lỗi thì cài lại và nhớ tick “Add to PATH”.

3

Bật 7 module Apache

5 phút · dễ sai nhất

Mở file này bằng Notepad (đường dẫn có thể khác số phiên bản):

C:\laragon\bin\apache\httpd-2.4.54-win64-VS16\conf\httpd.conf

Nhấn Ctrl+F, tìm lần lượt từng dòng dưới đây. Dòng nào có dấu # ở đầu thì xoá dấu # đi. Dòng nào không có # sẵn thì để nguyên.

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule headers_module modules/mod_headers.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule filter_module modules/mod_filter.so

Lưu file (Ctrl+S).

⚠ Thiếu proxy_wstunnel là hỏng âm thầm

Web vẫn vào được, hình vẫn đẹp, nhưng đăng nhập đứng im mà không báo lỗi gì. Đây là lỗi tốn thời gian nhất nếu sót. Kiểm lại cho chắc.

⚠ Thiếu filter_module là Apache tắt luôn

Kéo sập cả hsosky.com chứ không riêng playweb. Nhớ bật đủ cả 7 dòng.

4

Thêm cấu hình tên miền

1 phút

Chép file apache-play.hsosky.com.conf (nằm trong thư mục playweb) vào:

C:\laragon\etc\apache2\sites-enabled\

Laragon tự nạp mọi file .conf trong thư mục đó. Không phải sửa gì bên trong file — đường dẫn đã đúng sẵn.

5

Khởi động lại Apache

1 phút

Mở Laragon → bấm nút Reload (hoặc Stop rồi Start).

Phải thấy gì

Apache lên xanh bình thường, và hsosky.com vẫn vào được.

⚠ Nếu Apache không lên

Là do bước 3 thiếu module. Mở C:\laragon\bin\apache\httpd-…\logs\error.log, xem dòng cuối, nó ghi rõ thiếu cái gì. Sửa xong Reload lại.

6

Chạy thử cầu nối

2 phút

Vào C:\laragon\www\playweb\, nháy đúp start-bridge.bat. Một cửa sổ đen hiện ra.

Phải thấy gì
=== Khoi dong cau noi PlayWeb ===
Nghe tai 127.0.0.1:8081
Cho phep: sv.hsosky.com:19129

[bridge] nghe tai 127.0.0.1:8081
[bridge] cho phep: sv.hsosky.com:19129

Để nguyên cửa sổ này, đừng tắt. Mở trình duyệt trên VPS vào http://play.hsosky.com — game phải chạy và đăng nhập được.

Thử được rồi thì tắt cửa sổ đen đi, sang bước 7 cho nó chạy nền vĩnh viễn.

7

Cho cầu nối tự chạy khi bật máy

5 phút

Dùng NSSM — nó biến bridge.mjs thành dịch vụ Windows, tự bật khi máy khởi động và tự bật lại nếu lỡ chết.

7.1 — Tải NSSM

Vào nssm.cc/download, tải bản mới nhất, giải nén. Vào thư mục win64, chép nssm.exe ra C:\laragon\www\playweb\ cho tiện.

7.2 — Mở Command Prompt bằng quyền Admin

Bấm Start → gõ cmd → chuột phải Command PromptRun as administrator.

7.3 — Chạy 4 lệnh sau

Chép từng dòng, dán vào cmd, Enter:

cd /d C:\laragon\www\playweb

nssm install HsoskyPlayBridge "C:\Program Files\nodejs\node.exe" "C:\laragon\www\playweb\bridge.mjs"

nssm set HsoskyPlayBridge AppDirectory C:\laragon\www\playweb

nssm set HsoskyPlayBridge AppEnvironmentExtra HOST=127.0.0.1 PORT=8081 ALLOW=sv.hsosky.com:19129 MAP=sv.hsosky.com:19129=127.0.0.1:19129

nssm start HsoskyPlayBridge
Phải thấy gì
HsoskyPlayBridge: START: The operation completed successfully.

7.4 — Kiểm tra dịch vụ đang sống

nssm status HsoskyPlayBridge
Phải thấy gì
SERVICE_RUNNING
⚠ Vì sao có MAP

Máy chủ game chạy trên chính VPS này. Nếu cầu nối gọi tới sv.hsosky.com thì DNS trả về IP công khai, và khi một máy tự nối tới IP công khai của chính nó thì địa chỉ nguồn cũng là IP công khai đó, không phải 127.0.0.1. Server nhìn địa chỉ nguồn để biết ai là người chơi web — không nhận ra thì vẫn bắt họ dùng chung hạn mức tạo nhân vật.

Đổi dịch sang 127.0.0.1 vừa sửa được điều đó, vừa khỏi phải vòng ra ngoài mạng rồi quay lại.

ℹ Lệnh cần nhớ về sau
nssm restart HsoskyPlayBridgeKhởi động lại
nssm stop HsoskyPlayBridgeDừng
nssm edit HsoskyPlayBridgeMở cửa sổ sửa cấu hình
nssm remove HsoskyPlayBridge confirmGỡ hẳn dịch vụ
8

Kiểm tra lần cuối

2 phút

Trên VPS, mở cmd và chạy:

curl http://127.0.0.1:8081/health
Phải thấy gì
ok

Rồi mở https://play.hsosky.com trên điện thoại hoặc máy khác. Bấm F12 → tab Network → tải lại trang:

Kiểm traKết quả đúng
Lần vào đầu tiênTải khoảng 3,5 MB
Tải lại lần hai0 byte — tất cả lấy từ bộ nhớ đệm
classes.jsCột Size hiện khoảng 765 KB, không phải 10 MB
Đăng nhậpVào được game

Gặp lỗi thì tra ở đây

Hiện tượngNguyên nhân hay gặp nhất
Vào web được, nhưng bấm đăng nhập đứng im Cầu nối chưa chạy (nssm status), hoặc bước 3 sót proxy_wstunnel. Đây là lỗi phổ biến số 1.
Apache không khởi động, hsosky.com cũng sập Bước 3 sót module (hay gặp: filter_module). Xem logs\error.log, dòng cuối ghi rõ thiếu gì.
Vào play.hsosky.com ra trang hsosky.com File .conf chưa nằm đúng C:\laragon\etc\apache2\sites-enabled\, hoặc chưa Reload Laragon.
Trang trắng / lỗi 403 ROOT trong file .conf không trỏ đúng thư mục public, hoặc chép thiếu file.
classes.js tải 10 MB thay vì 765 KB Thiếu rewrite_module hoặc headers_module ở bước 3. Chạy vẫn được, chỉ tốn băng thông.
Đang chơi, treo máy một lúc rồi rớt Cloudflare cắt WebSocket nằm im quá lâu. Thử chuyển bản ghi DNS sang đám mây xám để loại trừ.
Cập nhật game rồi mà người chơi vẫn thấy bản cũ Quên tăng số ?v=, hoặc Cloudflare đang cache. Vào Cloudflare bấm Purge Cache.

Một điều bắt buộc phải nhớ

⚠ Đừng bao giờ để ALLOW trống

bridge.mjs mở kết nối TCP thay cho người dùng. Nếu không giới hạn đích thì bất kỳ ai trên Internet cũng dùng VPS của bạn làm bàn đạp đi tới máy chủ và cổng tuỳ ý — bị lạm dụng là mất VPS như chơi.

Giá trị đúng đã đặt sẵn ở bước 7.3:

ALLOW=sv.hsosky.com:19129

Thêm máy chủ khác thì ngăn cách bằng dấu phẩy. Cầu nối cũng chỉ nghe ở 127.0.0.1 nên người ngoài không gọi thẳng vào được, chỉ Apache gọi được.

Cập nhật game về sau

Sau mỗi lần build lại bằng TeaVM, làm đủ 4 việc:

  1. Áp lại bản vá (bắt buộc):
    cd PlayWeb
    node scripts\patch-classes.mjs teavm-build\target\generated\js\hsosky\classes.js classes.js
  2. Chép sang gói deploy và nén lại:
    copy PlayWeb\classes.js deploy\playweb\public\
    cd deploy\playweb\public
    node -e "const z=require('zlib'),f=require('fs');f.writeFileSync('classes.js.gz',z.gzipSync(f.readFileSync('classes.js'),{level:9}))"
  3. Tăng số ?v= trong index.htmlplay.html — dòng script.src = "classes.js?v=N".
  4. Chép public\ lên VPS, rồi vào Cloudflare bấm Purge Cache.
⚠ Bỏ qua bước 1 là game hỏng

Build lại xoá sạch các bản vá runtime — nhịp vẽ khung hình, đọc tài nguyên từ file JAR, vòng lặp game tự phục hồi khi lỗi. Script sẽ báo lỗi và dừng nếu có bản vá nào không khớp, nên cứ chạy là biết ngay.

⚠ Quên bước 3 là người chơi kẹt bản cũ

File được cache vĩnh viễn theo số ?v=. Không đổi số thì trình duyệt không bao giờ tải bản mới.