backlog #2

Open
opened 2 weeks ago by rbsetiawan · 1 comments
Owner

🗺️ ROADMAP & PRIORITAS PENGERJAAN

Status: 🔴 Belum dimulai | 🟡 Sedang berjalan | 🟢 Selesai


Sudah Selesai

Microservice & Infrastruktur yang Sudah Running di Server (10.100.1.24)

Service Domain Keterangan Terintegrasi ke Super Apps?
my-portal (Next.js) my.gisportal.id FE Super Apps Ya — ini super apps
geonet-console (Laravel) console.gisportal.id Backend API: auth, LDAP, permission Ya — API utama
geonet-collector (FastAPI) collector.gisportal.id / agent.gisportal.id Asset management, GeoNetAgent Ya — asset management
Grafana + Loki + Promtail grafana.gisportal.id Monitoring & log aggregation � Belum terintegrasi FE
Uptime Kuma uptime.gisportal.id Service uptime monitoring 🔶 Belum terintegrasi FE
n8n n8n.gisportal.id Workflow automation 🔶 Standalone
Node-RED node-red.gisportal.id IoT/flow automation 🔶 Standalone
Dockge dockge.gisportal.id Docker stack manager 🔶 Internal ops
Zabbix zabbix.gisportal.id Network monitoring (10.100.1.42) 🔶 Belum terintegrasi FE
Gitea git.gisportal.id Git server (10.100.1.41:3000) 🔶 Source control
Jira jira.gisportal.id Project management (10.100.1.55) 🔶 Existing ticketing lama
PostgreSQL (2x) internal DB untuk console & collector Ya
QNAP OSS file.gisportal.id / obj.gisportal.id S3 storage avatar & file Ya

Catatan penting:

  • jira.gisportal.id → sudah ada Jira di 10.100.1.55. Pertimbangkan apakah Zammad akan menggantikan atau paralel dengan Jira.
  • zabbix.gisportal.id → sudah ada monitoring. Integrasi alert Zabbix ke Push Notification bisa jadi prioritas di Fase 4.
  • grafana.gisportal.id → sudah ada, bisa digunakan untuk dashboard monitoring di FE super apps.

Yang Sudah Dibangun di Super Apps (my.gisportal.id)

Fitur
🟢 Auth (login LDAP, logout, session)
🟢 Profile (edit, ganti password, avatar OSS, device card)
🟢 Asset Management UI — list, detail, edit meta, assign owner
🟢 Admin: LDAP User & Group management (phone, dept, title, dll)
🟢 Admin: Permission management berbasis LDAP Group
🟢 GeoNet Collector — agent, snapshot, asset read service + owner info
🟢 Permission guard FE (sidebar, bottom-nav filter by permission)

🔴 Fase 1 — Content & Home Feed (Mulai sekarang — tidak ada dependency)

Dashboard home saat ini kosong. Content service adalah nilai tambah langsung terlihat user.

# Tugas Estimasi
1 Backend geonet-content — FastAPI, Post, Like, Comment, thumbnail OSS 4-6 hari
2 FE Home Feed — grid thumbnail di dashboard, Post Card (view/like/comment) 2-3 hari
3 FE Post Detail — halaman /posts/:slug, rich text, komentar bersarang 1-2 hari
4 FE Admin: Create/Edit Post — Tiptap editor, upload thumbnail, jadwal publish 2-3 hari
5 FE Admin: Manage Posts — reorder priority, bulk status, konfigurasi tampilan 1-2 hari

🔴 Fase 1.5 — Activity Tracking (Bisa mulai sekarang — tidak ada dependency)

Sebagian sudah dikerjakan: last_login_at di super apps sudah fix (Jun 2026).

# Tugas Estimasi
5a Fix last_login_at super apps — simpan ke DB saat login, tidak ambil dari AD DONE
5b Activity log FE — catat page visit, durasi per fitur, simpan ke geonet-console 2-3 hari
5c NAS login tracking — polling QNAP system log via SSH/API, simpan ke DB 1-2 hari
5d Gitea activity tracking — pull events via Gitea API (/user/heatmap, /repos/events) 1 hari
5e Admin: Activity Dashboard — tabel login history, fitur populer, durasi kunjungan 2-3 hari

🔴 Fase 2 — Mail Server (Prerequisite Ticketing & Mail UI)

# Tugas Estimasi
6 Install Mailcow — Docker, multi-domain (geonet.co.id, gegeo.my.id) 2-3 hari
7 Konfigurasi LDAP Mailcow — SSO ke AD 10.100.1.40 1 hari
8 Thunderbird — konfigurasi IMAP, simpan data ke NAS 1 hari

🔴 Fase 3 — Ticketing (Butuh Mailcow untuk notif email)

# Tugas Estimasi
9 Install Zammad — Docker, LDAP, kategori (Hardware/Software/ESRI/dll), SLA 2-3 hari
10 Konfigurasi Zammad — group mapping, webhook, auto-assign, public portal 1 hari
11 FE Ticketing — list, form buat tiket, detail+log timeline, dashboard IT 3-5 hari
12 Integrasi Tiket ↔ Asset — tiket bisa dikaitkan ke asset spesifik 1 hari

🔴 Fase 4 — Push Notification (Butuh Zammad webhook sebagai sumber event)

# Tugas Estimasi
13 Backend geonet-push — FastAPI + VAPID, subscribe per user LDAP 2-3 hari
14 FE Push — Service Worker handler, permission UI, notif center navbar 1-2 hari
15 Trigger: Zammad → push, Collector alert → push, broadcast IT 1 hari

🔴 Fase 5 — Gitea Integration (Tidak ada dependency — bisa mulai kapanpun)

Gitea v1.16.5 sudah running di git.gisportal.id (10.100.1.41:3000) dengan REST API aktif.

# Tugas Estimasi
16 Setup OAuth2 Gitea — daftarkan super apps sebagai OAuth client di Gitea 0.5 hari
17 src/lib/gitea-client.ts — API client (issues, repos, user) dengan token/OAuth 1 hari
18 FE: Gitea Issues — list issues per repo, form buat issue, detail+komentar 2-3 hari
19 FE: Repo Explorer — list repo milik user, branch, commit history, releases 2-3 hari
20 Profile: Gitea Token — simpan personal access token di profile (fallback jika tidak pakai OAuth) 0.5 hari

🔴 Fase 6 — Mail UI & Monitoring (Butuh Mailcow API)

# Tugas Estimasi
21 Mail UI — Inbox, Sent, Draft, Contacts, Calendar, Tasks, Rules 5-7 hari
22 Monitoring alert detail dialog (standar UI ADR) 1 hari

🔴 Fase 7 — Infrastruktur (Bisa paralel kapanpun)

# Tugas Estimasi
23 Mikrotik — PPP login via LDAP 1 hari
24 Windows Server AD — LDAP SSO + SAML 2-3 hari

🔴 Fase 8 — KPI Dashboard (Setelah semua service siap: Zammad, Gitea, Collector, Uptime Kuma)

Butuh semua sumber data aktif agar metrik KPI akurat dan bermakna.

# Tugas Estimasi
25 Backend geonet-kpi — FastAPI aggregator, pull dari semua API, cache Redis/SQLite 3-4 hari
26 Scheduler — hitung KPI harian/mingguan/bulanan otomatis 1 hari
27 FE: Dashboard KPI IT/Ops — uptime, tiket, asset health, alert count (Recharts) 2-3 hari
28 FE: Dashboard KPI Karyawan — performa individu, tiket selesai, SLA, commit 2-3 hari
29 Admin: KPI Config — set target, bobot metrik, periode laporan 1-2 hari
30 Export PDF/Excel — laporan KPI per periode untuk manajemen 1-2 hari
31 Push Notif KPI Alert — notif jika KPI di bawah target ke Manager/IT Admin 1 hari

Urutan pengerjaan:
① Content/Home Feed② Mailcow③ Zammad+Ticketing④ Push Notif⑤ Gitea⑥ Mail UI⑦ Infra⑧ KPI Dashboard

(Gitea Fase 5 bisa dikerjakan paralel dengan Fase 2-4 karena tidak ada dependency)
(KPI Fase 8 dikerjakan terakhir — butuh Zammad + Gitea + Collector + Uptime Kuma semua sudah running)


ADR — Standar Dialog Preview / Edit (UI Pattern)

