Browse Source
- feat(super-apps): tambah FeedbackButton + FeedbackDialog di semua halaman - feat(geonet-console): endpoint POST/GET/PATCH /api/v1/feedback + migration - feat(agent): GeoNetAgent v0.1.12-phase0 + shutdown task (GPO Shutdown script) - ops(proxmox): USB passthrough controller 00:1a.0 ke VM 103 (Opr Proxmox) - ops(ssh): setup key-based SSH ke Proxmox 10.100.1.101/102, ArcGIS 10.100.1.51/52 - ops(server): disk cleanup 10.100.1.24 (docker builder prune -af, freed 45GB) - docs: deploy-log.md, host.md update, ISO.md standar EOL perangkatmaster
19 changed files with 954 additions and 25 deletions
@ -0,0 +1,115 @@
@@ -0,0 +1,115 @@
|
||||
# Standar Internasional — Acuan Masa Pakai & EOL Perangkat IT |
||||
|
||||
Dokumen ini merangkum standar internasional yang menjadi acuan dalam menentukan masa pakai (*useful life*), siklus hidup, dan *End-of-Life* (EOL) perangkat laptop, PC, dan workstation di lingkungan organisasi. |
||||
|
||||
--- |
||||
|
||||
## Ringkasan Standar |
||||
|
||||
| Standar | Nama Lengkap | Fungsi Utama | |
||||
| ------- | ------------ | ------------ | |
||||
| ISO 55001 | Asset Management — Management Systems | Asset Lifecycle | |
||||
| ISO/IEC 19770-1 | IT Asset Management | IT Asset Management | |
||||
| ISO/IEC 20000-1 | IT Service Management | IT Service Management | |
||||
| ISO/IEC 27001 | Information Security Management | Information Security | |
||||
| NIST SP 800-53 | Security & Privacy Controls for IS | Hardware Lifecycle & Security Controls | |
||||
| ISACA COBIT | Control Objectives for IT | Governance & Asset Lifecycle | |
||||
|
||||
--- |
||||
|
||||
## Detail Standar & Relevansinya untuk Perangkat Endpoint |
||||
|
||||
### 1. ISO 55001 — Manajemen Aset (Asset Lifecycle) |
||||
|
||||
**Relevansi:** Standar utama untuk pengelolaan siklus hidup aset fisik, termasuk perangkat IT. |
||||
|
||||
- Mewajibkan organisasi mendefinisikan **masa pakai aset** secara eksplisit berdasarkan risiko dan kebutuhan bisnis. |
||||
- Memerlukan perencanaan **penghapusan aset** (*asset disposal*) yang terstruktur ketika perangkat mencapai EOL. |
||||
- Acuan umum masa pakai perangkat berdasarkan praktik ISO 55001: |
||||
- **Laptop/PC pengguna umum:** 3–5 tahun |
||||
- **Workstation teknis/desain:** 4–6 tahun |
||||
- **Server/infrastruktur:** 5–7 tahun |
||||
- Mensyaratkan dokumentasi kondisi aset, jadwal penggantian, dan analisis biaya siklus hidup penuh (*lifecycle cost analysis*). |
||||
|
||||
--- |
||||
|
||||
### 2. ISO/IEC 19770-1 — IT Asset Management (ITAM) |
||||
|
||||
**Relevansi:** Standar spesifik untuk pengelolaan aset IT, mencakup hardware dan software. |
||||
|
||||
- Mendefinisikan proses **inventarisasi, pelacakan, dan penonaktifan** aset IT secara sistematis. |
||||
- Mensyaratkan pencatatan atribut EOL/EOS (*End-of-Support*) dari setiap perangkat, termasuk: |
||||
- Tanggal akhir dukungan hardware dari vendor (OEM EOL) |
||||
- Tanggal akhir dukungan OS dari Microsoft/Apple/Linux distro |
||||
- Mensyaratkan proses **decommissioning** yang mencakup penghapusan data aman (*secure data wipe*) sebelum perangkat dilepas. |
||||
- Tiga tingkat kematangan ITAM (Tier 1–3); untuk pengelolaan EOL yang efektif minimal Tier 2. |
||||
|
||||
--- |
||||
|
||||
### 3. ISO/IEC 20000-1 — IT Service Management (ITSM) |
||||
|
||||
**Relevansi:** Menghubungkan siklus hidup perangkat dengan manajemen layanan IT. |
||||
|
||||
- Proses **Configuration Management** (CMDB) mewajibkan pencatatan status aset termasuk status EOL/aktif/pensiun. |
||||
- Proses **Change Management** mensyaratkan perencanaan penggantian perangkat yang mendekati EOL agar tidak mengganggu layanan. |
||||
- Proses **Capacity & Availability Management** menggunakan data EOL untuk merencanakan kapasitas dan anggaran pengadaan. |
||||
|
||||
--- |
||||
|
||||
### 4. ISO/IEC 27001 — Information Security Management |
||||
|
||||
**Relevansi:** Keamanan informasi mewajibkan kontrol ketat pada perangkat yang mendekati atau melewati EOL. |
||||
|
||||
- Kontrol **A.8 — Asset Management**: semua aset informasi (termasuk endpoint) harus diinventarisasi dan diketahui status EOL-nya. |
||||
- Perangkat yang OS-nya sudah EOL (contoh: Windows 7, Windows 10 setelah Okt 2025) dianggap **risiko keamanan tinggi** karena tidak mendapat patch keamanan. |
||||
- Mensyaratkan prosedur penghapusan data aman saat perangkat diretire (*media sanitization*). |
||||
- Pengelolaan EOL yang buruk dapat menjadi temuan **nonkonformitas** saat audit ISO 27001. |
||||
|
||||
--- |
||||
|
||||
### 5. NIST SP 800-53 — Hardware Lifecycle & Security Controls |
||||
|
||||
**Relevansi:** Panduan kontrol keamanan hardware dari NIST (banyak diadopsi sebagai referensi di luar AS). |
||||
|
||||
- **SA-22 (Unsupported System Components):** Mewajibkan organisasi untuk tidak mengoperasikan komponen IT yang sudah tidak didukung vendor (EOL/EOS), atau mendokumentasikan mitigasi risiko yang memadai. |
||||
- **MA-6 (Timely Maintenance):** Mensyaratkan perawatan dan penggantian tepat waktu berdasarkan jadwal siklus hidup. |
||||
- **SI-2 (Flaw Remediation):** Perangkat EOL tidak dapat menerima patch, secara otomatis melanggar kontrol ini. |
||||
|
||||
--- |
||||
|
||||
### 6. ISACA COBIT — Governance & Asset Lifecycle |
||||
|
||||
**Relevansi:** Kerangka tata kelola IT yang menghubungkan pengelolaan aset dengan nilai bisnis. |
||||
|
||||
- **BAI09 (Manage Assets):** Proses khusus untuk inventarisasi, pemeliharaan, dan penonaktifan aset IT. |
||||
- **DSS01 (Manage Operations):** Mensyaratkan pemantauan kondisi hardware secara berkelanjutan. |
||||
- Pengelolaan EOL masuk dalam konteks **risk management** dan **value delivery** — perangkat yang melewati EOL meningkatkan risiko operasional dan biaya tidak terduga. |
||||
|
||||
--- |
||||
|
||||
## Acuan Masa Pakai Umum Perangkat Endpoint |
||||
|
||||
| Jenis Perangkat | Masa Pakai Ideal | Batas Maksimum | Catatan | |
||||
| --------------- | ---------------- | -------------- | ------- | |
||||
| Laptop (pengguna umum) | 3–4 tahun | 5 tahun | Berdasarkan siklus depresiasi fiskal & EOL OS | |
||||
| PC Desktop (pengguna umum) | 4–5 tahun | 6 tahun | Komponen lebih mudah diupgrade | |
||||
| Workstation (teknis/CAD/GIS) | 4–5 tahun | 6 tahun | Tergantung kebutuhan performa aplikasi | |
||||
| Laptop/PC manajemen | 3–5 tahun | 5 tahun | Prioritas keamanan data tinggi | |
||||
|
||||
> **Catatan:** Masa pakai dihitung sejak tanggal pembelian pertama, bukan sejak mulai digunakan. Perangkat yang OS-nya mencapai EOL **wajib diganti atau diupgrade OS** terlepas dari usia hardware. |
||||
|
||||
--- |
||||
|
||||
## Referensi EOL OS Umum |
||||
|
||||
| Sistem Operasi | Tanggal EOL | Keterangan | |
||||
| -------------- | ----------- | ---------- | |
||||
| Windows 10 (semua edisi) | 14 Oktober 2025 | Tidak ada Extended Security Update gratis untuk konsumen | |
||||
| Windows 11 22H2 | 8 Oktober 2024 | Sudah EOL, wajib upgrade ke 23H2/24H2 | |
||||
| Windows 11 23H2 | 11 November 2025 | — | |
||||
| Windows 11 24H2 | Oktober 2026 (est.) | Rilis terbaru (2024) | |
||||
| Ubuntu 20.04 LTS | April 2025 (standard) | ESM hingga April 2030 | |
||||
| Ubuntu 22.04 LTS | April 2027 (standard) | ESM hingga April 2032 | |
||||
| Ubuntu 24.04 LTS | April 2029 (standard) | ESM hingga April 2034 | |
||||
|
||||
> Sumber: Microsoft Lifecycle Policy, Ubuntu Release Schedule. Selalu verifikasi ke situs resmi vendor untuk tanggal terkini. |
||||
@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
|
||||
@echo off |
||||
REM GeoNetAgent — GPO Computer Shutdown Script (wrapper) |
||||
REM Deploy folder ini ke SYSVOL / NETLOGON, lalu tautkan .cmd ini di GPO Shutdown. |
||||
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "%~dp0GeoNetAgent-GPO-Shutdown.ps1" |
||||
exit /b 0 |
||||
@ -0,0 +1,59 @@
@@ -0,0 +1,59 @@
|
||||
#Requires -Version 5.1 |
||||
<# |
||||
.SYNOPSIS |
||||
GPO Shutdown Script — kirim laporan GeoNetAgent sebelum Windows shutdown/restart. |
||||
|
||||
.DESCRIPTION |
||||
Dipanggil dari Group Policy (Computer Configuration → Shutdown Scripts). |
||||
Menjalankan UserAgent.ps1 -SkipAutoUpdate agar laporan terkirim sebelum PC mati. |
||||
Auto-update dilewati karena waktu shutdown terbatas. |
||||
|
||||
.NOTES |
||||
Log: %ProgramData%\GeoNetAgent\logs\gpo-shutdown.log |
||||
Exit selalu 0 agar GPO tidak error. |
||||
Batas waktu eksekusi GPO Shutdown Script default: 600 detik (bisa diatur via GPO). |
||||
Rekomendasikan set "Maximum wait time for Group Policy scripts" ke 60 detik. |
||||
#> |
||||
[CmdletBinding()] |
||||
param() |
||||
|
||||
$ErrorActionPreference = 'Continue' |
||||
|
||||
$InstallRoot = Join-Path $env:ProgramData 'GeoNetAgent' |
||||
$LogDir = Join-Path $InstallRoot 'logs' |
||||
$LogFile = Join-Path $LogDir 'gpo-shutdown.log' |
||||
$UserAgent = Join-Path $InstallRoot 'UserAgent.ps1' |
||||
|
||||
function Write-GeoNetShutdownLog { |
||||
param([string]$Message) |
||||
$line = '{0} {1}' -f (Get-Date -Format 'yyyy-MM-dd HH:mm:ss'), $Message |
||||
try { |
||||
if (-not (Test-Path $LogDir)) { |
||||
New-Item -ItemType Directory -Path $LogDir -Force | Out-Null |
||||
} |
||||
Add-Content -Path $LogFile -Value $line -Encoding UTF8 |
||||
} |
||||
catch { } |
||||
} |
||||
|
||||
Write-GeoNetShutdownLog '=== GPO shutdown begin ===' |
||||
|
||||
try { |
||||
if (-not (Test-Path $UserAgent)) { |
||||
Write-GeoNetShutdownLog "UserAgent.ps1 tidak ditemukan di $InstallRoot — skip" |
||||
exit 0 |
||||
} |
||||
|
||||
Write-GeoNetShutdownLog 'Mengirim laporan sebelum shutdown...' |
||||
& powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden ` |
||||
-File $UserAgent -SkipAutoUpdate |
||||
|
||||
$code = $LASTEXITCODE |
||||
Write-GeoNetShutdownLog "UserAgent selesai (exit $code)" |
||||
} |
||||
catch { |
||||
Write-GeoNetShutdownLog "ERROR: $($_.Exception.Message)" |
||||
} |
||||
|
||||
Write-GeoNetShutdownLog '=== GPO shutdown end ===' |
||||
exit 0 |
||||
@ -0,0 +1,182 @@
@@ -0,0 +1,182 @@
|
||||
# Workspace Context |
||||
|
||||
## Purpose |
||||
|
||||
Dokumen ini adalah **root context** untuk seluruh workspace. |
||||
|
||||
Workspace ini memiliki satu atau lebih repository. |
||||
|
||||
**Jangan melakukan analisis seluruh workspace sekaligus.** |
||||
|
||||
Selalu identifikasi repository yang relevan, kemudian baca **`docs/context-index.md`** pada repository tersebut sebagai sumber informasi utama. |
||||
|
||||
--- |
||||
|
||||
# Rules |
||||
|
||||
1. Selalu baca `Workspace-Context.md` terlebih dahulu. |
||||
2. Tentukan repository yang relevan. |
||||
3. Baca hanya `docs/context-index.md` pada repository tersebut. |
||||
4. Ikuti seluruh referensi dokumentasi yang terdapat pada `context-index.md`. |
||||
5. Jangan membaca atau memodifikasi repository lain kecuali benar-benar dibutuhkan. |
||||
6. Jika pekerjaan melibatkan lebih dari satu repository, baca `docs/context-index.md` masing-masing repository yang terkait. |
||||
7. Jangan membuat asumsi mengenai arsitektur, API, database, server, maupun implementasi tanpa membaca dokumentasi repository terkait. |
||||
|
||||
--- |
||||
|
||||
# Repository Ownership Policy |
||||
|
||||
* Setiap repository memiliki dokumentasi, aturan, dan lifecycle masing-masing. |
||||
* Seluruh perubahan harus dilakukan pada repository yang benar. |
||||
* Jangan membuat dokumentasi lintas repository yang menyebabkan duplikasi informasi. |
||||
* Dokumentasi teknis harus tetap berada pada repository pemiliknya (Single Source of Truth). |
||||
|
||||
--- |
||||
|
||||
# Cross Repository Policy |
||||
|
||||
Apabila sebuah pekerjaan melibatkan lebih dari satu repository: |
||||
|
||||
1. Identifikasi seluruh repository yang terdampak. |
||||
2. Baca `docs/context-index.md` dari setiap repository terkait. |
||||
3. Perbarui dokumentasi pada masing-masing repository yang mengalami perubahan. |
||||
4. Dokumentasikan dependency dan integrasi antar repository apabila terjadi perubahan. |
||||
5. Pastikan perubahan tetap kompatibel dengan repository lain. |
||||
|
||||
--- |
||||
|
||||
# Knowledge Preservation Policy |
||||
|
||||
Setiap informasi yang diperoleh AI Agent selama proses: |
||||
|
||||
* Analisis |
||||
* Debugging |
||||
* Development |
||||
* Testing |
||||
* Deployment |
||||
* Production Support |
||||
* Incident Handling |
||||
* Performance Tuning |
||||
* Security Review |
||||
|
||||
yang berpotensi berguna di masa depan harus didokumentasikan pada repository yang sesuai. |
||||
|
||||
AI Agent **tidak boleh menyimpan konteks penting hanya di dalam percakapan**. |
||||
|
||||
Seluruh pengetahuan yang relevan harus dipindahkan ke dokumentasi repository agar dapat digunakan kembali oleh developer maupun AI Agent lain. |
||||
|
||||
--- |
||||
|
||||
# Documentation Policy (Mandatory) |
||||
|
||||
Seluruh repository merupakan **Single Source of Truth** untuk proses development, deployment, operasi, dan maintenance. |
||||
|
||||
Dokumentasi merupakan bagian dari source code dan memiliki prioritas yang sama dengan implementasi. |
||||
|
||||
Setiap perubahan wajib didokumentasikan. |
||||
|
||||
Minimal dokumentasi yang harus diperbarui apabila relevan: |
||||
|
||||
* Feature Development |
||||
* Enhancement |
||||
* Bug Fix |
||||
* Known Issues |
||||
* Root Cause Analysis (RCA) |
||||
* Technical Debt |
||||
* TODO |
||||
* Next Action |
||||
* ADR (Architecture Decision Record) |
||||
* Changelog |
||||
* API Documentation |
||||
* Database Structure |
||||
* Database Migration |
||||
* Environment Configuration |
||||
* Infrastructure |
||||
* Server Information |
||||
* Deployment Guide |
||||
* CI/CD |
||||
* Monitoring |
||||
* Logging |
||||
* Dependency antar service |
||||
* Breaking Changes |
||||
* Security Notes |
||||
* Workaround |
||||
* Troubleshooting |
||||
* Performance Optimization |
||||
* Operational Notes |
||||
* Catatan penting lainnya yang mempengaruhi proses development maupun deployment. |
||||
|
||||
--- |
||||
|
||||
# Documentation Quality Standard |
||||
|
||||
Dokumentasi harus: |
||||
|
||||
* Akurat |
||||
* Ringkas |
||||
* Mudah dipahami |
||||
* Selalu diperbarui |
||||
* Tidak duplikat |
||||
* Konsisten dengan implementasi kode |
||||
* Menggunakan Markdown |
||||
* Mengacu pada `docs/context-index.md` |
||||
|
||||
Apabila dokumentasi sudah tersedia, lakukan pembaruan daripada membuat file baru. |
||||
|
||||
--- |
||||
|
||||
# AI Agent Responsibilities |
||||
|
||||
Apabila AI Agent melakukan perubahan pada repository, maka AI Agent wajib: |
||||
|
||||
1. Memperbarui dokumentasi yang relevan. |
||||
2. Memperbarui `docs/context-index.md` apabila terdapat dokumen baru. |
||||
3. Memperbarui TODO apabila status berubah. |
||||
4. Memperbarui Issue apabila ditemukan bug baru. |
||||
5. Membuat ADR apabila terdapat keputusan arsitektur baru. |
||||
6. Memperbarui dokumentasi API apabila endpoint berubah. |
||||
7. Memperbarui dokumentasi database apabila schema berubah. |
||||
8. Memperbarui deployment guide apabila proses deployment berubah. |
||||
9. Memperbarui changelog untuk setiap perubahan penting. |
||||
10. Memastikan seluruh dokumentasi konsisten dengan implementasi kode. |
||||
11. Menandai dokumentasi yang sudah tidak berlaku sebagai **Deprecated**, bukan langsung menghapusnya. |
||||
|
||||
--- |
||||
|
||||
# Commit Policy |
||||
|
||||
Sebelum pekerjaan dianggap selesai: |
||||
|
||||
* Review seluruh perubahan. |
||||
* Pastikan dokumentasi telah diperbarui. |
||||
* Pastikan tidak ada secret yang ikut ter-commit. |
||||
* Pastikan repository dapat dibangun dan dijalankan apabila memungkinkan. |
||||
* Buat commit yang jelas dan deskriptif. |
||||
* Jangan melakukan commit yang mencampurkan perubahan yang tidak berkaitan. |
||||
|
||||
--- |
||||
|
||||
# Definition of Done (DoD) |
||||
|
||||
Sebuah pekerjaan **belum dianggap selesai** apabila salah satu kondisi berikut masih ada: |
||||
|
||||
* Dokumentasi belum diperbarui. |
||||
* TODO belum diperbarui. |
||||
* Issue belum diperbarui. |
||||
* API belum diperbarui. |
||||
* ADR belum dibuat (jika diperlukan). |
||||
* Changelog belum diperbarui. |
||||
* `docs/context-index.md` belum diperbarui apabila terdapat dokumen baru. |
||||
|
||||
--- |
||||
|
||||
# Notes |
||||
|
||||
* Struktur workspace bersifat dinamis. |
||||
* Repository dapat ditambah, dipindahkan, atau dihapus. |
||||
* Pastikan daftar repository pada dokumen ini selalu diperbarui. |
||||
* Seluruh dokumentasi teknis berada di masing-masing repository. |
||||
* `Workspace-Context.md` hanya berfungsi sebagai navigasi dan entry point. |
||||
* Selalu gunakan dokumentasi terbaru sebagai acuan sebelum melakukan analisis atau implementasi. |
||||
* Prioritaskan pembaruan dokumentasi yang sudah ada daripada membuat dokumentasi baru yang berpotensi duplikat. |
||||
|
||||
@ -0,0 +1,91 @@
@@ -0,0 +1,91 @@
|
||||
# Backup AnyDesk |
||||
|
||||
Catatan sebelum uninstall AnyDesk. |
||||
|
||||
## File konfigurasi yang perlu di-backup |
||||
|
||||
| Apa | Lokasi | |
||||
|-----|--------| |
||||
| ID AnyDesk komputer ini | `C:\ProgramData\AnyDesk\service.conf` | |
||||
| Alias (jika ada) | `C:\ProgramData\AnyDesk\service.conf` | |
||||
| Daftar ID remote yang pernah dikoneksi | `C:\Users\<username>\AppData\Roaming\AnyDesk\user.conf` | |
||||
|
||||
Baris yang perlu disimpan: |
||||
- `ad.anynet.id=...` |
||||
- `ad.anynet.alias=...` |
||||
- `ad.roster.items=...` |
||||
- `ad.roster.favorites=...` |
||||
|
||||
## Perintah untuk langsung mengekstrak ID ke file ini |
||||
|
||||
Jalankan di PowerShell: |
||||
|
||||
```powershell |
||||
$md = 'd:\Project\app on git\anydesk.md' |
||||
Add-Content $md "`n## AnyDesk ID Backup`n" |
||||
Get-Content "$env:ProgramData\AnyDesk\service.conf" | |
||||
Select-String "^(ad\.anynet\.id|ad\.anynet\.alias)=" | |
||||
Add-Content $md |
||||
Get-Content "$env:APPDATA\AnyDesk\user.conf" | |
||||
Select-String "^(ad\.roster\.items|ad\.roster\.favorites)=" | |
||||
Add-Content $md |
||||
``` |
||||
|
||||
## Catatan uninstall |
||||
|
||||
- Saat uninstaller AnyDesk menanyakan apakah ingin menghapus **configuration files**, pilih **No/Tidak** supaya ID tetap tersimpan. |
||||
- Jika ingin uninstall bersih, salin file `service.conf` dan `user.conf` dulu, lalu restore setelah install ulang. |
||||
|
||||
|
||||
## History exsisting ID Anydesk |
||||
Recent Sessions yang terlihat |
||||
| Nama/Alias | AnyDesk ID | Status | |
||||
| ------------- | ------------- | ----------------------- | |
||||
| luwsrv03@ad | 1 315 522 618 | 🟢 Online | |
||||
| pc putih | 1 586 132 192 | 🔴 Offline | |
||||
| wabotpc | 782 089 407 | 🟢 Online | |
||||
| 768 397 903 | 768 397 903 | 🟢 Online | |
||||
| 196 357 002 | 196 357 002 | 🔴 Offline | |
||||
| 1 134 767 402 | 1 134 767 402 | 🔴 Offline | |
||||
| 150 878 707 | 150 878 707 | 🔴 Offline | |
||||
| 1 837 279 788 | 1 837 279 788 | 🔴 Offline | |
||||
| 753 011 914 | 753 011 914 | 🟢 Online | |
||||
| 1 940 821 188 | 1 940 821 188 | 🟢 Online (This Device) | |
||||
| wabot | 1 087 714 174 | 🔴 Offline | |
||||
| 1 843 863 429 | 1 843 863 429 | 🔴 Offline | |
||||
| 320 578 236 | 320 578 236 | 🟢 Online | |
||||
| turen | 1 919 377 233 | 🟢 Online | |
||||
| msi | 1 404 328 337 | 🟢 Online | |
||||
| 788 800 406 | 788 800 406 | 🔴 Offline | |
||||
| 1 442 565 617 | 1 442 565 617 | 🔴 Offline | |
||||
| 492 865 875 | 492 865 875 | 🟢 Online | |
||||
| 605 743 051 | 605 743 051 | 🔴 Offline | |
||||
| 259 511 811 | 259 511 811 | 🔴 Offline | |
||||
| 120 239 635 | 120 239 635 | 🔴 Offline | |
||||
| 1 508 728 214 | 1 508 728 214 | 🔴 Offline | |
||||
| 1 835 890 522 | 1 835 890 522 | 🔴 Offline | |
||||
| 1 029 425 656 | 1 029 425 656 | 🔴 Offline | |
||||
| 1 252 927 543 | 1 252 927 543 | 🔴 Offline | |
||||
| 1 477 009 444 | 1 477 009 444 | 🟢 Online | |
||||
| 690 848 779 | 690 848 779 | 🔴 Offline | |
||||
| 652 598 394 | 652 598 394 | 🔴 Offline | |
||||
| 1 960 924 256 | 1 960 924 256 | 🔴 Offline | |
||||
| 1 049 300 050 | 1 049 300 050 | 🔴 Offline | |
||||
| 931 977 962 | 931 977 962 | 🔴 Offline | |
||||
| 1 362 964 774 | 1 362 964 774 | 🔴 Offline | |
||||
| 1 029 198 007 | 1 029 198 007 | 🔴 Offline | |
||||
| 1 817 523 476 | 1 817 523 476 | 🔴 Offline | |
||||
| 1 057 176 301 | 1 057 176 301 | 🔴 Offline | |
||||
| 1 156 489 064 | 1 156 489 064 | 🔴 Offline | |
||||
| 970 927 367 | 970 927 367 | 🔴 Offline | |
||||
| 784 419 109 | 784 419 109 | 🔴 Offline | |
||||
| 483 865 345 | 483 865 345 | 🔴 Offline | |
||||
| 1 067 787 928 | 1 067 787 928 | 🔴 Offline | |
||||
| 1 878 652 573 | 1 878 652 573 | 🔴 Offline | |
||||
| 820 781 760 | 820 781 760 | 🔴 Offline | |
||||
| 848 924 578 | 848 924 578 | 🔴 Offline | |
||||
| 728 652 074 | 728 652 074 | 🔴 Offline | |
||||
| 709 551 067 | 709 551 067 | 🟢 Online | |
||||
| Windows | 116 079 452 | 🟢 Online (Discovered) | |
||||
| lenovo | 934 784 136 | 🟢 Online (Discovered) | |
||||
| Windows | 1 205 966 377 | 🟢 Online (Discovered) | |
||||
@ -0,0 +1,82 @@
@@ -0,0 +1,82 @@
|
||||
# Deploy Log |
||||
|
||||
--- |
||||
|
||||
## 2026-07-01 — Feature Feedback Super Apps |
||||
|
||||
### Frontend (my.gisportal.id) |
||||
- Buat `src/components/feedback/feedback-dialog.tsx` — dialog form laporan bug/saran |
||||
- Buat `src/components/feedback/feedback-button.tsx` — floating button di semua halaman |
||||
- Update `src/app/(app)/layout.tsx` — tambah `<FeedbackButton />` |
||||
- Deploy: `docker compose up -d --build` di `/opt/stacks/my-portal` |
||||
|
||||
### Backend (console.gisportal.id) |
||||
- Buat `app/Models/Feedback.php` |
||||
- Buat `app/Http/Controllers/Api/V1/FeedbackController.php` |
||||
- Buat `database/migrations/2026_07_01_000001_create_feedback_table.php` |
||||
- Update `routes/api.php` — tambah 3 route: `POST/GET /feedback`, `PATCH /feedback/{id}` |
||||
- Deploy: `docker cp` ke container `geonet-console` + `php artisan migrate --force` |
||||
- Hasil: migration `create_feedback_table` ✅ Ran, route terdaftar ✅ |
||||
|
||||
### Catatan |
||||
- Container geonet-console tidak mount source dari host (pakai image) → wajib `docker cp` untuk perubahan tanpa rebuild |
||||
- Untuk permanen: rebuild image |
||||
|
||||
--- |
||||
|
||||
## 2026-07-01 — SSH Key Setup ArcGIS Servers |
||||
|
||||
### Server 10.100.1.52 (DEV13 — ArcGIS Data Store Object) |
||||
- Install OpenSSH key via `ssh -t` dengan password sekali |
||||
- Public key: `id_ed25519_geonet_proxmox` → `C:\ProgramData\ssh\administrators_authorized_keys` |
||||
- SSH config alias: `dev13-object` |
||||
- Hasil: `ssh dev13-object` ✅ tanpa password |
||||
|
||||
### Server 10.100.1.51 (DEV11 — ArcGIS Base Development) |
||||
- Install OpenSSH key via `ssh -t` dengan password sekali |
||||
- Public key: `id_ed25519_geonet_proxmox` → `C:\ProgramData\ssh\administrators_authorized_keys` |
||||
- SSH config alias: `dev51-base` |
||||
- Hasil: `ssh dev51-base` ✅ tanpa password |
||||
|
||||
--- |
||||
|
||||
## 2026-07-01 — Disk Cleanup Server 10.100.1.24 |
||||
|
||||
- Kondisi sebelum: disk 98% (1.3 GB free / 50 GB) |
||||
- Root cause: Docker build cache 45.29 GB menumpuk |
||||
- Tindakan: `docker builder prune -af` |
||||
- Freed: 45.29 GB |
||||
- Kondisi sesudah: disk 50% (26 GB free) |
||||
- Dangling images: ~7.9 GB masih ada (aman untuk dibersihkan kapan saja) |
||||
|
||||
--- |
||||
|
||||
## 2026-06-30 — USB Passthrough VM 103 (Opr Proxmox 10.100.1.102) |
||||
|
||||
- Flashdisk Cruzer Blade terdeteksi di `usb 1-1.4` (idVendor=0781, idProduct=5567) |
||||
- Controller PCI: `0000:00:1a.0` (EHCI USB 2.0) |
||||
- Hapus passthrough per-device: `qm set 103 --delete usb1` |
||||
- Tambah passthrough controller: `qm set 103 -hostpci0 00:1a.0` |
||||
- VM 103 restart → `hostpci0: 00:1a.0` aktif |
||||
- Hasil: semua device USB yang dicolok ke bus 1 auto terdeteksi di VM 103 |
||||
|
||||
--- |
||||
|
||||
## 2026-06-30 — SSH Key Proxmox |
||||
|
||||
### Server 10.100.1.101 & 10.100.1.102 |
||||
- Key: `~/.ssh/id_ed25519_geonet_proxmox` |
||||
- SSH config alias: `proxmox` (10.100.1.101), `proxmox-opr` (10.100.1.102) |
||||
- Hasil: `ssh root@10.100.1.101` dan `ssh root@10.100.1.102` ✅ tanpa password |
||||
|
||||
--- |
||||
|
||||
## 2026-06-29 — GeoNetAgent v0.1.12-phase0 |
||||
|
||||
### Perubahan |
||||
- Tambah scheduled task `GeoNetAgent-Report-Shutdown` (Event ID 1074) |
||||
- Buat `GeoNetAgent-GPO-Shutdown.cmd` dan `GeoNetAgent-GPO-Shutdown.ps1` |
||||
- Update `GeoNetAgent-GPO-Startup.ps1` — cek task shutdown saat startup |
||||
- Bump VERSION → `0.1.12-phase0` |
||||
- Update `manifest.json` dan `index.html` (version badge dinamis) |
||||
- Deploy ke `https://agent.gisportal.id/install/` |
||||
@ -0,0 +1,99 @@
@@ -0,0 +1,99 @@
|
||||
<?php |
||||
|
||||
namespace App\Http\Controllers\Api\V1; |
||||
|
||||
use App\Http\Controllers\Api\Concerns\RespondsWithJson; |
||||
use App\Http\Controllers\Controller; |
||||
use App\Models\Feedback; |
||||
use App\Support\ApiActor; |
||||
use Illuminate\Http\JsonResponse; |
||||
use Illuminate\Http\Request; |
||||
use Illuminate\Validation\Rule; |
||||
|
||||
class FeedbackController extends Controller |
||||
{ |
||||
use RespondsWithJson; |
||||
|
||||
public function store(Request $request): JsonResponse |
||||
{ |
||||
/** @var ApiActor $actor */ |
||||
$actor = $request->attributes->get('api_actor'); |
||||
|
||||
$validated = $request->validate([ |
||||
'type' => ['required', Rule::in(['bug', 'suggestion', 'other'])], |
||||
'title' => ['required', 'string', 'max:120'], |
||||
'message' => ['required', 'string', 'max:5000'], |
||||
'context' => ['sometimes', 'array'], |
||||
'context.page' => ['sometimes', 'string', 'max:500'], |
||||
'context.url' => ['sometimes', 'string', 'max:1000'], |
||||
'context.user_agent' => ['sometimes', 'string', 'max:500'], |
||||
'context.reporter' => ['sometimes', 'string', 'max:100'], |
||||
'context.reporter_name' => ['sometimes', 'string', 'max:200'], |
||||
'context.reported_at' => ['sometimes', 'string'], |
||||
]); |
||||
|
||||
$ctx = $validated['context'] ?? []; |
||||
|
||||
$feedback = Feedback::create([ |
||||
'type' => $validated['type'], |
||||
'title' => $validated['title'], |
||||
'message' => $validated['message'], |
||||
'status' => 'open', |
||||
'reporter' => $ctx['reporter'] ?? ($actor?->identifier ?? null), |
||||
'reporter_name' => $ctx['reporter_name'] ?? null, |
||||
'page' => $ctx['page'] ?? null, |
||||
'url' => $ctx['url'] ?? null, |
||||
'user_agent' => $ctx['user_agent'] ?? null, |
||||
'reported_at' => isset($ctx['reported_at']) ? now()->parse($ctx['reported_at']) : now(), |
||||
]); |
||||
|
||||
return $this->ok([ |
||||
'id' => $feedback->id, |
||||
'status' => $feedback->status, |
||||
], [], 201); |
||||
} |
||||
|
||||
public function index(Request $request): JsonResponse |
||||
{ |
||||
/** @var ApiActor $actor */ |
||||
$actor = $request->attributes->get('api_actor'); |
||||
|
||||
if (!$actor?->is_admin) { |
||||
return $this->fail('Forbidden', 'forbidden', 403); |
||||
} |
||||
|
||||
$query = Feedback::query()->orderByDesc('created_at'); |
||||
|
||||
if ($request->filled('type')) { |
||||
$query->where('type', $request->query('type')); |
||||
} |
||||
if ($request->filled('status')) { |
||||
$query->where('status', $request->query('status')); |
||||
} |
||||
|
||||
$items = $query->paginate(20); |
||||
|
||||
return $this->ok($items); |
||||
} |
||||
|
||||
public function update(Request $request, int $id): JsonResponse |
||||
{ |
||||
/** @var ApiActor $actor */ |
||||
$actor = $request->attributes->get('api_actor'); |
||||
|
||||
if (!$actor?->is_admin) { |
||||
return $this->fail('Forbidden', 'forbidden', 403); |
||||
} |
||||
|
||||
$feedback = Feedback::findOrFail($id); |
||||
|
||||
$validated = $request->validate([ |
||||
'status' => ['sometimes', Rule::in(['open', 'in_progress', 'resolved', 'closed'])], |
||||
'admin_note' => ['sometimes', 'nullable', 'string', 'max:2000'], |
||||
]); |
||||
|
||||
$feedback->update($validated); |
||||
|
||||
return $this->ok($feedback->only(['id', 'status', 'admin_note'])); |
||||
} |
||||
} |
||||
@ -0,0 +1,26 @@
@@ -0,0 +1,26 @@
|
||||
<?php |
||||
|
||||
namespace App\Models; |
||||
|
||||
use Illuminate\Database\Eloquent\Model; |
||||
|
||||
class Feedback extends Model |
||||
{ |
||||
protected $fillable = [ |
||||
'type', |
||||
'title', |
||||
'message', |
||||
'status', |
||||
'reporter', |
||||
'reporter_name', |
||||
'page', |
||||
'url', |
||||
'user_agent', |
||||
'reported_at', |
||||
'admin_note', |
||||
]; |
||||
|
||||
protected $casts = [ |
||||
'reported_at' => 'datetime', |
||||
]; |
||||
} |
||||
@ -0,0 +1,32 @@
@@ -0,0 +1,32 @@
|
||||
<?php |
||||
|
||||
use Illuminate\Database\Migrations\Migration; |
||||
use Illuminate\Database\Schema\Blueprint; |
||||
use Illuminate\Support\Facades\Schema; |
||||
|
||||
return new class extends Migration |
||||
{ |
||||
public function up(): void |
||||
{ |
||||
Schema::create('feedback', function (Blueprint $table) { |
||||
$table->id(); |
||||
$table->string('type', 20)->default('bug'); |
||||
$table->string('title', 120); |
||||
$table->text('message'); |
||||
$table->string('status', 20)->default('open'); |
||||
$table->string('reporter', 100)->nullable(); |
||||
$table->string('reporter_name', 200)->nullable(); |
||||
$table->string('page', 500)->nullable(); |
||||
$table->string('url', 1000)->nullable(); |
||||
$table->string('user_agent', 500)->nullable(); |
||||
$table->timestamp('reported_at')->nullable(); |
||||
$table->text('admin_note')->nullable(); |
||||
$table->timestamps(); |
||||
}); |
||||
} |
||||
|
||||
public function down(): void |
||||
{ |
||||
Schema::dropIfExists('feedback'); |
||||
} |
||||
}; |
||||
Loading…
Reference in new issue