--- 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 ```bash npm install cp .env.example .env # rồi sửa các giá trị cho phù hợp ``` ## Chạy ```bash 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: ```bash 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.vn` - `quantri@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) 1. Tạo Space mới, chọn SDK **Docker**. 2. 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ệt `DATABASE_URL`, `REDIS_URL`, `JWT_SECRET`, `SEED_ADMIN_PASSWORD`. 3. 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.