Files
open-isp/docs/ANALISIS_SISTEM_DAN_UIUX.md
T
oxpoe eaf05f2811 OPEN-ISP v0.5 (pickle-lime) — rilis open-source perdana
Aplikasi billing & manajemen ISP (fiber optic) — PWA pelanggan, portal teknisi & kolektor,
admin panel lengkap, multi-vendor OLT, RADIUS, WhatsApp/Telegram, pembayaran QRIS.

Kredit & lisensi (ISC):
- Base kode & repo: alijayanet/billing-rtrw oleh Alijaya Net — terima kasih banyak
  atas base kode dan repo yang bermanfaat.
- Add-on: GoWA, LibreSpeed/OpenSpeedTest, Uptime Kuma, notification-forwarder.
- Dikembangkan menjadi OPEN-ISP oleh oxpoe — https://github.com/oxpoe/open-isp
2026-10-09 05:51:21 +07:00

17 KiB
Raw Blame History

Analisis Komprehensif Sistem, Logika Backend, dan UI/UX — Billing RT/RW Net

Target Project: /opt/billing-rtrw (VPS deneva — 116.212.74.115)
Layanan: billing-rtrw.service (Node.js v20+, port 3001)
Repository Asal: https://github.com/alijayanet/billing-rtrw
Repository Fork/Deploy: https://github.com/alijayanet/billing-rtrw


1. Ringkasan Eksekutif & Gambaran Sistem

Billing RT/RW Net ini adalah sistem manajemen operasional ISP (Internet Service Provider) berbasis komunitas yang memadukan:

  1. Billing & Invoicing: Siklus tagihan bulanan, isolir otomatis, dan pembayaran QRIS dinamis/manual.
  2. Network Automation: Integrasi RouterOS MikroTik (PPPoE, Hotspot Voucher, Simple Queue, Address List).
  3. Hardware Management (FTTH): Embedded ACS TR-069 Server (CWMP) untuk manajemen ONT klien dan SNMP OLT (EPON/GPON).
  4. Customer Self-Service (PWA): Portal pelanggan mobile-first dengan auto-login 90 hari, ganti WiFi SSID/password mandiri, grafik pemakaian kuota/bandwidth, dan reboot modem.
  5. Multi-Channel Bot: Bot WhatsApp (Baileys socket) dan Bot Telegram untuk notifikasi, penagihan, dan tiket operasional.
flowchart TD
    subgraph Klien_Pelanggan["Portal Klien & Interaksi"]
        CustPWA["Customer PWA (Tailwind + Lucide)"]
        PublicVoucher["Portal Voucher & QRIS"]
        WABot["WhatsApp Bot (Baileys)"]
        TeleBot["Telegram Bot Notifikasi"]
    end

    subgraph Core_Backend["Express 4 Engine (Port 3001)"]
        App["app-customer.js (Main Entry)"]
        ACSServer["Embedded TR-069 Server (/acs)"]
        AuthSvc["Auth & Token Service (90 Hari)"]
        BillSvc["Billing & Invoice Engine"]
        MikroSvc["MikroTik RouterOS API"]
        OLTSvc["OLT Service (SNMP / Web)"]
        UsageSvc["Bandwidth Usage Tracker"]
    end

    subgraph Data_Network["Infrastruktur Jaringan & Database"]
        DB[("SQLite WAL (better-sqlite3)")]
        MikroTik[("Router MikroTik (PPPoE / Hotspot)")]
        OLT[("OLT Fiber (Hioso/HSGQ/VSOL)")]
        CPE[("ONT / Modem Pelanggan (TR-069)")]
    end

    CustPWA -->|HTTP/REST| App
    PublicVoucher -->|HTTP/REST| App
    WABot <--> App
    TeleBot <--> App
    App --> AuthSvc
    App --> BillSvc
    App --> MikroSvc
    App --> OLTSvc
    App --> UsageSvc
    CPE <-->|CWMP SOAP| ACSServer
    ACSServer <--> DB
    BillSvc <--> DB
    MikroSvc <--> MikroTik
    OLTSvc <--> OLT
    UsageSvc <--> MikroTik

2. Analisis Backend & Logika Alur Fungsi

