Files
..
2026-04-30 14:27:01 +07:00
2026-04-30 14:27:01 +07:00
2026-04-30 14:27:01 +07:00
2026-04-30 14:27:01 +07:00
2026-04-30 14:27:01 +07:00
2026-04-30 14:27:01 +07:00
2026-04-30 14:27:01 +07:00
2026-04-30 14:27:01 +07:00
2026-04-30 14:27:01 +07:00
2026-05-04 10:51:11 +07:00

CPONE Dashboard

Web dashboard berbasis Go untuk monitoring CPONE.

Prerequisites

  • Go 1.22+
  • Akses SSH ke devcpone.aplikasi.web.id (untuk koneksi ke database)

Cara Menjalankan

1. Setup .env

Salin .env.example menjadi .env:

cp .env.example .env

Isi .env dengan credential yang sesuai:

APP_PORT=8080
DB_DSN=user:password@tcp(127.0.0.1:3307)/cpone_dashboard?parseTime=true&loc=Local

Port 3307 digunakan karena database diakses melalui SSH tunnel (bukan langsung port 3306).

2. Buka SSH Tunnel ke Database

Jalankan perintah ini di terminal terpisah (atau di background):

ssh -f -N -L 3307:127.0.0.1:3306 one@devcpone.aplikasi.web.id

Kalau muncul error Address already in use, berarti tunnel sudah aktif — lanjut ke langkah berikutnya.

3. Jalankan App

go run .

App berjalan di: http://localhost:8080/dashboard


Menjalankan Simulasi Live di Devcpone

scripts/demo_live.sh dijalankan di server devcpone (bukan di lokal), agar memakai environment dan database server yang sama.

scp scripts/demo_live.sh one@devcpone.aplikasi.web.id:/tmp/demo_live.sh
ssh one@devcpone.aplikasi.web.id "chmod +x /tmp/demo_live.sh && /tmp/demo_live.sh 5"

Keterangan:

  • Angka 5 adalah interval detik antar siklus simulasi.
  • Stop simulasi: Ctrl+C.

Cara Menghentikan

Hentikan tunnel dan app sekaligus:

make stop

Atau manual — cari dan kill prosesnya:

# Hentikan app (port 8080)
lsof -ti:8080 | xargs kill

# Hentikan SSH tunnel (port 3307)
lsof -ti:3307 | xargs kill

Kustomisasi Tampilan

Timpa file berikut dengan logo baru (format PNG, background transparan atau putih):

static/img/logo.png

Tidak perlu ubah kode — logo langsung berubah di seluruh halaman.

Ganti Warna Utama

Semua warna primary dikendalikan dari satu tempat di templates/layout/base.html:

tailwind.config = {
  theme: {
    extend: {
      colors: {
        brand: {
          50:  '#eef0fb',
          100: '#dde2f7',
          ...
          500: '#3b50a0',  // <-- warna utama (header, badge, dll)
          ...
        }
      }
    }
  }
}

Ubah nilai hex di blok brand, semua elemen yang pakai brand-* ikut berubah.


Autentikasi & Manajemen User

Alur Login

Browser                 Go (auth middleware)          DB (dashboard_user)
   │                           │                              │
   │  GET /dashboard           │                              │
   │ ────────────────────────► │  cek cookie session          │
   │                           │  (tidak ada / invalid)       │
   │  redirect /login  ◄────── │                              │
   │                           │                              │
   │  POST /login              │                              │
   │  username=budi       ───► │  SELECT User_Password,       │
   │  password=xxx             │         User_Salt        ──► │
   │                           │                    ◄──────── │ hash + salt
   │                           │  SHA2(salt:password, 256)    │
   │                           │  cocokkan dengan hash        │
   │                           │                              │
   │  set cookie + redirect ◄─ │  ✓ cocok → set session cookie│
   │  ke /dashboard            │                              │

Alur Password Hashing

Password tidak pernah disimpan dalam bentuk plain text. Setiap user punya salt unik yang di-generate otomatis saat insert/update.

sp_upsert_dashboard_user('budi', 'password123', 'Budi Santoso')
         │
         ├─ v_salt = UUID()              → contoh: "a91f-yyyy-..."
         ├─ v_hash = SHA2("a91f-yyyy-...:password123", 256)
         │
         └─ simpan ke DB:
              User_Password = "f3c2..."   ← hash
              User_Salt     = "a91f-..."  ← salt

Efeknya: dua user dengan password yang sama tetap menghasilkan hash yang berbeda di DB, karena salt-nya berbeda.

Menambah User Baru

-- Error jika username sudah terdaftar
CALL sp_insert_dashboard_user('budi', 'password123', 'Budi Santoso');

Reset Password

-- Error jika username tidak ditemukan
CALL sp_reset_dashboard_user_password('budi', 'passwordbaru');

Nonaktifkan User

UPDATE dashboard_user SET User_IsActive = 'N' WHERE User_Username = 'budi';

Struktur Tabel dashboard_user

Kolom Tipe Keterangan
User_ID INT Primary key, auto increment
User_Username VARCHAR(50) Login username, unique
User_Password VARCHAR(64) SHA2-256 hash
User_Salt VARCHAR(36) UUID salt, unik per user/reset
User_DisplayName VARCHAR(100) Nama yang ditampilkan di header
User_IsActive CHAR(1) Y = aktif, N = nonaktif

Mapping User ke MCU Project

Satu user bisa diassign ke lebih dari satu mcu_project. Relasi disimpan di tabel dashboard_user_project.

Relasi

dashboard_user          dashboard_user_project        mcu_project
──────────────          ──────────────────────        ───────────
User_ID        ◄──── UserProj_UserID                  Mcu_ProjectMcuID
                      UserProj_McuID        ────►
                      UserProj_IsActive

Assign / Cabut Akses Project

-- Assign user ke satu project
CALL sp_assign_user_project('budi', 101);

-- Assign ke project lain (bisa lebih dari satu)
CALL sp_assign_user_project('budi', 205);

-- Cabut akses dari satu project (soft delete, data tetap ada)
CALL sp_remove_user_project('budi', 101);

Lihat Project yang Bisa Diakses User

SELECT
    u.User_Username,
    u.User_DisplayName,
    p.Mcu_ProjectMcuID,
    p.Mcu_ProjectLabel,
    p.Mcu_ProjectCorporateName,
    up.UserProj_IsActive
FROM dashboard_user_project up
JOIN dashboard_user  u ON u.User_ID            = up.UserProj_UserID
JOIN mcu_project     p ON p.Mcu_ProjectMcuID   = up.UserProj_McuID
WHERE u.User_Username  = 'budi'
  AND up.UserProj_IsActive = 'Y';

Struktur Tabel dashboard_user_project

Kolom Tipe Keterangan
UserProj_ID INT Primary key, auto increment
UserProj_UserID INT Referensi ke dashboard_user.User_ID
UserProj_McuID INT Referensi ke mcu_project.Mcu_ProjectMcuID
UserProj_IsActive CHAR(1) Y = aktif, N = dicabut

Shortcut via Makefile

Perintah Keterangan
make start Buka SSH tunnel + jalankan app
make stop Hentikan app dan SSH tunnel
make restart Stop lalu start ulang
make run Jalankan app saja (tanpa buka tunnel)
make build Build binary untuk Linux
make deploy Build + deploy ke server