Aturan Wajib

  • Semua dialog preview/edit WAJIB menggunakan <Dialog> dari @/components/ui/dialog (bukan Sheet/Drawer)
  • Ukuran: sm:max-w-lg (detail lebar) atau sm:max-w-md (form pendek)
  • Struktur wajib:
    1. Header berwarna (gradient) — berisi ikon, judul, sub-judul
    2. Body dengan overflow-y-auto max-h-[65dvh] — scrollable
    3. Footer sticky dengan border-t bg-muted/30 — tombol Batal + Simpan
  • Untuk dialog yang punya preview DAN edit, gunakan 2 tab (tab "Detail" + tab "Edit")
  • Tab menggunakan komponen <Tabs> dari @/components/ui/tabs
  • Info 2-kolom: grid grid-cols-[160px_1fr] untuk label–value

Referensi Implementasi

  • src/app/(app)/profile/page.tsx<Dialog> Edit Profil & Ganti Password
  • src/components/asset-management/asset-detail-dialog.tsx — Dialog Asset (2 tab)

Komponen yang Mengikuti Standar Ini

  • Edit Profil (/profile)
  • Ganti Password (/profile)
  • Asset Detail & Edit (/asset-management)
  • Ticketing detail/edit
  • Monitoring alert detail
  • Mail compose

Ticketing Microservice

Platform: Zammad (Rekomendasi Production)

  • Docker di server 10.100.1.24, domain: zammad.gisportal.id
  • LDAP Auth terintegrasi ke AD 10.100.1.40
  • REST API digunakan oleh FE Next.js di /ticketing

Setup Zammad

  • Install Zammad via Docker Compose
  • Konfigurasi LDAP Auth (10.100.1.40)
  • Mapping LDAP Group → Zammad Role (IT-Admin, IT-Staff, Management, dll)
  • Konfigurasi email notifikasi via Mailcow
  • Setup SLA (response time & escalation)
  • Konfigurasi webhook/trigger: auto-assign by category → group
  • Setup public customer portal (untuk end user eksternal)

Kategori Tiket

  • Hardware: Komputer, Laptop, Printer, Server, Jaringan, dll
  • Software:
    • ESRI (ArcGIS Desktop, ArcGIS Pro, ArcGIS Online, ArcGIS Enterprise, Extension)
    • BlueMarble (Global Mapper, Geographic Calculator, dll)
    • DataEast (MapInfo, dll)
    • Microsoft (Office, Windows, Server, dll)
    • Lainnya (input bebas)
  • Asset Request (Pengadaan): Permohonan pembelian hardware/software baru
  • Issue Umum: Gangguan layanan, akses, dll

Alur Tiket (Workflow)

Open → In Progress → Pending (menunggu user/pihak lain) → Resolved → Closed
                   ↓
              Escalate (jika SLA breach)
  • Setiap transisi status tercatat di log timeline (audit trail)
  • Assignee: user LDAP atau group LDAP (IT-Admin/IT-Staff/divisi terkait)
  • Requester: user internal (SSO LDAP) atau guest publik (email + nama)

FE Integration (/ticketing di my.gisportal.id)

  • Halaman list tiket (filter by status, kategori, assignee)
  • Form buat tiket baru (kategori → sub-kategori hierarki software/hardware)
  • Detail tiket: info + log timeline + komentar (Dialog standar 2-tab)
  • Notifikasi real-time (websocket atau polling)
  • Dashboard ringkasan: open, in-progress, overdue (untuk IT Admin)
  • Integrasi dengan Asset Management: tiket bisa dikaitkan ke asset spesifik

Zammad API Client (src/lib/zammad-client.ts)

  • Auth via token (per-user token dari Zammad)
  • GET /tickets, GET /tickets/:id
  • POST /tickets (buat tiket baru)
  • PUT /tickets/:id (update status, assignee)
  • GET /ticket_articles/:ticket_id (log/komentar)
  • POST /ticket_articles (tambah komentar/update)

Push Notification Microservice

Arsitektur yang Disarankan: Web Push (VAPID) + ntfy / Superstream

Opsi Backend

Platform Protokol Docker PWA Support LDAP Nilai
ntfy HTTP Push + WebSocket (Web Push) via proxy 🥇 Ringan & simpel
Webpush custom (FastAPI) Web Push VAPID native 🥈 Full kontrol
Firebase FCM FCM self-host vendor lock-in
Apprise Multi-channel Sebagai relay saja

Rekomendasi: Custom FastAPI Push Service + Web Push VAPID

  • Self-hosted, no vendor lock-in
  • Compatible Web Push API — bekerja di browser (Chrome, Firefox, Edge, Safari iOS 16.4+)
  • PWA: Service Worker push event sudah didukung @ducanh2912/next-pwa
  • Subscription per-user (LDAP username) disimpan di DB
  • Trigger dari Zammad webhook, Collector alert, atau manual

Alur Push Notification

Event (Zammad tiket baru / Asset alert / dll)
    │
    ▼
Push Service API (FastAPI, port 17000)
    │
    ├─ Lookup subscription by user/group LDAP
    ├─ Web Push VAPID → Browser/PWA Service Worker
    └─ (opsional) relay ke ntfy/email/webhook
         │
         ▼
    Browser / PWA
    Service Worker `push` event
         │
         ▼
    Notification (judul, body, icon, action button, url)

Setup Push Service

  • Buat geonet-push service (FastAPI + pywebpush)
  • Generate VAPID key pair (public/private)
  • Endpoint: POST /subscribe — simpan push subscription per user LDAP
  • Endpoint: POST /unsubscribe — hapus subscription
  • Endpoint: POST /send — kirim notif ke user/group (internal, pakai API key)
  • Docker Compose di 10.100.1.24, domain: push.gisportal.id (internal)
  • Simpan subscription di PostgreSQL/SQLite

Sumber Event (Trigger)

  • Zammad webhook → tiket baru, update status, assign ke user/group
  • Collector / Asset Management → device offline, disk penuh, alert threshold
  • Manual broadcast → pengumuman IT Admin ke semua user atau group tertentu
  • (Future) Monitoring alert (Zabbix webhook → push service)

FE Integration (Next.js PWA)

  • src/lib/push-client.ts — subscribe/unsubscribe, kirim VAPID public key ke browser
  • Service Worker handler push event (via @ducanh2912/next-pwa custom SW)
  • Permission request UI — tombol "Aktifkan Notifikasi" di halaman profile/settings
  • Notification payload: { title, body, icon, badge, url, tag }
  • Action button pada notif: "Lihat Tiket", "Lihat Asset"
  • Notif center di navbar — in-app list notifikasi (polling atau WebSocket)

Kategori Notifikasi

  • 🎫 Ticketing: tiket baru assigned, update status, komentar baru, SLA overdue
  • 🖥️ Asset Management: device offline > X menit, disk usage > 90%, tiket asset baru
  • 📢 Broadcast IT: pengumuman, maintenance, downtime
  • (Future) 📊 Monitoring: alert Zabbix

Activity Tracking

Status

  • last_login_at super apps — sudah fix (Jun 2026): kolom ditambah ke ldap_user_meta, diset saat AuthController::login(), dikembalikan oleh MeController prioritas di atas lastlogontimestamp AD yang stale.

Kenapa Tidak Pakai lastlogontimestamp dari AD?

Active Directory lastlogontimestamp hanya direplikasi antar Domain Controller setiap 9-14 hari — by design Microsoft untuk mengurangi replikasi traffic. Jadi selalu stale. Solusi: simpan timestamp di DB sendiri saat login ke super apps.

1. Super Apps — Page Visit & Feature Usage

Backend (geonet-console)

  • Buat tabel user_activity_logs (username, feature, action, duration_seconds, metadata JSON, created_at)
  • POST /api/v1/activity — endpoint internal FE kirim activity event
  • GET /api/v1/admin/activity — admin query logs (filter: user, feature, date range)
  • Aggregation query: fitur paling banyak dikunjungi, avg durasi per fitur, DAU/WAU/MAU

Frontend (Next.js)

  • src/lib/activity-tracker.ts — hook usePageTracking(): catat page_enter + page_leave dengan durasi
  • Kirim event ke /api/v1/activity saat user leave page (via beforeunload + visibilitychange)
  • Payload: { feature: 'asset-management', action: 'view', duration_seconds: 45 }

Fitur yang Dilacak

Feature Key Halaman
dashboard /dashboard
profile /profile
asset_management /asset-management
admin_users /admin/permissions
ticketing /ticketing
gitea_issues /gitea/issues
gitea_repos /gitea/repos
mail /mail
monitoring /monitoring
kpi /kpi

