# 🚀 Deploy Keuangan HN (Laravel 12) ke cPanel/WHM

Panduan deploy backend Laravel ke shared hosting cPanel Anda di VPS AlmaLinux.

## Prerequisite

- ✅ cPanel/WHM aktif di VPS Anda
- ✅ Domain / subdomain sudah dibuat via WHM (misal `api.hostnesia.id`)
- ✅ PHP 8.2+ terpilih di cPanel → **MultiPHP Manager**
- ✅ MySQL database sudah dibuat via cPanel → **MySQL Databases**
- ✅ SSH access ke server (untuk `composer install`)

---

## Step 1 — Setup Database di cPanel

1. Login cPanel → **MySQL Databases**
2. **Create New Database**: `USER_keuangan_hn` (cPanel auto-prefix)
3. **Add New User**: `USER_khn_user` dengan password kuat
4. **Add User to Database**: assign `USER_khn_user` ke `USER_keuangan_hn` — **ALL PRIVILEGES**
5. Catat credentials:
   - DB Name: `USER_keuangan_hn`
   - DB User: `USER_khn_user`
   - DB Pass: (yang Anda set)

---

## Step 2 — Upload Code via SSH

```bash
# SSH ke server sebagai user cPanel
ssh USER@server.hostnesia.id

# Buat subdomain document root (kalau belum lewat WHM)
cd ~/domains/api.hostnesia.id  # atau path subdomain Anda

# Clone dari GitHub
git clone https://TOKEN@github.com/dekreatifcom-sys/keuangan-sistem.git repo
cd repo/backend_laravel

# Install dependencies (butuh 5-10 menit)
composer install --no-dev --optimize-autoloader

# Setup env
cp .env.example .env
nano .env
```

Isi `.env` dengan credentials cPanel:
```bash
APP_ENV=production
APP_DEBUG=false
APP_URL=https://api.hostnesia.id
FRONTEND_URL=https://keuangan.hostnesia.id

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=USER_keuangan_hn
DB_USERNAME=USER_khn_user
DB_PASSWORD=YOUR_DB_PASSWORD

# Cache/session pakai driver file (tidak butuh tabel tambahan — cocok shared hosting)
CACHE_STORE=file
SESSION_DRIVER=file
QUEUE_CONNECTION=sync

# Email (opsional — untuk kirim invoice & reminder). Ambil API key di https://resend.com
RESEND_API_KEY=
SENDER_EMAIL=no-reply@hostnesia.id

SUPER_ADMIN_EMAIL=superadmin@hostnesia.id
SUPER_ADMIN_PASSWORD=StrongPass123!
ADMIN_EMAIL=admin@hostnesia.id
ADMIN_PASSWORD=AnotherStrong456!
```

> **Catatan:** `.env.example` di repo sudah berisi semua variabel di atas dengan nilai default yang aman — cukup `cp .env.example .env` lalu ubah `DB_*` (dan `RESEND_API_KEY` bila pakai email).

```bash
# Generate keys + jalankan migrations
php artisan key:generate
php artisan jwt:secret
php artisan config:cache
php artisan route:cache
php artisan migrate --seed --force

# Set permissions
chmod -R 775 storage bootstrap/cache
```

> `migrate --seed` membuat SELURUH tabel (users, workspaces, pemasukan, pengeluaran, produksi, kategori, pembeli, invoice/audit, **dividend_settings, dividend_distributions, book_closings**) dan mengisi akun awal (super admin + admin) serta data legacy. Migrasi dividen `2026_01_03_000001_create_dividend_tables` sudah termasuk otomatis.

---

## Step 3 — Point Document Root ke `public/`

cPanel default document root ke folder domain. Kita perlu arahkan ke `public/` Laravel.

**Opsi A — via cPanel Domain Manager (RECOMMENDED)**

cPanel → **Domains** → edit `api.hostnesia.id` → set **Document Root** ke:
```
/home/USER/domains/api.hostnesia.id/repo/backend_laravel/public
```

**Opsi B — Symlink (kalau A tidak bisa diubah)**

```bash
cd ~/public_html
ln -s ~/domains/api.hostnesia.id/repo/backend_laravel/public api
# → Akses via https://hostnesia.id/api/
```

**Opsi C — .htaccess redirect (fallback terakhir)**

```apache
# di ~/domains/api.hostnesia.id/public_html/.htaccess
RewriteEngine On
RewriteRule ^(.*)$ /repo/backend_laravel/public/$1 [L]
```

---

## Step 4 — SSL & Test

1. cPanel → **SSL/TLS Status** → **Run AutoSSL** untuk `api.hostnesia.id`
2. Test:
```bash
curl https://api.hostnesia.id/api/
# → {"status":"ok","app":"Keuangan HN"}

curl -X POST https://api.hostnesia.id/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"superadmin@hostnesia.id","password":"StrongPass123!"}'
# → {"token":"eyJ...","user":{...}}
```

---

## Step 5 — Migrate Data dari MongoDB Lama (Optional)

Kalau ada data lama di MongoDB yang mau dipindah:

```bash
# Install MongoDB PHP driver di cPanel
# (via cPanel → Select PHP Version → Extensions → tambah "mongodb")
# ATAU minta hosting provider install extension

composer require mongodb/mongodb

# Jalankan migration
php artisan app:migrate-from-mongodb \
  --mongo-url="mongodb://old-server:27017" \
  --database=keuangan_hn
```

Kalau MongoDB extension susah install, alternatifnya:
- Export MongoDB collections ke JSON: `mongoexport --db keuangan_hn --collection users --out users.json`
- Buat parser sederhana untuk import JSON → MySQL (bisa dibuat kalau perlu)

---

## Step 6 — Update Frontend

Di React frontend Anda, buat file `.env` dari template lalu arahkan ke domain API:
```bash
cd frontend
cp .env.example .env
nano .env
```
```bash
# frontend/.env
REACT_APP_BACKEND_URL=https://api.hostnesia.id
```

> Frontend hanya butuh SATU variabel: `REACT_APP_BACKEND_URL` (tanpa trailing slash). Semua request otomatis menambah prefix `/api`.

Build ulang React:
```bash
yarn install
yarn build
# Upload isi folder build/ ke ~/public_html/keuangan/ (atau subdomain frontend Anda)
```

---

## Maintenance

### Update code dari GitHub:
```bash
cd ~/domains/api.hostnesia.id/repo
git pull
cd backend_laravel
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan config:cache
php artisan route:cache
```

### Backup database:
```bash
mysqldump -u USER_khn_user -p USER_keuangan_hn > backup-$(date +%Y%m%d).sql
```

### Logs:
```bash
tail -f storage/logs/laravel.log
```

---

## Troubleshoot

- **500 error**: Cek `storage/logs/laravel.log` + pastikan `chmod -R 775 storage bootstrap/cache`
- **"No application encryption key"**: `php artisan key:generate`
- **JWT error**: `php artisan jwt:secret` + `php artisan config:clear`
- **Migration error "unknown database"**: Buat dulu database via cPanel MySQL
- **"no such table: cache" / "Table 'cache' doesn't exist"**: Pastikan `CACHE_STORE=file` dan `SESSION_DRIVER=file` di `.env`, lalu `php artisan config:clear && php artisan config:cache`
- **Perubahan `.env` tidak terbaca**: `php artisan config:clear` (lalu `config:cache` lagi)
- **Composer memory limit**: `php -d memory_limit=-1 /usr/local/bin/composer install`
