Spaces:
Running
title: Nexus Chat
emoji: 💬
colorFrom: blue
colorTo: purple
sdk: docker
pinned: false
app_port: 7860
Nexus Chat — Standalone Node.js Server
Server chat (Express 5 + WebSocket + PostgreSQL + Redis), chạy trực tiếp bằng Node, không cần bước build. Dữ liệu lưu trong PostgreSQL; Redis dùng cho trạng thái online và pub/sub realtime (hỗ trợ chạy nhiều instance).
Cài đặt
npm install
cp .env.example .env # rồi sửa các giá trị cho phù hợp
Chạy
npm start
# hoặc khi phát triển (tự restart khi sửa file):
npm run dev
Hoặc chạy toàn bộ (app + Postgres + Redis) bằng Docker Compose:
docker compose up --build
Mặc định lắng nghe ở PORT=7860 (đặt biến môi trường PORT để đổi; Hugging
Face Spaces yêu cầu 7860).
Biến môi trường (.env)
Xem file .env.example để biết toàn bộ danh sách. Các nhóm chính:
| Nhóm | Biến | Ý nghĩa |
|---|---|---|
| Server | PORT, NODE_ENV, LOG_LEVEL |
Cổng, môi trường, mức log |
| Auth | JWT_SECRET, SEED_ADMIN_PASSWORD |
Khóa ký JWT, mật khẩu admin seed lần đầu |
| PostgreSQL | DATABASE_URL hoặc PGHOST/PGPORT/PGUSER/PGPASSWORD/PGDATABASE/PGSSL |
Kết nối database |
| Redis | REDIS_URL |
Kết nối Redis (presence + pub/sub) |
| Web Push | VAPID_PUBLIC, VAPID_PRIVATE, VAPID_EMAIL |
Web Push notifications |
DATABASE_URL nếu được đặt sẽ ưu tiên hơn các biến PG* riêng lẻ.
Với các nhà cung cấp Postgres managed (Neon, Supabase, RDS...) thường cần
PGSSL=true.
Cấu trúc
src/
index.js # entrypoint: init Postgres + Redis, tạo HTTP server, WS, seed admin
app.js # Express app: middleware + static + routes
db/index.js # lớp dữ liệu PostgreSQL (pg)
lib/
logger.js # pino logger
redis.js # Redis client, presence helpers, pub/sub
chat/
routes.js # toàn bộ REST API (auth, friends, rooms, messages, admin)
ws.js # WebSocket server (chat realtime, gọi điện WebRTC)
push.js # Web Push notifications
public/
index.html # UI gốc
patch.js # script vá lỗi phía client (được tự động chèn vào index.html)
sw.js # service worker cho push
Tài khoản admin mặc định
Khi server khởi động lần đầu, hai tài khoản admin sẽ được tạo tự động:
admin@nexus.vnquantri@nexus.vn
Mật khẩu mặc định lấy từ SEED_ADMIN_PASSWORD (mặc định 11082012) —
nên đặt biến môi trường này thành một mật khẩu mạnh, hoặc đổi ngay sau khi
đăng nhập lần đầu (qua PUT /me/password).
Database
Schema PostgreSQL được tự động tạo (nếu chưa có) khi server khởi động
(initDb() trong src/db/index.js). Cần một database PostgreSQL đang chạy
và truy cập được qua DATABASE_URL.
Redis
Redis được dùng để:
- Theo dõi danh sách user đang online (set
nexus:online), hoạt động đúng khi chạy nhiều instance của server. - Pub/Sub kênh
nexus:eventsđể chuyển tiếp tin nhắn realtime (chat, typing, thu hồi tin nhắn, gọi điện WebRTC...) giữa các instance.
Deploy lên Hugging Face Spaces (Docker)
- Tạo Space mới, chọn SDK Docker.
- Cấu hình các biến môi trường (
Settings → Variables and secrets) tương ứng với.env.example— đặc biệtDATABASE_URL,REDIS_URL,JWT_SECRET,SEED_ADMIN_PASSWORD. - Push code (kèm
Dockerfile) lên Space.
Lưu ý: PostgreSQL và Redis cần chạy ở dịch vụ ngoài (managed Postgres/Redis), vì Hugging Face Spaces không cung cấp các dịch vụ này.