You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
10 KiB
10 KiB
Arsitektur Super Apps — GIS Portal (my.gisportal.id)
Dokumen ini adalah referensi cepat untuk AI agent / developer baru. Update terakhir: Juli 2026
1. Arsitektur Keseluruhan (High-Level)
graph TB
subgraph USER["Pengguna"]
BROWSER["Browser / PWA\nmy.gisportal.id"]
AGENT["GeoNet Agent\n(Windows PC/Laptop)"]
end
subgraph SERVER24["App Server — 10.100.1.24 (Docker)"]
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
subgraph STORAGE["Storage"]
PGCONSOLE[("PostgreSQL\ngeonet-console")]
PGCOLLECTOR[("PostgreSQL\ncollector")]
OSS["QNAP QuObjects OSS\nfile.gisportal.id\nBucket: super-apps"]
end
subgraph IDENTITY["Identity — 10.100.1.40"]
AD["Windows AD\nLDAP / Active Directory"]
end
subgraph PLANNED["Direncanakan ⏳"]
MAILCOW["Mailcow\nmail.gisportal.id"]
CONTENT["geonet-content\nPosting/Feed"]
PUSH["geonet-push\nPush Notification"]
end
BROWSER -->|HTTPS| NGINX
AGENT -->|HTTPS POST report| NGINX
NGINX --> FE
NGINX --> CONSOLE
NGINX --> COLLECTOR
NGINX -.-> ZAMMAD
CONSOLE -->|LDAP bind| AD
CONSOLE --- PGCONSOLE
CONSOLE -->|S3 API| OSS
CONSOLE -.->|"create ticket ⏳"| ZAMMAD
COLLECTOR --- PGCOLLECTOR
FE -->|"API /api/v1/*"| CONSOLE
FE -->|"API assets/*"| COLLECTOR
FE -.->|"Static files"| OSS
2. Arsitektur Backend Services
graph LR
subgraph CONSOLE["geonet-console (Laravel 11)"]
direction TB
AUTH["Auth\nLDAP login\nJWT token"]
ME["Profile /me\navatar OSS"]
PERM["Permissions\ngroup_permissions\nLDAP group mapping"]
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
subgraph COLLECTOR["geonet-collector (FastAPI)"]
direction TB
INGEST["Agent Ingest\nPOST /report"]
ASSETS["Asset CRUD\nlist, detail, edit"]
SNAP["Snapshots\nhardware history"]
AUDIT_C["Audit Log\nperubahan aset"]
end
PGCON[("PostgreSQL\ngeonet-console")]
PGCOL[("PostgreSQL\ncollector")]
AD2["Active Directory\n10.100.1.40"]
OSS2["QNAP OSS\nfile.gisportal.id"]
AUTH -->|bind| AD2
ME --> OSS2
CONSOLE --- PGCON
COLLECTOR --- PGCOL
ASSET_C -->|HTTP| COLLECTOR
3. Alur Auth & Permission
sequenceDiagram
participant Browser
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)
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)
sequenceDiagram
participant User as User (Browser)
participant FE as my-portal
participant Console as geonet-console
participant Zammad as Zammad ⏳
User->>FE: Klik tombol Feedback
FE->>FE: Tampilkan FeedbackDialog\n(form bug/saran + auto-capture page, user, timestamp)
User->>FE: Isi form & klik Kirim
FE->>Console: POST /api/v1/feedback\n{type, title, message, context}
Console->>Console: Simpan ke tabel feedback
Console-->>FE: {id, status: open}
Console-)Zammad: POST /api/v1/tickets ✅\nauto-create tiket (geonet-console `ZammadTicketService`)
FE-->>User: Tampilkan nomor tiket + pesan sukses
6. Peta Halaman Frontend
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
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
Permission System
| Permission Key | Fungsi |
|---|---|
profile.view / profile.edit |
Halaman profile |
dashboard.view |
Halaman dashboard |
asset_mgmt.view / asset_mgmt.manage |
Asset Management |
cmdb.view / cmdb.manage / cmdb.assign_owner |
CMDB |
geonet_agent.view |
GeoNet Agent |
monitoring.view |
Monitoring |
ticketing.view / ticketing.create / ticketing.manage |
Ticketing |
mail.view |
|
admin.users / admin.groups / admin.permissions |
Admin panel |
Default group mapping (seeder):
- Domain Admins → semua 17 permissions
- IT-Admin → 13 permissions
- IT-Staff → 11 permissions
- Management → 9 permissions
- Staff/HR → 6 permissions
Environment Variables Penting
Frontend (my-portal / Next.js)
NEXT_PUBLIC_API_URL=https://console.gisportal.id
NEXT_PUBLIC_COLLECTOR_URL=https://collector.gisportal.id
NEXT_PUBLIC_COLLECTOR_TOKEN=<token>
Backend geonet-console (Laravel, /opt/stacks/geonet-console)
LDAP_HOST=10.100.1.40
LDAP_PORT=389
LDAP_BASE_DN=DC=geonet,DC=co,DC=id
OSS_ENDPOINT=http://10.100.1.10:8010
OSS_BUCKET=super-apps
OSS_ACCESS_KEY_ID=super-apps:0Jq7KbF31eJzd4k3LSXN
Backend geonet-collector (FastAPI, /opt/stacks/geonetagent-collector)
# Source: /opt/stacks/geonetagent-collector/collector-src/
# Docker build context: ./collector-src
Lokasi Server & Deploy
| Komponen | Server | Path | Deploy Command |
|---|---|---|---|
| FE Next.js | 10.100.1.24 | /opt/stacks/my-portal/ |
docker compose build && up -d |
| geonet-console | 10.100.1.24 | /opt/stacks/geonet-console/ |
docker compose up -d |
| geonet-collector | 10.100.1.24 | /opt/stacks/geonetagent-collector/ |
docker compose build && up -d |
| Nginx config | 10.100.1.24 | /etc/nginx/conf.d/ |
nginx -s reload |
SSH akses: ssh -m hmac-sha1 root@10.100.1.24 -p 22
Schema Key — Collector API
CollectorAsset (list item)
{ id, hostname, display_name, asset_type, status, manufacturer, model,
serial_number, owner_ldap_username, owner_display_name, owner_email,
last_seen_at, snapshot_count, primary_physical_mac }
CollectorSnapshotSummary (flat — root level, BUKAN nested .system)
{ os_name, os_version, os_build, cpu_model, ram_gb, gpu_model,
last_boot_at, agent_version,
system?: { form_factor, chassis_label, ... },
cpu?: { model, cores, logical_processors, max_clock_mhz },
disks?: [...], network?: [...], memory_summary?: {...} }
Microservice Yang Direncanakan (Belum Dibangun)
| Service | Domain (rencana) | Status |
|---|---|---|
| Mailcow | mail.gisportal.id |
🔴 Belum |
| Zammad (ticketing) | zammad.gisportal.id |
🔴 Belum |
| geonet-content (posting) | content.gisportal.id |
🔴 Belum |
| geonet-push (push notif VAPID) | push.gisportal.id |
🔴 Belum |
Lihat backlog.md untuk detail tugas dan prioritas pengerjaan.