Browse Source

docs: update ARCHITECTURE.md dengan 7 diagram Mermaid lengkap (Juli 2026)

master
Budi Setiawan 2 weeks ago
parent
commit
afd881fb29
  1. 271
      ARCHITECTURE.md

271
ARCHITECTURE.md

@ -1,104 +1,261 @@
# Arsitektur Super Apps — GIS Portal (`my.gisportal.id`) # Arsitektur Super Apps — GIS Portal (`my.gisportal.id`)
> Dokumen ini adalah referensi cepat untuk AI agent / developer baru. > Dokumen ini adalah referensi cepat untuk AI agent / developer baru.
> Update terakhir: Juni 2026 > Update terakhir: Juli 2026
--- ---
## Diagram Arsitektur ## 1. Arsitektur Keseluruhan (High-Level)
```mermaid ```mermaid
graph TB graph TB
subgraph CLIENT["Client (Browser / PWA)"] subgraph USER["Pengguna"]
FE["my.gisportal.id<br/>Next.js 16 + React 19<br/>TailwindCSS + shadcn/ui<br/>Zustand + React Query<br/>@ducanh2912/next-pwa"] BROWSER["Browser / PWA\nmy.gisportal.id"]
AGENT["GeoNet Agent\n(Windows PC/Laptop)"]
end end
subgraph PROXY["Reverse Proxy (10.100.1.24)"] subgraph SERVER24["App Server — 10.100.1.24 (Docker)"]
NGINX["Nginx<br/>(SSL termination, routing)"] NGINX["Nginx\nReverse Proxy + SSL"]
subgraph APPS["Aplikasi"]
FE["my-portal\nNext.js 16 + React 19\nmy.gisportal.id"]
CONSOLE["geonet-console\nLaravel 11\nconsole.gisportal.id"]
COLLECTOR["geonet-collector\nFastAPI\nagent.gisportal.id"]
ZAMMAD["Zammad ⏳\nTicketing\nticket.gisportal.id"]
end
subgraph OPS["Operasional"]
GRAFANA["Grafana + Loki\nMonitoring & Log"]
N8N["n8n\nAutomation"]
NODERED["Node-RED\nWorkflow"]
UPTIME["Uptime Kuma\nUptime Monitor"]
DOCKGE["Dockge\nDocker Manager"]
end
end end
subgraph BACKEND["Backend Services (Docker @ 10.100.1.24)"] subgraph STORAGE["Storage"]
CONSOLE["geonet-console<br/>Laravel 11<br/>console.gisportal.id<br/>Port: 8091→80<br/>Auth, LDAP, Permission,<br/>User Profile, Avatar"] PGCONSOLE[("PostgreSQL\ngeonet-console")]
COLLECTOR["geonet-collector<br/>FastAPI + SQLAlchemy<br/>collector.gisportal.id<br/>agent.gisportal.id<br/>Port: 18000<br/>Asset Mgmt, GeoNet Agent"] PGCOLLECTOR[("PostgreSQL\ncollector")]
OSS["QNAP QuObjects OSS\nfile.gisportal.id\nBucket: super-apps"]
end end
subgraph STORAGE["Storage"] subgraph IDENTITY["Identity — 10.100.1.40"]
PGCONSOLE[("PostgreSQL<br/>geonet-console DB")] AD["Windows AD\nLDAP / Active Directory"]
PGCOLLECTOR[("PostgreSQL<br/>collector DB")]
OSS["QNAP QuObjects OSS<br/>S3-compatible<br/>file.gisportal.id<br/>Bucket: super-apps<br/>Avatar, file upload"]
end end
subgraph LDAP["Identity (10.100.1.40)"] subgraph PLANNED["Direncanakan ⏳"]
AD["Windows Server AD<br/>LDAP / Active Directory<br/>User, Group, Auth"] MAILCOW["Mailcow\nmail.gisportal.id"]
CONTENT["geonet-content\nPosting/Feed"]
PUSH["geonet-push\nPush Notification"]
end end
FE -->|HTTPS| NGINX BROWSER -->|HTTPS| NGINX
NGINX -->|":8091"| CONSOLE AGENT -->|HTTPS POST report| NGINX
NGINX -->|":18000"| COLLECTOR NGINX --> FE
NGINX --> CONSOLE
NGINX --> COLLECTOR
NGINX -.-> ZAMMAD
CONSOLE -->|LDAP bind| AD CONSOLE -->|LDAP bind| AD
CONSOLE --- PGCONSOLE CONSOLE --- PGCONSOLE
CONSOLE -->|S3 API| OSS CONSOLE -->|S3 API| OSS
CONSOLE -.->|"create ticket ⏳"| ZAMMAD
COLLECTOR --- PGCOLLECTOR COLLECTOR --- PGCOLLECTOR
FE -.->|"API /api/v1/*"| CONSOLE FE -->|"API /api/v1/*"| CONSOLE
FE -.->|"API /api/v1/assets/*"| COLLECTOR FE -->|"API assets/*"| COLLECTOR
FE -.->|"Static file read"| OSS FE -.->|"Static files"| OSS
``` ```
--- ---
## Komponen FE yang Sudah Ada ## 2. Arsitektur Backend Services
```mermaid ```mermaid
graph LR graph LR
subgraph PAGES["Pages (src/app/(app))"] subgraph CONSOLE["geonet-console (Laravel 11)"]
P1["/dashboard"] direction TB
P2["/profile"] AUTH["Auth\nLDAP login\nJWT token"]
P3["/asset-management"] ME["Profile /me\navatar OSS"]
P4["/admin/permissions"] PERM["Permissions\ngroup_permissions\nLDAP group mapping"]
P5["/(app)/layout → AuthGuard"] ASSET_C["Asset API\nbridge ke collector"]
FEEDBACK["Feedback\nPOST /feedback\nbug & saran"]
SVCTOKEN["Service Tokens\nmicroservice auth"]
LDAPMGMT["LDAP Management\nuser, group CRUD"]
end end
subgraph COMPONENTS["Key Components"] subgraph COLLECTOR["geonet-collector (FastAPI)"]
C1["ldap-users-panel.tsx<br/>(Admin: User LDAP mgmt)"] direction TB
C2["asset-detail-dialog.tsx<br/>(Asset detail + edit)"] INGEST["Agent Ingest\nPOST /report"]
C3["asset-detail-sheet.tsx<br/>(Asset quick view)"] ASSETS["Asset CRUD\nlist, detail, edit"]
C4["device-card.tsx<br/>(Profile: device info)"] SNAP["Snapshots\nhardware history"]
C5["sidebar.tsx + bottom-nav.tsx<br/>(filtered by permission)"] AUDIT_C["Audit Log\nperubahan aset"]
end end
subgraph LIBS["Libs (src/lib)"] PGCON[("PostgreSQL\ngeonet-console")]
L1["api-client.ts<br/>(geonet-console API)"] PGCOL[("PostgreSQL\ncollector")]
L2["collector-client.ts<br/>(geonet-collector API)"] AD2["Active Directory\n10.100.1.40"]
L3["ldap-client.ts<br/>(LDAP user/group ops)"] OSS2["QNAP OSS\nfile.gisportal.id"]
L4["permissions.ts<br/>(usePermission hooks)"]
L5["auth.ts<br/>(AuthUser interface)"] AUTH -->|bind| AD2
L6["constants.ts<br/>(API URLs, tokens)"] ME --> OSS2
end CONSOLE --- PGCON
COLLECTOR --- PGCOL
ASSET_C -->|HTTP| COLLECTOR
``` ```
--- ---
## Alur Auth & Permission ## 3. Alur Auth & Permission
```mermaid ```mermaid
sequenceDiagram sequenceDiagram
participant Browser participant Browser
participant NextJS as my.gisportal.id participant FE as my-portal (Next.js)
participant Console as geonet-console
participant AD as Active Directory (LDAP)
Browser->>FE: POST /api/login {username, password}
FE->>Console: POST /api/v1/auth/login
Console->>AD: LDAP bind — verifikasi kredensial
AD-->>Console: OK + groups[]
Console->>Console: Resolve permissions dari group_permissions
Console-->>FE: {token, username, groups[], permissions[]}
FE-->>Browser: Set httpOnly cookie → redirect /dashboard
Browser->>FE: GET /dashboard
FE->>Console: GET /api/v1/me (Bearer token)
Console-->>FE: {username, display_name, groups[], permissions[]}
FE-->>Browser: Render sidebar/nav (filter by permissions)
```
---
## 4. Alur GeoNet Agent (PC Reporting)
```mermaid
sequenceDiagram
participant PC as Windows PC/Laptop
participant GPO as Group Policy (AD)
participant Agent as GeoNet Agent Script
participant Collector as geonet-collector
GPO->>PC: Startup/Shutdown Task trigger
PC->>Agent: Jalankan UserAgent.ps1
Agent->>Agent: Kumpulkan data hardware\n(CPU, RAM, Disk, GPU, Network, OS)
Agent->>Agent: Cek versi manifest.json\nauto-update jika ada versi baru
Agent->>Collector: POST /api/v1/agent/report\n{hostname, snapshot, ...}
Collector->>Collector: Simpan asset + snapshot
Collector-->>Agent: 200 OK
Note over PC,Agent: Task: GeoNetAgent-Report-Startup\nGeoNetAgent-Report-Logon\nGeoNetAgent-Report-Shutdown
```
---
## 5. Alur Feedback → Tiket (Rencana Integrasi Zammad)
```mermaid
sequenceDiagram
participant User as User (Browser)
participant FE as my-portal
participant Console as geonet-console participant Console as geonet-console
participant AD as Active Directory participant Zammad as Zammad ⏳
Browser->>NextJS: POST /api/login {username, password} User->>FE: Klik tombol Feedback
NextJS->>Console: POST /api/v1/auth/login FE->>FE: Tampilkan FeedbackDialog\n(form bug/saran + auto-capture page, user, timestamp)
Console->>AD: LDAP bind (verify credentials) User->>FE: Isi form & klik Kirim
AD-->>Console: OK + user groups FE->>Console: POST /api/v1/feedback\n{type, title, message, context}
Console-->>NextJS: {token, user, groups[], permissions[]} Console->>Console: Simpan ke tabel feedback
NextJS-->>Browser: Set cookie + redirect /dashboard Console-->>FE: {id, status: open}
Console-)Zammad: POST /api/v1/tickets ⏳\nauto-create tiket
Browser->>NextJS: GET /dashboard FE-->>User: Tampilkan nomor tiket + pesan sukses
NextJS->>Console: GET /api/v1/me (Bearer token) ```
Console-->>NextJS: {username, display_name, groups[], permissions[]}
NextJS-->>Browser: Render (sidebar/nav filtered by permissions) ---
## 6. Peta Halaman Frontend
```mermaid
graph TD
subgraph AUTH["Autentikasi"]
LOGIN["/login"]
end
subgraph APP["App (AuthGuard + Layout)"]
DASH["/dashboard"]
PROFILE["/profile"]
subgraph ASSET["Asset Management"]
ASSETLIST["/asset-management"]
end
subgraph ADMIN["Admin (admin.*)"]
USERS["/admin/users"]
GROUPS["/admin/groups"]
PERMS["/admin/permissions"]
end
subgraph PLANNED2["Direncanakan ⏳"]
TICKET["/ticket\n→ Zammad"]
MAIL["/mail\n→ Mailcow"]
MONITOR["/monitoring\n→ Grafana"]
NOTIF["/notification\n→ Push Service"]
ATTEND["/attendance"]
LEAVE["/leave"]
end
FEEDBACK_BTN["FeedbackButton\n(floating, semua halaman)"]
end
LOGIN --> DASH
DASH --- PROFILE
DASH --- ASSETLIST
DASH --- ADMIN
DASH --- PLANNED2
FEEDBACK_BTN -.->|"POST /api/v1/feedback"| CONSOLE2["geonet-console"]
```
---
## 7. Infrastruktur & Topologi Jaringan
```mermaid
graph TB
subgraph INTERNET["Internet"]
USERS2["Pengguna Eksternal"]
end
subgraph LAN["LAN — 10.100.1.x"]
GW["Mikrotik Gateway\n10.100.1.1"]
subgraph SERVERS["Servers"]
S24["10.100.1.24\nApp Server\n(Docker: portal, console,\ncollector, nginx, monitoring)"]
S25["10.100.1.25\nMain Database\n(PostgreSQL)"]
S40["10.100.1.40\nAD-LDAP\n(Active Directory)"]
S42["10.100.1.42\nZabbix\n(Network Monitor)"]
S26["10.100.1.26\nOllama\n(AI Inference CPU)"]
QNAP["10.100.1.10\nNAS QNAP TS-932X\n(OSS S3, NFS)"]
end
subgraph PROXMOX["Proxmox Hypervisor"]
PDEV["10.100.1.101\nDev Proxmox"]
POPR["10.100.1.102\nOpr Proxmox\n(VM 103: monitoring)"]
end
subgraph ARCGIS["ArcGIS Enterprise (Dev)"]
A51["10.100.1.51\nArcGIS Base\n(Portal + Server + DS Relational)"]
A52["10.100.1.52\nArcGIS DS Object"]
A53["10.100.1.53\nArcGIS DS Spatio"]
end
end
USERS2 -->|HTTPS| GW
GW --> S24
S24 --> S25
S24 --> S40
S24 --> QNAP
``` ```
--- ---

Loading…
Cancel
Save