Sistem ini didesain untuk dijalankan di infrastruktur cloud Azure dengan mempertimbangkan high availability, keamanan, dan skalabilitas.
-
Frontend Tier (High Availability)
- Multiple VM untuk redundansi dan load balancing
- NGINX untuk hosting UI dan proxy ke API
-
Backend Tier (High Availability)
- Multiple VM untuk redundansi dan load balancing
- Express.js API dengan Node.js
- Clustering dengan PM2 untuk memanfaatkan multi-core
-
Komponen Express Application
- Routes - Mengelola endpoint API
- Controllers - Logika bisnis untuk autentikasi, pengguna, admin, dan owner
- Middlewares - Validasi, autentikasi, dan error handling
- Repositories - Akses data dengan Prisma ORM
- Socket Handlers - Manajemen koneksi real-time
- Zod Schemas - Validasi request
- Utils - Helper functions
-
Data Storage
- Azure MySQL Database - Menyimpan data aplikasi
- Azure Blob Storage - Menyimpan file dan gambar
- NodeCache - Caching di memori aplikasi
-
Keamanan
- Application Gateway
- Network Security Groups
- Azure Firewall
- Key Vault untuk credential management
-
Monitoring
- Azure Monitor
- Application Insights
-
DevOps Services
- CI/CD Pipeline
- Source Repositories
- Project Management
- Load balancer untuk mendistribusikan traffic
- Multiple VM instance untuk redundansi
- Auto-scaling berdasarkan CPU usage
- Clustering dengan PM2 di setiap VM
- Virtual Network (VCN) untuk isolasi
- Network Security Groups untuk kontrol akses
- Key Vault untuk penyimpanan kredensial
- HTTPS enforcement di semua endpoint publik
-
π Autentikasi & Otorisasi
- JWT-based authentication
- Role-based access control (Super Admin/Branch Admin/User)
- Secure password hashing dengan bcrypt
-
π Manajemen Reservasi
- Real-time booking status via Socket.io
- Pencarian & filter fasilitas olahraga
- Sistem pembayaran terintegrasi dengan Midtrans
- Review dan rating fasilitas
-
π Notifikasi
- Real-time updates via Socket.io
- Activity log tracking
- Status pembayaran dan booking
-
π Manajemen Cabang
- Multiple branch management
- Analisis pendapatan per cabang
- Manajemen lapangan dan tipe lapangan
- Sistem promosi dan diskon
- Runtime: Node.js v22.8.0
- Language: TypeScript 5.0
- Framework: Express.js
- Database: MySQL + Prisma ORM
- Real-time: Socket.io
- Payment Gateway: Midtrans
- File Storage: Cloudinary
- Security: Helmet, CORS, Rate Limiting
- Logging: Winston
- Deployment: PM2 dengan clustering
# Versi minimum yang dibutuhkan
Node.js >= v22.8.0
npm >= v10.8.2
MySQL >= 8.0-
Clone & Install Dependencies
git clone <repository-url> cd backend npm install
-
Setup Environment
# Copy .env.example cp .env.example .envEdit
.envdengan konfigurasi yang sesuai:# Database DATABASE_URL="mysql://user:password@localhost:3306/sport_center" # JWT JWT_ACCESS_TOKEN_SECRET=your_access_token_secret JWT_REFRESH_TOKEN_SECRET=your_refresh_token_secret # Midtrans MIDTRANS_SERVER_KEY=your_server_key MIDTRANS_CLIENT_KEY=your_client_key # Cloudinary CLOUDINARY_CLOUD_NAME=your_cloud_name CLOUDINARY_API_KEY=your_api_key CLOUDINARY_API_SECRET=your_api_secret
-
Setup Database & Prisma
# Generate Prisma Client npx prisma generate # Run migrations npx prisma migrate dev # Seed database npx prisma db seed
-
Start Development Server
npm run dev
Server berjalan di
http://localhost:3000
-
Build aplikasi:
npm run build
-
Jalankan dengan PM2:
npm run start:prod
-
Perintah pengelolaan:
# Menghentikan aplikasi npm run stop:prod # Restart aplikasi npm run restart:prod # Monitoring npm run monitor:prod # Membersihkan log pm2 flush # Reset PM2 pm2 reset all
Mode development dioptimalkan untuk kecepatan pengembangan dan debugging:
-
Jalankan dalam mode development:
npm run dev
-
Fitur mode development:
- Hot-reload dengan nodemon
- Debugging lebih detail
- Tidak ada kompresi response untuk memudahkan debugging
- HTTPS enforcement dinonaktifkan
- Automatic Prisma Client generation
-
Debugging:
# Jalankan dengan inspeksi node node --inspect src/app.ts # Atau dengan lebih banyak log DEBUG=* npm run dev
Mode production dioptimalkan untuk performa dan keamanan maksimal:
-
Build aplikasi:
npm run build
-
Jalankan dalam cluster mode dengan PM2:
npm run start:prod
-
Fitur mode production:
- Clustering untuk pemanfaatan multi-core
- Kompresi response untuk kecepatan loading
- Rate limiting untuk keamanan
- Optimasi memori dengan garbage collection otomatis
- HTTPS enforcement diaktifkan
- Caching API selama 5 menit
-
Monitoring dan pengelolaan:
# Monitoring real-time npm run monitor:prod # Lihat log aplikasi pm2 logs # Tampilkan status instansi pm2 status
-
Skalabilitas:
- Aplikasi akan otomatis menyesuaikan jumlah instansi berdasarkan beban CPU
- Port akan dialokasikan secara dinamis untuk setiap instansi
- Batas memori dikontrol untuk mencegah overload server
| Fitur | Development | Production |
|---|---|---|
| Hot-reload | β | β |
| Debugging | Detail tinggi | Minimal |
| Kompresi | β | β |
| Clustering | β | β (Auto-scaling) |
| Caching | β | β (5 menit) |
| HTTPS | Opsional | Wajib |
| Memory Limit | Tidak dibatasi | 200MB/instance |
| GC Manual | β | β (2 menit) |
| Rate Limiting | Longgar | Ketat (100/15min) |
Aplikasi telah dioptimalkan untuk performa maksimal dengan:
- Batas memori: Maksimal 200MB per instance
- Garbage Collection: Otomatis setiap 2 menit
- V8 Engine:
--max-old-space-size=200,--max-semi-space-size=64 - Optimasi Flag:
--optimize-for-size,--gc-interval=50
- Mode Cluster PM2: Pemanfaatan multi-core CPU
- Auto-scaling: Berdasarkan beban CPU
- Instance: Minimum 1, maksimum 2 untuk penggunaan memori optimal
- Kompresi: Dengan middleware
compression - Caching: API responses selama 5 menit
- WebSocket: Payload maksimum 50KB, optimasi ping interval
- Rate Limiting: 100 request per 15 menit
- Headers Keamanan: Dengan
helmet - HTTPS Enforcement: Otomatis di production
- Timeout: Listen timeout 5000ms, kill timeout 2000ms
- Restart: Eksponensial backoff 50ms
- Tracing:
--trace-warnings,--trace-uncaught,--trace-sync-io
backend/
βββ prisma/ # Database schema & migrations
β βββ migrations/ # Database migrations
β βββ schema.prisma # Prisma schema
β βββ seeds/ # Database seeders
βββ src/
β βββ config/ # App configuration
β βββ controllers/ # Request handlers
β β βββ admin/ # Admin controllers
β β βββ owner/ # Owner controllers
β β βββ user/ # User controllers
β βββ middlewares/ # Express middlewares
β βββ routes/ # API routes
β βββ socket-handlers/ # Socket.io handlers
β βββ utils/ # Helper functions
β βββ zod-schemas/ # Request validation
β βββ app.ts # App entry point
βββ .env # Environment variables
βββ ecosystem.config.js # Konfigurasi PM2
βββ package.json # Dependencies
-
π Aplikasi tidak dapat dimulai
- Periksa port 3000 sudah digunakan atau tidak
- Periksa status database MySQL
- Cek file log di
logs/err.log
-
π Memori tinggi
- Jalankan
npm run monitor:produntuk memantau penggunaan - Turunkan nilai
max_instancesjika diperlukan - Cek bottleneck dengan monitoring
- Jalankan
-
π’ Performa lambat
- Optimasi query database
- Kurangi jumlah instance pada server dengan CPU terbatas
- Cek logs untuk blocking operations
http://localhost:3000/api/v1
π Auth
POST /auth/register- Register user baruPOST /auth/login- Login userPOST /auth/refresh- Refresh access tokenPOST /auth/logout- Logout user
π’ Branch
GET /branches- List semua cabangGET /branches/:id- Detail cabangPOST /branches- Tambah cabang baru (Super Admin)PUT /branches/:id- Update cabangDELETE /branches/:id- Hapus cabang
β½ Field
GET /fields- List semua lapanganGET /fields/:id- Detail lapanganPOST /fields- Tambah lapangan baru (Admin)PUT /fields/:id- Update lapanganDELETE /fields/:id- Hapus lapangan
π Booking
GET /bookings- List reservasi userPOST /bookings- Buat reservasi baruGET /bookings/:id- Detail reservasiDELETE /bookings/:id- Batalkan reservasi
π° Payment
GET /payments- List pembayaran userGET /payments/:id- Detail pembayaranPOST /payments/notification- Webhook Midtrans
{
"dev": "npx prisma generate && nodemon src/app.ts",
"build": "tsc",
"start": "node dist/app.js",
"lint": "eslint . --ext .ts --fix",
"start:prod": "pm2 start ecosystem.config.js --node-args='--expose-gc'",
"stop:prod": "pm2 stop ecosystem.config.js",
"restart:prod": "pm2 restart ecosystem.config.js",
"monitor:prod": "pm2 monit"
}Distributed under the MIT License. See LICENSE for more information.
Aplikasi ini menggunakan sistem konfigurasi berbasis tipe dengan nilai default yang sudah disediakan, sehingga tidak memerlukan file .env secara mayoritas. Berikut cara konfigurasi:
Aplikasi akan menggunakan nilai default yang aman untuk pengembangan. Anda dapat langsung menjalankan aplikasi tanpa membuat file .env apapun. Sistem akan menampilkan informasi nilai default yang digunakan.
# Cukup jalankan aplikasi
npm run devUntuk lingkungan production atau jika Anda perlu mengubah nilai default:
-
Salin file
.env.typesebagai referensi:# Untuk development cp .env.type .env.development # Untuk production cp .env.type .env.production
-
Edit file tersebut dengan konfigurasi yang sesuai.
-
Aplikasi akan mencari file konfigurasi dengan prioritas:
.env.{NODE_ENV}(misalnya .env.development atau .env.production).env(sebagai fallback)- Nilai default yang dikodekan dalam aplikasi
Semua variabel lingkungan didefinisikan sebagai tipe di src/types/env.ts dan memiliki nilai default di dalam kode. Sistem akan:
- Mencoba memuat file lingkungan yang sesuai
- Jika tidak ditemukan, menggunakan nilai default
- Memberikan peringatan untuk nilai-nilai kritis yang menggunakan default di lingkungan production
Catatan Keamanan: Di lingkungan production, pastikan Anda mengatur variabel lingkungan kritis seperti
JWT_SECRET, kredensial database, dan kunci API. Meskipun ada nilai default, nilai tersebut tidak boleh digunakan di production.
