
Tech stack
Chi tiết dự án
Kosu — Nền tảng học trực tuyến (end-to-end)
Upload video lớn · Payment webhook qua queue · Kiểm soát phiên theo thiết bị
Vai trò: Solo developer cho cả frontend và backend. Tôi thiết kế kiến trúc, build các luồng chính và tự triển khai phần lớn hệ thống.
Next.js 15 · NestJS · PostgreSQL · Redis/BullMQ · AWS S3/CloudFront · Docker · GitLab CI/CD
Kosu là nền tảng học online cho học viên, giảng viên và đội vận hành. Bài toán chính là vừa xử lý các việc nặng như encode video và webhook thanh toán, vừa giữ API đủ nhanh cho các luồng học tập và mua khóa học.
Kiến trúc Hệ thống
Hệ thống tách thành 3 runtime độc lập: API xử lý nghiệp vụ đồng bộ, Worker chạy tác vụ nặng (encode video, xử lý webhook, batch jobs) qua Redis/BullMQ, Scheduler quản lý cron jobs. Việc tách runtime giúp API luôn phản hồi nhanh ngay cả khi Worker đang encode hàng chục video cùng lúc.
Dữ liệu quan hệ lưu ở PostgreSQL, dữ liệu nóng (session, progress, cache) ở Redis, media ở S3 và phân phối qua CloudFront CDN.
Video Upload & Processing Pipeline
Vấn đề: Upload video lớn (hàng trăm MB đến GB) trực tiếp qua API sẽ nghẽn server, khó retry khi mạng không ổn định, và user không biết video đang xử lý đến bước nào.
Giải pháp: Xây dựng pipeline upload + encode end-to-end với progress tracking theo từng bước.
Cách thực hiện:
- Client upload trực tiếp lên S3 bằng multipart presigned URLs — chunk 10MB, 3 luồng song song, giảm tải cho API
- Backend chỉ điều phối metadata và đẩy job vào queue
- Worker chạy BullMQ flow 7 bước: download → extract metadata → tạo thumbnail → encode HLS (stream) → encode MP4 (download) → upload artifacts → cleanup
- Frontend poll progress mỗi 3 giây, hiển thị step hiện tại + percentage
- Video phát qua HLS signed-cookie trên CloudFront — bảo mật nội dung trả phí
Kết quả: Pipeline production-ready với 7 bước tiến độ hiển thị realtime. User thấy rõ video đang ở bước nào, HLS playback bảo mật qua CDN.
Queue-first Payment Webhook
Vấn đề: Xử lý webhook thanh toán trực tiếp (synchronous) dễ timeout khi database chậm, và duplicate event từ payment gateway có thể gây ghi nhận enrollment sai.
Giải pháp: Thiết kế payment flow theo pattern queue-first webhook — bền vững và chống xử lý trùng.
Cách thực hiện:
- Webhook endpoint chỉ verify chữ ký + enqueue rồi trả
200 ACKngay lập tức — giữ latency thấp - Worker xử lý business logic bất đồng bộ trong transaction: cập nhật payment/order, tạo enrollment
- Idempotency: check event/transaction ID + guard trạng thái final — chống double-processing
- Hỗ trợ đa cổng thanh toán: Stripe, VNPay, SePay
Kết quả: Webhook ack nhanh, xử lý an toàn với eventual consistency ngắn, chống duplicate event hiệu quả.


Multi-device Authentication
Vấn đề: Mô hình auth ban đầu lưu refresh_token trực tiếp trên bảng users — chỉ hỗ trợ 1 session duy nhất. User đăng nhập trên thiết bị mới sẽ invalidate thiết bị cũ, không có cách revoke theo từng device, và replay protection yếu.
Giải pháp:
- Chuyển sang session-based auth: mỗi thiết bị tạo session riêng, JWT mang
session_id+device_id - Token rotation bằng CAS (Compare-And-Swap) trên session row — nếu phát hiện refresh token replay, revoke toàn bộ session ngay lập tức
- Frontend giữ
device_idcookie bền vững (180 ngày), injectx-device-idheader khi login/register - Redis cache session theo
session_idcho hot-path, fallback DB khi cache miss - UI quản lý thiết bị tại
/settings/devices: revoke, revoke-all, trust, rename từng device - Race condition khi đạt device limit xử lý bằng PostgreSQL advisory lock trong transaction
Kết quả: Multi-device isolation hoạt động end-to-end. User có toàn quyền kiểm soát các phiên đăng nhập trên từng thiết bị.

CI/CD & Deploy
- GitLab CI pipeline: build → deploy → rollback cho cả frontend và backend
- Docker: Image build theo commit SHA, push lên GitLab Container Registry. Backend chạy 3 service container riêng biệt (
api,worker,scheduler) +postgres+redis - Deploy: SSH lên server, pull image,
docker compose up -d. Rollback manual theo commit trước - Frontend: Next.js standalone container với healthcheck
/api/health
Tôi có dùng AI để tra cứu và debug ở một số đoạn, nhưng kiến trúc, thiết kế hệ thống và phần code chính đều do tôi trực tiếp quyết định và triển khai.
Các màn hình chính
Trang chủ
Điểm vào chính để khám phá khóa học và bắt đầu học.
Khám phá
Duyệt khóa học, bộ sưu tập và xem trước bài giảng.
Khóa học theo danh mục
Danh sách khóa học đã lọc theo từng nhóm chủ đề.
Chi tiết khóa học
Tổng quan khóa học, nội dung học, review và quyền truy cập cho nội dung trả phí.
Ghi chú thông minh
Ghi chú theo mốc thời gian, mở lại đúng đoạn đang học.