Arsitektur Sistem
Dokumentasi arsitektur sistem LMS Codeverta β memahami bagaimana komponen-komponen platform saling terhubung.
Gambaran Umum Arsitekturβ
LMS Codeverta menggunakan arsitektur monorepo dengan backend API (Go/Gin) dan frontend SPA (React/Vite) yang terpisah. Berikut adalah gambaran arsitektur tingkat tinggi:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β HTTPS/HTTP β
β (Cloudflare / Nginx) β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββ¬ββββββββββββββββ€
β β β β
β ββββββββββββββββ β ββββββββββββββββ β βββββββββββ β
β β Frontend β β β Frontend β β β Landing β β
β β Admin βββββΌβββΆβ Admin (CDN) ββββ β β Page β β
β β (Vite/React)β β β (Nginx) β β β β(Workers)β β
β ββββββββββββββββ β ββββββββββββββββ β β βββββββββββ β
β β β β β
βββββββββββββββββββββββΌβββββββββββββββββββββββΌββΌβββββββββββββββ€
β β β β β
β βΌ βΌ β β
β ββββββββββββββββββββββββββββββ β β
β β Go Backend (Gin) ββββ β
β β :8080 / :3000 β β
β ββββββββββββ¬ββββββββββββββββββ β
β β β
β βββββββββββββββββΌββββββββββββββββ β
β β β β β
β βΌ βΌ βΌ β
β ββββββββββββββ ββββββββββββββ ββββββββββββββ β
β β MySQL β β Redis β β Storage β β
β β Database β β Cache β β Files β β
β β :3306 β β :6379 β β β β
β ββββββββββββββ ββββββββββββββ ββββββββββββββ β
β β
β ββββββββββββββββ ββββββββββββββββββ βββββββββββββββββ β
β β Xendit β β OpenAI β β SES/Tencent β β
β β (Payment) β β (AI Chat) β β (Email) β β
β ββββββββββββββββ ββββββββββββββββββ βββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Tech Stackβ
Backendβ
| Komponen | Teknologi | Versi | Fungsi |
|---|---|---|---|
| Bahasa | Go (Golang) | 1.22+ | Bahasa pemrograman backend |
| HTTP Framework | Gin | v1.9+ | Routing, middleware, request handling |
| ORM | GORM | v2+ | Database ORM dan migrasi |
| Database | MySQL / MariaDB | 8.0+ | Penyimpanan data utama |
| Cache | Redis | 6.0+ | Session store, rate limiting, cache |
| Validator | go-playground/validator | v10+ | Validasi input request |
| Session | gin-contrib/sessions | - | Manajemen session (cookie/redis) |
Frontendβ
| Komponen | Teknologi | Versi | Fungsi |
|---|---|---|---|
| Framework | React | 18+ | Library UI frontend |
| Build Tool | Vite | 5+ | Bundler dan dev server |
| CSS | Tailwind CSS | 3+ | Utility-first CSS framework |
| State Management | React Context + Zustand | - | Manajemen state global |
| Routing | React Router | 6+ | Routing SPA |
| HTTP Client | Axios / Fetch | - | Komunikasi dengan backend API |
Infrastructureβ
| Komponen | Teknologi | Fungsi |
|---|---|---|
| Container | Docker | Containerization |
| Orchestration | Docker Compose | Multi-container setup |
| Reverse Proxy | Nginx | Static files & reverse proxy untuk frontend |
| CDN / Edge | Cloudflare Workers | Landing page |
| Payment Gateway | Xendit | Pemrosesan pembayaran |
| AI | OpenAI API | Chat AI cerdas |
| Tencent SES | Pengiriman email transaksional |
Struktur Monorepoβ
Proyek LMS Codeverta menggunakan pnpm workspace untuk mengelola monorepo:
lms.codeverta.com/
βββ apps/
β βββ admin/ # React Frontend (Vite)
β β βββ src/
β β β βββ components/ # Komponen UI reusable
β β β βββ pages/ # Halaman aplikasi
β β β βββ context/ # React Context providers
β β β βββ hooks/ # Custom React hooks
β β β βββ lib/ # Utility functions
β β β βββ store/ # Zustand stores
β β β βββ schemas/ # Form validation schemas
β β β βββ layout/ # Layout komponen
β β βββ public/ # Static assets
β β βββ ...konfigurasi
β β
β βββ backend/ # Go Backend
β β βββ main.go # Entry point
β β βββ router/ # Route definitions
β β β βββ api-router.go # Main API router
β β β βββ auth-router.go # Authentication routes
β β β βββ admin-router.go # Admin routes
β β β βββ lms-router.go # LMS routes
β β β βββ public-router.go # Public routes
β β βββ controller/ # HTTP handlers
β β βββ model/ # GORM models & DB init
β β βββ repository/ # Data access layer
β β βββ services/ # Business logic
β β βββ middleware/ # HTTP middleware
β β βββ common/ # Shared utilities
β β βββ dto/ # Data Transfer Objects
β β βββ validator/ # Custom validators
β β βββ handler/ # Additional handlers
β β
β βββ landing/ # Landing page (Cloudflare Workers)
β βββ src/
β
βββ docs/ # Dokumentasi (folder ini)
βββ pnpm-workspace.yaml # Workspace config
βββ pnpm-lock.yaml # Lock file
βββ docker-compose.yml # Docker Compose
βββ package.json # Root package.json
Arsitektur Backend (Layered Architecture)β
Backend LMS Codeverta menggunakan Layered Architecture yang memisahkan tanggung jawab ke dalam lapisan-lapisan:
Layer Diagramβ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ROUTER LAYER β
β Menentukan route β middleware β controller β
β File: router/*.go β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β MIDDLEWARE LAYER β
β Rate limiting, autentikasi, CORS, tenant resolver β
β File: middleware/*.go β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β CONTROLLER LAYER β
β HTTP request/response handling, validasi input β
β File: controller/*.go β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β SERVICE LAYER β
β Business logic, integrasi eksternal (Xendit, OpenAI) β
β File: services/*.go β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β REPOSITORY LAYER β
β Akses database, query, data persistence β
β File: repository/*.go β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β MODEL LAYER β
β Definisi tabel, relasi, database initialization β
β File: model/*.go β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Alur Requestβ
HTTP Request
β
βΌ
βββββββββββββββ ββββββββββββββββββββ
β Gin Router ββββββΆβ Middleware β
β /api/* β β - CORS β
βββββββββββββββ β - Rate Limit β
β - Auth β
β - Tenant β
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β Controller β
β (Handler) β
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β Repository β
β (Database) β
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β MySQL/Redis β
ββββββββββββββββββββ
β
βΌ
HTTP Response (JSON)
Arsitektur Frontend (Component-Based)β
Frontend LMS Codeverta menggunakan arsitektur Component-Based dengan React:
Struktur Halamanβ
βββββββββββββββββββββββββββββββββββββββββββ
β App Layout β
ββββββββββββ¬βββββββββββββββββββββββββββββββ€
β β β
β Sidebar β Main Content β
β β β
β - Nav β (React Router Pages) β
β - Menu β β
β β ββββββββββββββββββββββββ β
β β β Dashboard Page β β
β β ββββββββββββββββββββββββ€ β
β β β Course Page β β
β β ββββββββββββββββββββββββ€ β
β β β Quiz Page β β
β β ββββββββββββββββββββββββ β
β β β
ββββββββββββ΄βββββββββββββββββββββββββββββββ
Manajemen Stateβ
Frontend menggunakan kombinasi React Context dan Zustand untuk state management:
- Context β State global seperti autentikasi user, role, tenant
- Zustand Store β State spesifik fitur (kursus, kuis, chat)
- Local State β State komponen lokal (form input, UI state)
Alur Data Frontendβ
User Action (klik, submit form)
β
βΌ
React Component
β
βΌ
Custom Hook (useFetch, useAuth, dll)
β
βΌ
API Call (Axios β Backend)
β
βΌ
Zustand Store / Context (update state)
β
βΌ
React Re-render (UI updated)
Sistem Databaseβ
Entity Relationship Diagram (Textual)β
Berikut adalah relasi utama antar entitas di LMS Codeverta:
users (id, email, password, role, name, status)
β
βββ< students (user_id β courses) [Many-to-Many via enrollments]
β
βββ< mentor (user_id β students) [One-to-Many]
β
βββ< parent (user_id β students) [Many-to-Many via parent_student]
courses (id, title, slug, description, price, status)
β
βββ< modules (course_id) [One-to-Many]
β β
β βββ< lessons (module_id) [One-to-Many]
β β
β βββ< quizzes (module_id) [One-to-Many]
β β
β βββ< questions (quiz_id) [One-to-Many]
β β
β βββ< options (question_id) [One-to-Many]
β
βββ< certificates (course_id β user_id)
chat_messages (id, sender_id, receiver_id, message, type)
learning_schedules (id, user_id, title, date, time, duration)
Tabel Utamaβ
| Tabel | Fungsi |
|---|---|
| users | Data semua pengguna (siswa, orang tua, mentor, admin) |
| courses | Data kursus |
| modules | Modul dalam kursus |
| lessons | Pelajaran dalam modul |
| lesson_details | Detail konten pelajaran |
| quizzes | Kuis dalam modul |
| quiz_questions | Soal dalam kuis |
| quiz_options | Opsi jawaban soal |
| quiz_attempts | Riwayat pengerjaan kuis |
| enrollments | Pendaftaran siswa ke kursus |
| certificates | Sertifikat kelulusan |
| certificate_templates | Template sertifikat |
| learning_schedules | Jadwal belajar |
| chat_messages | Pesan chat |
| orders | Pesanan pembayaran |
| payments | Transaksi pembayaran |
| subscriptions | Langganan pengguna |
| promo_codes | Kode promo |
| system_settings | Pengaturan global sistem |
| audit_logs | Log aktivitas |
Multi-Tenant Architectureβ
LMS Codeverta mendukung multi-tenant dimana satu instalasi dapat melayani multiple institusi/tenant:
Cara Kerja Tenant Resolutionβ
- Setiap request masuk membawa identitas tenant (via subdomain atau header)
- TenantMiddleware akan me-resolve tenant dari request
- Data di-scope berdasarkan tenant_id
Request: https://institusiA.lms.codeverta.com/api/courses
β
βΌ
TenantMiddleware.Resolve()
β
βΌ
Menentukan tenant = "institusiA"
β
βΌ
Query dibatasi: WHERE tenant_id = 'institusiA'
Security Architectureβ
Lapisan Keamananβ
| Lapisan | Teknologi | Fungsi |
|---|---|---|
| Transport | HTTPS/SSL | Enkripsi data in-transit |
| API Rate Limiting | middleware/rate-limit | Mencegah brute force & abuse |
| Autentikasi | JWT + Session | Verifikasi identitas pengguna |
| Otorisasi | Role-based access control (RBAC) | Pembatasan akses berdasarkan role |
| Input Validation | go-playground/validator | Mencegah injection & malformed data |
| CORS | middleware/CORS | Pembatasan akses dari domain asing |
| Body Size Limit | middleware/body-size-limit | Mencegah upload file terlalu besar |
RBAC (Role-Based Access Control)β
Level 100 Super Admin βββ Akses penuh ke semua fitur
Level 99 Admin βββ Akses manajemen sistem
Level 30 Mentor βββ Mengelola siswa & tugas
Level 10 Orang Tua βββ Memantau progres anak
Level 1 Siswa βββ Akses kursus & belajar
Integrasi Eksternalβ
| Service | Tujuan | Metode Komunikasi |
|---|---|---|
| Xendit | Payment gateway | REST API + Webhook |
| OpenAI | AI Chat asisten | REST API (GPT) |
| Tencent SES | Email transaksional | SDK API |
| Redis | Caching & session | TCP/IP |
| MySQL | Database utama | TCP/IP (GORM) |
Skalabilitasβ
Vertical Scalingβ
- Tambah resource CPU/RAM pada server
- Optimasi query database dengan indexing
- Gunakan connection pooling
Horizontal Scalingβ
- Multiple backend instances behind load balancer
- Redis sebagai shared session store
- Database read replicas untuk query berat
- CDN untuk static assets frontend
Caching Strategyβ
- Redis Cache β Data yang sering diakses (daftar kursus, profil user)
- Query Cache β Hasil query yang jarang berubah
- Browser Cache β Static assets (CSS, JS, images)
- CDN β Distribusi konten statis secara global
Monitoring & Loggingβ
Loggingβ
- Structured Logging β Menggunakan zap logger (JSON format)
- Request Logs β Method, path, status code, latency
- Error Logs β Stack trace dan konteks error
- Audit Logs β Aktivitas penting pengguna (login, create, delete)
Metrik yang Dipantauβ
- Response time β Latency API
- Error rate β Persentase error request
- Throughput β Jumlah request per detik
- Database connections β Jumlah koneksi aktif
- Memory & CPU usage β Resource utilization
Deployment Architectureβ
Developmentβ
Local Machine
βββ Backend : localhost:3000 (Go run)
βββ Frontend: localhost:5173 (Vite dev server)
βββ MySQL : localhost:3306
βββ Redis : localhost:6379
Production (Docker)β
Docker Host
βββ Container: backend (Go binary)
βββ Container: admin (Nginx + React build)
βββ Container: mysql (MySQL 8)
βββ Container: redis (Redis 6)
βββ Network: docker-network (bridge)
CI/CD Pipeline (Ideal)β
Git Push β Build β Test β Docker Image β Deploy
β β β β β
βΌ βΌ βΌ βΌ βΌ
GitHub pnpm + go test docker docker-compose
vite + vitest build up -d
Disaster Recoveryβ
Backup Strategyβ
- Database β Daily automated backup via cron/mysqldump
- Files β Backup storage files (uploads, media)
- Configuration β Version-controlled .env.example
Recovery Planβ
- Restore database from latest backup
- Restore storage files
- Redeploy application containers
- Verify data integrity
- Test critical user flows
Terakhir diperbarui: Juni 2026