Admin Activity Dashboard (/admin/activity)

  • Card: DAU (Daily Active Users), WAU, MAU
  • Bar chart: page visits per fitur per hari/minggu
  • Tabel: login history per user (username, last_login_at, IP, user agent)
  • Tabel: fitur paling populer (rank by visit count + avg durasi)
  • Filter: by user, date range, feature

2. NAS (QNAP) Login Tracking

Pendekatan

QNAP tidak punya webhook login. Opsi terbaik: polling system log via SSH periodik.

  • SSH ke NAS: ssh -i ~/.ssh/id_ed25519 admin@10.100.1.10
  • Log path QNAP: /var/log/connection.log atau via API GET /cgi-bin/authLogin.cgi
  • QNAP juga punya REST API: GET /api/v2/system/log (QTS 5.x)

Implementasi

  • Cek apakah QNAP QTS versi mendukung /api/v2/system/log
  • Buat scheduler di geonet-console (atau geonet-kpi) — pull NAS log setiap 15 menit
  • Parse log entry: timestamp, username, action (login/logout), IP
  • Simpan ke tabel external_login_logs (source: 'nas'|'gitea', username, logged_at, ip, metadata)
  • Tampilkan di Admin Activity Dashboard sebagai tab "NAS Login"

3. Gitea Login & Activity Tracking

Pendekatan

Gitea punya Events API — tidak perlu parsing log.

GET /api/v1/users/{username}/heatmap        — commit activity heatmap (per hari)
GET /api/v1/repos/{owner}/{repo}/statuses   — repo activity
GET /api/v1/admin/users                     — list users + last_login (admin token)
  • Gitea LDAP auth: login ke Gitea = login via AD — username sama dengan super apps
  • Pull data setiap malam via scheduler, simpan ke external_login_logs

Implementasi

  • Generate Gitea admin token untuk pull user data
  • Scheduler: GET /api/v1/admin/users tiap malam → update external_login_logs (source: 'gitea')
  • Tampilkan di Admin Activity Dashboard sebagai tab "Gitea Activity"
  • Di profile user: tampilkan "Last seen di Gitea: X hari lalu"

Permission

Permission Fungsi
activity.view_own User lihat activity diri sendiri di profile
activity.view_all Admin lihat semua user activity

Gitea Integration (git.gisportal.id)

Status

  • Gitea v1.16.5 sudah running di 10.100.1.41:3000 → domain git.gisportal.id
  • REST API aktif (/api/v1/) — tidak perlu install apapun, langsung integrasi
  • Swagger UI tersedia di git.gisportal.id/api/swagger

Auth Strategy

Pilihan: OAuth2 (rekomendasi)

  • Daftarkan super apps sebagai OAuth Application di Gitea (Settings → Applications → OAuth2)
  • Callback URL: https://my.gisportal.id/auth/gitea/callback
  • Flow: user klik "Hubungkan Gitea" → redirect OAuth → dapat access token → simpan di session/DB
  • Fallback: user input Personal Access Token manual di halaman Profile

API Endpoint yang Digunakan

Auth:
GET  /user                          — info user yang login
GET  /users/{username}              — profil user

Issues:
GET  /repos/{owner}/{repo}/issues   — list issues (filter: state, label, assignee)
POST /repos/{owner}/{repo}/issues   — buat issue baru
GET  /repos/{owner}/{repo}/issues/{index}         — detail issue
PATCH /repos/{owner}/{repo}/issues/{index}        — update (close, assign, label)
GET  /repos/{owner}/{repo}/issues/{index}/comments — komentar
POST /repos/{owner}/{repo}/issues/{index}/comments — tambah komentar
GET  /repos/{owner}/{repo}/labels   — label/kategori tersedia

Repositories:
GET  /user/repos                    — semua repo milik user
GET  /repos/{owner}/{repo}          — detail repo (stars, forks, size, last push)
GET  /repos/{owner}/{repo}/branches — daftar branch
GET  /repos/{owner}/{repo}/commits  — commit history
GET  /repos/{owner}/{repo}/releases — releases / tags
GET  /repos/search?q=&topic=       — search repo

FE Tasks

Setup & Auth

  • Daftarkan OAuth2 App di Gitea admin panel
  • src/lib/gitea-client.ts — wrapper API dengan Bearer token
  • Route GET /api/gitea/callback — handle OAuth callback, simpan token
  • Profile page: tombol "Hubungkan Akun Gitea" + status connected
  • Tambah gitea_token ke user session/store

Halaman Issues (/gitea/issues)

  • List issues dari semua repo yang diikuti user (filter: open/closed, label, repo)
  • Form buat issue — pilih repo, judul, body (Markdown), label, assignee
  • Detail issue — info lengkap + thread komentar + tombol close/reopen
  • Badge count issue open di sidebar/navbar

Halaman Repo Explorer (/gitea/repos)

  • Grid/list repo milik user + starred repos
  • Detail repo — README, branch list, commit history, releases
  • Link ke Gitea web untuk operasi lebih lanjut (clone, PR, dll)

Permission (tambah ke group_permissions)

Permission Fungsi
gitea.view Lihat issue & repo (semua user yang punya akun Gitea)
gitea.create_issue Buat issue baru
gitea.manage Admin Gitea (close issue, assign, label)

Catatan

  • Issue dari super apps dan Gitea web sinkron sempurna — data disimpan di Gitea, super apps hanya read/write via API
  • Tidak perlu database tambahan di super apps untuk Gitea — semua state di Gitea
  • Bisa jadi alternatif/pelengkap Zammad untuk bug tracking development (Zammad = IT helpdesk, Gitea = dev issues)

Content / Posting Microservice (geonet-content)

Saran Profesional

Gunakan pola Headless CMS + custom API — bukan CMS full seperti WordPress.
Ini memberi kontrol penuh atas schema, permission berbasis LDAP group, dan integrasi ke push notification.

Stack yang Disarankan

  • Backend: FastAPI + PostgreSQL (konsisten dengan Collector)
  • Storage thumbnail/gambar: QNAP OSS (S3 bucket super-apps, path content/)
  • Rich text body: simpan sebagai HTML atau Markdown (pakai Tiptap editor di FE)
  • CDN/resize: thumbnail di-generate otomatis via Pillow saat upload (multi-resolusi: 400px, 800px)

Model Data

Post

Post
├── id (UUID)
├── title (string)
├── slug (string, unique)
├── body (text — HTML/Markdown)
├── thumbnail_url (string — OSS path)
├── status (draft | published | archived)
├── priority (int — urutan manual oleh admin)
├── published_at (datetime | null)
├── created_by (ldap_username)
├── created_at / updated_at
├── tags[] (many-to-many)
└── category (string: announcement | info | event | update | dll)

PostEngagement (per post)
├── view_count (int, increment atomic)
├── like_count (int)
└── comment_count (int — cached, sync dari PostComment)

PostLike
├── post_id
└── ldap_username (unique per post+user)

PostComment
├── id
├── post_id
├── ldap_username
├── body (text)
├── created_at
└── parent_id (null = top-level, isi = reply)

API Endpoints

  • GET /posts — list posting (filter: status, kategori, tag; sort: date/views/likes/comments/priority)
  • GET /posts/:slug — detail + increment view_count
  • POST /posts — buat posting (butuh permission content.create)
  • PUT /posts/:id — edit posting (butuh permission content.edit atau own post)
  • DELETE /posts/:id — hapus (butuh permission content.manage)
  • POST /posts/:id/like — toggle like (user LDAP)
  • GET /posts/:id/comments — list komentar + reply
  • POST /posts/:id/comments — tambah komentar
  • PUT /admin/posts/reorder — ubah urutan priority (butuh permission content.manage)
  • POST /admin/posts/:id/thumbnail — upload + resize thumbnail ke OSS

Permission LDAP Group (tambah ke group_permissions)

Permission Fungsi
content.view Lihat posting (semua user default)
content.create Buat posting baru
content.edit Edit semua posting (moderator)
content.manage Kelola urutan, status, hapus, konfigurasi tampilan

Konfigurasi Tampilan (Admin Panel)

  • Jumlah thumbnail yang tampil di home (misal: 6, 9, 12)
  • Mode urutan default: date_created | views | likes | comments | priority
  • Tampilan grid: 2-kolom / 3-kolom / list
  • Auto-publish terjadwal (published_at di masa depan)
  • Pin post (selalu tampil di atas terlepas dari urutan)

