# 🚀 Panduan Deployment ke cPanel Shared Hosting

> Aplikasi ini di-desain agar bisa langsung jalan di cPanel shared hosting (Hostinger / Niagahoster / Rumahweb / Domainesia / dll).

## ✅ Persyaratan Hosting

| Item | Min | Recommended |
|---|---|---|
| PHP | 8.2 | 8.3 |
| MySQL / MariaDB | 8.0 / 10.6 | 8.0 / 10.11 |
| Memory limit | 256 MB | 512 MB |
| Upload max | 32 MB | 64 MB |
| SSL/HTTPS | ✅ WAJIB | Let's Encrypt |
| SSH access | Recommended | Required |
| Composer | Tersedia | Tersedia |
| Cron job | Tersedia | Tersedia |

### PHP Extensions yang Wajib
`BCMath · Ctype · Fileinfo · JSON · Mbstring · OpenSSL · PDO · pdo_mysql · Tokenizer · XML · GD · cURL · Zip · intl · sodium`

Cek di cPanel → **MultiPHP INI Editor** atau via SSH:
```bash
php -m | grep -E "bcmath|mbstring|openssl|pdo_mysql|intl|sodium|gd|curl"
```

---

## 📦 Langkah Deployment

### A. Persiapan File

**Opsi 1 — Via SSH (Recommended)**
```bash
# Di cPanel home directory
cd ~
git clone https://github.com/your-org/absensi.git
# atau
unzip absensi.zip -d absensi
cd absensi/codeigniter-app

# Install composer deps
composer install --no-dev --optimize-autoloader
```

**Opsi 2 — Via File Manager**
1. Upload `codeigniter-app.zip` lewat cPanel **File Manager**
2. Extract di home dir → `home/yourusername/absensi`
3. Upload folder `vendor/` (download lokal: `composer install --no-dev` → zip → upload)

### B. Buat Database

1. **cPanel → MySQL Databases**
2. Buat database baru: `youruser_absensi`
3. Buat user MySQL: `youruser_dbadmin` + password
4. **Add User to Database** dengan **ALL PRIVILEGES**

### C. Setup .env

```bash
cp .env.example .env
nano .env
```

Edit minimal:
```ini
CI_ENVIRONMENT = production
app.baseURL = 'https://absensi.yourdomain.com/'
app.forceGlobalSecureRequests = true

database.default.hostname = localhost
database.default.database = youruser_absensi
database.default.username = youruser_dbadmin
database.default.password = SuperSecretPass123!

encryption.key = hex2bin:RANDOM_64_CHAR_HEX
jwt.secret = RANDOM_LONG_STRING

email.SMTPHost = mail.yourdomain.com
email.SMTPUser = noreply@yourdomain.com
email.SMTPPass = your_smtp_password
email.fromEmail = noreply@yourdomain.com

webauthn.rp_id = absensi.yourdomain.com
```

Generate encryption key (via SSH):
```bash
php spark key:generate
```

### D. Jalankan Migrasi & Seed

```bash
php spark migrate
php spark db:seed DatabaseSeeder
```

### E. Set Document Root ke `public/`

**Opsi A — Subdomain (Recommended)**
1. **cPanel → Subdomains** → buat `absensi.yourdomain.com`
2. **Document Root**: `home/yourusername/absensi/codeigniter-app/public`
3. Pasang SSL: **cPanel → SSL/TLS → Let's Encrypt**

**Opsi B — Domain Utama**
- Set **Document Root** domain ke folder `public/`
- ATAU: copy isi `public/` ke `public_html/` dan ubah `public/index.php`:
  ```php
  require FCPATH . '../app/Config/Paths.php';
  ```
  menjadi path absolut ke folder `app/` di luar `public_html`.

**Opsi C — Tanpa akses Document Root**
Buat `.htaccess` di `public_html/`:
```apache
RewriteEngine On
RewriteRule ^$ /absensi/codeigniter-app/public/ [L]
RewriteRule (.*) /absensi/codeigniter-app/public/$1 [L]
```

### F. Set Permission

```bash
cd ~/absensi/codeigniter-app
chmod -R 755 writable/
chmod -R 755 public/uploads/ 2>/dev/null || mkdir -p public/uploads && chmod -R 755 public/uploads
```

### G. Setup Cron Job

**cPanel → Cron Jobs**. Tambah:

| Frequency | Command |
|---|---|
| `0 1 * * *` | `cd /home/USER/absensi/codeigniter-app && php spark absensi:sync-leaderboard` |
| `30 8 * * 1-5` | `cd /home/USER/absensi/codeigniter-app && php spark absensi:send-reminders` |

Ganti `USER` dengan username cPanel Anda.

---

## 🌐 Multi-Tenant: Wildcard Subdomain

Untuk SaaS multi-perusahaan (`acme.absensi.com`, `corp.absensi.com`):

1. **cPanel → Subdomains** → buat `*.absensi.yourdomain.com`
2. Document Root semua mengarah ke `public/`
3. `TenantFilter` otomatis resolve company dari subdomain

---

## 🔧 Troubleshooting

### "writable not writable"
```bash
chmod -R 775 writable/
chown -R USER:USER writable/  # via SSH
```

### "Class not found" setelah upload
```bash
composer dump-autoload -o
```

### Cron tidak jalan
Test manual:
```bash
cd ~/absensi/codeigniter-app && php spark absensi:sync-leaderboard
```
Periksa output PHP path di cPanel (kadang harus `/usr/local/bin/ea-php82 spark ...`).

### Service Worker tidak ke-register
- **WAJIB HTTPS**. Tanpa SSL, PWA & WebAuthn tidak akan jalan.
- Pastikan `sw.js` accessible: `https://absensi.yourdomain.com/sw.js`

### Biometric login tidak muncul
- HTTPS required (kecuali `localhost`)
- Device harus support: iPhone (Face ID), Android dengan fingerprint, Windows Hello, Mac Touch ID
- `webauthn.rp_id` di .env harus match domain (tanpa `https://`, tanpa port)

### Upload limit kecil
**cPanel → MultiPHP INI Editor**:
- `upload_max_filesize = 64M`
- `post_max_size = 64M`
- `memory_limit = 256M`

---

## 📊 Tier Hosting Rekomendasi

| Skala | Rekomendasi |
|---|---|
| 1-10 karyawan | Shared hosting Rp 30-50K/bln |
| 11-50 karyawan | Shared business Rp 80-150K/bln |
| 51-200 karyawan | Cloud / VPS 2GB RAM |
| 200+ karyawan | VPS 4GB+ atau dedicated |

---

## 🔐 Production Security Checklist

- [ ] HTTPS aktif (Let's Encrypt / SSL berbayar)
- [ ] `CI_ENVIRONMENT = production` di .env
- [ ] `app.forceGlobalSecureRequests = true`
- [ ] Encryption key sudah di-generate baru
- [ ] Database password kuat
- [ ] Folder `writable/`, `app/`, `vendor/` di luar `public_html`
- [ ] Backup otomatis via cPanel
- [ ] Update super admin password setelah login pertama
- [ ] Aktifkan 2FA untuk admin

---

## 📞 Support

Issue di production?
1. Cek `writable/logs/log-*.php`
2. Aktifkan `CI_ENVIRONMENT = development` SEMENTARA untuk lihat stack trace
3. Cek cPanel **Error Logs**

Selamat deploy! 🚀
