# Laporan Optimasi Sumber Daya (Resource Optimization Report) Dokumen ini mendokumentasikan implementasi teknis optimasi sumber daya yang diterapkan pada repositori KeluargaMart untuk memastikan keandalan pada VPS Hostinger KVM 2 (2 vCPU / 8 GB RAM). --- ## 1. Ringkasan Optimasi yang Diimplementasikan ### A. Go Backend Hardening & Connection Pooling 1. **HTTP Server Timeouts**: - Ditambahkan `ReadTimeout: 30s`, `WriteTimeout: 60s`, dan `IdleTimeout: 120s` pada `apps/backend/cmd/server/main.go`. - Mencegah slowloris attacks dan goroutine leak dari koneksi TCP yang menggantung. 2. **Database Connection Pool**: - Ditambahkan batasan pool aman di `apps/backend/pkg/database/database.go`: `MaxConns=25`, `MinConns=2`, `MaxConnLifetime=1h`, `MaxConnIdleTime=15m`. - Menghindari kehabisan file descriptor dan lonjakan koneksi Postgres di server dual-core. 3. **Go Memory Limit**: - Dikonfigurasikan `GOMEMLIMIT=512MiB` dan `GOGC=100` pada environment container backend. Runtime Go akan menjalankan garbage collector secara agresif saat penggunaan memori mendekati 512 MB, mencegah OOM kills. ### B. Node.js & Nuxt 4 SSR Optimization 1. **V8 Heap Constraint**: - Dikonfigurasikan `NODE_OPTIONS="--max-old-space-size=256 --enable-source-maps=false"` pada `apps/b2b`. - Mengunci batas heap V8 agar tidak membengkak melebihi 256 MB. 2. **Eliminasi Source Maps di Produksi**: - Menonaktifkan source maps di runtime untuk menghemat memori parsing JavaScript sebesar ~30%. ### C. Frontend Static Serving & Caching 1. **Nginx Lightweight Runners**: - ERP dan POS disajikan melalui Nginx Alpine berkinerja tinggi (~12 MB RAM idle). - Aset statis ter-hash di `/assets/*` diberi header `Cache-Control: public, max-age=31536000, immutable`. - File `index.html` diberi header `Cache-Control: no-cache, no-store, must-revalidate` untuk mencegah stale caching saat ada rilis baru. 2. **Zero-Build di VPS**: - Semua aset dikompilasi pada GitHub Actions Runners. VPS hanya menjalankan `podman compose -f compose.prod.yml up -d` untuk me-pull image jadi dari GHCR. ### D. Disk & Log Hygiene 1. **Container Log Rotation**: - Seluruh service di `compose.yml` dan `compose.prod.yml` dikonfigurasikan dengan `max-size: 10m` dan `max-file: 3`. - Menjamin bahwa log container tidak akan pernah melebihi 30 MB per service, melindungi 100 GB NVMe dari kepenuhan log. 2. **Redis Memory Policy**: - Redis dikonfigurasikan dengan batas `--maxmemory 96mb` dan eviction policy `--maxmemory-policy volatile-lru`. --- ## 2. Tabel Perbandingan Sebelum & Sesudah Optimasi | Aspek | Kondisi Awal | Hasil Setelah Optimasi | Dampak Keamanan & Efisiensi | |---|---|---|---| | **Port Binding** | `0.0.0.0:3001-3004` (Terbuka publik) | `127.0.0.1:3001-3004` (Loopback only) | Mencegah akses langsung dari internet; hanya Cloudflare Tunnel yang dapat menjangkau port origin. | | **Go HTTP Timeouts** | Hanya `ReadHeaderTimeout` | `ReadHeaderTimeout=10s`, `ReadTimeout=30s`, `WriteTimeout=60s`, `IdleTimeout=120s` | Melindungi VPS dari serangan koneksi lambat dan socket exhaustion. | | **DB Pool Limits** | Unset (bergantung default CPU) | `MaxConns=25`, `MinConns=2`, `IdleTime=15m`, `Lifetime=1h` | Mencegah PostgreSQL connection spike & crash pada 2 vCPU. | | **Nuxt 4 Memory** | Default V8 heap (~1.5 GB limit) | `max-old-space-size=256MB` | Menghemat hingga 1.2 GB RAM pada service B2B. | | **Go Backend Memory** | Unset (bebas bertumbuh) | `GOMEMLIMIT=512MiB` | Zero OOM risk pada backend container. | | **Container Logging** | Unbounded (bisa makan puluhan GB) | Rotasi maksimal 30 MB (`10m x 3 files`) | Mengamankan sisa kapasitas NVMe VPS. |