# πŸ—ΊοΈ 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 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 β€” Mail UI & Monitoring *(Butuh Mailcow API)* | # | Tugas | Estimasi | |---|---|---| | **16** | **Mail UI** β€” Inbox, Sent, Draft, Contacts, Calendar, Tasks, Rules | 5-7 hari | | **17** | **Monitoring alert detail** dialog (standar UI ADR) | 1 hari | --- ## πŸ”΄ Fase 6 β€” Infrastruktur *(Bisa paralel kapanpun)* | # | Tugas | Estimasi | |---|---|---| | **18** | **Mikrotik** β€” PPP login via LDAP | 1 hari | | **19** | **Windows Server AD** β€” LDAP SSO + SAML | 2-3 hari | --- > **Urutan pengerjaan**: > **β‘  Content/Home Feed** β†’ **β‘‘ Mailcow** β†’ **β‘’ Zammad+Ticketing** β†’ **β‘£ Push Notif** β†’ **β‘€ Mail UI** β†’ **β‘₯ Infra** --- # ADR β€” Standar Dialog Preview / Edit (UI Pattern) ## Aturan Wajib - Semua dialog preview/edit WAJIB menggunakan `` 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 `` dari `@/components/ui/tabs` - Info 2-kolom: `grid grid-cols-[160px_1fr]` untuk label–value ## Referensi Implementasi - `src/app/(app)/profile/page.tsx` β€” `` 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 --- # 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 # Mikrotik - [ ] Setup PPP login via LDAP # Windows Server 2012 R2 Active Directory - [ ] Setup LDAP SSO - [ ] Setup LDAP SAML