# Instalasi DosenBaik di Shared Hosting / cPanel

Panduan ini dibuat khusus untuk paket source **DosenBaik Laravel 13** tanpa folder `vendor`.

## A. Persyaratan

Hosting minimal:

- PHP 8.4 atau 8.5
- MySQL/MariaDB
- Terminal/SSH
- Composer
- Cron Jobs
- SSL
- Dapat mengarahkan document root domain ke folder `public`

Pada hosting yang sudah dicek sebelumnya:

```text
PHP CLI: /opt/alt/php85/usr/bin/php
Composer: /home/ahlp5785/bin/composer
Folder aplikasi: /home/ahlp5785/dosenbaik
```

Sesuaikan username jika akun hosting berbeda.

---

## B. Upload dan extract

Upload ZIP ke home directory melalui File Manager, lalu extract sehingga struktur menjadi:

```text
/home/USERNAME/dosenbaik/
    app/
    bootstrap/
    config/
    database/
    public/
    resources/
    routes/
    storage/
    artisan
    composer.json
```

**Jangan** menaruh seluruh Laravel langsung sebagai file publik jika bisa mengatur document root ke `public`.

---

## C. Install Composer dependency

Terminal:

```bash
cd ~/dosenbaik
~/bin/composer install --no-dev --optimize-autoloader
```

Jika Composer berada di lokasi lain, gunakan path Composer akun hosting Anda.

---

## D. Buat database

Di cPanel buka **MySQL Databases** atau **Database Wizard**.

Buat:

1. database
2. user database
3. password database kuat
4. tambahkan user ke database dengan **ALL PRIVILEGES**

Catat nama database dan user yang sudah memiliki prefix cPanel.

Contoh:

```text
ahlp5785_bimbingan
ahlp5785_bimbinganuser
```

---

## E. Buat `.env`

Terminal:

```bash
cd ~/dosenbaik
cp .env.example .env
```

Edit `.env` melalui **cPanel File Manager > Edit**. Ini biasanya lebih mudah daripada editor terminal.

Bagian utama:

```env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://dosenbaik.com
CENTRAL_DOMAIN=dosenbaik.com

DB_HOST=localhost
DB_DATABASE=PREFIX_NAMA_DATABASE
DB_USERNAME=PREFIX_USER_DATABASE
DB_PASSWORD=PASSWORD_DATABASE

SESSION_DOMAIN=
SESSION_SECURE_COOKIE=true
QUEUE_CONNECTION=sync

OWNER_EMAIL=email-owner-anda
OWNER_PASSWORD=PASSWORD_OWNER_YANG_KUAT
```

Jangan mengirim password database, password owner, API token, atau APP_KEY kepada pihak lain.

---

## F. Generate key dan database

```bash
cd ~/dosenbaik
php artisan key:generate
php artisan migrate --seed --force
php artisan optimize:clear
php artisan optimize
```

Jika command `php` berbeda dengan versi web hosting, gunakan PHP 8.5 secara eksplisit, misalnya:

```bash
/opt/alt/php85/usr/bin/php artisan migrate --seed --force
```

---

## G. Permission

Biasanya cPanel tidak memerlukan `chown`. Pastikan folder berikut writable oleh akun hosting:

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

Jika provider hosting menyarankan `755`, ikuti kebijakan provider. Jangan menggunakan `777` kecuali diminta secara khusus oleh provider.

---

## H. Document Root

Tambahkan `dosenbaik.com` ke cPanel dan arahkan document root ke:

```text
/home/USERNAME/dosenbaik/public
```

Bukan ke root Laravel.

Target:

```text
https://dosenbaik.com
       ↓
/home/USERNAME/dosenbaik/public/index.php
```

---

## I. Wildcard subdomain

Aplikasi SaaS menggunakan alamat seperti:

```text
gunawan.dosenbaik.com
ahmad.dosenbaik.com
```

Idealnya buat wildcard DNS:

```text
*.dosenbaik.com -> IP shared hosting
```

Kemudian pada cPanel buat wildcard subdomain/domain yang document root-nya sama:

```text
/home/USERNAME/dosenbaik/public
```

Jika paket hosting tidak mendukung wildcard SSL/subdomain, tahap awal tetap bisa dilakukan dengan membuat subdomain dosen **satu per satu** di cPanel. Database aplikasi tidak perlu diubah.

