Skip to content

JunedSetiawan/laravel-multi-tenant-api-try

Repository files navigation

🏒 Laravel Multi-Tenant Application

Multi-tenant Laravel application dengan API key-based tenant identification. Setiap tenant memiliki database terpisah untuk isolasi data yang sempurna.

Laravel PHP MySQL

πŸ“‹ Daftar Isi

✨ Fitur

πŸ—οΈ Multi-Tenancy

  • βœ… Database Isolation - Setiap tenant memiliki database terpisah
  • βœ… API Key Authentication - Identifikasi tenant via X-Tenant-API-Key header
  • βœ… Dynamic Database Configuration - Konfigurasi database per-tenant (host, port, username, password)
  • βœ… Encrypted Credentials - Password database dienkripsi menggunakan Laravel encryption

πŸ” Authentication & Authorization

  • βœ… Laravel Sanctum - Token-based authentication untuk API
  • βœ… Role-Based Access Control - Support role admin/user
  • βœ… Tenant Token Validation - Mencegah cross-tenant token usage
  • βœ… Custom Error Messages - Pesan error yang informatif

πŸ’Ύ Backup & Restore

  • βœ… Automated Backup - Scheduled daily & weekly backup
  • βœ… Manual Backup - Via Artisan command atau REST API
  • βœ… Compression Support - Gzip compression untuk menghemat storage
  • βœ… Auto Cleanup - Hapus backup lama otomatis
  • βœ… Restore Capability - Restore database dari backup

πŸ› οΈ Management

  • βœ… Tenant Management API - CRUD tenant via REST API
  • βœ… Health Check - Monitor koneksi database tenant
  • βœ… Backup Statistics - Monitor status backup semua tenant

πŸ›οΈ Arsitektur

Database Structure

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Central Database  β”‚
β”‚                     β”‚
β”‚  - tenants          β”‚
β”‚  - domains          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                     β”‚
β”‚  Tenant Metadata &  β”‚
β”‚  API Keys Storage   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          β”‚
          β”‚ Manages
          β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         Tenant Databases             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Tenant A   β”‚  Tenant B   β”‚ Tenant C β”‚
β”‚             β”‚             β”‚          β”‚
β”‚ - users     β”‚ - users     β”‚ - users  β”‚
β”‚ - products  β”‚ - products  β”‚ - productsβ”‚
β”‚ - orders    β”‚ - orders    β”‚ - orders β”‚
β”‚ - tokens    β”‚ - tokens    β”‚ - tokens β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Request Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    Client    β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚ X-Tenant-API-Key: tk_abc123...
       β”‚ Authorization: Bearer token...
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Middleware: InitializeTenancyByApiKeyβ”‚
β”‚   1. Validasi API Key                 β”‚
β”‚   2. Find Tenant                      β”‚
β”‚   3. Initialize Tenancy               β”‚
β”‚   4. Set Database Connection          β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Middleware: auth:sanctum            β”‚
β”‚   1. Verify Bearer Token              β”‚
β”‚   2. Load User dari Tenant Database   β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Middleware: ValidateTenantToken     β”‚
β”‚   1. Pastikan token dari tenant yang  β”‚
β”‚      sama dengan API key              β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         Controller Action             β”‚
β”‚   Data dari Tenant Database           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸš€ Instalasi

Prerequisites

  • PHP 8.4+
  • Composer
  • MySQL 8.0+
  • Laravel Herd (atau PHP development server lainnya)