2.1 Arsitektur Server & Runtime

  • Runtime: Node.js >=20.0.0 (Native ES Module + CommonJS hybrid).
  • Database Engine: SQLite 3 melalui better-sqlite3 dengan mode WAL (Write-Ahead Logging), foreign keys aktif, sinkronisasi file cepat dan hemat resource.
  • Proses Lifecycle: Dikelola oleh Systemd (billing-rtrw.service) dengan auto-restart on-failure (delay 5 detik), batas memori RAM --max-old-space-size=512.
  • Proteksi Server:
    • Penanganan unhandledRejection dan uncaughtException terpusat agar error koneksi (misal timeout MikroTik) tidak mematikan server Express.
    • Fallback port otomatis (startServer mencoba port +1000 jika port 3001 bentrok).
    • Proteksi CSRF berbasis validasi header Origin dan Referer (mengecualikan webhook dan endpoint SOAP ACS).

2.2 Modul-Modul Inti & Alur Logika

A. Layanan Billing, Invoice & Isolir (services/billingService.js & services/cronService.js)

  • Logika Pembuatan Tagihan:
    1. Cron berjalan setiap hari (cronService.js) memeriksa seluruh pelanggan aktif.
    2. Tagihan dibuat otomatis setiap siklus tanggal tagihan (billing_date) untuk periode bulan berjalan.
    3. Kode unik nominal QRIS (qris_amount_unique) diinjeksi 3 digit acak (1–999) agar mutasi bank/QRIS dapat dicocokkan otomatis tanpa payment gateway berbayar.
  • Logika Isolir Otomatis:
    1. Bila tanggal saat ini mencapai atau melewati isolir_day (default tanggal 20 tiap bulan) dan tagihan pelanggan masih unpaid:
    2. Status pelanggan di database diubah menjadi isolated.
    3. mikrotikService dipanggil untuk memindahkan secret PPPoE ke profile isolir atau memasukkan IP klien ke Address List ISOLIR di MikroTik Firewall.
    4. Sesi aktif diputus (disconnectPPPoE) sehingga pelanggan ter-redirect ke halaman Walled Garden (/isolated).

B. Layanan TR-069 ACS Server (services/acsServerService.js & /acs)

  • Protokol: CWMP (CPE WAN Management Protocol) via SOAP XML over HTTP POST.
  • Alur Inform & Handshake:
    1. Modem (ONT) mengirim HTTP POST Inform ke endpoint /acs.
    2. Server memeriksa header Authorization. Jika belum diautentikasi, server membalas dengan HTTP 401 Unauthorized (Digest Challenge).
    3. Modem mengirim kembali request dengan Digest Hash yang dihitung berdasarkan username (skyfiber) dan password acak perangkat.
    4. Server membaca parameter XML (Device.DeviceInfo.*, Device.WANDevice.*, Device.Ethernet.*, Device.LANDevice.*).
    5. Data kekuatan redaman optik (RXPower, TXPower), serial number, model, dan versi software disimpan ke tabel acsdevices.
    6. Server memeriksa antrean tugas (task queue) per perangkat: jika ada perintah ganti password WiFi atau reboot, server merespons dengan SetParameterValues atau Reboot.

C. Pengelolaan WiFi Multi-Vendor (services/customerDeviceService.js)

  • Masalah Klasik: Tiap vendor modem (Huawei, ZTE, FiberHome, Nokia) memiliki skema OID/TR-098 yang berbeda-beda. Mengirim parameter yang salah menyebabkan SOAP Fault 9007.
  • Logika Adaptif Per-Vendor:
    • Huawei / FiberHome / Nokia: Memprioritaskan PreSharedKey.1.KeyPassphrase dan menghindari pengiriman hex 64-digit bersamaan dengan plain string.
    • ZTE / ZICG / CIOT: Memprioritaskan KeyPassphrase top-level.
    • Dual-Band SSID: Mengatur WLANConfiguration.1.SSID (2.4 GHz) dan WLANConfiguration.5.SSID (5 GHz) secara independen tanpa merusak konfigurasi guest SSID.

