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
17 KiB
17 KiB
Analisis Komprehensif Sistem, Logika Backend, dan UI/UX — Billing RT/RW Net
Target Project:
/opt/billing-rtrw(VPSdeneva—116.212.74.115)
Layanan:billing-rtrw.service(Node.js v20+, port3001)
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:
- Billing & Invoicing: Siklus tagihan bulanan, isolir otomatis, dan pembayaran QRIS dinamis/manual.
- Network Automation: Integrasi RouterOS MikroTik (PPPoE, Hotspot Voucher, Simple Queue, Address List).
- Hardware Management (FTTH): Embedded ACS TR-069 Server (CWMP) untuk manajemen ONT klien dan SNMP OLT (EPON/GPON).
- 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.
- 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-sqlite3dengan mode WAL (Write-Ahead Logging), foreign keys aktif, sinkronisasi file cepat dan hemat resource. - Proses Lifecycle: Dikelola oleh Systemd (
billing-rtrw.service) dengan auto-restarton-failure(delay 5 detik), batas memori RAM--max-old-space-size=512. - Proteksi Server:
- Penanganan
unhandledRejectiondanuncaughtExceptionterpusat agar error koneksi (misal timeout MikroTik) tidak mematikan server Express. - Fallback port otomatis (
startServermencoba port +1000 jika port 3001 bentrok). - Proteksi CSRF berbasis validasi header
OrigindanReferer(mengecualikan webhook dan endpoint SOAP ACS).
- Penanganan
2.2 Modul-Modul Inti & Alur Logika
A. Layanan Billing, Invoice & Isolir (services/billingService.js & services/cronService.js)
- Logika Pembuatan Tagihan:
- Cron berjalan setiap hari (
cronService.js) memeriksa seluruh pelanggan aktif. - Tagihan dibuat otomatis setiap siklus tanggal tagihan (
billing_date) untuk periode bulan berjalan. - Kode unik nominal QRIS (
qris_amount_unique) diinjeksi 3 digit acak (1–999) agar mutasi bank/QRIS dapat dicocokkan otomatis tanpa payment gateway berbayar.
- Cron berjalan setiap hari (
- Logika Isolir Otomatis:
- Bila tanggal saat ini mencapai atau melewati
isolir_day(default tanggal 20 tiap bulan) dan tagihan pelanggan masihunpaid: - Status pelanggan di database diubah menjadi
isolated. mikrotikServicedipanggil untuk memindahkan secret PPPoE ke profile isolir atau memasukkan IP klien ke Address ListISOLIRdi MikroTik Firewall.- Sesi aktif diputus (
disconnectPPPoE) sehingga pelanggan ter-redirect ke halaman Walled Garden (/isolated).
- Bila tanggal saat ini mencapai atau melewati
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:
- Modem (ONT) mengirim HTTP POST
Informke endpoint/acs. - Server memeriksa header
Authorization. Jika belum diautentikasi, server membalas dengan HTTP 401 Unauthorized (Digest Challenge). - Modem mengirim kembali request dengan Digest Hash yang dihitung berdasarkan username (
skyfiber) dan password acak perangkat. - Server membaca parameter XML (
Device.DeviceInfo.*,Device.WANDevice.*,Device.Ethernet.*,Device.LANDevice.*). - Data kekuatan redaman optik (
RXPower,TXPower), serial number, model, dan versi software disimpan ke tabelacsdevices. - Server memeriksa antrean tugas (task queue) per perangkat: jika ada perintah ganti password WiFi atau reboot, server merespons dengan
SetParameterValuesatauReboot.
- Modem (ONT) mengirim HTTP POST
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.KeyPassphrasedan menghindari pengiriman hex 64-digit bersamaan dengan plain string. - ZTE / ZICG / CIOT: Memprioritaskan
KeyPassphrasetop-level. - Dual-Band SSID: Mengatur
WLANConfiguration.1.SSID(2.4 GHz) danWLANConfiguration.5.SSID(5 GHz) secara independen tanpa merusak konfigurasi guest SSID.
- Huawei / FiberHome / Nokia: Memprioritaskan
D. Integrasi Jaringan MikroTik (services/mikrotikService.js)
- Koneksi: RouterOS API (port default
25722/8728) menggunakan libraryrouteros-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:
- Pelanggan memasukkan nomor HP / ID Pelanggan.
- Saat login berhasil, backend men-generate token kriptografi acak
crypto.randomBytes(32).toString('hex'). - Token di-hash dengan SHA-256 dan disimpan di tabel SQLite
customer_auth_tokensdengan masa berlaku 90 hari. - Plain token dikirimkan ke browser sebagai cookie
customer_remember(httpOnly,secure,sameSite: lax). - 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:
- Mengambil byte delta dari MikroTik queue / interface.
- Menyimpan sampel agregat harian dan bulanan ke database.
- 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
- 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
#14b8a6ke Cyan#06b6d4 - Aksen Sekunder: Indigo
#6366f1 - Status Indikator: Hijau Sukses
#10b981, Merah Warning/Error#f43f5e, Amber#f59e0b
- Background Utama:
- Mode Terang (Customer Dashboard & Global Theme):
- Background Utama:
#f1f5f9(Slate 100) - Card & Panel:
#ffffffmurni dengan borderrgba(15, 23, 42, 0.08) - Teks Utama:
#0f172a(Slate 900), Teks Muted:#64748b(Slate 500)
- Background Utama:
- Mekanisme Tema (Theming Engine):
- Terdapat dua sistem tema yang berjalan berdampingan:
views/dashboard.ejsmenggunakan script lokal inline (localStorage: skyfiber-customer-theme) mengendalikan classdarkpada<html>untuk Tailwind.- Portal lainnya menggunakan
/js/theme.jsdan/css/theme.css(localStorage: app-theme) mengendalikan atributdata-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.
- Terdapat dua sistem tema yang berjalan berdampingan:
3.4 Analisis Layout, Spacing, Alignment & UX
1. Customer Dashboard (Mobile App Shell)
- Alignment & Container:
- Lebar maksimum dibatasi ke
max-w-mdataumax-w-lgdi 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.
- Lebar maksimum dibatasi ke
- 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:
tab-beranda(Home, status paket, kuota, shortcut aksi)tab-router(Status ONT, redaman fiber optic, ganti WiFi, reboot)tab-ppob(Layanan isi pulsa & token listrik - status Coming Soon)tab-tagihan(Riwayat invoice, tombol bayar QRIS)tab-profile(Data akun, riwayat tiket kendala, tombol CS WhatsApp, logout)
- Terpasang fixed di bagian bawah layar:
- 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.
- Seluruh tombol interaktif memiliki ukuran touch-target minimal
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.
- Sidebar navigasi di sisi kiri (
3.5 Temuan Evaluasi & Celah UI/UX (Bottlenecks)
- 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.
- 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.
- Dashboard pelanggan menggunakan
- 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.
- Log Error Berulang di Backend:
- Terdapat log
Telegram Polling Errorberkala pada journal server deneva karena token bot belum dikonfigurasi / timeout koneksi ke server Telegram API.
- Terdapat log
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
- Fix Polling Telegram (
services/telegramBot.js):- Tambahkan pengecekan kondisi: jika token Telegram kosong, nonaktifkan
polling: trueagar tidak membanjiri log server dengan polling error setiap 5 detik.
- Tambahkan pengecekan kondisi: jika token Telegram kosong, nonaktifkan
- Peningkatan Ketahanan Koneksi MikroTik (
services/mikrotikService.js):- Implementasikan retry backoff otomatis saat query queue/PPPoE timeout, menghindari uncaught exception yang tidak perlu.
- Audit Query Database (
config/database.js):- Periksa indeks pada tabel
pppoe_traffic_samples,invoices, dancustomer_auth_tokensuntuk mempercepat query bulanan.
- Periksa indeks pada tabel
Fase 2: Harmonisasi UI/UX & Standarisasi Tipografi
- 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.
- Terapkan font Plus Jakarta Sans ke seluruh halaman pelanggan, termasuk halaman Login (
- 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.
- 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
- 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.
- 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
- 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.
- Uji Fungsional End-to-End:
- Uji ganti SSID/password pada modem online.
- Uji alur pembuatan invoice dan QRIS.
- Restart service
billing-rtrw.servicedan verifikasi log bersih tanpa error.