Setup

  1. Clone Repository

    git clone https://github.com/JunedSetiawan/laravel-multi-tenant-try.git
    cd laravel-multi-tenant-try
  2. Install Dependencies

    composer install
  3. Environment Configuration

    cp .env.example .env
    php artisan key:generate
  4. Database Configuration (.env)

    # Central Database
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=central_db
    DB_USERNAME=root
    DB_PASSWORD=root
    
    # Tenant Database Template
    TENANT_DB_HOST=127.0.0.1
    TENANT_DB_PORT=3306
    TENANT_DB_USERNAME=root
    TENANT_DB_PASSWORD=root
    
    # Master API Key untuk Management
    MASTER_API_KEY=your-super-secret-master-key
    
    # Backup Email Alert (optional)
    BACKUP_ALERT_EMAIL=admin@example.com
  5. Run Migrations

    # Migrate central database
    php artisan migrate
    
    # Seed super admin (optional)
    php artisan db:seed --class=SuperAdminSeeder
  6. Start Development Server

    # Jika menggunakan Laravel Herd
    herd link
    
    # Atau gunakan artisan serve
    php artisan serve

βš™οΈ Konfigurasi

Create Tenant

Endpoint: POST /api/central/tenants

Headers:

X-Master-API-Key: your-master-key
Accept: application/json

Body:

{
    "name": "Warung Makan Bu Joko",
    "db_name": "kasir_waroenk",
    "db_host": "localhost",
    "db_port": 3306,
    "db_username": "root",
    "db_password": "root"
}

Response:

{
    "message": "Tenant created successfully",
    "data": {
        "tenant_id": "warung-makan-bu-joko-abc123",
        "name": "Warung Makan Bu Joko",
        "api_key": "tk_0123456789abcdef...",
        "database": "kasir_waroenk"
    },
    "warning": "Save the API Key securely! It cannot be retrieved again."
}

⚠️ PENTING: Simpan api_key dengan aman! API key ini digunakan untuk akses tenant.

πŸ“š Dokumentasi API

Central Routes (Management)

Base URL: http://localhost/api/central

Required Header: X-Master-API-Key: your-master-key

Method Endpoint Deskripsi
POST /tenants Create tenant baru
GET /tenants List semua tenant
GET /tenants/{id} Detail tenant
PUT /tenants/{id} Update tenant
DELETE /tenants/{id} Delete tenant
POST /tenants/{id}/regenerate-key Regenerate API key
GET /tenants/{id}/health Health check
POST /tenants/{id}/backup Backup database
GET /tenants/{id}/backups List backups
POST /tenants/{id}/restore Restore database

Tenant Routes (User API)

Base URL: http://localhost/api

Required Headers:

X-Tenant-API-Key: tk_your_tenant_key
Accept: application/json

Public Routes (No Auth Required)

Method Endpoint Deskripsi
POST /register Register user baru
POST /login Login user
GET /info Info tenant saat ini

Register Example:

POST /api/register
Headers:
  X-Tenant-API-Key: tk_abc123...
  Accept: application/json

Body:
{
  "name": "John Doe",
  "email": "john@example.com",
  "username": "johndoe",
  "password": "password123",
  "password_confirmation": "password123",
  "role": "user"
}

Login Example:

POST /api/login
Headers:
  X-Tenant-API-Key: tk_abc123...
  Accept: application/json

Body:
{
  "email": "john@example.com",
  "password": "password123"
}

Response:
{
  "message": "Login successful",
  "user": { ... },
  "token": "11|abc123xyz..."
}

Protected Routes (Auth Required)

Additional Header: Authorization: Bearer {token}

Method Endpoint Deskripsi
GET /me Get user profile
POST /logout Logout user
GET /products List products
POST /products Create product
GET /products/{id} Show product
PUT /products/{id} Update product
DELETE /products/{id} Delete product
GET /users List users (admin only)

Example Request:

GET /api/me
Headers:
  X-Tenant-API-Key: tk_abc123...
  Authorization: Bearer 11|abc123xyz...
  Accept: application/json

πŸ”„ Alur Kerja

1. Setup Tenant Baru

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Admin  β”‚
β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜
     β”‚
     β”‚ POST /api/central/tenants
     β”‚ (name, db_name, db_host, db_username, db_password)
     β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Create Tenant in Central DB        β”‚
