Skip to main content

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​

KomponenTeknologiVersiFungsi
BahasaGo (Golang)1.22+Bahasa pemrograman backend
HTTP FrameworkGinv1.9+Routing, middleware, request handling
ORMGORMv2+Database ORM dan migrasi
DatabaseMySQL / MariaDB8.0+Penyimpanan data utama
CacheRedis6.0+Session store, rate limiting, cache
Validatorgo-playground/validatorv10+Validasi input request
Sessiongin-contrib/sessions-Manajemen session (cookie/redis)

Frontend​

KomponenTeknologiVersiFungsi
FrameworkReact18+Library UI frontend
Build ToolVite5+Bundler dan dev server
CSSTailwind CSS3+Utility-first CSS framework
State ManagementReact Context + Zustand-Manajemen state global
RoutingReact Router6+Routing SPA
HTTP ClientAxios / Fetch-Komunikasi dengan backend API

Infrastructure​

KomponenTeknologiFungsi
ContainerDockerContainerization
OrchestrationDocker ComposeMulti-container setup
Reverse ProxyNginxStatic files & reverse proxy untuk frontend
CDN / EdgeCloudflare WorkersLanding page
Payment GatewayXenditPemrosesan pembayaran
AIOpenAI APIChat AI cerdas
EmailTencent SESPengiriman 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​

TabelFungsi
usersData semua pengguna (siswa, orang tua, mentor, admin)
coursesData kursus
modulesModul dalam kursus
lessonsPelajaran dalam modul
lesson_detailsDetail konten pelajaran
quizzesKuis dalam modul
quiz_questionsSoal dalam kuis
quiz_optionsOpsi jawaban soal
quiz_attemptsRiwayat pengerjaan kuis
enrollmentsPendaftaran siswa ke kursus
certificatesSertifikat kelulusan
certificate_templatesTemplate sertifikat
learning_schedulesJadwal belajar
chat_messagesPesan chat
ordersPesanan pembayaran
paymentsTransaksi pembayaran
subscriptionsLangganan pengguna
promo_codesKode promo
system_settingsPengaturan global sistem
audit_logsLog aktivitas

Multi-Tenant Architecture​

LMS Codeverta mendukung multi-tenant dimana satu instalasi dapat melayani multiple institusi/tenant:

Cara Kerja Tenant Resolution​

  1. Setiap request masuk membawa identitas tenant (via subdomain atau header)
  2. TenantMiddleware akan me-resolve tenant dari request
  3. 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​

LapisanTeknologiFungsi
TransportHTTPS/SSLEnkripsi data in-transit
API Rate Limitingmiddleware/rate-limitMencegah brute force & abuse
AutentikasiJWT + SessionVerifikasi identitas pengguna
OtorisasiRole-based access control (RBAC)Pembatasan akses berdasarkan role
Input Validationgo-playground/validatorMencegah injection & malformed data
CORSmiddleware/CORSPembatasan akses dari domain asing
Body Size Limitmiddleware/body-size-limitMencegah 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​

ServiceTujuanMetode Komunikasi
XenditPayment gatewayREST API + Webhook
OpenAIAI Chat asistenREST API (GPT)
Tencent SESEmail transaksionalSDK API
RedisCaching & sessionTCP/IP
MySQLDatabase utamaTCP/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​

  1. Restore database from latest backup
  2. Restore storage files
  3. Redeploy application containers
  4. Verify data integrity
  5. Test critical user flows

Terakhir diperbarui: Juni 2026