Pastikan SSL aktif sebelum digunakan publik.

---

## J. Login owner

Buka:

```text
https://dosenbaik.com/login
```

Gunakan `OWNER_EMAIL` dan `OWNER_PASSWORD` yang dimasukkan sebelum seeding.

Setelah berhasil login owner:

1. buka **Billing & Moota**
2. tambahkan rekening penerimaan
3. buka **Paket** dan cek harga Rp50.000/bulan
4. buat satu dosen test melalui `/daftar`

---

## K. Cron Laravel

Buka **cPanel > Cron Jobs**.

Contoh untuk hosting yang memakai `/opt/alt/php85/usr/bin/php`:

```cron
*/5 * * * * cd /home/ahlp5785/dosenbaik && /opt/alt/php85/usr/bin/php artisan schedule:run >> /dev/null 2>&1
```

Jika username berbeda, ganti path home.

Scheduler menjalankan:

- generate invoice bulanan
- status overdue/reminder
- suspend overdue
- fallback sync Moota setiap jam

---

## L. Integrasi Moota

### 1. `.env`

Isi:

```env
MOOTA_BASE_URL=https://app.moota.co
MOOTA_API_TOKEN=TOKEN_API_V2_ANDA
MOOTA_WEBHOOK_SECRET=SECRET_WEBHOOK_ANDA
```

Setelah mengubah `.env`:

```bash
php artisan optimize:clear
php artisan optimize
```

### 2. Dashboard owner

Buka:

```text
/owner/billing
```

Tambahkan rekening dan **Moota Bank ID** masing-masing rekening.

### 3. Webhook Moota

Endpoint aplikasi:

```text
https://dosenbaik.com/webhooks/moota
```

Di Moota, pilih akun bank yang ingin dihubungkan dengan webhook dan gunakan secret token yang sama dengan `MOOTA_WEBHOOK_SECRET`.

Aplikasi memvalidasi signature webhook HMAC SHA-256 jika header Signature tersedia.

### 4. Matching pembayaran

Prioritas matching:

1. nomor invoice `BK-YYYYMM-XXXXXX` ditemukan pada deskripsi mutasi; atau
2. total nominal cocok tepat dan hanya ada satu invoice outstanding dengan nominal tersebut.

Kode unik mengurangi risiko dua invoice mempunyai nominal sama.

---

## M. Custom domain dosen

Contoh:

```text
dosenku.id
```

Langkah:

1. A/CNAME domain diarahkan ke shared hosting.
2. Tambahkan domain ke cPanel dengan document root yang sama:
   `/home/USERNAME/dosenbaik/public`
3. Aktifkan SSL.
4. Login owner > **Domain**.
5. Tambahkan hostname dan pilih tenant.
6. Setelah DNS + SSL benar, ubah status menjadi `active`.

Aplikasi tidak mendaftarkan domain ke registrar; aplikasi hanya melakukan mapping hostname ke tenant.

---

## N. Test wajib sebelum go-live

Jalankan:

```bash
cd ~/dosenbaik
php artisan about
php artisan route:list
php artisan migrate:status
php artisan optimize
```

Tes browser:

1. `https://dosenbaik.com`
2. `/login`
3. login owner
4. `/daftar`
5. daftar tenant contoh `gunawan`
6. `https://gunawan.dosenbaik.com`
7. login dosen
8. isi profil website
9. tambah publikasi
10. tambah artikel
11. tambah materi
12. daftar satu mahasiswa
13. terima mahasiswa
14. login mahasiswa
15. ajukan bimbingan
16. kirim revisi dari dosen
17. konfirmasi revisi dari mahasiswa
18. test invoice dan webhook Moota

Setelah semua test lolos, baru ubah DNS utama dari VPS ke shared hosting.

---

## O. Jangan hapus VPS dulu

Pertahankan VPS lama sampai:

- root domain berhasil di shared hosting
- wildcard/subdomain berhasil
- SSL berhasil
- login owner/dosen/mahasiswa berhasil
- database stabil
- cron berjalan
- webhook Moota sudah diuji

Setelah itu VPS dapat dihentikan atau dipakai sebagai staging/backup.