β”‚                                      β”‚
β”‚  1. Save tenant metadata             β”‚
β”‚  2. Encrypt db_password              β”‚
β”‚  3. Generate & hash API Key          β”‚
β”‚  4. Store db config (host, port,     β”‚
β”‚     username, encrypted password)    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β”‚ Database tenant (db_name) HARUS SUDAH ADA
           β”‚ dengan migrations yang sudah di-run
           β”‚
           β”‚ Response: tenant_id, api_key (plaintext)
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Admin receives API Key               β”‚
β”‚ ⚠️  SAVE API KEY - shown only once!  β”‚
β”‚                                      β”‚
β”‚ Admin gives API Key to Tenant Owner  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β”‚ Tenant Owner can now use API Key
           β”‚ to access their database
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Tenant users can register/login      β”‚
β”‚ using X-Tenant-API-Key header         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

⚠️ Important Notes:

  • Database dengan nama db_name HARUS SUDAH DIBUAT sebelumnya
  • Migrations HARUS SUDAH DI-RUN di database tenant tersebut
  • Sistem TIDAK otomatis membuat database atau run migrations
  • Sistem hanya menyimpan konfigurasi koneksi ke database yang sudah ada

2. User Registration & Login

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   User   β”‚
β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
     β”‚
     β”‚ POST /api/register
     β”‚ Headers: X-Tenant-API-Key
     β”‚ Body: name, email, password
     β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Register Process    β”‚
β”‚                      β”‚
β”‚  1. Validate Tenant  β”‚
β”‚  2. Create User in   β”‚
β”‚     Tenant Database  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β”‚ Success Response
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  POST /api/login     β”‚
β”‚  Body: email, pass   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Login Process       β”‚
β”‚                      β”‚
β”‚  1. Find User        β”‚
β”‚  2. Verify Password  β”‚
β”‚  3. Generate Token   β”‚
β”‚  4. Save to Tenant DBβ”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β”‚ Response: user, token
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  User can now access β”‚
β”‚  protected resources β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

3. Access Protected Resources

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ User Request   β”‚
β”‚ with Headers   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚
        β–Ό
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚ Has X-Tenant-API-   β”‚ NO
   β”‚ Key header?         β”œβ”€β”€β”€β”€β–Ί Error: API Key Required
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚ YES
             β–Ό
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚ Find Tenant by      β”‚ NO
   β”‚ API Key             β”œβ”€β”€β”€β”€β–Ί Error: Invalid API Key
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚ YES
             β–Ό
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚ Initialize Tenancy  β”‚
   β”‚ - Set DB Connection β”‚
   β”‚ - Load Tenant Data  β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚
             β–Ό
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚ Has Authorization   β”‚ NO
   β”‚ Bearer header?      β”œβ”€β”€β”€β”€β–Ί Error: Unauthenticated
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚ YES
             β–Ό
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚ Find Token in       β”‚ NO
   β”‚ Tenant Database     β”œβ”€β”€β”€β”€β–Ί Error: Invalid Token
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚ YES
             β–Ό
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚ Validate Token      β”‚ NO
   β”‚ belongs to Tenant   β”œβ”€β”€β”€β”€β–Ί Error: Token Mismatch
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚ YES
             β–Ό
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚ Check Role/         β”‚ NO
   β”‚ Permissions         β”œβ”€β”€β”€β”€β–Ί Error: Forbidden
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚ YES
             β–Ό
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚ βœ… Access Granted   β”‚
   β”‚ Execute Controller  β”‚
   β”‚ Return Response     β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ” Keamanan

1. Multi-Layer Authentication

  • Layer 1: Tenant API Key - Identifikasi tenant
  • Layer 2: Bearer Token - Autentikasi user
  • Layer 3: Token Validation - Validasi token belongs to tenant
  • Layer 4: Role-Based Access - Authorization based on role

2. Data Isolation

  • Setiap tenant memiliki database terpisah
  • Tidak ada data sharing antar tenant
  • Token dari Tenant A tidak bisa akses Tenant B