Setup Backend

  • Buat geonet-content service (FastAPI + SQLAlchemy + PostgreSQL)
  • Model: Post, PostLike, PostComment, PostTag, ContentConfig
  • Upload thumbnail → resize via Pillow → simpan ke OSS (content/thumbnails/)
  • Atomic view_count increment (pakai UPDATE ... SET view_count = view_count + 1)
  • Docker Compose di 10.100.1.24, akses via content.gisportal.id (internal) atau lewat my.gisportal.id/api/content
  • Permission check via header X-LDAP-Username + X-LDAP-Groups (diteruskan dari geonet-console)

FE Integration (/ home & /posts)

  • Home Dashboard — feed thumbnail posting (grid responsif, lazy load)
  • Post Card: thumbnail, judul, kategori, tanggal, ikon view/like/comment count
  • Post Detail — halaman /posts/:slug dengan body rich text, komentar bersarang
  • Like button — toggle, animasi, optimistic update
  • Comment section — list + form reply, pagination
  • Admin: Create/Edit Post — form dengan Tiptap rich text editor, upload thumbnail, jadwal publish
  • Admin: Manage Posts — tabel dengan drag-and-drop reorder (priority), bulk status change
  • Admin: Config — panel jumlah tampilan, mode urutan, layout grid

Content API Client (src/lib/content-client.ts)

  • getPosts(params) — list dengan filter & sort
  • getPost(slug) — detail
  • createPost(body) / updatePost(id, body)
  • toggleLike(postId)
  • getComments(postId) / addComment(postId, body)
  • reorderPosts(orderedIds)
  • uploadThumbnail(postId, file)

FE

my.gisportal.id

├─ Dashboard
├─ Profile (Action : Edit Profile, Ganti Password, Test Email)
├─ Ticketing
├─ Asset Management
├─ GeoNetAgent
├─ Monitoring
└─ Mail

├─ Inbox
├─ Sent
├─ Draft
├─ Contacts
├─ Calendar
├─ Tasks
└─ Rules

Microservices

Mailserver (Mailcow)

Produk Web UI API Multi Domain Docker Enterprise Nilai
Mailcow 🥇
iRedMail ⚠️ 🥈
Zimbra 🥉
Modoboa ⚠️
Stalwart Mail

Setup

  • Install Mailcow (Docker)
  • Configure Mailcow
  • Configure Mailcow API
  • Configure Mailcow Web UI
  • Configure Mailcow Multi Domain (geonet.co.id, gegeo.my.id)
  • Configure Mailcow Docker
  • Configure Mailcow Enterprise
  • Configure Mailcow Nilai
  • Configure Mailcow LDAP (10.100.1.40)

Install Thunderbird

  • Install Thunderbird
  • Configure Thunderbird
  • Configure Thunderbird for geonet.co.id
  • Configure Thunderbird for gegeo.my.id
  • Move Inbox from main geonet.co.id to geonet for mail server
  • save imap and pop3 file Thunderbird di NAS : untuk meringankan vm dan memastikan file tidak hilang

KPI Dashboard (geonet-kpi)

Dependency (semua harus sudah running)

  • geonet-collector (asset & device data)
  • 🔴 Zammad (tiket metrics)
  • 🔴 Gitea (issue & commit metrics)
  • 🔶 Uptime Kuma API (service uptime)
  • 🔶 Zabbix API (network alert)

Arsitektur

  • Backend: geonet-kpi — FastAPI aggregator, bukan BI tool besar
  • Cache: Redis atau SQLite — hasil agregasi disimpan agar FE tidak hit semua API setiap request
  • Scheduler: APScheduler (built-in FastAPI) — hitung KPI otomatis tiap malam / per jam
  • Domain: kpi.gisportal.id (internal) atau lewat console.gisportal.id/api/kpi

Metrik KPI Karyawan

Metrik Sumber Cara Hitung
Tiket IT diselesaikan Zammad Count closed by assignee per periode
Rata-rata waktu resolve Zammad Avg(closed_at − created_at) per assignee
SLA compliance (%) Zammad % tiket selesai sebelum SLA deadline
Issue dev diselesaikan Gitea Count closed issues by assignee
Jumlah commit Gitea Count commits by author
Asset yang dikelola geonet-collector Count asset by owner
Login activity geonet-console Count login per bulan

Metrik KPI IT/Operasional

Metrik Sumber Cara Hitung
Uptime layanan (%) Uptime Kuma monitors → uptime ratio per service
Asset online vs offline geonet-collector online_count / total_count
Asset disk > 90% geonet-collector Count disk pct_used > 90
Tiket masuk vs selesai Zammad Open/Close ratio per periode
Avg first response time Zammad Time to first agent reply
Network alert count Zabbix Problem count by severity
Repo aktif Gitea Repo dengan commit dalam 30 hari terakhir

API Endpoints (geonet-kpi)

GET /kpi/summary              — ringkasan KPI semua kategori (untuk dashboard)
GET /kpi/employee/{username}  — KPI individu karyawan
GET /kpi/it-ops               — KPI operasional IT
GET /kpi/history?period=monthly&months=6  — trend historis
GET /kpi/export?format=pdf|excel&period=  — export laporan
POST /admin/kpi/config        — set target & bobot per metrik
POST /admin/kpi/refresh       — trigger recalculate manual

Permission (tambah ke group_permissions)

Permission Fungsi
kpi.view_own Lihat KPI diri sendiri
kpi.view_team Lihat KPI semua karyawan (Manager/HR)
kpi.manage Konfigurasi target, bobot, export (IT-Admin, Management)

FE Tasks

Dashboard KPI IT/Ops (/kpi/ops)

  • Card ringkasan: uptime %, tiket open, asset offline, alert aktif
  • Chart trend tiket (bar chart bulanan)
  • Chart uptime per service (line chart)
  • Tabel asset dengan status disk warning

Dashboard KPI Karyawan (/kpi/employee)

  • Tabel performa per karyawan (filter: periode, divisi/group LDAP)
  • Detail individu: chart radar (tiket, SLA, commit, response time)
  • Perbandingan vs target (progress bar per metrik)
  • Trend bulan ke bulan (sparkline)

Admin: KPI Config (/admin/kpi)

  • Form set target per metrik (misal: SLA target 95%, uptime target 99.5%)
  • Pilih periode laporan (mingguan / bulanan / kuartalan)
  • Trigger recalculate manual
  • Export laporan PDF/Excel

Notifikasi KPI

  • Push notif ke Manager/IT-Admin jika KPI < target threshold
  • Weekly summary digest via email (Mailcow) ke stakeholder

Mikrotik

  • Setup PPP login via LDAP

Windows Server 2012 R2 Active Directory

  • Setup LDAP SSO
  • Setup LDAP SAML
