Server chỉ xây cầu và chuyển tiếp: nhận request, đưa job vào queue, broadcast/notify qua WebSocket. Không lưu trữ tin nhắn – client tự lo lưu trữ và dọn dẹp. Mỗi request từ client (HTTP hoặc WebSocket) đều kích hoạt xử lý queue.
Cho phép thêm các server Node khác làm sub, điều phối và phân chia tầng theo server sub.
/nodeadmin/) → tab Multi-server.POST {sub.url}/api/sub/receive.POST /api/sub/receive, thêm vào queue local và xử lý (broadcast/notify trong phạm vi sub đó).http://localhost:3101), Tên, Tầng (số, mặc định 0). Bấm Thêm sub.Để sub chấp nhận job từ server điều phối, mọi server (điều phối và sub) phải cấu hình cùng một secret.
POST tới {sub}/api/sub/receive, gửi header X-Sub-Secret: <secret>.POST /api/sub/receive chỉ chấp nhận request có header X-Sub-Secret khớp với cấu hình.servernode/src/config.js, mục multiServer.subSecret. Hoặc biến môi trường SUB_SECRET / CHATAI_SUB_SECRET. Đổi giá trị mặc định khi triển khai thật.POST /api/chat/send) tới server điều phối.POST tới từng sub: { "type": "broadcast", "payload": { ... } } kèm X-Sub-Secret.| Method | Path | Mô tả |
|---|---|---|
| GET | /api/admin/multi-server | Trạng thái bật/tắt và danh sách sub (cần X-Admin-Token) |
| POST | /api/admin/multi-server/enabled | Body { "enabled": true|false } – bật/tắt multi-server |
| POST | /api/admin/multi-server/subs | Body { "url", "name?", "tier?" } – thêm sub |
| PUT | /api/admin/multi-server/subs/:id | Body { "url?", "name?", "tier?" } – cập nhật sub |
| DELETE | /api/admin/multi-server/subs/:id | Xóa sub |
| POST | /api/sub/receive | Nhận job từ điều phối. Header X-Sub-Secret bắt buộc. Body { "type", "payload" }. |
Danh sách sub và trạng thái bật/tắt được lưu trong file servernode/data/sub-servers.json (tự tạo thư mục nếu chưa có). Server khởi động lại vẫn giữ cấu hình.
Giao diện quản trị tại /nodeadmin/. Hỗ trợ hai phương thức đăng nhập:
| Role | Quyền |
|---|---|
| super_admin | Toàn quyền: token, user, device, blocklist, queue, settings, … |
| admin | Tạo member, quản lý token của member, quản lý device của member. Tạo token mới cho member. |
| viewer | Quản lý token của mình, device của mình, sửa thông tin cá nhân. Tạo token API. |
Cách cấp token: Super admin tạo token mới → chọn role admin (nhập User được quản lý) hoặc viewer (nhập UserId).
User tạo token để tích hợp vào App (mobile, web, bot). Token dùng header X-User-Token khi gọi API.
| Method | Path | Mô tả |
|---|---|---|
| GET | /api/user/tokens | Danh sách token API của user |
| POST | /api/user/tokens | Body { "name": "App A" } – tạo token mới (chỉ hiện 1 lần) |
| DELETE | /api/user/tokens/:id | Thu hồi token |
| Method | Path | Mô tả |
|---|---|---|
| GET | /api/admin/user-tokens?userId=xxx | Danh sách token API của user |
| POST | /api/admin/user-tokens | Body { "userId", "name" } – tạo token cho user |
| DELETE | /api/admin/user-tokens/:id?userId=xxx | Thu hồi token |
API chấp nhận hai loại:
POST /api/auth/login (userId + password). Hết hạn sau 24h.Device hoạt động độc lập, được cấp token qua user hoặc admin. Xác thực bằng X-User-Token hoặc userId trong body/query.
| Method | Path | Mô tả |
|---|---|---|
| POST | /api/device/register | Đăng ký device (body: userId?, name?, platform?, groupId?) |
| GET | /api/device/list?userId= | Danh sách device của user |
| PUT | /api/device/:deviceId | Cập nhật (body: userId?, groupId?, name?, platform?) |
| GET | /api/device/:deviceId/token | Xem token device |
| POST | /api/device/:deviceId/token | Gia hạn token |
| DELETE | /api/device/:deviceId | Xóa device |
| POST | /api/device/notify-group | Gửi thông báo tới nhóm (body: groupId, content?, type?) |
| Method | Path | Mô tả |
|---|---|---|
| GET | /api/admin/devices?userId= | Danh sách device (tất cả hoặc theo user) |
| POST | /api/admin/devices | Tạo device (body: userId, deviceId?, name?, groupId?, companyId?) |
| PUT | /api/admin/devices/:deviceId/token | Cấp/cập nhật token (body: token?) |
| PUT | /api/admin/devices/:deviceId | Cập nhật device |
| DELETE | /api/admin/devices/:deviceId | Xóa device |
const ws = new WebSocket('wss://example.com/ws');
ws.onopen = () => {
ws.send(JSON.stringify({ type: 'auth_device', token: 'YOUR_DEVICE_TOKEN' }));
};
ws.onmessage = (ev) => {
const m = JSON.parse(ev.data);
if (m.type === 'auth_ok') {
ws.send(JSON.stringify({ type: 'subscribe', roomId: 'device_group:' + groupId }));
}
};
| Method | Path | Mô tả |
|---|---|---|
| POST | /api/auth/login | Body { "userId", "password" }. Trả về userToken (session), adminToken (nếu user có token viewer). |
Server tích hợp các lớp bảo mật cho môi trường production:
GET /api/admin/security/warnings (cần X-Admin-Token).| Biến | Mô tả |
|---|---|
SECURITY_DISABLED=1 | Tắt toàn bộ lớp bảo mật (chỉ dùng khi debug) |
RATE_LIMIT_WINDOW_MS | Cửa sổ rate limit (giây), mặc định 60 |
RATE_LIMIT_MAX | Số request tối đa mỗi cửa sổ, mặc định 200 |
AUTH_RATE_WINDOW_MS | Cửa sổ auth rate (giây), mặc định 900 (15 phút) |
AUTH_MAX_ATTEMPTS | Số lần thử đăng nhập tối đa, mặc định 15 |
servernode/README.md – API HTTP, WebSocket, queue, session, dashboard.