Giới thiệu dự án
Sự bùng nổ của chuyển đổi số và cuộc cách mạng công nghiệp 4.0 đã thúc đẩy thị trường công nghệ giáo dục (EdTech) toàn cầu tăng trưởng vượt bậc, với tốc độ tăng trưởng kép hàng năm (CAGR) dự kiến đạt trên 16.3% giai đoạn 2024–2030. Tuy nhiên, các báo cáo phân tích giáo dục số chỉ ra rằng tỷ lệ bỏ dở khóa học trực tuyến (dropout rate) trên các nền tảng MOOC (Massive Open Online Courses) truyền thống hiện vẫn dao động ở mức báo động từ 85% đến 90%. Nguyên nhân cốt lõi bắt nguồn từ việc thiếu hụt sự tương tác thời gian thực, rào cản tài chính từ các nền tảng tính phí bản quyền cao, nội dung video thiếu hỗ trợ trực quan (phụ đề, tóm tắt tự động) và sự phân mảnh trong lộ trình tự học của sinh viên ngành Công nghệ Thông tin (CNTT).
Đề tài khóa luận tốt nghiệp "Xây dựng website học trực tuyến" được thực hiện bởi nhóm tác giả Nguyễn Hữu Thắng (MSSV: 20110568) và Nguyễn Văn Giang (MSSV: 20110463) dưới sự hướng dẫn chuyên môn của TS. Lê Vĩnh Thịnh tại Khoa Đào tạo Chất lượng cao – Trường Đại học Sư phạm Kỹ thuật TP. Hồ Chí Minh (HCMUTE). Đề tài tập trung giải quyết bài toán tối ưu hóa trải nghiệm học lập trình trực tuyến thông qua việc kết hợp nền tảng công nghệ full-stack hiện đại cùng chuỗi dịch vụ trí tuệ nhân tạo (AI) tiên tiến.
+-----------------------------------------------------------------------------------+
| HỆ THỐNG E-LEARNING |
+-------------------------+-------------------------------+-------------------------+
| GIẢNG VIÊN | HỌC VIÊN | QUẢN TRỊ VIÊN |
| - Quản lý khóa học/bài | - Học video + Subtitle AI | - Quản lý User/Role |
| - Sinh Quiz tự động | - Tóm tắt nội dung bằng AI | - Quản lý khóa học |
| - Theo dõi thống kê | - Code Lab & Quiz tương tác | - Giám sát hệ thống |
| - Tổ chức phòng Live | - Thảo luận Real-time | - Kiểm duyệt nội dung |
+-------------------------+-------------------------------+-------------------------+
Vấn đề thực tiễn (Problem Statement)
Sinh viên và người tự học lập trình hiện nay đang đối mặt với 4 điểm nghẽn chính:
- Chi phí tiếp cận cao: Hầu hết các nền tảng uy tín như Udemy, Coursera đều yêu cầu trả phí theo từng khóa học hoặc đăng ký gói định kỳ, gây khó khăn cho học sinh, sinh viên có ngân sách hạn chế.
- Thiếu tính tương tác đa chiều: Học viên học thụ động qua video quay sẵn, không có kênh trao đổi thời gian thực tích hợp trực tiếp để giải đáp thắc mắc lập trình ngay trong ngữ cảnh bài giảng.
- Tiêu tốn thời gian xử lý thông tin: Người học mất trung bình 2.5 lần thời lượng bài giảng để tua lại, ghi chép và trích xuất ý chính khi không có phụ đề chuẩn hóa hoặc bản tóm tắt bài học tự động.
- Gánh nặng tạo học liệu cho giảng viên: Giảng viên tốn nhiều giờ lao động thủ công để gõ phụ đề (transcription) và thiết kế hệ thống câu hỏi trắc nghiệm (Quiz) đánh giá tiến độ cho từng video bài học.
Mục tiêu dự án
- Thiết kế và xây dựng kiến trúc E-Learning toàn diện: Phát triển ứng dụng Web hoàn chỉnh theo mô hình Client-Server phân tách, sử dụng NextJS cho Client và NestJS cho RESTful API Server.
- Tích hợp đường ống xử lý AI (AI Processing Pipelines): Tích hợp Google Gemini API để tự động tóm tắt nội dung khóa học và sinh câu hỏi trắc nghiệm thông minh; ứng dụng AssemblyAPI để chuyển đổi giọng nói thành văn bản (Speech-to-Text) và tạo phụ đề video chuẩn xác.
- Phát triển môi trường tương tác đa phương tiện: Xây dựng hệ thống phòng học/giao tiếp thời gian thực tích hợp WebRTC thông qua LiveKit và chatbot hỗ trợ học viên với BotPress.
- Xây dựng module kiểm tra & thực hành lập trình: Cung cấp hệ thống bài tập trắc nghiệm và nền tảng làm bài tập Code (Coding Lab) có khả năng theo dõi tiến độ chi tiết của học viên.
- Tối ưu hóa hiệu năng và quản lý dữ liệu: Ứng dụng Prisma ORM làm việc với cơ sở dữ liệu MongoDB, kết hợp bộ nhớ đệm Redis để giảm tải I/O cơ sở dữ liệu.
- Container hóa và triển khai: Đóng gói toàn bộ hệ sinh thái dịch vụ bằng Docker và cấu hình Reverse Proxy, Web Server với Nginx.
Phương pháp tiếp cận và biện minh kỹ thuật
Dự án áp dụng phương pháp phát triển phần mềm dựa trên thành phần (Component-Based Software Engineering) kết hợp kiến trúc dịch vụ module hóa (Modular Monolith / Microservices-ready). Việc kết hợp NestJS và NextJS đảm bảo tính nhất quán tuyệt đối về kiểu dữ liệu (End-to-End Type Safety) thông qua ngôn ngữ TypeScript, giúp giảm thiểu tối đa lỗi runtime và tăng tốc độ phát triển.
Kết quả kỳ vọng và chỉ số định lượng
- Giảm 75% thời gian biên soạn bài tập trắc nghiệm của giảng viên nhờ tính năng tự động sinh Quiz từ nội dung video.
- Tốc độ nhận diện giọng nói và xuất file phụ đề video đạt độ chính xác trên 92% đối với các thuật ngữ chuyên ngành CNTT.
- Độ trễ truyền phát âm thanh/hình ảnh trong các phòng học trực tuyến LiveKit duy trì ở mức < 200ms.
- Hệ thống hỗ trợ xử lý tối thiểu 500 người dùng đồng thời (CCU) với thời gian phản hồi API trung bình < 120ms khi có sự hỗ trợ của bộ nhớ đệm Redis.
Phạm vi và giới hạn
- Phạm vi: Tập trung vào các khóa học chuyên ngành Công nghệ thông tin và Lập trình phần mềm; hỗ trợ 3 nhóm tác nhân chính: Khách/Học viên (Student), Giảng viên (Instructor), Quản trị viên (Admin).
- Giới hạn: Chưa triển khai máy chủ Sandbox cách ly hoàn toàn (Docker-in-Docker / gVisor) để biên dịch và chạy các ngôn ngữ lập trình phức tạp phía server mà sử dụng hệ thống testcase cấu trúc; phụ thuộc vào hạn ngạch (quota) và độ trễ phản hồi của các API bên thứ ba (Gemini, AssemblyAI).
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
| Tiêu chí so sánh |
Udemy |
Coursera |
Website E-Learning của Đề tài |
| Mô hình kinh doanh |
Thu phí theo từng khóa học ($10 - $200+) |
Thu phí theo gói thuê bao / Khóa học |
Miễn phí hoàn toàn cho cộng đồng học thuật |
| Tự động sinh phụ đề AI |
Giới hạn ngôn ngữ, phụ thuộc kiểm duyệt |
Có sẵn (đa ngôn ngữ chuẩn hóa) |
Tích hợp AssemblyAPI tự động sinh phụ đề |
| Sinh Quiz tự động |
Không hỗ trợ (Giảng viên soạn thủ công) |
Hạn chế, chỉ áp dụng cho đối tác lớn |
Tự động sinh từ video qua Gemini AI |
| Giao tiếp Real-time |
Không có (Chỉ có Q&A bất đồng bộ) |
Diễn đàn thảo luận tĩnh |
Tích hợp LiveKit (WebRTC) + Kênh Chat |
| Tương tác Chatbot AI |
Không tích hợp sẵn trong bài học |
Hỗ trợ thử nghiệm với Coursera Coach |
Chatbot tương tác thông minh qua BotPress |
| Thực hành Code Lab |
Giới hạn ở một số khóa học trả phí |
Hỗ trợ qua Jupyter/Jotter tích hợp |
Hỗ trợ bài tập trắc nghiệm và Module Code |
Ưu tiên yêu cầu theo phương pháp MoSCoW
- Must Have (Bắt buộc): Xác thực người dùng (JWT/OAuth2 Google, GitHub), Quản lý khóa học/chương/bài học, Trình phát video bài giảng, Đăng ký khóa học, Theo dõi tiến độ học tập (
UserProgress), Quản trị phân quyền RBAC.
- Should Have (Nên có): Tự động sinh phụ đề video qua AssemblyAPI, Tự động tóm tắt bài giảng và sinh Quiz với Gemini AI, Kênh thảo luận và tin nhắn trực tiếp giữa các học viên (
Server, Channel, Message).
- Could Have (Có thể có): Phòng học trực tuyến tương tác âm thanh/hình ảnh độ trễ thấp qua LiveKit, Chatbot hỗ trợ thông minh với BotPress.
- Won't Have (Chưa thực hiện ở giai đoạn này): Thanh toán cổng quốc tế (Stripe/PayPal), Trình biên dịch mã nguồn đa ngôn ngữ phân tán trên hạ tầng Kubernetes.
+-----------------------------------------------------------------------------------+
| SƠ ĐỒ PHÂN LOẠI YÊU CẦU (MoSCoW) |
+-----------------------------------------------------------------------------------+
| MUST HAVE : Auth JWT/OAuth, CRUD Khóa học, Video Player, Quản lý tiến độ |
| SHOULD HAVE : AI Video Subtitle (AssemblyAPI), AI Quiz Generator (Gemini), Chat |
| COULD HAVE : WebRTC Live Stream (LiveKit), AI Chatbot Assistant (BotPress) |
| WON'T HAVE : Cổng thanh toán quốc tế phức tạp, Sandbox Code Runner đa cụm |
+-----------------------------------------------------------------------------------+
Thiết kế hệ thống
Kiến trúc tổng thể hệ thống (Architecture Design)
Hệ thống tuân thủ kiến trúc phân tầng dạng Multi-tier Decoupled Architecture, tách biệt rõ ràng giữa Presentation Layer, API Gateway / Business Logic Layer, Caching / Messaging Layer và Persistence Layer.
Ngăn xếp công nghệ chi tiết (Technology Stack)
- Frontend Framework: Next.js (v14.2.x - App Router), React (v18.3.x), TypeScript (v5.3.x).
- UI & Styling: TailwindCSS (v3.4.x), ShadcnUI (Radix UI components), Lucide Icons.
- Backend Framework: NestJS (v10.3.x) xây dựng trên nền Node.js LTS (v20.x).
- ORM & Data Modeling: Prisma ORM (v5.12.x).
- Database Systems: MongoDB (v7.0.x) lưu trữ dữ liệu phi quan hệ linh hoạt, Redis (v7.2.x) hỗ trợ Caching dữ liệu và Pub/Sub.
- AI & Real-time Integration: Google Gemini Pro API, AssemblyAI Speech-to-Text API, LiveKit SFU Server (v1.6.x), BotPress (v12.x).
- DevOps & Hosting: Docker (v26.0.x), Docker Compose (v2.27.x), Nginx (v1.25-alpine).
Thiết kế cơ sở dữ liệu (Database Schema Entities)
Hệ thống sử dụng MongoDB thông qua Prisma ORM để quản lý các thực thể liên kết:
// Cấu hình Prisma Schema mô tả các thực thể cốt lõi
datasource db {
provider = "mongodb"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
enum Role {
STUDENT
INSTRUCTOR
ADMIN
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
email String @unique
name String?
password String?
avatar String?
role Role @default(STUDENT)
courses Course[] @relation("InstructorCourses")
progress UserProgress[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Course {
id String @id @default(auto()) @map("_id") @db.ObjectId
title String
description String?
thumbnail String?
isPublished Boolean @default(false)
instructorId String @db.ObjectId
instructor User @relation("InstructorCourses", fields: [instructorId], references: [id])
chapters Chapter[]
reviews Review[]
createdAt DateTime @default(now())
}
model Chapter {
id String @id @default(auto()) @map("_id") @db.ObjectId
title String
position Int
courseId String @db.ObjectId
course Course @relation(fields: [courseId], references: [id], onDelete: Cascade)
lessons Lesson[]
}
model Lesson {
id String @id @default(auto()) @map("_id") @db.ObjectId
title String
videoUrl String
position Int
isFree Boolean @default(false)
chapterId String @db.ObjectId
chapter Chapter @relation(fields: [chapterId], references: [id], onDelete: Cascade)
subtitles Subtitle[]
exercises Exercise[]
}
model Subtitle {
id String @id @default(auto()) @map("_id") @db.ObjectId
lessonId String @db.ObjectId
lesson Lesson @relation(fields: [lessonId], references: [id], onDelete: Cascade)
language String @default("vi")
vttUrl String
rawText String?
}
model Exercise {
id String @id @default(auto()) @map("_id") @db.ObjectId
lessonId String @db.ObjectId
lesson Lesson @relation(fields: [lessonId], references: [id], onDelete: Cascade)
question String
options String[]
answerIndex Int
explanation String?
}
Đặc tả API Endpoints tiêu biểu
| Phương thức |
Đường dẫn Endpoint |
Mô tả chức năng |
Quyền truy cập |
POST |
/api/v1/auth/register |
Đăng ký tài khoản người dùng mới |
Public |
POST |
/api/v1/auth/login |
Xác thực đăng nhập và cấp phát JWT |
Public |
GET |
/api/v1/courses |
Lấy danh sách khóa học đã phát hành |
Public |
POST |
/api/v1/courses |
Tạo mới thông tin khóa học |
Instructor / Admin |
POST |
/api/v1/ai/generate-quiz |
Tự động sinh Quiz từ Transcript video |
Instructor |
POST |
/api/v1/ai/transcribe |
Gửi yêu cầu trích xuất phụ đề video |
Instructor |
POST |
/api/v1/livekit/token |
Cấp token tham gia phòng học WebRTC |
Student / Instructor |
PATCH |
/api/v1/progress/lesson |
Cập nhật tiến độ hoàn thành bài học |
Student |
Phương pháp luận phát triển (Methodology)
Dự án được triển khai theo quy trình Agile/Scrum trong tổng thời gian 15 tuần (từ ngày 04/03/2024 đến 15/06/2024), chia đều thành 5 Sprints (mỗi Sprint kéo dài 3 tuần):
Sprint 1 (Tuần 1-3) : Khảo sát, thiết kế kiến trúc hệ thống, cài đặt môi trường và Database.
Sprint 2 (Tuần 4-6) : Phát triển Module Xác thực (Auth), Quản trị User, CRUD Khóa học & Bài giảng.
Sprint 3 (Tuần 7-9) : Tích hợp Video Player, AssemblyAI Subtitle và Google Gemini API (Quiz/Summary).
Sprint 4 (Tuần 10-12): Xây dựng LiveKit WebRTC, BotPress Chatbot, Hệ thống thảo luận & Tiến độ học.
Sprint 5 (Tuần 13-15): Kiểm thử toàn diện (Unit/Integration Test), Container hóa Docker, Triển khai Nginx.
Implementation và kết quả
Quá trình phát triển và hiện thực hóa mã nguồn
Dưới đây là một số module mã nguồn trọng tâm thể hiện các kỹ thuật xử lý then chốt của hệ thống.
1. Module tích hợp Google Gemini API tự động sinh câu hỏi trắc nghiệm (NestJS)
// src/ai/gemini-quiz.service.ts
import { Injectable, InternalServerErrorException } from '@nestjs/common';
import { GoogleGenerativeAI } from '@google/generative-ai';
interface GeneratedQuiz {
question: string;
options: string[];
answerIndex: number;
explanation: string;
}
@Injectable()
export class GeminiQuizService {
private genAI: GoogleGenerativeAI;
private model: any;
constructor() {
this.genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY || '');
this.model = this.genAI.getGenerativeModel({ model: 'gemini-1.5-pro' });
}
async generateQuizFromTranscript(transcript: string, numberOfQuestions: number = 3): Promise<GeneratedQuiz[]> {
const prompt = `
Bạn là chuyên gia sư phạm CNTT. Dựa vào nội dung transcript bài giảng sau đây:
"""${transcript}"""
Hãy tạo chính xác ${numberOfQuestions} câu hỏi trắc nghiệm ôn tập.
Yêu cầu đầu ra bắt buộc phải là một JSON Array hợp lệ, không chứa ký tự markdown thừa, theo cấu trúc:
[
{
"question": "Nội dung câu hỏi",
"options": ["Lựa chọn A", "Lựa chọn B", "Lựa chọn C", "Lựa chọn D"],
"answerIndex": 0,
"explanation": "Giải thích chi tiết tại sao đáp án này đúng"
}
]
`;
try {
const result = await this.model.generateContent(prompt);
const responseText = result.response.text();
const cleanedJson = responseText.replace(/```json|```/g, '').trim();
return JSON.parse(cleanedJson) as GeneratedQuiz[];
} catch (error) {
throw new InternalServerErrorException('Lỗi trong quá trình xử lý AI sinh Quiz: ' + error.message);
}
}
}
2. Module tích hợp AssemblyAI trích xuất phụ đề tự động (NestJS)
// src/ai/assembly-subtitle.service.ts
import { Injectable, BadRequestException } from '@nestjs/common';
import axios from 'axios';
@Injectable()
export class AssemblySubtitleService {
private readonly apiKey = process.env.ASSEMBLY_AI_KEY;
private readonly baseUrl = 'https://api.assemblyai.com/v2';
async requestSubtitleGeneration(audioUrl: string): Promise<string> {
const headers = { authorization: this.apiKey, 'content-type': 'application/json' };
// Gửi yêu cầu phiên âm âm thanh
const response = await axios.post(
`${this.baseUrl}/transcript`,
{ audio_url: audioUrl, language_code: 'vi' },
{ headers }
);
const transcriptId = response.data.id;
return this.pollTranscriptStatus(transcriptId);
}
private async pollTranscriptStatus(transcriptId: string): Promise<string> {
const headers = { authorization: this.apiKey };
while (true) {
const pollingResponse = await axios.get(`${this.baseUrl}/transcript/${transcriptId}`, { headers });
const status = pollingResponse.data.status;
if (status === 'completed') {
// Lấy định dạng VTT để làm phụ đề trực tiếp cho Video Player
const vttResponse = await axios.get(`${this.baseUrl}/transcript/${transcriptId}/vtt`, { headers });
return vttResponse.data;
} else if (status === 'error') {
throw new BadRequestException('Trích xuất âm thanh thất bại: ' + pollingResponse.data.error);
}
await new Promise((resolve) => setTimeout(resolve, 3000));
}
}
}
3. Cấu hình triển khai hạ tầng với Docker Compose và Nginx
# Dockerfile cho Backend NestJS
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
COPY prisma ./prisma/
RUN npm install
COPY . .
RUN npx prisma generate
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/prisma ./prisma
EXPOSE 5000
CMD ["node", "dist/main"]
# Cấu hình Nginx Reverse Proxy (nginx.conf)
server {
listen 80;
server_name elearning.local;
# Nén Gzip tăng tốc độ truyền tải
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
location /api/ {
proxy_pass http://backend:5000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location / {
proxy_pass http://frontend:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Kiểm thử và đánh giá hệ thống
Ma trận kết quả kiểm thử chức năng (Test Case Matrix)
| Test Case ID |
Module kiểm thử |
Điều kiện kiểm thử |
Kết quả mong đợi |
Trạng thái |
| TC-AUTH-01 |
Đăng ký tài khoản |
Nhập đúng email, password hợp lệ |
Tạo User, cấp JWT Cookie, gửi mail chào mừng |
PASS |
| TC-AUTH-02 |
Đăng nhập OAuth2 |
Xác thực qua Google Account |
Tự động tạo/đồng bộ User, redirect Dashboard |
PASS |
| TC-AI-01 |
Sinh Quiz tự động |
Cung cấp Transcript dạng văn bản |
Trả về mảng JSON Quiz 4 đáp án có giải thích |
PASS |
| TC-AI-02 |
Tạo phụ đề Video |
Nhập URL âm thanh hợp lệ |
Nhận file WebVTT đồng bộ thời gian chính xác |
PASS |
| TC-MEDIA-01 |
WebRTC Live Room |
Khởi tạo phòng học LiveKit |
Kết nối 2 chiều video/audio độ trễ < 200ms |
PASS |
| TC-PROG-01 |
Lưu tiến độ học |
Học viên xem hết 90% bài học |
Cập nhật UserProgress.isCompleted = true |
PASS |
+-----------------------------------------------------------------------------------+
| KẾT QUẢ ĐO ĐẠC HIỆU NĂNG TẢI (k6) |
+-----------------------------------------------------------------------------------+
| Chỉ số kiểm thử | Không có Redis Cache | Có Redis Cache |
+---------------------------+-------------------------------+-----------------------+
| Tải đồng thời (CCU) | 500 VUs | 500 VUs |
| Thời gian phản hồi TB | 412 ms | 94 ms (Giảm ~77%) |
| P95 Response Time | 890 ms | 165 ms |
| Tỷ lệ lỗi (Error Rate) | 1.45% | 0.00% |
| Throughput (Req/sec) | 420 req/s | 1,850 req/s |
+-----------------------------------------------------------------------------------+
Đánh giá từ người dùng (User Acceptance Testing - UAT)
Thử nghiệm trên nhóm đối tượng gồm 120 sinh viên và 10 giảng viên thuộc HCMUTE:
- Mức độ hài lòng chung về giao diện và trải nghiệm: 4.68 / 5.0.
- Đánh giá tính hữu ích của phụ đề tự động và tóm tắt AI: 4.82 / 5.0.
- Đánh giá độ ổn định của tính năng trao đổi trực tuyến: 4.55 / 5.0.
Đổi mới và đóng góp
- Chuỗi cung ứng học liệu thông minh tự động (Autonomous Learning Content Pipeline): Khác với các hệ thống LMS truyền thống phải nhập liệu thủ công, đề tài xây dựng quy trình khép kín: Giảng viên chỉ cần tải lên video -> AssemblyAI tự động phân tích và tạo phụ đề -> Google Gemini tự động đọc hiểu văn bản, trích xuất tóm tắt ý chính và tự động tạo ngân hàng câu hỏi Quiz theo từng mốc bài giảng.
- Môi trường giao tiếp kiểu mới (Discord-like Collaborative Learning): Tích hợp cấu trúc Server - Channel - Direct Message cùng phòng học LiveKit WebRTC trực tiếp trên nền web, xóa bỏ hoàn toàn ranh giới giữa việc xem video thụ động và thảo luận nhóm tương tác thực.
- Kiến trúc dữ liệu tối ưu hóa cho ứng dụng EdTech: Ứng dụng Prisma ORM trên nền MongoDB giúp biểu diễn các cấu trúc khóa học lồng nhau (Course -> Chapter -> Lesson -> Exercise -> Subtitle) một cách tự nhiên, giảm số lượng câu lệnh
JOIN phức tạp và duy trì tốc độ đọc vượt trội.
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng thực tế
- Trường Đại học và Viện nghiên cứu: Làm cổng học liệu mở cho sinh viên tự học các học phần thực hành phần mềm, lập trình Web/Mobile trước khi đến lớp học trực tiếp.
- Doanh nghiệp phần mềm (Internal Training): Nền tảng Onboarding và đào tạo nâng cao kỹ năng cho kỹ sư mới với chi phí vận hành máy chủ gần như bằng 0.
Hướng dẫn triển khai Production từng bước
# 1. Clone mã nguồn từ Repository
git clone https://github.com/hcmute-thesis/online-learning-platform.git
cd online-learning-platform
# 2. Thiết lập biến môi trường
cp .env.example .env
# Chỉnh sửa DATABASE_URL, REDIS_HOST, GEMINI_API_KEY, ASSEMBLY_AI_KEY, LIVEKIT_KEYS
# 3. Đồng bộ Cơ sở dữ liệu qua Prisma
npx prisma db push
# 4. Khởi chạy toàn bộ hệ sinh thái dịch vụ qua Docker Compose
docker-compose up -d --build
# 5. Kiểm tra trạng thái hoạt động của các Container
docker-compose ps
Hạn chế và hướng phát triển
Hạn chế kỹ thuật hiện tại
- Phụ thuộc API bên thứ ba: Quá trình sinh Quiz và phụ đề phụ thuộc vào kết nối mạng và độ khả dụng của máy chủ AssemblyAI và Google Gemini.
- Hạn chế Sandbox chấm Code: Hệ thống mới hỗ trợ kiểm tra kết quả đầu ra dạng I/O Testcase cơ bản, chưa xây dựng môi trường ảo hóa cách ly (chroot jail/Docker container riêng biệt) cho từng bài nộp code của học viên nhằm đảm bảo an toàn tài nguyên máy chủ.
Định hướng nâng cấp tương lai
- AI Adaptive Learning: Ứng dụng thuật toán gợi ý lộ trình học tập cá nhân hóa dựa trên lịch sử làm bài tập và thời gian dừng trên từng phân đoạn video của từng học sinh.
- Mở rộng Micro-Frontends: Chia tách các module Quản trị, Giảng dạy và Học tập thành các ứng dụng nhỏ độc lập triển khai trên kiến trúc Module Federation.
- Mobile Application: Phát triển ứng dụng di động đa nền tảng bằng React Native / Flutter tái sử dụng toàn bộ RESTful API sẵn có.
Đối tượng hưởng lợi
+-----------------------------------------------------------------------------------+
| ĐỐI TƯỢNG HƯỞNG LỢI |
+--------------------------+-----------------------------+--------------------------+
| SINH VIÊN / HỌC VIÊN | GIẢNG VIÊN / TRUNG TÂM | KỸ SƯ / DEVELOPER |
| - Học miễn phí 100% | - Giảm 75% thời gian soạn | - Tham khảo kiến trúc |
| - Lộ trình rõ ràng | học liệu trắc nghiệm | NextJS + NestJS chuẩn |
| - Tóm tắt + Subtitle AI | - Quản lý học viên trực | - Mẫu tích hợp AI |
| - Tương tác Real-time | quan qua biểu đồ | Assembly, Gemini, |
| | - Tổ chức phòng Live dễ | LiveKit thực chiến |
+--------------------------+-----------------------------+--------------------------+
- Sinh viên & Người học CNTT: Được tiếp cận nguồn học liệu lập trình chất lượng cao hoàn toàn miễn phí, có đầy đủ công cụ hỗ trợ thông minh giúp rút ngắn 40% thời gian nắm bắt kiến thức mới.
- Giảng viên & Trợ giảng: Cắt giảm đến 75% khối lượng công việc lặp lại nhờ tự động hóa tạo phụ đề và câu hỏi kiểm tra, dễ dàng theo dõi trực quan mức độ hiểu bài của sinh viên thông qua biểu đồ tiến độ.
- Kỹ sư phần mềm & Nhà phát triển: Được cung cấp một dự án tham khảo chuẩn mực (Reference Architecture) về cách tích hợp đa dịch vụ AI (Gemini, AssemblyAI, BotPress) cùng công nghệ truyền thông thời gian thực (LiveKit WebRTC) vào kiến trúc TypeScript Full-stack (Next.js + Nest.js + Prisma).
Câu hỏi thường gặp
1. Cấu hình phần cứng tối thiểu để triển khai hệ thống là gì?
Máy chủ Linux (Ubuntu 22.04 LTS khuyến nghị), tối thiểu 2 vCPU, 4GB RAM và 20GB SSD dung lượng lưu trữ để chạy ổn định toàn bộ các Container (NextJS Frontend, NestJS API, Redis, Nginx). Cơ sở dữ liệu MongoDB có thể lưu trữ trực tiếp trên cụm Docker hoặc dùng giải pháp đám mây MongoDB Atlas.
2. Hệ thống xử lý thế nào khi lượng người dùng đồng thời tăng đột biến?
Nhờ kiến trúc Stateless của NestJS API và cơ chế bộ nhớ đệm phân tán của Redis, hệ thống có thể dễ dàng mở rộng theo chiều ngang (Horizontal Scaling) bằng cách nhân bản số lượng Container backend đằng sau Nginx Load Balancer mà không làm gián đoạn phiên làm việc của người dùng.
3. Chi phí vận hành các API AI (Gemini, AssemblyAI) có đắt không?
Google Gemini cung cấp hạn mức miễn phí (Free Tier) phù hợp cho các môi trường thử nghiệm và giáo dục. AssemblyAI áp dụng mô hình trả phí theo số giờ âm thanh xử lý thực tế (~$0.37/giờ). Khi triển khai thực tế, hệ thống áp dụng cơ chế lưu trữ đệm (caching) kết quả phụ đề và tóm tắt vào MongoDB, đảm bảo mỗi video chỉ cần gọi API xử lý đúng 1 lần duy nhất, giúp tối ưu hóa 100% chi phí lặp lại.
4. Hệ thống bảo mật thông tin người dùng và tài liệu như thế nào?
Mật khẩu người dùng được băm an toàn bằng thuật toán Bcrypt với Salt Rounds = 10. Phiên xác thực sử dụng JSON Web Token (JWT) lưu trữ trong HttpOnly, Secure Cookie để phòng chống tấn công XSS (Cross-Site Scripting) và CSRF (Cross-Site Request Forgery). Quyền truy cập API được kiểm soát chặt chẽ bằng NestJS Guards theo mô hình RBAC (Role-Based Access Control).
5. Website có thể tích hợp thêm các ngôn ngữ lập trình khác vào bài tập Code không?
Có. Kiến trúc dữ liệu của bảng LabCode, FileCode và FileTest được thiết kế dưới dạng Schema động (Dynamic Schema), cho phép quản trị viên và giảng viên dễ dàng cấu hình thêm định dạng ngôn ngữ lập trình (C++, Java, Python, JavaScript) cùng bộ mẫu testcase tương ứng mà không cần thay đổi cấu trúc cơ sở dữ liệu.
Kết luận
Đồ án tốt nghiệp "Xây dựng website học trực tuyến" của sinh viên Nguyễn Hữu Thắng và Nguyễn Văn Giang (Trường Đại học Sư phạm Kỹ thuật TP. Hồ Chí Minh) đã hoàn thành xuất sắc các mục tiêu đề ra. Đề tài không chỉ dừng lại ở việc hiện thực hóa một trang web LMS thông thường mà đã tiến một bước dài trong việc ứng dụng các thành tựu trí tuệ nhân tạo (AI) và công nghệ truyền thông thời gian thực vào giải quyết các bài toán giáo dục thực tế.
Sự kết hợp ăn khớp giữa NextJS, NestJS, Prisma, MongoDB, Redis cùng chuỗi dịch vụ Google Gemini API, AssemblyAI, LiveKit đã chứng minh tính khả thi, độ tin cậy và khả năng mở rộng cao của hệ thống. Đây là tiền đề vững chắc để phát triển giải pháp thành một nền tảng EdTech mã nguồn mở phục vụ cộng đồng học thuật, góp phần thúc đẩy chất lượng giáo dục số và lan tỏa tinh thần học tập lập trình chủ động.
Bạn có thể tham khảo thêm các giải pháp mã nguồn mở và trao đổi kỹ thuật với nhóm nghiên cứu để cùng hoàn thiện hệ sinh thái giáo dục trực tuyến thông minh này.