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.
Có 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.
play.hsosky.com → 103.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.
Chép nguyên thư mục playweb vào C:\laragon\www\
trên VPS (Remote Desktop rồi copy-paste là được).
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
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ề.
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
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”.
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).
proxy_wstunnel là hỏng âm thầmWeb 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.
filter_module là Apache tắt luônKéo sập cả hsosky.com chứ không riêng playweb. Nhớ bật đủ cả 7 dòng.
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.
Mở Laragon → bấm nút Reload (hoặc Stop rồi Start).
Apache lên xanh bình thường, và hsosky.com vẫn vào được.
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.
Vào C:\laragon\www\playweb\, nháy đúp
start-bridge.bat. Một cửa sổ đen hiện ra.
=== 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.
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.
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.
Bấm Start → gõ cmd → chuột phải Command Prompt →
Run as administrator.
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
HsoskyPlayBridge: START: The operation completed successfully.
nssm status HsoskyPlayBridge
SERVICE_RUNNING
MAPMá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.
nssm restart HsoskyPlayBridge | Khởi động lại |
nssm stop HsoskyPlayBridge | Dừng |
nssm edit HsoskyPlayBridge | Mở cửa sổ sửa cấu hình |
nssm remove HsoskyPlayBridge confirm | Gỡ hẳn dịch vụ |
Trên VPS, mở cmd và chạy:
curl http://127.0.0.1:8081/health
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 tra | Kết quả đúng |
|---|---|
| Lần vào đầu tiên | Tải khoảng 3,5 MB |
| Tải lại lần hai | 0 byte — tất cả lấy từ bộ nhớ đệm |
classes.js | Cột Size hiện khoảng 765 KB, không phải 10 MB |
| Đăng nhập | Vào được game |
| Hiện tượng | Nguyê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. |
ALLOW trốngbridge.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.
Sau mỗi lần build lại bằng TeaVM, làm đủ 4 việc:
cd PlayWeb
node scripts\patch-classes.mjs teavm-build\target\generated\js\hsosky\classes.js classes.js
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}))"
?v= trong index.html và
play.html — dòng script.src = "classes.js?v=N".
public\ lên VPS, rồi vào Cloudflare bấm Purge Cache.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.
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.