# Panduan Deployment ke Shared Hosting

Aplikasi Laravel + Filament ini **BISA** di-deploy ke shared hosting dengan beberapa persiapan. Berikut panduan lengkapnya:

## ✅ Persyaratan Shared Hosting

Pastikan hosting Anda mendukung:
- **PHP 8.2 atau lebih tinggi** (Laravel 12 membutuhkan PHP 8.2+)
- **MySQL 5.7+ atau MariaDB 10.3+**
- **Composer** (biasanya tersedia via SSH atau cPanel)
- **Node.js & NPM** (untuk build assets - bisa dilakukan di local sebelum upload)
- **mod_rewrite** enabled (untuk URL rewriting)
- **SSH Access** (opsional, tapi sangat membantu)

## 📦 Persiapan Sebelum Upload

### 1. Build Assets di Local

**PENTING**: Build assets **SEBELUM** upload ke hosting, karena shared hosting biasanya tidak memiliki Node.js/NPM.

```bash
# Di local komputer Anda
npm install
npm run build
```

Ini akan menghasilkan folder `public/build/` yang **HARUS** di-upload ke hosting.

### 2. Install Dependencies

```bash
composer install --no-dev --optimize-autoloader
```

### 3. Optimize untuk Production

```bash
php artisan config:cache
php artisan route:cache
php artisan view:cache
```

## 📤 Upload ke Hosting

### Struktur File yang Di-upload

Upload **SEMUA** file kecuali:
- `node_modules/` (tidak perlu)
- `.git/` (tidak perlu)
- `.env` (buat baru di hosting)
- `storage/logs/*` (folder kosong saja)
- File development lainnya

**PENTING**: Pastikan folder `public/build/` **TERMASUK** dalam upload!

### Struktur di Hosting

```
public_html/
├── index.php          (dari public/index.php)
├── .htaccess         (dari public/.htaccess)
├── build/             (dari public/build/) ⚠️ PENTING!
├── css/               (dari public/css/)
├── js/                (dari public/js/)
├── favicon.ico        (dari public/favicon.ico)
└── ... (file lain dari public/)

app/
├── app/
├── bootstrap/
├── config/
├── database/
├── resources/
├── routes/
├── storage/
├── vendor/
├── .env               (buat baru)
├── artisan
├── composer.json
└── ... (file root lainnya)
```

## 🔧 Konfigurasi di Hosting

### 1. Buat File `.env`

Copy dari `.env.example` atau buat baru dengan konfigurasi:

```env
APP_NAME="Presensi Admin"
APP_ENV=production
APP_KEY=base64:... (generate dengan: php artisan key:generate)
APP_DEBUG=false
APP_URL=https://yourdomain.com

DB_CONNECTION=mysql
DB_HOST=localhost (atau IP dari hosting)
DB_PORT=3306
DB_DATABASE=nama_database
DB_USERNAME=username_database
DB_PASSWORD=password_database

# Session & Cache
SESSION_DRIVER=file
CACHE_DRIVER=file
QUEUE_CONNECTION=sync

# Mail (sesuaikan dengan hosting)
MAIL_MAILER=smtp
MAIL_HOST=smtp.hostinger.com
MAIL_PORT=587
MAIL_USERNAME=your-email@domain.com
MAIL_PASSWORD=your-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=your-email@domain.com
MAIL_FROM_NAME="${APP_NAME}"
```

### 2. Generate Application Key

Via SSH atau cPanel Terminal:
```bash
php artisan key:generate
```

### 3. Set Permission

```bash
chmod -R 755 storage bootstrap/cache
chmod -R 775 storage bootstrap/cache
```

### 4. Create Storage Link

```bash
php artisan storage:link
```

### 5. Run Migration

```bash
php artisan migrate --force
```

### 6. Seed Data (Opsional)

```bash
php artisan db:seed --class=RoleAndPermissionSeeder
```

## 🌐 Konfigurasi Web Server

### Jika Menggunakan Subdomain/Folder

Jika aplikasi tidak di root `public_html/`, edit `public/index.php`:

```php
// Ubah dari:
require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';

// Menjadi (sesuaikan path):
require __DIR__.'/../../vendor/autoload.php';
$app = require_once __DIR__.'/../../bootstrap/app.php';
```

### .htaccess untuk Subfolder

Jika aplikasi di subfolder (misal: `public_html/admin/`), buat `.htaccess`:

```apache
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /admin/
    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
```

## ✅ Checklist Deployment

- [ ] Build assets dengan `npm run build`
- [ ] Upload folder `public/build/` ke hosting
- [ ] Install dependencies dengan `composer install --no-dev`
- [ ] Buat file `.env` di hosting
- [ ] Generate APP_KEY dengan `php artisan key:generate`
- [ ] Set permission folder `storage` dan `bootstrap/cache`
- [ ] Buat storage link dengan `php artisan storage:link`
- [ ] Run migration dengan `php artisan migrate --force`
- [ ] Optimize dengan `php artisan config:cache`
- [ ] Test aplikasi di browser

## 🚨 Troubleshooting

### Error: Vite manifest not found
**Solusi**: Pastikan folder `public/build/` sudah di-upload dan berisi `manifest.json`

### Error: 500 Internal Server Error
**Solusi**: 
- Cek permission folder `storage` dan `bootstrap/cache`
- Cek file `.env` sudah benar
- Cek error log di `storage/logs/laravel.log`

### Error: Class not found
**Solusi**: 
```bash
composer dump-autoload
php artisan optimize:clear
php artisan config:cache
```

### CSS/JS tidak muncul
**Solusi**: 
- Pastikan `public/build/` sudah di-upload
- Cek `APP_URL` di `.env` sudah benar
- Clear cache: `php artisan optimize:clear`

## 📝 Catatan Penting

1. **Build Assets di Local**: Karena shared hosting biasanya tidak punya Node.js, build assets di local sebelum upload
2. **Jangan Upload node_modules**: Folder ini besar dan tidak diperlukan di production
3. **Upload public/build/**: Folder ini **WAJIB** di-upload karena berisi manifest dan assets yang sudah di-compile
4. **Environment Production**: Pastikan `APP_ENV=production` dan `APP_DEBUG=false` di `.env`
5. **Optimize Cache**: Selalu jalankan `php artisan config:cache` setelah deploy

## 🔄 Update Aplikasi

Saat ada update:

1. **Di Local**:
   ```bash
   git pull
   composer install --no-dev
   npm install
   npm run build
   ```

2. **Upload ke Hosting**:
   - Upload semua file (kecuali `.env`)
   - **PENTING**: Upload folder `public/build/` yang baru

3. **Di Hosting**:
   ```bash
   composer install --no-dev --optimize-autoloader
   php artisan migrate --force
   php artisan config:cache
   php artisan route:cache
   php artisan view:cache
   ```

## 💡 Tips

- Gunakan **Git** untuk version control dan memudahkan deployment
- Backup database sebelum update
- Test di staging environment dulu jika memungkinkan
- Monitor error log di `storage/logs/laravel.log`
- Gunakan **cPanel File Manager** atau **FTP** untuk upload file
- Jika ada SSH access, gunakan untuk command yang lebih cepat

---

**Selamat Deploy! 🚀**