D. Integrasi Jaringan MikroTik (services/mikrotikService.js)

  • Koneksi: RouterOS API (port default 25722/8728) menggunakan library routeros-client.
  • Fitur Utama:
    • Sinkronisasi PPPoE: Read active connections, update secret passwords, kick active sessions.
    • Monitoring Traffic: Mengambil data byte RX/TX interface pelanggan untuk kalkulasi kuota.
    • Voucher Hotspot: Direct injection user hotspot, profile rate-limit, dan validitas voucher.

E. Autentikasi Pelanggan & Persistent Token (services/customerAuthTokenService.js)

  • Alur Sesi PWA:
    1. Pelanggan memasukkan nomor HP / ID Pelanggan.
    2. Saat login berhasil, backend men-generate token kriptografi acak crypto.randomBytes(32).toString('hex').
    3. Token di-hash dengan SHA-256 dan disimpan di tabel SQLite customer_auth_tokens dengan masa berlaku 90 hari.
    4. Plain token dikirimkan ke browser sebagai cookie customer_remember (httpOnly, secure, sameSite: lax).
    5. Ketika pengguna membuka PWA (bahkan setelah browser/HP di-restart), middleware auto-login memverifikasi cookie ini dan merekonstruksi session secara transparan.

F. Pelacakan Kuota & Pemakaian Bandwidth (services/usageService.js)

  • Logika Agregasi:
    1. Mengambil byte delta dari MikroTik queue / interface.
    2. Menyimpan sampel agregat harian dan bulanan ke database.
    3. Menyediakan API untuk konsumsi frontend (Chart.js di dashboard pelanggan).

3. Analisis UI / UX, Styling, Typografi & Layout

Pemeriksaan mendalam terhadap template EJS dan file CSS/JS di /opt/billing-rtrw/views/ dan /opt/billing-rtrw/public/ mengungkap sejumlah temuan penting mengenai styling, engine, dan konsistensi desain:

3.1 Peta Engine & Library UI per Portal

