Kosu - Nền tảng học trực tuyến

Frontend
Backend
DevOps
Kosu - Nền tảng học trực tuyến

Tech stack

Next.js
Nest.js
Typescript
PostgreSQL
Redis
AWS
Docker
CI/CD

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 ACK ngay 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ả.

Kosu Payment Checkout

Kosu Payment Checkout Kosu Payment Checkout


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_id cookie bền vững (180 ngày), inject x-device-id header khi login/register
  • Redis cache session theo session_id cho 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ị.

Kosu Multi-device Authentication


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.