chore: update gitignore and add root docs and tooling
This commit is contained in:
+262
@@ -0,0 +1,262 @@
|
||||
# User Guide — Panduan Admin
|
||||
|
||||
Panduan ini untuk **Administrator** atau **Super Admin** yang mengoperasikan aplikasi.
|
||||
|
||||
---
|
||||
|
||||
## Login
|
||||
|
||||
1. Buka `https://domain.com/login`
|
||||
2. Masukkan email & password
|
||||
3. (Opsional) jika **2FA** diaktifkan, kode 6 digit dikirim ke email — input di halaman `/2fa`
|
||||
4. (Opsional) centang **Trust this device** untuk skip 2FA selama 30 hari (cookie aman)
|
||||
5. (Opsional) gunakan **Passkey (biometrik)** jika sudah didaftarkan di profil
|
||||
6. (Opsional) login via **Google / Facebook / GitHub** jika Social OAuth diaktifkan
|
||||
|
||||
> Akun default setelah seeder: lihat tabel di README.md. Jika perlu reset, jalankan:
|
||||
> ```bash
|
||||
> ./vendor/bin/sail artisan db:seed --class=AdminUserSeeder
|
||||
> ./vendor/bin/sail artisan cache:clear
|
||||
> ```
|
||||
|
||||
### Rate Limit
|
||||
|
||||
Untuk mencegah brute force:
|
||||
|
||||
| Endpoint | Limit |
|
||||
|----------|-------|
|
||||
| `/login` (web) | 5/menit per IP |
|
||||
| `/2fa` verify | 5/menit per IP |
|
||||
| `/forgot-password` | dibatasi via Spatie throttle |
|
||||
| `/api/v1/login` (mobile) | 10/menit per IP |
|
||||
| `/api/v1/otp/send` | 5/menit per IP |
|
||||
| `/api/v1/otp/verify` | 10/menit per IP |
|
||||
|
||||
Jika kena rate limit, response `429 Too Many Requests` — tunggu 1 menit.
|
||||
|
||||
---
|
||||
|
||||
## Dashboard
|
||||
|
||||
Halaman pertama setelah login. Menampilkan statistik sistem secara **real-time** via WebSocket (Laravel Reverb). Jika koneksi WebSocket tidak tersedia, data di-refresh otomatis tiap 30 detik.
|
||||
|
||||
### Widget Bawaan
|
||||
|
||||
| Widget | Isi |
|
||||
|--------|-----|
|
||||
| CPU Load | Persentase penggunaan CPU dengan sparkline |
|
||||
| Memory | RAM used/total |
|
||||
| Storage | Disk used/total |
|
||||
| Live Users | Sesi aktif saat ini |
|
||||
| Queue Stats | Job pending/processed/failed |
|
||||
| Activity Feed | Log aktivitas terbaru (butuh permission `view health and logs`) |
|
||||
| AI Security Insight | Skor keamanan terakhir dari AI analysis (butuh permission `view ai log analysis`) |
|
||||
|
||||
### Kustomisasi Dashboard
|
||||
|
||||
1. Klik tombol **Customize** di pojok kanan atas halaman Dashboard
|
||||
2. Panel kustomisasi muncul dengan daftar widget:
|
||||
- Toggle switch untuk **tampilkan/sembunyikan** setiap widget
|
||||
- Drag-and-drop widget untuk **mengubah urutan** tampilan
|
||||
3. Klik **Save Layout** — preferensi tersimpan di database per akun
|
||||
4. Klik **Reset to Default** untuk kembali ke urutan dan visibilitas bawaan
|
||||
|
||||
> Preferensi layout **per-user** — setiap admin bisa punya tata letak sendiri.
|
||||
|
||||
---
|
||||
|
||||
## Menu Utama
|
||||
|
||||
### 1. Users — Manajemen Pengguna
|
||||
|
||||
**Akses:** sidebar → User Management
|
||||
|
||||
- Tambah / edit / hapus user (soft delete — bisa di-restore)
|
||||
- Atur role (Super Admin, Admin, Custom)
|
||||
- Aktif / nonaktifkan akun
|
||||
- **Bulk action** — aktifkan/nonaktifkan/hapus banyak user sekaligus
|
||||
- **Impersonate** — login sebagai user lain untuk debugging
|
||||
- Tidak bisa impersonate diri sendiri
|
||||
- Tidak bisa impersonate Super Admin/Developer
|
||||
- Tidak bisa impersonate user inactive
|
||||
- Tidak bisa nested impersonate (loop prevention)
|
||||
|
||||
> Force delete diri sendiri di-blokir oleh sistem — gunakan akun admin lain bila perlu.
|
||||
|
||||
### 2. Roles & Permissions
|
||||
|
||||
**Akses:** sidebar → Access Control
|
||||
|
||||
- Buat role baru dan pilih permission yang diizinkan
|
||||
- **Permission dikelompokkan per kategori** dalam dua panel:
|
||||
- Panel kiri (**Available**) — permission yang belum diberikan ke role ini
|
||||
- Panel kanan (**Assigned**) — permission yang sudah diberikan
|
||||
- Pindahkan dengan **drag-and-drop** atau **double-click** item
|
||||
- Gunakan **search** di masing-masing panel untuk filter cepat
|
||||
- **Category group headers** muncul otomatis di panel Assigned saat ada permission dari kategori tersebut
|
||||
- **85 granular tab permissions** — setiap tab di Global Settings dan Mobile Settings punya permission sendiri (mis. `manage global settings password policy`, `view mobile settings kill switch`)
|
||||
- Role dan permission bisa diaktif/nonaktifkan tanpa dihapus
|
||||
- Audit trail tersedia: setiap perubahan role/permission tercatat
|
||||
- Tidak bisa archive role yang masih dipakai user — pindahkan user dulu
|
||||
|
||||
### 3. Action Logs — Audit Trail
|
||||
|
||||
**Akses:** sidebar → Action History
|
||||
|
||||
Mencatat semua perubahan data: siapa, kapan, apa yang diubah, dari IP mana. Berguna untuk audit & forensik.
|
||||
|
||||
Sensitive fields (password, token, secret, 2fa_secret) otomatis di-redact dari log entry.
|
||||
|
||||
---
|
||||
|
||||
## System Settings
|
||||
|
||||
### Global Settings
|
||||
|
||||
**Akses:** System Settings → Global Settings
|
||||
|
||||
| Tab | Pengaturan |
|
||||
|-----|------------|
|
||||
| General (Branding) | Nama app, logo, favicon, tagline, footer, landing page visibility, locale |
|
||||
| Login Security | Max attempts, lockout duration, 2FA, OTP, captcha (reCAPTCHA v2/v3), passkey (WebAuthn) |
|
||||
| Password Policy | Panjang min/max, karakter wajib (uppercase/lowercase/angka/simbol), expiry, riwayat |
|
||||
| Social Login / OAuth | Toggle Google/Facebook/GitHub OAuth, client ID & secret, callback URL |
|
||||
| IP & Access | Whitelist/blacklist IP admin, CORS, rate limit, force HTTPS, HSTS |
|
||||
| Notification | SMTP (host, port, encryption, from address), Telegram bot token & chat ID |
|
||||
| AI Config | Provider (GPT/Gemini/Claude/DeepSeek/Grok/Mistral/OpenRouter), API key, model, temperature |
|
||||
| SAP Integration | RFC host, system number, client, user, password — termasuk tombol Test Connection |
|
||||
| Backup & Storage | Driver (local/S3/GDrive), jadwal, retensi, enkripsi, notifikasi |
|
||||
| Maintenance | Toggle, pesan, judul, countdown, secret key, IP whitelist |
|
||||
| Legal & Content | Privacy Policy, Terms of Use, About, Security Policy, Help Center (editor WYSIWYG) |
|
||||
| Regional | Timezone, format tanggal, format waktu |
|
||||
| Session | Driver, lifetime, single session, auto logout, remember me, cookie settings |
|
||||
|
||||
> Tombol **Save Configuration** selalu muncul di pojok kanan bawah (floating). Setelah save, cache otomatis di-invalidate.
|
||||
|
||||
### Mobile Settings
|
||||
|
||||
**Akses:** System Settings → Mobile Settings
|
||||
|
||||
Kontrol konfigurasi aplikasi mobile dari jarak jauh — warna tema, base URL API, FCM topic, biometric login, kill switch, pesan maintenance mobile, dll. Perubahan langsung tersinkron ke aplikasi mobile via endpoint `/api/v1/mobile/sync` (dengan ETag caching).
|
||||
|
||||
### Maintenance Mode
|
||||
|
||||
**Akses:** System Settings → Maintenance (atau via tab di Global Settings)
|
||||
|
||||
1. Aktifkan toggle **Enable Maintenance Mode**
|
||||
2. Isi judul & pesan untuk pengunjung
|
||||
3. (Opsional) set **End Time** untuk countdown timer — aplikasi auto-release saat waktu berlalu
|
||||
4. (Opsional) isi **Secret Key** — admin bisa tetap akses via `domain.com/{secret}`
|
||||
5. (Opsional) isi **IP Whitelist** — IP yang dikecualikan dari maintenance
|
||||
6. Klik **Apply Maintenance Settings**
|
||||
|
||||
> Live preview ditampilkan persis seperti yang dilihat pengunjung.
|
||||
|
||||
### Backup & Restore
|
||||
|
||||
**Akses:** System Settings → Backup & Storage
|
||||
|
||||
- Pilih **driver**: Local / Amazon S3 / Google Drive
|
||||
- Atur jadwal backup otomatis, retensi (berapa backup disimpan), dan enkripsi AES-256
|
||||
- Operasi: Run Backup Now, Download, Restore, Delete
|
||||
- Notifikasi backup bisa dikirim ke email atau webhook
|
||||
- Tombol **Test Connection** untuk verifikasi driver sebelum simpan
|
||||
|
||||
### System Monitoring
|
||||
|
||||
**Akses:** System Settings → System Monitoring
|
||||
|
||||
| Tab | Isi |
|
||||
|-----|-----|
|
||||
| Logs | Laravel error log (filter level, search, download, clear) |
|
||||
| SAP Logs | Log integrasi SAP RFC — status request dan error |
|
||||
| Mobile Logs | Log yang dikirim dari aplikasi mobile (`/api/v1/mobile/log`) |
|
||||
| Background Jobs | Status queue, retry / delete failed jobs |
|
||||
| AI Usage | Riwayat penggunaan AI — provider, model, token, waktu |
|
||||
| Health | CPU, memory, disk usage secara real-time |
|
||||
|
||||
### Notification Center
|
||||
|
||||
**Akses:** sidebar → Notifications (ikon lonceng)
|
||||
|
||||
Pusat notifikasi sistem real-time via WebSocket (Reverb). Admin bisa:
|
||||
|
||||
- Melihat notifikasi masuk
|
||||
- Menandai sudah dibaca (satu atau semua)
|
||||
- Broadcast notifikasi ke semua user atau role tertentu
|
||||
|
||||
### Session Manager
|
||||
|
||||
**Akses:** System Settings → Session Manager
|
||||
|
||||
Lihat semua sesi aktif seluruh user. Bisa memaksa logout user tertentu jika dicurigai kompromi akun.
|
||||
|
||||
Jika `Single Session` aktif di Global Settings, user otomatis di-logout dari device lama saat login di device baru.
|
||||
|
||||
---
|
||||
|
||||
## Profil & Keamanan Akun
|
||||
|
||||
**Akses:** klik nama/avatar di pojok kanan atas → Profile
|
||||
|
||||
- Update nama, email, avatar
|
||||
- Ganti password (cek policy: min 12, mixed-case, digit, symbol; tidak boleh sama dengan password sebelumnya jika history blocker aktif)
|
||||
- Daftarkan / hapus **Passkey (biometrik)**
|
||||
- Lihat & cabut sesi aktif
|
||||
|
||||
### Password Expiry
|
||||
|
||||
Jika admin mengaktifkan **Password Expiry** di Global Settings → Password Policy, user akan diarahkan ke `/profile/password` saat password lewat masa berlaku, dengan pesan warning.
|
||||
|
||||
---
|
||||
|
||||
## Halaman Legal (UU PDP)
|
||||
|
||||
Halaman publik yang bisa diakses tanpa login:
|
||||
|
||||
| URL | Konten |
|
||||
|-----|--------|
|
||||
| `/legal/privacy` | Kebijakan Privasi |
|
||||
| `/legal/tos` | Syarat & Ketentuan |
|
||||
| `/legal/about` | Tentang Biiproject |
|
||||
| `/legal/security` | Kebijakan Keamanan |
|
||||
| `/legal/help` | Pusat Bantuan & FAQ |
|
||||
|
||||
Konten semua halaman ini dikelola via Global Settings → Legal & Content.
|
||||
|
||||
Jika versi dokumen (`pdp_document_version` atau `tos_document_version`) diperbarui, user yang sudah login akan diarahkan ke halaman **re-agree** (`/legal/re-agree`) dan wajib menyetujui ulang sebelum bisa mengakses aplikasi.
|
||||
|
||||
---
|
||||
|
||||
## Tips Operasional
|
||||
|
||||
1. **Setelah menjalankan seeder**, selalu clear cache: `./vendor/bin/sail artisan cache:clear`
|
||||
2. **Backup sebelum update** besar atau perubahan konfigurasi penting
|
||||
3. Selalu uji koneksi (Email, SAP, Backup) lewat tombol **Test Connection** sebelum save
|
||||
4. Setelah ubah `.env`, jalankan: `./vendor/bin/sail artisan optimize:clear`
|
||||
5. Cek **Action Logs** secara berkala untuk audit keamanan
|
||||
6. **Maintenance Mode**: selalu set Secret Key agar tidak terkunci dari panel sendiri
|
||||
7. **IP Whitelist Admin**: tambahkan dulu IP statis Anda sebelum mengaktifkan, agar tidak terkunci
|
||||
8. **2FA**: untuk akun super admin, sangat disarankan diaktifkan
|
||||
9. **Single Session**: untuk environment sensitif (PII, finance), aktifkan agar 1 akun = 1 device
|
||||
|
||||
---
|
||||
|
||||
## Bantuan & Troubleshooting
|
||||
|
||||
| Masalah | Solusi |
|
||||
|---------|--------|
|
||||
| Lupa password admin | `./vendor/bin/sail artisan tinker` → reset via model `User` |
|
||||
| Panel tidak responsif / data lama | `./vendor/bin/sail artisan optimize:clear` + `cache:clear` |
|
||||
| Error 500 | Cek `storage/logs/laravel.log` atau menu System Monitoring → Logs |
|
||||
| Setting yang baru disimpan tidak muncul | `./vendor/bin/sail artisan cache:clear` |
|
||||
| User tidak bisa login | Cek status akun di User Management, pastikan role & permission aktif |
|
||||
| Notifikasi real-time tidak muncul | Pastikan Reverb berjalan: `supervisorctl status biiproject-reverb` |
|
||||
| Dashboard stats tidak update otomatis | Cek koneksi WebSocket di browser DevTools (Console). Jika gagal, refresh — akan fallback ke polling 30 detik. |
|
||||
| Widget tersimpan tidak muncul | Buka Customize panel, klik Reset to Default, lalu coba Save Layout ulang. |
|
||||
| Tab Settings tidak bisa diakses | Permission tab-level mungkin belum diberikan ke role Anda — minta Super Admin assign via Roles & Permissions. |
|
||||
| Kena rate limit terus | Cek IP whitelist admin, tunggu 1 menit, atau reset via `php artisan cache:clear` |
|
||||
| 2FA email tidak masuk | Verifikasi SMTP di Global Settings → Notifications + cek log queue |
|
||||
| OAuth Google/Facebook gagal | Cek `/auth/callback` reachable (bukan 404), Client ID/Secret valid, redirect URI cocok |
|
||||
| Health endpoint return 503 | Buka `/api/health`, lihat field `checks.*` — yang `fail` mengindikasikan dependensi rusak. `warn` masih 200. |
|
||||
| User di-logout otomatis | Single-session mungkin aktif (login dari device lain), atau password expired |
|
||||
Reference in New Issue
Block a user