Portal / Halaman Engine CSS Utama Library Icon Font Family Utama Style Pendekatan
Customer Dashboard (views/dashboard.ejs) Tailwind CSS 3.4.17 (via CDN) Lucide Icons (v1.48.0) + FontAwesome 6.4.0 Plus Jakarta Sans (Google Fonts) Modern App Shell / Glassmorphism Mobile-first
Customer Login (views/login.ejs) Bootstrap 5.3.2 (CDN) Bootstrap Icons 1.11.3 System Font Stack (-apple-system, Segoe UI, Roboto) Centered Glass Card / Radial Background
Admin Portal (views/admin/*) Custom CSS (/css/admin.css) Bootstrap Icons 1.11.3 + FontAwesome Inter (Google Fonts) Desktop Enterprise Sidebar & Table Layout
Teknisi Portal (views/tech/*) Bootstrap 5 + /css/theme.css Bootstrap Icons System Font / Inter Mobile Bottom Navigation
Halaman Peta Jaringan (views/admin/map.ejs) Leaflet 1.9.4 + /css/admin.css FontAwesome + SVG Animasi Inter Fullscreen Interactive Map & Vector Layer

3.2 Analisis Typografi & Hierarki Font

[Customer Dashboard]   Plus Jakarta Sans (300, 400, 500, 600, 700, 800)
       ├── Title / Header     : text-base sm:text-lg font-bold (Tracking tight)
       ├── Section Labels     : text-xs font-semibold text-slate-400 uppercase (Tracking wider)
       ├── Body / Konten      : text-sm font-normal text-slate-200 (Leading relaxed)
       └── Badges & Metadata  : text-[10px] sm:text-xs font-medium

[Customer Login]       System Font Stack (BlinkMacSystemFont, Segoe UI, Roboto)
       └── Ketidaksesuaian    : Font berbeda dengan Dashboard; saat user login terjadi visual jump dari font sistem ke Plus Jakarta Sans.

[Admin Portal]         Inter (300, 400, 500, 600, 700, 800)
       ├── Sidebar Items      : font-size 13px, font-weight 500
       ├── Data Table Header  : font-size 11px, text-transform uppercase, letter-spacing 0.5px
       └── Table Data Cells   : font-size 13px, color var(--text: #e6edf3)

3.3 Analisis Styling, Palette Warna & Tema Gelap/Terang

Palette Warna Dominan

  1. Mode Gelap (Customer Dashboard):
    • Background Utama: #0b0f19 (Deep Blue-Black)
    • Card & Panel: #1e293b (Slate 800) dengan border #334155 (Slate 700)
    • Aksen Primer (Brand): Gradasi Teal #14b8a6 ke Cyan #06b6d4
    • Aksen Sekunder: Indigo #6366f1
    • Status Indikator: Hijau Sukses #10b981, Merah Warning/Error #f43f5e, Amber #f59e0b
  2. Mode Terang (Customer Dashboard & Global Theme):
    • Background Utama: #f1f5f9 (Slate 100)
    • Card & Panel: #ffffff murni dengan border rgba(15, 23, 42, 0.08)
    • Teks Utama: #0f172a (Slate 900), Teks Muted: #64748b (Slate 500)
  3. Mekanisme Tema (Theming Engine):
    • Terdapat dua sistem tema yang berjalan berdampingan:
      • views/dashboard.ejs menggunakan script lokal inline (localStorage: skyfiber-customer-theme) mengendalikan class dark pada <html> untuk Tailwind.
      • Portal lainnya menggunakan /js/theme.js dan /css/theme.css (localStorage: app-theme) mengendalikan atribut data-theme="light|dark".
    • Pada rilis v1.9.4, kedua key ini sudah disinkronkan, namun styling mode terang di portal admin masih membutuhkan penyesuaian kontras pada beberapa tabel dan modal.

3.4 Analisis Layout, Spacing, Alignment & UX

1. Customer Dashboard (Mobile App Shell)

  • Alignment & Container:
    • Lebar maksimum dibatasi ke max-w-md atau max-w-lg di tengah layar (mx-auto), memberikan rasa native mobile application saat dibuka di smartphone maupun desktop browser.
    • Padding konten konsisten (px-4 py-3), dengan padding bawah ekstra (pb-28) untuk memberi ruang bagi floating navigation dock.
  • Floating Glass Dock (5 Tab Navigasi):
    • Terpasang fixed di bagian bawah layar: fixed bottom-4 left-1/2 -translate-x-1/2.
    • Menggunakan efek glassmorphism (backdrop-blur-md, background semi-transparan, border tipis halus).
    • Indikator aktif berupa sliding pill yang bergerak halus mengikuti tab yang diklik (updatePillPosition).
    • Tab navigasi:
      1. tab-beranda (Home, status paket, kuota, shortcut aksi)
      2. tab-router (Status ONT, redaman fiber optic, ganti WiFi, reboot)
      3. tab-ppob (Layanan isi pulsa & token listrik - status Coming Soon)
      4. tab-tagihan (Riwayat invoice, tombol bayar QRIS)
      5. tab-profile (Data akun, riwayat tiket kendala, tombol CS WhatsApp, logout)
  • Kerapian & Touch Target:
    • Seluruh tombol interaktif memiliki ukuran touch-target minimal 40x40px (ramah sentuhan jari di layar HP).
    • Safe-area-insets untuk iPhone (env(safe-area-inset-bottom)) sudah ditambahkan pada .dock-glass.

2. Admin & Staff Portal

  • Layout:
    • Sidebar navigasi di sisi kiri (width: 240px, fixed).
    • Konten utama di sebelah kanan dengan header fixed dan breadcrumb.
    • Responsive breakpoint: Pada layar kecil (mobile), sidebar disembunyikan dan diakses lewat toggle menu hamburger.

3.5 Temuan Evaluasi & Celah UI/UX (Bottlenecks)

  1. Fragmentasi Framework CSS:
    • Halaman login menggunakan Bootstrap 5, sedangkan dashboard pelanggan menggunakan Tailwind CSS. Ini membebani browser pengguna karena harus mengunduh dua framework CSS besar saat pertama kali membuka aplikasi.
  2. Ketergantungan CDN Runtime (Client-Side Tailwind):
    • Dashboard pelanggan menggunakan <script src="https://cdn.tailwindcss.com/3.4.17"></script>. CDN ini mem-parse class Tailwind saat runtime di perangkat klien (JIT compiler di browser), yang dapat memperlambat rendering awal (First Contentful Paint) pada ponsel berspesifikasi rendah.
  3. Dual Icon Libraries:
    • Halaman dashboard memuat Lucide Icons dan FontAwesome 6.4.0 secara bersamaan. FontAwesome (file CSS + font ~400KB) hanya digunakan untuk segelintir ikon kecil, sementara sebagian besar UI sudah menggunakan SVG Lucide.
  4. Log Error Berulang di Backend:
    • Terdapat log Telegram Polling Error berkala pada journal server deneva karena token bot belum dikonfigurasi / timeout koneksi ke server Telegram API.

4. Rencana Kerja Terperinci (Execution Plan)

Rencana perubahan ini dibagi menjadi 4 fase berurutan dengan prinsip zero-downtime dan keamanan data:

timeline
    title Timeline Rencana Peningkatan Billing RTRW
    Fase 1 : Konsolidasi Backend & Error Fix : Fix Polling Telegram : Optimalisasi Error Handling
    Fase 2 : Unifikasi Design System : Standarisasi Font (Plus Jakarta Sans) : Harmonisasi Halaman Login & Dashboard
    Fase 3 : Optimasi Asset & Performa : Eliminasi Redundansi Icon : Cache Profiling & PWA Hardening
    Fase 4 : Testing & Validasi : Uji Responsivitas Semua Layar : Uji Fungsi WiFi & Pembayaran Live

Fase 1: Perbaikan Stabilitas & Logika Backend

  1. Fix Polling Telegram (services/telegramBot.js):
    • Tambahkan pengecekan kondisi: jika token Telegram kosong, nonaktifkan polling: true agar tidak membanjiri log server dengan polling error setiap 5 detik.
  2. Peningkatan Ketahanan Koneksi MikroTik (services/mikrotikService.js):
    • Implementasikan retry backoff otomatis saat query queue/PPPoE timeout, menghindari uncaught exception yang tidak perlu.
  3. Audit Query Database (config/database.js):
    • Periksa indeks pada tabel pppoe_traffic_samples, invoices, dan customer_auth_tokens untuk mempercepat query bulanan.

Fase 2: Harmonisasi UI/UX & Standarisasi Tipografi

  1. Standarisasi Tipografi:
    • Terapkan font Plus Jakarta Sans ke seluruh halaman pelanggan, termasuk halaman Login (views/login.ejs), Register, dan Isolir (views/isolated.ejs), menggantikan system font default agar pengalaman visual konsisten sejak awal.
  2. Harmonisasi Desain Halaman Login (views/login.ejs):
    • Rombak halaman login agar memiliki nuansa tema, sudut rounded, dan aksen warna Teal/Cyan yang identik dengan Dashboard Pelanggan.
    • Ganti elemen Bootstrap pada halaman login menjadi layout yang selaras dengan tema dashboard.
  3. Penyempurnaan Form Ganti WiFi di Tab Router:
    • Perjelas instruksi frekuensi 2.4 GHz vs 5 GHz.
    • Tambahkan toggle visibility (mata) untuk password WiFi dan validasi panjang password (minimal 8 karakter) di sisi klien sebelum submit.

Fase 3: Optimasi Frontend & Efisiensi Aset

  1. Rasionalisasi Icon:
    • Migrasikan sisa ikon FontAwesome di Dashboard pelanggan ke Lucide Icons bawaan.
    • Hapus pemanggilan CSS FontAwesome di dashboard pelanggan untuk menghemat ukuran transfer data hingga ~400 KB.
  2. Optimasi Mode Terang (Light Mode):
    • Periksa dan rapikan kontras teks di seluruh tab dashboard agar tidak ada teks putih yang tidak terbaca saat berganti ke background terang.
    • Pastikan border card dan form input terlihat tegas pada mode terang.

Fase 4: Pengujian, Validasi & Deployment

  1. Uji Coba Lintas Perangkat:
    • Uji tampilan di mobile (Android Chrome, iOS Safari), tablet, dan desktop.
    • Uji fungsi PWA Add to Home Screen dan verifikasi auto-login setelah kill aplikasi.
  2. Uji Fungsional End-to-End:
    • Uji ganti SSID/password pada modem online.
    • Uji alur pembuatan invoice dan QRIS.
    • Restart service billing-rtrw.service dan verifikasi log bersih tanpa error.