3. Encrypted Credentials

  • Password database tenant dienkripsi dengan Laravel encryption
  • API key di-hash dengan SHA-256
  • User password di-hash dengan bcrypt

4. Error Messages

Sistem memberikan pesan error yang jelas:

{
    "error": "Invalid Tenant API Key",
    "message": "The provided API key does not match any tenant...",
    "hint": "Make sure you are using the correct API key...",
    "provided_key": "tk_abc123..."
}

πŸ’Ύ Backup & Restore

Manual Backup

# Backup semua tenant
php artisan tenant:backup --compress

# Backup tenant tertentu
php artisan tenant:backup tenant-id-123 --compress

# Custom retention
php artisan tenant:backup --keep-days=60

Automated Backup

Backup otomatis sudah dikonfigurasi di app/Console/Kernel.php:

  • Daily Backup: Setiap hari jam 02:00 WIB (retention 30 hari)
  • Weekly Backup: Setiap Minggu jam 03:00 WIB (retention 90 hari)

Setup Scheduler (Production)

Tambahkan cron job:

* * * * * cd /path-to-project && php artisan schedule:run >> /dev/null 2>&1

List Backups

# List semua backups
php artisan tenant:backups

# List backup tenant tertentu
php artisan tenant:backups tenant-id-123

Restore Database

# Restore dari backup terbaru
php artisan tenant:restore tenant-id-123

# Restore dari file tertentu
php artisan tenant:restore tenant-id-123 backups/tenant-id/2025/10/backup.sql.gz

Backup via API

# Create backup
POST /api/central/tenants/{id}/backup
Headers: X-Master-API-Key: your-key
Body: { "compress": true }

# List backups
GET /api/central/tenants/{id}/backups

# Download backup
GET /api/central/tenants/{id}/backups/download?file=backup.sql.gz

# Restore
POST /api/central/tenants/{id}/restore
Body: { "file": "backup.sql.gz" }

πŸ§ͺ Testing

Test Central API

# Create tenant
curl -X POST http://localhost/api/central/tenants \
  -H "X-Master-API-Key: your-master-key" \
  -H "Accept: application/json" \
  -d '{"name":"Test Tenant","db_name":"test_db"}'

Test Tenant API

# Register
curl -X POST http://localhost/api/register \
  -H "X-Tenant-API-Key: tk_abc123..." \
  -H "Accept: application/json" \
  -d '{"name":"John","email":"john@test.com","password":"secret"}'

# Login
curl -X POST http://localhost/api/login \
  -H "X-Tenant-API-Key: tk_abc123..." \
  -H "Accept: application/json" \
  -d '{"email":"john@test.com","password":"secret"}'

# Access protected route
curl -X GET http://localhost/api/me \
  -H "X-Tenant-API-Key: tk_abc123..." \
  -H "Authorization: Bearer 11|token..." \
  -H "Accept: application/json"

πŸ“ Best Practices

1. Tenant Management

  • Simpan tenant API key dengan aman
  • Jangan share API key antar tenant
  • Regenerate API key jika terjadi kebocoran

2. Database

  • Gunakan database terpisah untuk setiap tenant
  • Backup rutin (automated + manual)
  • Monitor disk space untuk backup

3. Security

  • Gunakan HTTPS di production
  • Rate limiting untuk prevent abuse
  • Monitor suspicious activities
  • Update dependencies secara berkala

4. Monitoring

  • Health check rutin untuk semua tenant
  • Monitor backup status
  • Log analysis untuk debug

🀝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

πŸ“„ License

This project is open-sourced software licensed under the MIT license.

πŸ‘¨β€πŸ’» Author

Juned Setiawan

πŸ“ž Support

Jika ada pertanyaan atau issue, silakan buat GitHub Issue.


Built with ❀️ using Laravel & Stancl Tenancy

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors