# 🌐 Multi-Environment Auto-Detection

## 📋 Overview

Aplikasi sekarang secara otomatis mendeteksi environment berdasarkan domain/hostname dan memuat file `.env` yang sesuai.

**Tidak perlu lagi copy file .env manual setiap deploy!** 🎉

---

## 🎯 Domain Mapping

| Domain/Host | Environment File | Keterangan |
|-------------|----------------|-------------|
| `cbtapps.com` | `.env.prod` | Production utama |
| `www.cbtapps.com` | `.env.prod` | Production dengan www |
| `dev.cbtapps.com` | `.env.dev` | Development/Staging |
| `*.onrender.com` | `.env.dev` | OnRender preview |
| `localhost` | `.env` | Local development |
| `127.0.0.1` | `.env` | Local development |

**Tenant Subdomains:**
- `tenant.cbtapps.com` → Tenant di production (pakai .env.prod)
- `tenant.dev.cbtapps.com` → Tenant di development (pakai .env.dev)
- `www` dan `dev` adalah **reserved subdomain** (bukan tenant)

---

## 🏢 Reserved Subdomains (Multi-Tenant)

Aplikasi menggunakan sistem multi-tenant berdasarkan subdomain. Namun, beberapa subdomain adalah **reserved** (dicadangkan) untuk keperluan sistem dan **TIDAK** dianggap sebagai tenant.

### Daftar Reserved Subdomains

Subdomain berikut **TIDAK** akan dianggap sebagai tenant:

| Subdomain | Keterangan |
|-----------|------------|
| `dev` | Development environment |
| `www` | Web server standard |
| `staging` | Staging environment |
| `test` | Testing environment |

**Konfigurasi:** [config/tenancy.php](config/tenancy.php)

### Cara Mengakses Tenant

#### Di Production (cbtapps.com)
```
https://cbtapps.com          → Halaman utama (pilih tenant)
https://tenant.cbtapps.com   → Langsung ke tenant "tenant"
https://www.cbtapps.com      → Reserved, bukan tenant
```

#### Di Development (dev.cbtapps.com)
```
https://dev.cbtapps.com              → Halaman utama dev
https://tenant.dev.cbtapps.com       → Tenant "tenant" di environment dev
https://another-tenant.dev.cbtapps.com → Tenant "another-tenant" di dev
```

### Logika Middleware

Middleware `SetLbbContextFromSubdomain` akan:

1. Cek apakah host adalah **central domain** → Skip tenant resolution
2. Cek apakah subdomain adalah **reserved subdomain** → Skip tenant resolution
3. Jika bukan keduanya → Cari tenant berdasarkan subdomain

**Contoh:**
- `dev.cbtapps.com` → Reserved subdomain "dev" → Tidak cari tenant
- `tenant.cbtapps.com` → Bukan reserved → Cari tenant "tenant"
- `tenant.dev.cbtapps.com` → Subdomain "tenant" di environment "dev" → Cari tenant "tenant"

---

## 🔧 Cara Kerja

### Di Server (cPanel/Production)

```
User mengakses: cbtapps.com
         ↓
bootstrap/app.php mendeteksi HTTP_HOST
         ↓
Otomatis load .env.prod
         ↓
App menggunakan production config
```

### Di Development Server

```
User mengakses: dev.cbtapps.com
         ↓
bootstrap/app.php mendeteksi HTTP_HOST
         ↓
Otomatis load .env.dev
         ↓
App menggunakan development config
```

### Di Local (Laptop)

```
User mengakses: localhost:8000
         ↓
bootstrap/app.php mendeteksi HTTP_HOST
         ↓
Otomatis load .env
         ↓
App menggunakan local config
```

---

## 📝 Kode Implementasi

**File:** [bootstrap/app.php](bootstrap/app.php)

```php
// Auto-detect environment based on HTTP_HOST
if (isset($_SERVER['HTTP_HOST'])) {
    $host = $_SERVER['HTTP_HOST'];

    // Remove port number if present
    $host = parse_url($host, PHP_URL_HOST) ?: $host;

    // Determine which env file to use
    if ($host === 'cbtapps.com' || $host === 'www.cbtapps.com') {
        $app->loadEnvironmentFrom('.env.prod');
    } elseif ($host === 'dev.cbtapps.com') {
        $app->loadEnvironmentFrom('.env.dev');
    } elseif ($host === 'localhost' || $host === '127.0.0.1') {
        $app->loadEnvironmentFrom('.env');
    }
    elseif (str_ends_with($host, '.onrender.com')) {
        $app->loadEnvironmentFrom('.env.dev');
    }
}
```

---

## 🚀 Keuntungan

### 1. **Tidak Perlu Copy .env Manual** ❌
Sebelumnya:
```bash
# Di server
cp .env.prod .env  # Manual copy
```

Sekarang: ✅ **Otomatis berdasarkan domain!**

### 2. **Tidak Ada Kesalahan Human Error**
- Tidak lupa ganti .env
- Tidak copy .env yang salah
- Tidak ada konflik antar environment

### 3. **Deployment Lebih Cepat**
- Pull via cPanel Git
- Auto-detect env file
- Siap digunakan!

### 4. **Bisa Deploy ke Banyak Domain**
- cbtapps.com → .env.prod
- dev.cbtapps.com → .env.dev
- test.cbtapps.com → .env.test (bisa ditambah)

---

## ➕ Menambah Domain Baru

Untuk menambahkan domain/environment baru:

### Contoh: Tambah Domain Testing

```php
// Dalam bootstrap/app.php
elseif ($host === 'test.cbtapps.com') {
    $app->loadEnvironmentFrom('.env.test');
}
```

### Lalu Buat File Environment

```bash
# Copy .env.example sebagai template
cp .env.example .env.test

# Edit sesuai kebutuhan
nano .env.test
```

---

## 🧪 Testing

### Test 1: Local Development

```bash
# Start development server
php artisan serve

# Buka http://localhost:8000
# Harus pakai .env
```

### Test 2: Production Domain

```bash
# Set locally untuk test
# Edit /etc/hosts (Windows/Mac/Linux):
127.0.0.1 cbtapps.com

# Buka http://cbtapps.com
# Harus pakai .env.prod
```

### Test 3: Development Domain

```bash
# Set locally untuk test
# Edit /etc/hosts:
127.0.0.1 dev.cbtapps.com

# Buka http://dev.cbtapps.com
# Harus pakai .env.dev
```

---

## 🔍 Debugging

### Cek Environment Saat Runtime

```bash
php artisan tinker
>>> app()->environment()
>>> config('app.name')
>>> config('app.url')
>>> env('DB_DATABASE')
>>> exit
```

### Cek File .env yang Aktif

```bash
# Cek environment file yang diload
ps aux | grep artisan
# Look for environment variables

# Atau di code:
\Log::info('Current env', ['env' => app()->environment()]);
```

---

## ⚠️ Penting: JANGAN Edit .env di Server Lagi!

Karena sekarang auto-detect:
- ❌ **JANGAN** edit `.env` di server
- ❌ **JANGAN** copy `.env.prod` → `.env`
- ❌ **JANGAN** rename file environment

**Edit file environment di repositori lokal saja**, lalu push dan pull! ✅

---

## 📊 Workflow Development Baru

### Development

```
1. Edit kode di local
2. Test di localhost (pakai .env)
3. Commit & push ke GitHub
```

### Deploy ke Development (dev.cbtapps.com)

```
1. Push ke branch `main`
2. Pull via cPanel Git
3. Auto-load .env.dev ✅
4. Test di dev.cbtapps.com
```

### Deploy ke Production (cbtapps.com)

```
1. Push ke branch `master`
2. Pull via cPanel Git
3. Auto-load .env.prod ✅
4. Live di cbtapps.com
```

---

## 🔄 Perbanding: Lama vs Baru

### ❌ Cara Lama (Manual)

```bash
# 1. SSH ke server
ssh user@server

# 2. Copy env file
cp .env.prod .env

# 3. Clear cache
php artisan cache:clear

# 4. Test aplikasi
```

### ✅ Cara Baru (Otomatis)

```bash
# 1. Push ke GitHub
git push origin master

# 2. Pull via cPanel Git
# Klik tombol "Pull" di cPanel

# 5. SELESAI! ✅
# - Environment auto-loaded
# - Tidak perlu SSH
# - Tidak perlu copy .env
```

---

## 🎯 Tips & Best Practices

### 1. **Simpan Environment yang Beda di Repositori**

**Repositori:**
```
.env           # Local (jangan commit)
.env.dev       # Development (COMMIT)
.env.prod      # Production (COMMIT)
.env.test       # Testing (COMMIT jika perlu)
```

**.gitignore:**
```
.env
.env.local
.env.*.local
```

### 2. **Selalu Test di Local Dulu**

```bash
# Test config sebelum push
php artisan config:clear
php artisan tinker
>>> config('app.url')
```

### 3. **Gunakan Branch untuk Environment**

- `main` branch → Development (`.env.dev`)
- `master` branch → Production (`.env.prod`)

### 4. **Documentation**

Update dokumentasi jika menambah domain baru:
- [ ] Update file ini
- [ ] Update [DEPLOYMENT.md](DEPLOYMENT.md)
- [ ] Beritahu tim developer lain

---

## 🔧 Troubleshooting

### "Environment tidak berubah"

**Problem:** Setelah deploy, environment masih menggunakan config lama.

**Solution:**
```bash
# Clear cache
php artisan cache:clear
php artisan config:clear

# Cek HTTP_HOST
php artisan tinker
>>> $_SERVER['HTTP_HOST']
```

### "403 Forbidden atau 404 Not Found"

**Problem:** Domain tidak dikenali.

**Solution:**
1. Cek apakah domain ada di mapping
2. Cek spelling domain
3. Clear browser cache

### "Database connection error"

**Problem:** Salah database environment.

**Solution:**
```bash
# Pastikan DB_DATABASE beda untuk tiap environment
# .env.dev → postgres_dev
# .env.prod → cbtapps_prod
```

---

## 📚 Referensi

- **Laravel Environment Detection:** https://laravel.com/docs/configuration#environment-specific-configuration
- **Multiple Environments:** https://laravel.com/docs/deployment#environment-configuration

---

## 📝 Summary

✅ **Fitur yang Ditambahkan:**
- Auto-detect environment berdasarkan HTTP_HOST
- Mapping domain → environment file
- Tidak perlu copy .env manual lagi

✅ **File yang Diupdate:**
- [bootstrap/app.php](bootstrap/app.php) - Logika auto-detection

✅ **Keuntungan:**
- Deployment lebih cepat
- Tidak ada human error
- Bisa multi-domain dengan environment berbeda

---

**Sekarang deployment jauh lebih mudah dan aman!** 🎉

Bukan cuma sekali deploy, tapi berkali-kali tanpa pusing-pusing dengan environment file!
