<USER_REQUEST>
APPSALAMA — FASE 2
SAAS CORE + MULTI-TENANT + INTEGRASI APLIKASI + SUBDOMAIN
Lanjutkan pengembangan proyek AppsAlama dari hasil FASE 1 yang sudah selesai.
Domain utama:
[https://appsalama.my.id](https://appsalama.my.id/)
Nama platform:
AppsAlama
Tagline:
Satu Platform, Banyak Solusi
Pada Fase 1 telah dibuat:
Website Public
Admin Dashboard
Login Admin
CMS
Produk
Blog
FAQ
Testimonial
Media Manager
Branding
Logo
Favicon
Copyright
Database foundation
cPanel-compatible architecture
Sekarang bangun FASE 2.
Tujuan utama Fase 2:
Mengubah AppsAlama dari sekadar portal website menjadi platform SaaS multi-tenant yang dapat menaungi berbagai aplikasi SaaS.
Aplikasi pertama yang akan dipersiapkan untuk integrasi adalah:
Rental Mobil
dengan alamat produk:
rentalcar.appsalama.my.id
ATURAN KERJA WAJIB
JANGAN BERHENTI UNTUK MEMINTA KONFIRMASI.
JANGAN BOLAK-BALIK MEMINTA AKSES/PERSETUJUAN UNTUK KEPUTUSAN TEKNIS NORMAL.
JANGAN MENUNGGU APPROVE/SUBMIT.
Kerjakan seluruh Fase 2 secara langsung sampai selesai.
Jika menemukan masalah pada implementasi Fase 1, diagnosis dan perbaiki tanpa merusak fitur yang sudah berjalan.
Jika ada keputusan teknis yang belum ditentukan, gunakan keputusan yang paling:
sederhana
aman
scalable
kompatibel dengan cPanel
mudah dipelihara
mudah dikembangkan
Jangan membuat ulang fitur yang sudah berfungsi.
Jangan menghapus data existing.
Lakukan backup/migration dengan aman sebelum perubahan database besar.
1. TUJUAN ARSITEKTUR
Bangun struktur:
APPSALAMA appsalama.my.id │ SAAS CORE │ ┌──────────────┼──────────────┐ │ │ │ PRODUCT TENANT USER │ │ │ ▼ ▼ ▼ Rental Car OIS Rental Admin/User │ ▼ rentalcar.appsalama.my.id │ ├── OIS Rental ├── Jaya Rental └── Maju Rental
AppsAlama menjadi pusat pengelolaan.
2. DEFINISI MULTI-TENANT
Implementasikan konsep:
Satu aplikasi SaaS → banyak tenant → data terisolasi.
Contoh:
Produk:
Rental Mobil
Tenant:
OIS Rental
Tenant lain:
Jaya Rental
Tenant lain:
Maju Rental
Semua menggunakan aplikasi Rental Mobil yang sama tetapi masing-masing mempunyai data sendiri.
Data tidak boleh tercampur.
3. DATABASE MULTI-TENANT
Tambahkan struktur database yang diperlukan.
Minimal:
users tenants tenant_users products plans subscriptions domains tenant_settings
Relasi utama:
users │ └── tenant_users │ ▼ tenants │ ▼ products
Pastikan setiap data tenant mempunyai mekanisme identifikasi tenant.
Gunakan:
tenant_id
sebagai salah satu fondasi isolasi data.
4. TENANT
Buat sistem Tenant Management.
Setiap tenant mempunyai:
ID
nama
slug
logo
email
WhatsApp
alamat
produk
status
tanggal dibuat
pengaturan
domain
Contoh:
Tenant Name: OIS Rental Slug: oisrental Product: Rental Mobil Status: Aktif
5. REGISTRASI TENANT
Perluas sistem registrasi dari Fase 1.
Alur:
appsalama.my.id ↓ Daftar ↓ Buat akun ↓ Pilih aplikasi ↓ Pilih Rental Mobil ↓ Masukkan nama usaha ↓ OIS Rental ↓ Buat tenant
Sistem otomatis membuat:
tenant: OIS Rental slug: oisrental product: Rental Mobil
6. SLUG TENANT
Buat slug otomatis dari nama usaha.
Contoh:
OIS Rental
menjadi:
oisrental
Jika slug sudah digunakan:
oisrental-2
atau mekanisme unique slug lain.
Slug harus:
lowercase
aman
URL-friendly
unik
tidak mengandung karakter berbahaya
Sediakan validasi.
7. SUBDOMAIN TENANT
Implementasikan konsep:
oisrental.rentalcar.appsalama.my.id
dengan pola:
{tenant_slug}.{product_slug}.appsalama.my.id
Contoh:
oisrental.rentalcar.appsalama.my.id jayatrans.rentalcar.appsalama.my.id majurental.rentalcar.appsalama.my.id
Aplikasi harus membaca hostname/request host dan menentukan:
product tenant
secara otomatis.
8. WILDCARD DOMAIN
Siapkan arsitektur untuk wildcard:
*.rentalcar.appsalama.my.id
Jangan membuat DNS record satu per satu untuk setiap tenant.
Sistem harus dirancang agar tenant baru dapat langsung menggunakan pola:
tenant-slug.product-slug.appsalama.my.id
setelah DNS wildcard dan SSL dikonfigurasi pada server.
Dokumentasikan konfigurasi DNS/cPanel secara jelas.
9. TENANT RESOLUTION
Buat mekanisme:
Request Host ↓ Parse hostname ↓ Cari Product ↓ Cari Tenant ↓ Validasi status Tenant ↓ Load Tenant Configuration ↓ Load Application
Contoh:
Request:
oisrental.rentalcar.appsalama.my.id
Sistem harus mengenali:
product = rentalcar tenant = oisrental
Kemudian memuat tenant OIS Rental.
10. DATA ISOLATION
Ini bagian yang sangat penting.
Tenant A tidak boleh melihat data Tenant B.
Contoh:
OIS Rental
tidak boleh melihat:
Jaya Rental
dan sebaliknya.
Terapkan tenant isolation pada:
query
controller/service
API
session
dashboard
laporan
file
upload
transaksi
Jangan hanya menyembunyikan data pada frontend.
Filtering harus dilakukan pada server/backend.
11. TENANT DASHBOARD
Buat dashboard untuk pemilik tenant.
URL dapat menggunakan:
oisrental.rentalcar.appsalama.my.id
atau routing tenant yang sesuai dengan arsitektur aplikasi.
Dashboard awal:
Selamat Datang, OIS Rental 👋
Tampilkan:
Nama tenant
Produk
Paket
Status layanan
Domain
pengguna
notifikasi
shortcut membuka aplikasi
Siapkan dashboard agar nanti dapat menampilkan data asli dari aplikasi Rental Mobil.
12. LOGIN TENANT
Tenant tidak boleh menggunakan login Admin AppsAlama sebagai Admin pusat.
Pisahkan:
Admin AppsAlama
appsalama.my.id/admin/login
User/Tenant
appsalama.my.id/login
Tenant login hanya mendapatkan akses terhadap tenant yang dimilikinya.
Admin pusat mempunyai akses untuk mengelola seluruh tenant.
13. HAK AKSES SEDERHANA
Untuk Fase 2 jangan membuat sistem Role-Based Access Control yang terlalu kompleks.
Gunakan minimal:
Platform Admin
Admin pusat AppsAlama.
Tenant Owner
Pemilik tenant.
Tenant User
Pengguna tenant.
Implementasikan struktur database yang memungkinkan role lebih detail pada Fase 3, tetapi jangan over-engineer.
14. PRODUK SAAS
Pastikan Produk merupakan entitas database.
Contoh:
ID: 1 Name: Rental Mobil Slug: rentalcar Base Domain: rentalcar.appsalama.my.id Status: Active
Produk lain nantinya:
sekolah umroh tpq paud
Jangan membuat Rental Mobil sebagai satu-satunya produk yang hard-coded.
15. INTEGRASI APLIKASI RENTAL MOBIL YANG SUDAH ADA
Ini sangat penting.
JANGAN MEMBUAT ULANG APLIKASI RENTAL MOBIL JIKA SUDAH ADA.
Jika aplikasi Rental Mobil telah tersedia dalam source code/project terpisah, perlakukan aplikasi tersebut sebagai produk SaaS existing.
Tujuan integrasi:
AppsAlama ↓ Rental Mobil ↓ Tenant ↓ OIS Rental
Pertahankan fitur Rental Mobil yang sudah ada.
Jangan menghapus modul existing.
Jangan mengubah business logic existing tanpa alasan.
16. ADAPTASI RENTAL MOBIL
Periksa aplikasi Rental Mobil existing dan identifikasi:
database
tabel
authentication
dashboard
user
kendaraan
pelanggan
transaksi
booking
pembayaran
laporan
file upload
Tentukan tabel mana yang harus mempunyai:
tenant_id
Tambahkan tenant isolation secara aman.
Buat migration jika diperlukan.
Jangan menghapus data existing.
Jika existing application belum memiliki tenant:
Buat strategi migrasi data existing ke:
Default Tenant / Owner Tenant
sehingga data lama tetap dapat digunakan.
17. ENTRY POINT RENTAL CAR
Produk:
rentalcar.appsalama.my.id
dapat digunakan sebagai:
Landing/Product Page Rental Mobil
sedangkan tenant:
oisrental.rentalcar.appsalama.my.id
menjadi:
aplikasi Rental Mobil milik OIS Rental
Pisahkan fungsi keduanya.
18. ADMIN APPSALAMA — TENANT MANAGEMENT
Tambahkan menu Admin:
Tenant
Admin dapat:
melihat tenant
mencari tenant
filter produk
filter status
membuka detail tenant
mengaktifkan tenant
menonaktifkan tenant
mengubah data tenant
melihat user tenant
melihat produk tenant
melihat domain tenant
Detail:
OIS Rental Rental Mobil oisrental.rentalcar.appsalama.my.id Status: Aktif
19. ADMIN — CREATE TENANT
Admin dapat membuat tenant secara manual.
Form:
Nama Tenant
Produk
Slug
Email
WhatsApp
Status
Owner
Setelah dibuat, sistem menghasilkan alamat tenant secara otomatis.
20. ADMIN — PRODUCT MANAGEMENT
Pastikan Admin dapat mengelola:
nama produk
slug
deskripsi
icon
URL
status
konfigurasi domain
Jangan merusak CMS Produk dari Fase 1.
21. TENANT SETTINGS
Setiap tenant mempunyai pengaturan sendiri:
nama usaha
logo
favicon jika diperlukan
alamat
email
WhatsApp
warna/branding jika diperlukan
informasi bisnis
Tenant tidak boleh mengubah setting tenant lain.
22. FILE ISOLATION
File tenant harus dipisahkan.
Contoh:
uploads/ tenants/ 101/ 102/ 103/
OIS Rental:
uploads/tenants/101/
Jaya Rental:
uploads/tenants/102/
Pastikan tenant tidak dapat mengakses file tenant lain hanya dengan mengganti URL.
23. SESSION DAN AUTHENTICATION
Pastikan session membawa informasi tenant jika user tenant login.
Contoh konsep:
user_id tenant_id role
Server harus selalu memvalidasi bahwa user memang mempunyai akses terhadap tenant tersebut.
Jangan mempercayai tenant_id yang dikirim langsung oleh browser tanpa validasi.
24. ADMIN IMPERSONATION / VIEW TENANT
Jika aman dan diperlukan, sediakan pada Admin:
Lihat Tenant
Admin dapat masuk melihat kondisi tenant untuk keperluan support.
Namun:
catat aktivitasnya
tampilkan indikator bahwa Admin sedang melihat tenant
jangan menghapus audit trail
Jika fitur ini terlalu berisiko pada arsitektur existing, buat foundation dan dokumentasikan untuk Fase 3.
25. SUBDOMAIN DETECTION
Implementasikan resolver yang dapat menangani:
appsalama.my.id rentalcar.appsalama.my.id oisrental.rentalcar.appsalama.my.id
Aturan:
Domain utama
appsalama.my.id
→ Website Public.
Product domain
rentalcar.appsalama.my.id
→ Product/Landing Rental Mobil.
Tenant domain
oisrental.rentalcar.appsalama.my.id
→ Tenant OIS Rental pada Rental Mobil.
Arsitektur harus dapat diperluas:
tokosembako.ecommerce.appsalama.my.id sekolahabc.sekolah.appsalama.my.id travelxyz.umroh.appsalama.my.id
tanpa membuat kode baru untuk setiap tenant.
26. ERROR HANDLING DOMAIN
Jika hostname tenant tidak ditemukan:
Tampilkan:
Tenant Tidak Ditemukan
Jika tenant suspended:
Layanan Sementara Tidak Aktif
Jika product tidak aktif:
Aplikasi Tidak Tersedia
Jangan menampilkan error database atau stack trace kepada publik.
27. ADMIN DASHBOARD UPDATE
Tambahkan statistik:
Total Produk
Total Tenant
Tenant Aktif
Tenant Suspended
Total User
Tambahkan tabel:
Tenant Terbaru
Kolom:
Tenant
Produk
Owner
Subdomain
Status
Tanggal
Tambahkan:
Aktivitas Tenant Terbaru
28. AUDIT LOG
Perluas audit log.
Catat:
tenant dibuat
tenant diubah
tenant diaktifkan
tenant dinonaktifkan
user tenant dibuat
domain dibuat
login tenant
logout tenant
Admin membuka tenant
perubahan tenant settings
29. DATABASE MIGRATION
Jangan melakukan perubahan database secara manual tanpa migration yang jelas.
Buat migration/schema update.
Backup database sebelum migration besar.
Pastikan Fase 1 tetap dapat berjalan.
30. CPANEL
Tetap wajib kompatibel dengan:
PHP
MySQL/MariaDB
cPanel
Apache
SSL
DNS
Jangan membutuhkan:
Node.js
npm
SSH
Docker
server khusus
Jika wildcard subdomain memerlukan konfigurasi cPanel tertentu, buat dokumentasi langkah demi langkah.
31. WILDCARD SSL
Siapkan dokumentasi untuk:
*.rentalcar.appsalama.my.id
dan jika arsitektur memerlukannya, jelaskan kebutuhan sertifikat wildcard.
Jangan mengklaim wildcard SSL sudah aktif jika server belum dikonfigurasi.
Sediakan:
CPANEL_WILDCARD_SETUP.md
yang menjelaskan:
DNS
subdomain wildcard
SSL
document root
routing
testing
32. BACKWARD COMPATIBILITY
URL lama dari aplikasi Rental Mobil harus tetap diperhatikan.
Jika aplikasi sebelumnya memiliki URL:
rentalcar.appsalama.my.id
jangan sampai langsung rusak.
Pertahankan landing/product page.
Jika ada route existing yang masih digunakan, pertahankan atau buat redirect yang benar.
33. SECURITY MULTI-TENANT
Lakukan pengujian khusus:
Tenant A
login sebagai OIS Rental.
Pastikan tidak dapat:
membaca data Jaya Rental
mengubah data Jaya Rental
menghapus data Jaya Rental
mengakses file Jaya Rental
mengakses endpoint Jaya Rental
Tenant B
lakukan pengujian sebaliknya.
Test langsung melalui URL/API, bukan hanya melalui UI.
34. TEST SUBDOMAIN
Simulasikan dan dokumentasikan:
rentalcar.appsalama.my.id oisrental.rentalcar.appsalama.my.id jayatrans.rentalcar.appsalama.my.id
Pastikan resolver dapat membedakannya.
Jika wildcard DNS belum dapat diuji pada environment development, buat mode local testing yang tidak merusak production.
35. MIGRASI APLIKASI EXISTING
Jika source code Rental Mobil tersedia di project:
inspect source
inspect database
mapping tabel
mapping authentication
mapping routes
mapping file
mapping user
mapping business logic
tambahkan tenant isolation
testing
migrasi data existing
JANGAN menghapus source code aplikasi existing.
Jika struktur aplikasi existing berbeda dengan AppsAlama, buat adapter/integration layer yang bersih.
36. JANGAN MEMAKSA REWRITE
Jangan melakukan full rewrite aplikasi Rental Mobil hanya untuk menyesuaikan AppsAlama.
Prioritaskan:
integrasi
daripada:
rewrite total
kecuali setelah inspeksi ditemukan bahwa integrasi benar-benar tidak memungkinkan.
Jika rewrite memang mutlak diperlukan, dokumentasikan alasan teknisnya dan pertahankan semua fitur existing.
37. USER FLOW
Implementasikan flow:
Pengunjung ↓ appsalama.my.id ↓ Daftar ↓ Pilih Rental Mobil ↓ Isi nama usaha ↓ OIS Rental ↓ Tenant dibuat ↓ Subdomain dibuat ↓ Login ↓ OIS Rental Dashboard ↓ Buka Rental Mobil
Target akhirnya:
oisrental.rentalcar.appsalama.my.id
38. ADMIN FLOW
Admin AppsAlama:
Login ↓ Dashboard ↓ Tenant ↓ OIS Rental ↓ Detail ↓ Rental Mobil ↓ Subdomain ↓ oisrental.rentalcar.appsalama.my.id
Admin dapat memonitor tenant.
39. FUTURE-READY
Jangan membangun fitur billing penuh pada Fase 2.
Namun database harus siap untuk:
subscriptions invoices payments plans
Fase 3 akan mengaktifkannya.
Begitu juga:
custom_domains SSO payment_gateway automatic_provisioning
cukup disiapkan fondasinya.
40. HASIL AKHIR FASE 2
Fase 2 dianggap selesai jika:
✓ SaaS Core tersedia
✓ Tenant tersedia
✓ Tenant dapat dibuat
✓ Tenant mempunyai slug unik
✓ Tenant dapat dikaitkan dengan Product
✓ User dapat dikaitkan dengan Tenant
✓ Tenant isolation diterapkan
✓ Product system berfungsi
✓ Rental Mobil terdaftar sebagai Product
✓ Existing Rental Mobil dapat diintegrasikan
✓ Existing data tidak hilang
✓ Tenant dapat menggunakan aplikasi Rental Mobil
✓ Struktur subdomain tersedia
✓ Wildcard subdomain siap dikonfigurasi
✓ Tenant resolver tersedia
✓ Admin dapat melihat tenant
✓ Admin dapat mengelola tenant
✓ Tenant Dashboard tersedia
✓ Tenant login tersedia
✓ File tenant terisolasi
✓ Audit log berjalan
✓ Security test dilakukan
✓ URL product tetap berfungsi
✓ cPanel compatibility tetap terjaga
✓ Tidak membutuhkan Node.js
✓ Tidak membutuhkan SSH
✓ Tidak membutuhkan npm pada production
41. TESTING WAJIB
Lakukan testing menyeluruh:
Authentication
login Admin
login Tenant
logout
session
unauthorized access
Tenant
create
update
activate
suspend
delete jika aman
Product
create
update
activate
deactivate
Isolation
Tenant A tidak boleh melihat Tenant B.
Domain
Test domain utama.
Test product domain.
Test tenant domain.
File
Tenant A tidak boleh mengakses file Tenant B.
Security
Test:
IDOR
unauthorized tenant access
session manipulation
SQL injection
XSS
CSRF
file upload
privilege escalation
Perbaiki seluruh masalah yang ditemukan.
42. DOKUMENTASI
Buat:
SAAS_ARCHITECTURE.md MULTI_TENANT.md TENANT_FLOW.md SUBDOMAIN_SETUP.md CPANEL_WILDCARD_SETUP.md RENTAL_CAR_INTEGRATION.md DATABASE_MIGRATION.md SECURITY_TEST.md
Dokumentasi harus menjelaskan implementasi aktual, bukan teori.
43. FINAL CHECK
Sebelum menyatakan Fase 2 selesai:
Pastikan:
AppsAlama masih dapat dibuka.
Admin masih dapat login.
Dashboard Admin masih berjalan.
CMS Fase 1 tidak rusak.
Logo dan favicon tetap berjalan.
Produk tetap berjalan.
Rental Mobil tidak kehilangan data.
Tenant isolation benar-benar diterapkan.
Subdomain resolver siap digunakan.
cPanel compatibility tetap terjaga.
44. OUTPUT FINAL
Setelah pekerjaan selesai, tampilkan laporan:
Fitur yang berhasil dibuat
Perubahan database
Struktur tenant
Struktur product
Struktur user
Cara kerja multi-tenant
Cara kerja subdomain
Cara konfigurasi wildcard DNS
Cara konfigurasi wildcard SSL
Integrasi Rental Mobil
Status migrasi data
Status security testing
Status cPanel compatibility
File dokumentasi yang dibuat
Struktur folder akhir
URL yang dapat diuji
Catatan penting untuk Fase 3
Jangan berhenti sebelum seluruh pekerjaan Fase 2 yang memungkinkan pada environment saat ini telah selesai.
Jika ada bagian yang bergantung pada konfigurasi DNS/cPanel yang tidak dapat dilakukan otomatis oleh aplikasi, implementasikan sisi aplikasinya sampai selesai dan berikan dokumentasi konfigurasi server yang harus dilakukan.
Setelah Fase 2 selesai, jangan mengerjakan Fase 3 secara otomatis.
Fase 3 akan menjadi fase berikutnya untuk:
Subscription
Billing
Payment Gateway
Custom Domain
SSO
provisioning otomatis
pengelolaan paket SaaS
dan fitur komersial AppsAlama lainnya.
SELESAIKAN FASE 2 TERLEBIH DAHULU.
</USER_REQUEST>
<ADDITIONAL_METADATA>
The current local time is: 2026-09-07T16:29:39+07:00.
</ADDITIONAL_METADATA>