Hệ thống quản lý vé sự kiện — monorepo với backend API (NestJS), frontend web (Next.js), worker (NestJS), và mobile app (Flutter).
src/ticketbox/
├── apps/
│ ├── api/ # Backend REST API (NestJS + Prisma)
│ ├── web/ # Frontend Web (Next.js 14 + MUI + Tailwind)
│ ├── worker/ # Worker xử lý async (BullMQ + Prisma)
│ └── mobile/ # Mobile App (Flutter)
├── packages/
│ └── shared/ # Shared types/utils (TypeScript)
├── docker-compose.yml
├── package.json # Root workspace scripts
└── pnpm-workspace.yaml
- Docker / Docker Compose v2 — chạy Postgres, Redis, Mailpit, MinIO
- Node.js v18+ & pnpm v10 (
corepack enable && corepack prepare pnpm@10.33.0 --activate) - Flutter SDK ^3.11 (chỉ cần nếu chạy mobile app)
cd src/ticketboxpnpm installpnpm dev:infra
# tương đương: docker compose up -dChờ các service sẵn sàng:
docker compose logs -f postgres redispnpm shared:buildCác file .env đã được cấu hình sẵn cho môi trường dev local:
apps/api/.env— kết nối Postgres, Redis, MinIO, VNPay sandboxapps/worker/.env— kết nối Postgres, Redis, SMTP (Mailpit), OpenAI/Groqapps/web/.env.example→ copy thành.envnếu cần custom
Áp dụng các migration có sẵn:
cd apps/api
pnpm dlx prisma migrate deployNếu bạn thay đổi Prisma schema, dùng
prisma migrate dev --name ten_migrationđể tạo migration mới. Nếu muốn reset DB + xoá hết dữ liệu:prisma migrate reset --force
Worker và API đều có seed script. Chạy seed từ API (có thể chạy lại an toàn — dùng upsert):
cd apps/api
pnpm prisma db seedNếu muốn reset DB + seed lại từ đầu:
pnpm prisma migrate reset --force
# Sau đó chạy worker seed để seed dữ liệu worker-specific:
cd apps/worker
pnpm seedMở 3 terminal riêng:
# Terminal 1 — API (NestJS, port 3000)
cd apps/api
pnpm start:dev
# Terminal 2 — Web (Next.js, port 5173)
cd apps/web
pnpm dev
# Terminal 3 — Worker (xử lý queue async)
cd apps/worker
pnpm dev- Xác thực — JWT + refresh token, phân quyền (AUDIENCE / ORGANIZER / CHECKIN_STAFF)
- Quản lý sự kiện — CRUD concert, seat map SVG, seat zones, ticket types
- Đặt vé — Giỏ hàng + thanh toán VNPay/MoMo
- Check-in — QR code, hỗ trợ online & offline sync
- Guest list — Import CSV, tạo guest pass
- Artist Bio — Tạo tự động bằng AI (Groq/OpenAI)
- Thông báo — Email (Mailpit) & in-app notification
- Idempotency — Xử lý đơn hàng an toàn với idempotency key
| Lệnh | Mô tả |
|---|---|
pnpm dev:infra |
Khởi tạo Docker services |
pnpm stop:infra |
Dừng Docker services |
pnpm reset:infra |
Xoá volumes Docker và khởi tạo lại |
pnpm dev:api |
Chạy API dev server |
pnpm dev:web |
Chạy Web dev server |
pnpm dev:worker |
Chạy Worker dev server |
pnpm shared:build |
Build package shared |
| Layer | Công nghệ |
|---|---|
| API | NestJS 11, Prisma 7, PostgreSQL 16, Redis 7, BullMQ |
| Web | Next.js 14, React 18, MUI 7, Tailwind 4 |
| Worker | NestJS 11, BullMQ, OpenAI/Groq, Nodemailer |
| Mobile | Flutter 3, GoRouter, Dio |
| Storage | MinIO (S3-compatible) |
| Mailpit (dev), Nodemailer (prod) | |
| Payment | VNPay Sandbox, MoMo |
| Service | Port |
|---|---|
| Web (Next.js) | 5173 |
| API (NestJS) | 3000 |
| PostgreSQL | 5432 |
| Redis | 6379 |
| MinIO API | 9000 |
| MinIO Console | 9001 |
| Mailpit SMTP | 1025 |
| Mailpit UI | 8025 |