Files
biiproject-kit-v1/TECH_STACK.md
T

15 KiB

Tech Stack

Daftar lengkap teknologi yang dipakai di proyek ini, beserta penjelasan singkat kegunaannya.


1. Runtime & Bahasa

Teknologi Versi Kegunaan
PHP 8.2+ Bahasa utama backend. Kelas utility pakai declare(strict_types=1).
Node.js 20+ Build asset frontend (Vite) + tooling mobile
PostgreSQL 15+ Database relasional utama (ACID-compliant). Skema pakai FK + cascade penuh.
Redis 7.x Cache, session store, queue, broadcast driver

2. Framework Inti

Package Versi Kegunaan
laravel/framework ^13.0 Framework PHP utama (routing, ORM, middleware, dll)
laravel/sanctum ^4.0 Autentikasi API berbasis token untuk mobile app
laravel/socialite ^5.24 OAuth login (Google, Facebook, GitHub)
laravel/reverb ^1.10 WebSocket server native untuk notifikasi real-time
laravel/pulse ^1.7 Monitoring performa app (request, queue, cache, slow queries)
laravel/horizon ^5.46 Queue dashboard (Redis-backed)
laravel/breeze ^2.3 Scaffolding autentikasi (login, register, reset password)
laravel/tinker ^3.0 REPL interaktif untuk debugging via terminal

3. Database & Storage

Package Versi Kegunaan
predis/predis ^3.4 Client PHP untuk Redis (PSR-compliant)
masbug/flysystem-google-drive-ext ^2.5 Driver Flysystem untuk Google Drive (backup)

Driver S3 sudah built-in di Laravel — cukup set FILESYSTEM_DISK=s3 di .env.

Skema database

  • 40+ tabel, semua bermigrasi (lihat database/migrations/).
  • FK constraint penuh: audit created_by/updated_byusers(id) ON DELETE SET NULL; data milik user → ON DELETE CASCADE (lihat 2026_05_14_110000_add_fk_to_audit_columns.php).
  • Composite indexes pada tabel hot (password_histories, system_setting_revisions, notifications) — lihat 2026_05_14_100000_add_performance_indexes.php.
  • Data retention otomatis via Laravel Prunable trait pada 8 model + telescope:prune + activitylog:clean. Retention policy lengkap ada di SECURITY.md.

4. Autentikasi & Keamanan

Package Versi Kegunaan
laragear/webauthn ^5.0 Passkey / biometric login (FIDO2/WebAuthn) — ⚠️ marked abandoned upstream; replacement: laravel/passkeys
anhskohbo/no-captcha ^3.7 Integrasi Google reCAPTCHA v2/v3 di form login

Built-in (no extra package)

  • 2FA via email OTP + trust-device cookie (file: app/Http/Controllers/Auth/TwoFactorController.php)
  • Password policyApp\Services\Auth\PasswordPolicyService (min/max/charset/expiry/history-reuse-block)
  • IP access controlapp/Http/Middleware/IpAccessControl.php (blacklist, admin whitelist, auto-block on burst, HSTS toggle)
  • Security headersapp/Http/Middleware/SecurityHeaders.php (X-Frame, X-CTO, Referrer, Permissions-Policy, X-XSS, HSTS)
  • Session manager — list & force-logout active sessions
  • ImpersonateImpersonateController dengan guard self/Developer/inactive + loop prevention
  • Single-session enforcement opsional (di-toggle dari Global Settings)

5. Manajemen Hak Akses & Audit (Spatie)

Package Versi Kegunaan
spatie/laravel-permission ^6.24 Sistem role & permission granular
spatie/laravel-activitylog ^4.10 Audit trail — mencatat perubahan data
spatie/laravel-backup ^10.2 Backup database & file ke Local/S3/GDrive
spatie/laravel-medialibrary ^11.21 Upload & manajemen file media (avatar, dokumen)

5b. Dashboard Widget System

Per-user persisted widget layout. Architecture:

Layer Class / File Fungsi
Model DashboardWidgetPreference forUser() merge defaults + DB prefs, sorted by sort_order
Migration 2026_05_16_220000_create_dashboard_widget_preferences_table user_id FK cascade, unique (user_id, widget_key)
Controller DashboardController@saveWidgetPreferences upsert prefs via updateOrCreate
Controller DashboardController@resetWidgetPreferences delete all prefs → restore defaults
Route POST /dashboard/widgets (dashboard.widgets.save)
Partials resources/views/pages/dashboard/widget-*.blade.php cpu, ram, disk, live-users, queues, quick-actions
JS SortableJS (CDN) drag-to-reorder grid
Broadcasting DashboardStatsUpdated event → Reverb → Echo push stats every minute via dashboard:broadcast-stats

Sidebar Toggle

Sidebar submenus use vanilla JS initSidebarSubmenus() (bottom of navigation.blade.php). Uses data-sidebar-toggle attribute, e.stopPropagation(), and cloneNode() to replace buttons and prevent duplicate listeners. Does not depend on Alpine.js (theme JS conflict prevented Alpine x-on:click from working).


6. Modular & Arsitektur

Package Versi Kegunaan
nwidart/laravel-modules ^13.0 Memisahkan fitur ke folder Modules/ agar codebase rapi

Custom Exception Hierarchy

App\Exceptions\* — domain-specific exceptions instead of generic \Exception:

  • SystemConfigException::unknownKey(), ::imageUploadFailed()
  • BackupOperationException::missingBinary(), ::diskNotConfigured(), ::restoreFailed()
  • MonitoringException::unsupportedOs(), ::probeFailed()

7. Admin Panel & API Docs

Package Versi Kegunaan
filament/filament ^5.5 Admin panel builder (resource management cepat)
darkaonline/l5-swagger ^11.0 Auto-generate Swagger/OpenAPI docs dari annotation. Spec di storage/api-docs/.

8. Monitoring & Error Tracking

Package Versi Kegunaan
sentry/sentry-laravel ^4.25 Error monitoring & performance tracking untuk production

Set SENTRY_LARAVEL_DSN di .env untuk mengaktifkan. Log error otomatis terkirim ke Sentry dashboard.

Endpoint GET /api/health mengembalikan status database/redis/storage/queue. Kembalikan 503 hanya saat ada check yang failwarn (disk >90%) tetap 200.


9. Frontend Build

Package Versi Kegunaan
vite ^7.0 Build tool — hot reload & bundling JS/CSS
laravel-vite-plugin ^2.0 Integrasi Vite dengan Blade
tailwindcss ^4.2 CSS utility-first
@tailwindcss/forms ^0.5.2 Plugin Tailwind untuk styling form
alpinejs ^3.4 Reactive JS ringan (toggle, modal, tabs)
axios ^1.15 HTTP client untuk AJAX
laravel-echo ^2.3 Client untuk subscribe ke WebSocket channel
pusher-js ^8.5 Transport layer untuk Echo (kompatibel Reverb)
rollup ^4.60 Module bundler (digunakan Vite secara internal)
concurrently ^9.0 Menjalankan beberapa command paralel saat dev

Dev Script (composer run dev)

Menjalankan beberapa proses secara paralel:

Proses Command
SERVER php artisan serve --host=0.0.0.0 --port=8000
VITE npm run dev
QUEUE php artisan queue:listen --tries=1

Scheduled Tasks (Production)

Waktu Command Fungsi
Setiap menit dashboard:broadcast-stats Broadcast stats dashboard ke WebSocket channel admin.monitoring (withoutOverlapping)
Setiap menit MaintenanceManagementService::autoCheckAndRelease() Auto-release maintenance mode
Setiap menit WorkerHeartbeatJob Queue worker monitoring
Setiap 30 menit system:health-check System health check
Harian 03:00 model:prune Pruning OtpCode, UserTrustedDevice, AiHealingLog, PasswordHistory, dll
Harian 03:05 telescope:prune --hours=48 Hapus Telescope entries > 48 jam
Harian activitylog:clean Hapus activity log > 365 hari
Senin 07:00 backups:verify Verifikasi integritas backup
Senin 07:05 permissions:audit --json Audit permission (log only)
Senin 08:00 system:send-digest Weekly health digest ke admin
Dinamis DB backup + cleanup Frekuensi dikonfigurasi dari Global Settings

Untuk dev penuh (termasuk Reverb + Scheduler), pakai Sail (./vendor/bin/sail up -d).


10. Frontend Library (CDN/Blade)

Dimuat via CDN di template Blade:

Library Kegunaan
Bootstrap 5 Layout grid & komponen UI
Bootstrap Icons Ikon SVG
jQuery DOM manipulation & AJAX
SweetAlert2 Dialog & notifikasi toast
CKEditor 5 WYSIWYG editor (Privacy Policy, ToS, About, dll)
FilePond Upload file drag-and-drop
Animate.css Animasi entrance/exit elemen
Marked.js Render Markdown untuk laporan analisis AI
Choices.js Dropdown searchable & multi-select
SortableJS Drag-to-reorder dashboard widget grid (loaded via CDN in dashboard.blade.php)
Google Fonts Inter, Outfit, Fira Code

11. Development & Quality Tools

Code Quality

Package Versi Kegunaan
laravel/pint ^1.24 Code formatter (PSR-12). Wajib hijau sebelum merge.
larastan/larastan ^3.9 Static analysis Laravel-aware (PHPStan). Level 5 + baseline.
laravel/sail ^1.41 Docker dev environment (app + Postgres + Redis)
laravel/pail ^1.2 Live log viewer di terminal
laravel/telescope ^5.20 Debug tool (request, query, job, mail) — hanya dev
laravel/boost ^2.0 AI assistant untuk Laravel dev

Testing

Package Versi Kegunaan
pestphp/pest ^4.0 Testing framework modern
pestphp/pest-plugin-laravel ^4.0 Helper Pest untuk Laravel
mockery/mockery ^1.6 Library mocking untuk test
fakerphp/faker ^1.23 Generator data dummy
nunomaduro/collision ^8.6 Error reporting yang readable di terminal

Test Suite Statistics

Kategori File Tests
Feature: Auth + WebAuthn + Social + 2FA + Impersonate 9 ~50
Feature: AccessControl (User/Role/Permission) 3 37
Feature: Middleware (IP, ActivePermission, Legal, PwdExpiry, SecurityHeaders, CheckTabPermission) 6 30
Feature: Services (SystemConfig, PasswordPolicy, Backup) 3 31
Feature: Performance (N+1 regression) 1 3
Feature: Database (FK + Cascade) 1 9
Feature: API (Health, MobileConfig, Rate-limit, OTP, AuthAPI, DeviceToken) 6 25
Feature: Dashboard (widget prefs, broadcast event) 2 18
Feature: Helpers (ApiResponse, PasswordRule) 2 18
Unit: Pure logic (Formatter, Caster, Helpers, Exceptions) 5 88
Granular tab permission system +62
Total 38 371

Run via ./vendor/bin/sail artisan test. Avg runtime ~35s.


12. CI/CD

Workflow di .github/workflows/ci.yml (GitHub Actions). 3 job paralel:

Job Tools
test Pest 4 (Postgres 15 + Redis 7 service containers)
lint pint --test + composer audit + permissions:audit
static-analysis Larastan level 5 + baseline

Push ke main/develop/config/advanced dan PR ke main/develop mentrigger pipeline.


13. Integrasi Eksternal (Opsional)

Sebagian besar diatur dari Global Settings di admin panel — tidak perlu edit .env.

Layanan Kegunaan
OpenAI GPT AI assistant di admin panel
Google Gemini AI assistant alternatif
Anthropic Claude AI assistant alternatif
DeepSeek AI assistant alternatif
xAI Grok AI assistant alternatif
Mistral AI AI assistant alternatif
OpenRouter Gateway multi-provider AI
SAP NW RFC Koneksi ke sistem SAP ERP
Google Drive Cloud backup
Amazon S3 Cloud backup
SMTP (Mailgun/SES) Pengiriman email transaksional
Telegram Bot Notifikasi ke channel Telegram (incl. firewall block alert)
Google reCAPTCHA Anti-bot di form login
Firebase Cloud Messaging Push notification ke mobile (device token)
Sentry Error monitoring & performance tracing

Ringkasan Arsitektur

┌─────────────────────────────────────────────────────────┐
│              Browser / Mobile App (React Native)         │
└────────────┬────────────────────────────────┬───────────┘
             │ HTTPS (+ security headers)     │ HTTPS + WS
             ▼                                ▼
       ┌──────────┐                     ┌──────────┐
       │  Nginx   │◄────────────────────│  Reverb  │  WebSocket
       └─────┬────┘                     └─────┬────┘
             ▼                                ▼
       ┌──────────────────────────────────────────────┐
       │    Laravel 13 (PHP-FPM)                      │
       │                                              │
       │   Global middleware:                         │
       │   ┌──────────────────────────────────────┐   │
       │   │ SecurityHeaders                      │   │
       │   │ IpAccessControl                      │   │
       │   │ PasswordExpiry                       │   │
       │   │ CheckLegalAgreement                  │   │
       │   │ ThrottleRequests (per route)         │   │
       │   └──────────────────────────────────────┘   │
       │                                              │
       │  ┌──────────┐ ┌──────────┐ ┌─────────────┐  │
       │  │  Web     │ │  API v1  │ │   Reverb    │  │
       │  │  Routes  │ │ Sanctum  │ │  Broadcast  │  │
       │  └────┬─────┘ └────┬─────┘ └──────┬──────┘  │
       └───────┼────────────┼──────────────┼──────────┘
               │            │              │
    ┌──────────▼───┐   ┌────▼──┐   ┌──────▼─────┐
    │ PostgreSQL 15 │   │Redis 7│   │ Filesystem │
    │ (data utama)  │   │cache, │   │ local/S3/  │
    │ FK + indexes  │   │queue, │   │ GDrive     │
    │ + cascade     │   │session│   │            │
    └───────────────┘   └───────┘   └────────────┘
                              │
                       ┌──────▼──────┐
                       │   Sentry    │
                       │ (error mon) │
                       └─────────────┘