# 🗺️ ROADMAP & PRIORITAS PENGERJAAN > Status: **🔴 Belum dimulai** | **🟡 Sedang berjalan** | **🟢 Selesai** --- ## ✅ Sudah Selesai ### Microservice & Infrastruktur yang Sudah Running di Server (10.100.1.24) | Service | Domain | Keterangan | Terintegrasi ke Super Apps? | |---|---|---|---| | **my-portal** (Next.js) | `my.gisportal.id` | FE Super Apps | ✅ **Ya — ini super apps** | | **geonet-console** (Laravel) | `console.gisportal.id` | Backend API: auth, LDAP, permission | ✅ Ya — API utama | | **geonet-collector** (FastAPI) | `collector.gisportal.id` / `agent.gisportal.id` | Asset management, GeoNetAgent | ✅ Ya — asset management | | **Grafana + Loki + Promtail** | `grafana.gisportal.id` | Monitoring & log aggregation | � Belum terintegrasi FE | | **Uptime Kuma** | `uptime.gisportal.id` | Service uptime monitoring | 🔶 Belum terintegrasi FE | | **n8n** | `n8n.gisportal.id` | Workflow automation | 🔶 Standalone | | **Node-RED** | `node-red.gisportal.id` | IoT/flow automation | 🔶 Standalone | | **Dockge** | `dockge.gisportal.id` | Docker stack manager | 🔶 Internal ops | | **Zabbix** | `zabbix.gisportal.id` | Network monitoring (10.100.1.42) | 🔶 Belum terintegrasi FE | | **Gitea** | `git.gisportal.id` | Git server (10.100.1.41:3000) | 🔶 Source control | | **Jira** | `jira.gisportal.id` | Project management (10.100.1.55) | 🔶 Existing ticketing lama | | **PostgreSQL** (2x) | internal | DB untuk console & collector | ✅ Ya | | **QNAP OSS** | `file.gisportal.id` / `obj.gisportal.id` | S3 storage avatar & file | ✅ Ya | > **Catatan penting**: > - `jira.gisportal.id` → sudah ada Jira di 10.100.1.55. Pertimbangkan apakah **Zammad** akan menggantikan atau paralel dengan Jira. > - `zabbix.gisportal.id` → sudah ada monitoring. Integrasi alert Zabbix ke Push Notification bisa jadi prioritas di Fase 4. > - `grafana.gisportal.id` → sudah ada, bisa digunakan untuk dashboard monitoring di FE super apps. ### Yang Sudah Dibangun di Super Apps (my.gisportal.id) | | Fitur | |---|---| | 🟢 | Auth (login LDAP, logout, session) | | 🟢 | Profile (edit, ganti password, avatar OSS, device card) | | 🟢 | Asset Management UI — list, detail, edit meta, assign owner | | 🟢 | Admin: LDAP User & Group management (phone, dept, title, dll) | | 🟢 | Admin: Permission management berbasis LDAP Group | | 🟢 | GeoNet Collector — agent, snapshot, asset read service + owner info | | 🟢 | Permission guard FE (sidebar, bottom-nav filter by permission) | --- ## 🔴 Fase 1 — Content & Home Feed *(Mulai sekarang — tidak ada dependency)* > Dashboard home saat ini kosong. Content service adalah nilai tambah langsung terlihat user. | # | Tugas | Estimasi | |---|---|---| | **1** | **Backend `geonet-content`** — FastAPI, Post, Like, Comment, thumbnail OSS | 4-6 hari | | **2** | **FE Home Feed** — grid thumbnail di dashboard, Post Card (view/like/comment) | 2-3 hari | | **3** | **FE Post Detail** — halaman `/posts/:slug`, rich text, komentar bersarang | 1-2 hari | | **4** | **FE Admin: Create/Edit Post** — Tiptap editor, upload thumbnail, jadwal publish | 2-3 hari | | **5** | **FE Admin: Manage Posts** — reorder priority, bulk status, konfigurasi tampilan | 1-2 hari | --- ## 🔴 Fase 1.5 — Activity Tracking *(Bisa mulai sekarang — tidak ada dependency)* > Sebagian sudah dikerjakan: `last_login_at` di super apps sudah fix (Jun 2026). | # | Tugas | Estimasi | |---|---|---| | **5a** | ✅ **Fix `last_login_at` super apps** — simpan ke DB saat login, tidak ambil dari AD | DONE | | **5b** | **Activity log FE** — catat page visit, durasi per fitur, simpan ke `geonet-console` | 2-3 hari | | **5c** | **NAS login tracking** — polling QNAP system log via SSH/API, simpan ke DB | 1-2 hari | | **5d** | **Gitea activity tracking** — pull events via Gitea API (`/user/heatmap`, `/repos/events`) | 1 hari | | **5e** | **Admin: Activity Dashboard** — tabel login history, fitur populer, durasi kunjungan | 2-3 hari | --- ## 🔴 Fase 2 — Mail Server *(Prerequisite Ticketing & Mail UI)* | # | Tugas | Estimasi | |---|---|---| | **6** | **Install Mailcow** — Docker, multi-domain (geonet.co.id, gegeo.my.id) | 2-3 hari | | **7** | **Konfigurasi LDAP Mailcow** — SSO ke AD 10.100.1.40 | 1 hari | | **8** | **Thunderbird** — konfigurasi IMAP, simpan data ke NAS | 1 hari | --- ## 🔴 Fase 3 — Ticketing *(Butuh Mailcow untuk notif email)* | # | Tugas | Estimasi | |---|---|---| | **9** | **Install Zammad** — Docker, LDAP, kategori (Hardware/Software/ESRI/dll), SLA | 2-3 hari | | **10** | **Konfigurasi Zammad** — group mapping, webhook, auto-assign, public portal | 1 hari | | **11** | **FE Ticketing** — list, form buat tiket, detail+log timeline, dashboard IT | 3-5 hari | | **12** | **Integrasi Tiket ↔ Asset** — tiket bisa dikaitkan ke asset spesifik | 1 hari | --- ## 🔴 Fase 4 — Push Notification *(Butuh Zammad webhook sebagai sumber event)* | # | Tugas | Estimasi | |---|---|---| | **13** | **Backend `geonet-push`** — FastAPI + VAPID, subscribe per user LDAP | 2-3 hari | | **14** | **FE Push** — Service Worker handler, permission UI, notif center navbar | 1-2 hari | | **15** | **Trigger**: Zammad → push, Collector alert → push, broadcast IT | 1 hari | --- ## 🔴 Fase 5 — Gitea Integration *(Tidak ada dependency — bisa mulai kapanpun)* > Gitea v1.16.5 sudah running di git.gisportal.id (10.100.1.41:3000) dengan REST API aktif. | # | Tugas | Estimasi | |---|---|---| | **16** | **Setup OAuth2 Gitea** — daftarkan super apps sebagai OAuth client di Gitea | 0.5 hari | | **17** | **`src/lib/gitea-client.ts`** — API client (issues, repos, user) dengan token/OAuth | 1 hari | | **18** | **FE: Gitea Issues** — list issues per repo, form buat issue, detail+komentar | 2-3 hari | | **19** | **FE: Repo Explorer** — list repo milik user, branch, commit history, releases | 2-3 hari | | **20** | **Profile: Gitea Token** — simpan personal access token di profile (fallback jika tidak pakai OAuth) | 0.5 hari | --- ## 🔴 Fase 6 — Mail UI & Monitoring *(Butuh Mailcow API)* | # | Tugas | Estimasi | |---|---|---| | **21** | **Mail UI** — Inbox, Sent, Draft, Contacts, Calendar, Tasks, Rules | 5-7 hari | | **22** | **Monitoring alert detail** dialog (standar UI ADR) | 1 hari | --- ## 🔴 Fase 7 — Infrastruktur *(Bisa paralel kapanpun)* | # | Tugas | Estimasi | |---|---|---| | **23** | **Mikrotik** — PPP login via LDAP | 1 hari | | **24** | **Windows Server AD** — LDAP SSO + SAML | 2-3 hari | --- ## 🔴 Fase 8 — KPI Dashboard *(Setelah semua service siap: Zammad, Gitea, Collector, Uptime Kuma)* > Butuh semua sumber data aktif agar metrik KPI akurat dan bermakna. | # | Tugas | Estimasi | |---|---|---| | **25** | **Backend `geonet-kpi`** — FastAPI aggregator, pull dari semua API, cache Redis/SQLite | 3-4 hari | | **26** | **Scheduler** — hitung KPI harian/mingguan/bulanan otomatis | 1 hari | | **27** | **FE: Dashboard KPI IT/Ops** — uptime, tiket, asset health, alert count (Recharts) | 2-3 hari | | **28** | **FE: Dashboard KPI Karyawan** — performa individu, tiket selesai, SLA, commit | 2-3 hari | | **29** | **Admin: KPI Config** — set target, bobot metrik, periode laporan | 1-2 hari | | **30** | **Export PDF/Excel** — laporan KPI per periode untuk manajemen | 1-2 hari | | **31** | **Push Notif KPI Alert** — notif jika KPI di bawah target ke Manager/IT Admin | 1 hari | --- > **Urutan pengerjaan**: > **① Content/Home Feed** → **② Mailcow** → **③ Zammad+Ticketing** → **④ Push Notif** → **⑤ Gitea** → **⑥ Mail UI** → **⑦ Infra** → **⑧ KPI Dashboard** > > *(Gitea Fase 5 bisa dikerjakan paralel dengan Fase 2-4 karena tidak ada dependency)* > *(KPI Fase 8 dikerjakan terakhir — butuh Zammad + Gitea + Collector + Uptime Kuma semua sudah running)* --- # ADR — Standar Dialog Preview / Edit (UI Pattern) ## Aturan Wajib - Semua dialog preview/edit WAJIB menggunakan `<Dialog>` dari `@/components/ui/dialog` (bukan Sheet/Drawer) - Ukuran: `sm:max-w-lg` (detail lebar) atau `sm:max-w-md` (form pendek) - Struktur wajib: 1. **Header berwarna** (gradient) — berisi ikon, judul, sub-judul 2. **Body** dengan `overflow-y-auto max-h-[65dvh]` — scrollable 3. **Footer sticky** dengan `border-t bg-muted/30` — tombol Batal + Simpan - Untuk dialog yang punya preview DAN edit, gunakan **2 tab** (tab "Detail" + tab "Edit") - Tab menggunakan komponen `<Tabs>` dari `@/components/ui/tabs` - Info 2-kolom: `grid grid-cols-[160px_1fr]` untuk label–value ## Referensi Implementasi - `src/app/(app)/profile/page.tsx` — `<Dialog>` Edit Profil & Ganti Password - `src/components/asset-management/asset-detail-dialog.tsx` — Dialog Asset (2 tab) ## Komponen yang Mengikuti Standar Ini - [x] Edit Profil (`/profile`) - [x] Ganti Password (`/profile`) - [x] Asset Detail & Edit (`/asset-management`) - [ ] Ticketing detail/edit - [ ] Monitoring alert detail - [ ] Mail compose --- # Ticketing Microservice ## Platform: Zammad (Rekomendasi Production) - Docker di server 10.100.1.24, domain: `zammad.gisportal.id` - LDAP Auth terintegrasi ke AD 10.100.1.40 - REST API digunakan oleh FE Next.js di `/ticketing` ## Setup Zammad - [ ] Install Zammad via Docker Compose - [ ] Konfigurasi LDAP Auth (10.100.1.40) - [ ] Mapping LDAP Group → Zammad Role (IT-Admin, IT-Staff, Management, dll) - [ ] Konfigurasi email notifikasi via Mailcow - [ ] Setup SLA (response time & escalation) - [ ] Konfigurasi webhook/trigger: auto-assign by category → group - [ ] Setup public customer portal (untuk end user eksternal) ## Kategori Tiket - Hardware: Komputer, Laptop, Printer, Server, Jaringan, dll - Software: - ESRI (ArcGIS Desktop, ArcGIS Pro, ArcGIS Online, ArcGIS Enterprise, Extension) - BlueMarble (Global Mapper, Geographic Calculator, dll) - DataEast (MapInfo, dll) - Microsoft (Office, Windows, Server, dll) - Lainnya (input bebas) - Asset Request (Pengadaan): Permohonan pembelian hardware/software baru - Issue Umum: Gangguan layanan, akses, dll ## Alur Tiket (Workflow) ``` Open → In Progress → Pending (menunggu user/pihak lain) → Resolved → Closed ↓ Escalate (jika SLA breach) ``` - Setiap transisi status tercatat di log timeline (audit trail) - Assignee: user LDAP atau group LDAP (IT-Admin/IT-Staff/divisi terkait) - Requester: user internal (SSO LDAP) atau guest publik (email + nama) ## FE Integration (`/ticketing` di my.gisportal.id) - [ ] Halaman list tiket (filter by status, kategori, assignee) - [ ] Form buat tiket baru (kategori → sub-kategori hierarki software/hardware) - [ ] Detail tiket: info + log timeline + komentar (Dialog standar 2-tab) - [ ] Notifikasi real-time (websocket atau polling) - [ ] Dashboard ringkasan: open, in-progress, overdue (untuk IT Admin) - [ ] Integrasi dengan Asset Management: tiket bisa dikaitkan ke asset spesifik ## Zammad API Client (`src/lib/zammad-client.ts`) - [ ] Auth via token (per-user token dari Zammad) - [ ] GET /tickets, GET /tickets/:id - [ ] POST /tickets (buat tiket baru) - [ ] PUT /tickets/:id (update status, assignee) - [ ] GET /ticket_articles/:ticket_id (log/komentar) - [ ] POST /ticket_articles (tambah komentar/update) --- # Push Notification Microservice ## Arsitektur yang Disarankan: **Web Push (VAPID) + ntfy / Superstream** ### Opsi Backend | Platform | Protokol | Docker | PWA Support | LDAP | Nilai | |---|---|---|---|---|---| | **ntfy** | HTTP Push + WebSocket | ✅ | ✅ (Web Push) | via proxy | 🥇 Ringan & simpel | | **Webpush custom (FastAPI)** | Web Push VAPID | ✅ | ✅ | ✅ native | 🥈 Full kontrol | | **Firebase FCM** | FCM | ❌ self-host | ✅ | ❌ | ❌ vendor lock-in | | **Apprise** | Multi-channel | ✅ | ❌ | ❌ | Sebagai relay saja | ### **Rekomendasi: Custom FastAPI Push Service + Web Push VAPID** - Self-hosted, no vendor lock-in - Compatible Web Push API — bekerja di browser (Chrome, Firefox, Edge, Safari iOS 16.4+) - PWA: Service Worker `push` event sudah didukung `@ducanh2912/next-pwa` - Subscription per-user (LDAP username) disimpan di DB - Trigger dari Zammad webhook, Collector alert, atau manual ### Alur Push Notification ``` Event (Zammad tiket baru / Asset alert / dll) │ ▼ Push Service API (FastAPI, port 17000) │ ├─ Lookup subscription by user/group LDAP ├─ Web Push VAPID → Browser/PWA Service Worker └─ (opsional) relay ke ntfy/email/webhook │ ▼ Browser / PWA Service Worker `push` event │ ▼ Notification (judul, body, icon, action button, url) ``` ## Setup Push Service - [ ] Buat `geonet-push` service (FastAPI + pywebpush) - [ ] Generate VAPID key pair (public/private) - [ ] Endpoint: `POST /subscribe` — simpan push subscription per user LDAP - [ ] Endpoint: `POST /unsubscribe` — hapus subscription - [ ] Endpoint: `POST /send` — kirim notif ke user/group (internal, pakai API key) - [ ] Docker Compose di 10.100.1.24, domain: `push.gisportal.id` (internal) - [ ] Simpan subscription di PostgreSQL/SQLite ## Sumber Event (Trigger) - [ ] **Zammad webhook** → tiket baru, update status, assign ke user/group - [ ] **Collector / Asset Management** → device offline, disk penuh, alert threshold - [ ] **Manual broadcast** → pengumuman IT Admin ke semua user atau group tertentu - [ ] *(Future)* Monitoring alert (Zabbix webhook → push service) ## FE Integration (Next.js PWA) - [ ] `src/lib/push-client.ts` — subscribe/unsubscribe, kirim VAPID public key ke browser - [ ] Service Worker handler `push` event (via `@ducanh2912/next-pwa` custom SW) - [ ] Permission request UI — tombol "Aktifkan Notifikasi" di halaman profile/settings - [ ] Notification payload: `{ title, body, icon, badge, url, tag }` - [ ] Action button pada notif: "Lihat Tiket", "Lihat Asset" - [ ] Notif center di navbar — in-app list notifikasi (polling atau WebSocket) ## Kategori Notifikasi - 🎫 **Ticketing**: tiket baru assigned, update status, komentar baru, SLA overdue - 🖥️ **Asset Management**: device offline > X menit, disk usage > 90%, tiket asset baru - 📢 **Broadcast IT**: pengumuman, maintenance, downtime - *(Future)* 📊 Monitoring: alert Zabbix --- # Activity Tracking ## Status - ✅ `last_login_at` super apps — **sudah fix** (Jun 2026): kolom ditambah ke `ldap_user_meta`, diset saat `AuthController::login()`, dikembalikan oleh `MeController` prioritas di atas `lastlogontimestamp` AD yang stale. ## Kenapa Tidak Pakai `lastlogontimestamp` dari AD? Active Directory `lastlogontimestamp` hanya direplikasi antar Domain Controller setiap **9-14 hari** — by design Microsoft untuk mengurangi replikasi traffic. Jadi selalu stale. Solusi: simpan timestamp di DB sendiri saat login ke super apps. ## 1. Super Apps — Page Visit & Feature Usage ### Backend (`geonet-console`) - [ ] Buat tabel `user_activity_logs` (username, feature, action, duration_seconds, metadata JSON, created_at) - [ ] `POST /api/v1/activity` — endpoint internal FE kirim activity event - [ ] `GET /api/v1/admin/activity` — admin query logs (filter: user, feature, date range) - [ ] Aggregation query: fitur paling banyak dikunjungi, avg durasi per fitur, DAU/WAU/MAU ### Frontend (Next.js) - [ ] `src/lib/activity-tracker.ts` — hook `usePageTracking()`: catat `page_enter` + `page_leave` dengan durasi - [ ] Kirim event ke `/api/v1/activity` saat user leave page (via `beforeunload` + `visibilitychange`) - [ ] Payload: `{ feature: 'asset-management', action: 'view', duration_seconds: 45 }` ### Fitur yang Dilacak | Feature Key | Halaman | |---|---| | `dashboard` | `/dashboard` | | `profile` | `/profile` | | `asset_management` | `/asset-management` | | `admin_users` | `/admin/permissions` | | `ticketing` | `/ticketing` | | `gitea_issues` | `/gitea/issues` | | `gitea_repos` | `/gitea/repos` | | `mail` | `/mail` | | `monitoring` | `/monitoring` | | `kpi` | `/kpi` | ### Admin Activity Dashboard (`/admin/activity`) - [ ] Card: DAU (Daily Active Users), WAU, MAU - [ ] Bar chart: page visits per fitur per hari/minggu - [ ] Tabel: login history per user (username, last_login_at, IP, user agent) - [ ] Tabel: fitur paling populer (rank by visit count + avg durasi) - [ ] Filter: by user, date range, feature ## 2. NAS (QNAP) Login Tracking ### Pendekatan QNAP tidak punya webhook login. Opsi terbaik: **polling system log via SSH** periodik. - SSH ke NAS: `ssh -i ~/.ssh/id_ed25519 admin@10.100.1.10` - Log path QNAP: `/var/log/connection.log` atau via API `GET /cgi-bin/authLogin.cgi` - QNAP juga punya REST API: `GET /api/v2/system/log` (QTS 5.x) ### Implementasi - [ ] Cek apakah QNAP QTS versi mendukung `/api/v2/system/log` - [ ] Buat scheduler di `geonet-console` (atau `geonet-kpi`) — pull NAS log setiap 15 menit - [ ] Parse log entry: timestamp, username, action (login/logout), IP - [ ] Simpan ke tabel `external_login_logs` (source: 'nas'|'gitea', username, logged_at, ip, metadata) - [ ] Tampilkan di Admin Activity Dashboard sebagai tab "NAS Login" ## 3. Gitea Login & Activity Tracking ### Pendekatan Gitea punya **Events API** — tidak perlu parsing log. ``` GET /api/v1/users/{username}/heatmap — commit activity heatmap (per hari) GET /api/v1/repos/{owner}/{repo}/statuses — repo activity GET /api/v1/admin/users — list users + last_login (admin token) ``` - Gitea LDAP auth: login ke Gitea = login via AD — username sama dengan super apps - Pull data setiap malam via scheduler, simpan ke `external_login_logs` ### Implementasi - [ ] Generate Gitea admin token untuk pull user data - [ ] Scheduler: `GET /api/v1/admin/users` tiap malam → update `external_login_logs` (source: 'gitea') - [ ] Tampilkan di Admin Activity Dashboard sebagai tab "Gitea Activity" - [ ] Di profile user: tampilkan "Last seen di Gitea: X hari lalu" ## Permission | Permission | Fungsi | |---|---| | `activity.view_own` | User lihat activity diri sendiri di profile | | `activity.view_all` | Admin lihat semua user activity | --- # Gitea Integration (`git.gisportal.id`) ## Status - Gitea v1.16.5 sudah running di `10.100.1.41:3000` → domain `git.gisportal.id` - REST API aktif (`/api/v1/`) — tidak perlu install apapun, langsung integrasi - Swagger UI tersedia di `git.gisportal.id/api/swagger` ## Auth Strategy **Pilihan: OAuth2** (rekomendasi) - Daftarkan super apps sebagai OAuth Application di Gitea (Settings → Applications → OAuth2) - Callback URL: `https://my.gisportal.id/auth/gitea/callback` - Flow: user klik "Hubungkan Gitea" → redirect OAuth → dapat access token → simpan di session/DB - **Fallback**: user input Personal Access Token manual di halaman Profile ## API Endpoint yang Digunakan ``` Auth: GET /user — info user yang login GET /users/{username} — profil user Issues: GET /repos/{owner}/{repo}/issues — list issues (filter: state, label, assignee) POST /repos/{owner}/{repo}/issues — buat issue baru GET /repos/{owner}/{repo}/issues/{index} — detail issue PATCH /repos/{owner}/{repo}/issues/{index} — update (close, assign, label) GET /repos/{owner}/{repo}/issues/{index}/comments — komentar POST /repos/{owner}/{repo}/issues/{index}/comments — tambah komentar GET /repos/{owner}/{repo}/labels — label/kategori tersedia Repositories: GET /user/repos — semua repo milik user GET /repos/{owner}/{repo} — detail repo (stars, forks, size, last push) GET /repos/{owner}/{repo}/branches — daftar branch GET /repos/{owner}/{repo}/commits — commit history GET /repos/{owner}/{repo}/releases — releases / tags GET /repos/search?q=&topic= — search repo ``` ## FE Tasks ### Setup & Auth - [ ] Daftarkan OAuth2 App di Gitea admin panel - [ ] `src/lib/gitea-client.ts` — wrapper API dengan Bearer token - [ ] Route `GET /api/gitea/callback` — handle OAuth callback, simpan token - [ ] Profile page: tombol "Hubungkan Akun Gitea" + status connected - [ ] Tambah `gitea_token` ke user session/store ### Halaman Issues (`/gitea/issues`) - [ ] List issues dari semua repo yang diikuti user (filter: open/closed, label, repo) - [ ] Form buat issue — pilih repo, judul, body (Markdown), label, assignee - [ ] Detail issue — info lengkap + thread komentar + tombol close/reopen - [ ] Badge count issue open di sidebar/navbar ### Halaman Repo Explorer (`/gitea/repos`) - [ ] Grid/list repo milik user + starred repos - [ ] Detail repo — README, branch list, commit history, releases - [ ] Link ke Gitea web untuk operasi lebih lanjut (clone, PR, dll) ## Permission (tambah ke group_permissions) | Permission | Fungsi | |---|---| | `gitea.view` | Lihat issue & repo (semua user yang punya akun Gitea) | | `gitea.create_issue` | Buat issue baru | | `gitea.manage` | Admin Gitea (close issue, assign, label) | ## Catatan - Issue dari super apps dan Gitea web **sinkron sempurna** — data disimpan di Gitea, super apps hanya read/write via API - Tidak perlu database tambahan di super apps untuk Gitea — semua state di Gitea - Bisa jadi alternatif/pelengkap Zammad untuk bug tracking development (Zammad = IT helpdesk, Gitea = dev issues) --- # Content / Posting Microservice (`geonet-content`) ## Saran Profesional Gunakan pola **Headless CMS + custom API** — bukan CMS full seperti WordPress. Ini memberi kontrol penuh atas schema, permission berbasis LDAP group, dan integrasi ke push notification. ### Stack yang Disarankan - **Backend**: FastAPI + PostgreSQL (konsisten dengan Collector) - **Storage thumbnail/gambar**: QNAP OSS (S3 bucket `super-apps`, path `content/`) - **Rich text body**: simpan sebagai HTML atau Markdown (pakai Tiptap editor di FE) - **CDN/resize**: thumbnail di-generate otomatis via `Pillow` saat upload (multi-resolusi: 400px, 800px) ## Model Data ### Post ``` Post ├── id (UUID) ├── title (string) ├── slug (string, unique) ├── body (text — HTML/Markdown) ├── thumbnail_url (string — OSS path) ├── status (draft | published | archived) ├── priority (int — urutan manual oleh admin) ├── published_at (datetime | null) ├── created_by (ldap_username) ├── created_at / updated_at ├── tags[] (many-to-many) └── category (string: announcement | info | event | update | dll) PostEngagement (per post) ├── view_count (int, increment atomic) ├── like_count (int) └── comment_count (int — cached, sync dari PostComment) PostLike ├── post_id └── ldap_username (unique per post+user) PostComment ├── id ├── post_id ├── ldap_username ├── body (text) ├── created_at └── parent_id (null = top-level, isi = reply) ``` ## API Endpoints - `GET /posts` — list posting (filter: status, kategori, tag; sort: date/views/likes/comments/priority) - `GET /posts/:slug` — detail + increment view_count - `POST /posts` — buat posting (butuh permission `content.create`) - `PUT /posts/:id` — edit posting (butuh permission `content.edit` atau own post) - `DELETE /posts/:id` — hapus (butuh permission `content.manage`) - `POST /posts/:id/like` — toggle like (user LDAP) - `GET /posts/:id/comments` — list komentar + reply - `POST /posts/:id/comments` — tambah komentar - `PUT /admin/posts/reorder` — ubah urutan priority (butuh permission `content.manage`) - `POST /admin/posts/:id/thumbnail` — upload + resize thumbnail ke OSS ## Permission LDAP Group (tambah ke group_permissions) | Permission | Fungsi | |---|---| | `content.view` | Lihat posting (semua user default) | | `content.create` | Buat posting baru | | `content.edit` | Edit semua posting (moderator) | | `content.manage` | Kelola urutan, status, hapus, konfigurasi tampilan | ## Konfigurasi Tampilan (Admin Panel) - [ ] Jumlah thumbnail yang tampil di home (misal: 6, 9, 12) - [ ] Mode urutan default: `date_created` | `views` | `likes` | `comments` | `priority` - [ ] Tampilan grid: 2-kolom / 3-kolom / list - [ ] Auto-publish terjadwal (`published_at` di masa depan) - [ ] Pin post (selalu tampil di atas terlepas dari urutan) ## Setup Backend - [ ] Buat `geonet-content` service (FastAPI + SQLAlchemy + PostgreSQL) - [ ] Model: Post, PostLike, PostComment, PostTag, ContentConfig - [ ] Upload thumbnail → resize via Pillow → simpan ke OSS (`content/thumbnails/`) - [ ] Atomic view_count increment (pakai `UPDATE ... SET view_count = view_count + 1`) - [ ] Docker Compose di 10.100.1.24, akses via `content.gisportal.id` (internal) atau lewat `my.gisportal.id/api/content` - [ ] Permission check via header `X-LDAP-Username` + `X-LDAP-Groups` (diteruskan dari geonet-console) ## FE Integration (`/` home & `/posts`) - [ ] **Home Dashboard** — feed thumbnail posting (grid responsif, lazy load) - [ ] **Post Card**: thumbnail, judul, kategori, tanggal, ikon view/like/comment count - [ ] **Post Detail** — halaman `/posts/:slug` dengan body rich text, komentar bersarang - [ ] **Like button** — toggle, animasi, optimistic update - [ ] **Comment section** — list + form reply, pagination - [ ] **Admin: Create/Edit Post** — form dengan Tiptap rich text editor, upload thumbnail, jadwal publish - [ ] **Admin: Manage Posts** — tabel dengan drag-and-drop reorder (priority), bulk status change - [ ] **Admin: Config** — panel jumlah tampilan, mode urutan, layout grid ## Content API Client (`src/lib/content-client.ts`) - [ ] `getPosts(params)` — list dengan filter & sort - [ ] `getPost(slug)` — detail - [ ] `createPost(body)` / `updatePost(id, body)` - [ ] `toggleLike(postId)` - [ ] `getComments(postId)` / `addComment(postId, body)` - [ ] `reorderPosts(orderedIds)` - [ ] `uploadThumbnail(postId, file)` --- # FE my.gisportal.id │ ├─ Dashboard ├─ Profile (Action : Edit Profile, Ganti Password, Test Email) ├─ Ticketing ├─ Asset Management ├─ GeoNetAgent ├─ Monitoring └─ Mail │ ├─ Inbox ├─ Sent ├─ Draft ├─ Contacts ├─ Calendar ├─ Tasks └─ Rules # Microservices ## Mailserver (Mailcow) | Produk | Web UI | API | Multi Domain | Docker | Enterprise | Nilai | | ------------- | ------ | ----- | ------------ | ------ | ---------- | ----- | | Mailcow | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ✅ | ✅ | ⭐⭐⭐⭐⭐ | 🥇 | | iRedMail | ⭐⭐⭐⭐ | ⭐⭐⭐ | ✅ | ⚠️ | ⭐⭐⭐⭐⭐ | 🥈 | | Zimbra | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ | ❌ | ⭐⭐⭐⭐⭐ | 🥉 | | Modoboa | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ | ⚠️ | ⭐⭐⭐⭐ | ⭐⭐⭐ | | Stalwart Mail | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ✅ | ✅ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ## Setup - [ ] Install Mailcow (Docker) - [ ] Configure Mailcow - [ ] Configure Mailcow API - [ ] Configure Mailcow Web UI - [ ] Configure Mailcow Multi Domain (geonet.co.id, gegeo.my.id) - [ ] Configure Mailcow Docker - [ ] Configure Mailcow Enterprise - [ ] Configure Mailcow Nilai - [ ] Configure Mailcow LDAP (10.100.1.40) ## Install Thunderbird - [ ] Install Thunderbird - [ ] Configure Thunderbird - [ ] Configure Thunderbird for geonet.co.id - [ ] Configure Thunderbird for gegeo.my.id - [ ] Move Inbox from main geonet.co.id to geonet for mail server - [ ] save imap and pop3 file Thunderbird di NAS : untuk meringankan vm dan memastikan file tidak hilang # KPI Dashboard (`geonet-kpi`) ## Dependency (semua harus sudah running) - ✅ geonet-collector (asset & device data) - 🔴 Zammad (tiket metrics) - 🔴 Gitea (issue & commit metrics) - 🔶 Uptime Kuma API (service uptime) - 🔶 Zabbix API (network alert) ## Arsitektur - **Backend**: `geonet-kpi` — FastAPI aggregator, bukan BI tool besar - **Cache**: Redis atau SQLite — hasil agregasi disimpan agar FE tidak hit semua API setiap request - **Scheduler**: APScheduler (built-in FastAPI) — hitung KPI otomatis tiap malam / per jam - **Domain**: `kpi.gisportal.id` (internal) atau lewat `console.gisportal.id/api/kpi` ## Metrik KPI Karyawan | Metrik | Sumber | Cara Hitung | |---|---|---| | Tiket IT diselesaikan | Zammad | Count closed by assignee per periode | | Rata-rata waktu resolve | Zammad | Avg(closed_at − created_at) per assignee | | SLA compliance (%) | Zammad | % tiket selesai sebelum SLA deadline | | Issue dev diselesaikan | Gitea | Count closed issues by assignee | | Jumlah commit | Gitea | Count commits by author | | Asset yang dikelola | geonet-collector | Count asset by owner | | Login activity | geonet-console | Count login per bulan | ## Metrik KPI IT/Operasional | Metrik | Sumber | Cara Hitung | |---|---|---| | Uptime layanan (%) | Uptime Kuma | monitors → uptime ratio per service | | Asset online vs offline | geonet-collector | online_count / total_count | | Asset disk > 90% | geonet-collector | Count disk pct_used > 90 | | Tiket masuk vs selesai | Zammad | Open/Close ratio per periode | | Avg first response time | Zammad | Time to first agent reply | | Network alert count | Zabbix | Problem count by severity | | Repo aktif | Gitea | Repo dengan commit dalam 30 hari terakhir | ## API Endpoints (`geonet-kpi`) ``` GET /kpi/summary — ringkasan KPI semua kategori (untuk dashboard) GET /kpi/employee/{username} — KPI individu karyawan GET /kpi/it-ops — KPI operasional IT GET /kpi/history?period=monthly&months=6 — trend historis GET /kpi/export?format=pdf|excel&period= — export laporan POST /admin/kpi/config — set target & bobot per metrik POST /admin/kpi/refresh — trigger recalculate manual ``` ## Permission (tambah ke group_permissions) | Permission | Fungsi | |---|---| | `kpi.view_own` | Lihat KPI diri sendiri | | `kpi.view_team` | Lihat KPI semua karyawan (Manager/HR) | | `kpi.manage` | Konfigurasi target, bobot, export (IT-Admin, Management) | ## FE Tasks ### Dashboard KPI IT/Ops (`/kpi/ops`) - [ ] Card ringkasan: uptime %, tiket open, asset offline, alert aktif - [ ] Chart trend tiket (bar chart bulanan) - [ ] Chart uptime per service (line chart) - [ ] Tabel asset dengan status disk warning ### Dashboard KPI Karyawan (`/kpi/employee`) - [ ] Tabel performa per karyawan (filter: periode, divisi/group LDAP) - [ ] Detail individu: chart radar (tiket, SLA, commit, response time) - [ ] Perbandingan vs target (progress bar per metrik) - [ ] Trend bulan ke bulan (sparkline) ### Admin: KPI Config (`/admin/kpi`) - [ ] Form set target per metrik (misal: SLA target 95%, uptime target 99.5%) - [ ] Pilih periode laporan (mingguan / bulanan / kuartalan) - [ ] Trigger recalculate manual - [ ] Export laporan PDF/Excel ### Notifikasi KPI - [ ] Push notif ke Manager/IT-Admin jika KPI < target threshold - [ ] Weekly summary digest via email (Mailcow) ke stakeholder --- # Mikrotik - [ ] Setup PPP login via LDAP # Windows Server 2012 R2 Active Directory - [ ] Setup LDAP SSO - [ ] Setup LDAP SAML
Poster
Owner

ToDo

Zammad → integrasi feedback → halaman /ticket → baru Mailcow

# ToDo Zammad → integrasi feedback → halaman /ticket → baru Mailcow
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.