# Panduan Upload ke cPanel — MyMeeting

Ikut langkah ini **berurutan**. Semua masalah anda (gambar tak keluar, error 419 Page Expired) akan selesai jika ikut betul.

---

## 1. Sediakan fail di local sebelum upload

### a) Build asset (sekali sahaja di local)

```powershell
npm install
npm run build
```

Ini akan jana folder `public/build/` (untuk Vite). **Folder ini WAJIB di-upload**.

### b) Optimize composer (untuk production)

```powershell
composer install --no-dev --optimize-autoloader
```

### c) Bersihkan cache lama yang berkaitan local

```powershell
php artisan optimize:clear
```

### d) Padam fail/folder yang TIDAK perlu upload

- `node_modules/` — tak perlu di server
- `.env` (local anda) — kita guna `.env.production.example` sebagai template
- `public/storage` — ini _junction_ Windows, akan rosak bila upload. Padam dulu, kita create semula di server pakai `php artisan storage:link`.
- `storage/logs/*.log`
- `storage/framework/cache/data/*`
- `storage/framework/sessions/*`
- `storage/framework/views/*`
- `bootstrap/cache/*.php` (kekalkan `.gitignore`)

---

## 2. Struktur folder di cPanel

cPanel ada **dua corak biasa**. Pilih SATU.

### Corak A — Letak Laravel di luar `public_html` (DISYORKAN, lebih selamat)

```
/home/cpaneluser/
├── laravel/                  ← seluruh projek Laravel di sini
│   ├── app/
│   ├── bootstrap/
│   ├── config/
│   ├── ...
│   ├── public/               ← JANGAN upload kandungan public ke sini
│   └── ...
└── public_html/              ← kandungan folder public/ Laravel
    ├── index.php             ← edit dua baris (lihat bawah)
    ├── .htaccess
    ├── favicon.ico
    ├── robots.txt
    ├── images/
    ├── build/                ← dari `npm run build`
    └── storage/              ← symlink yang akan dicipta
```

**Edit `public_html/index.php`** (dua baris):

```php
// Sebelum
require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';

// Selepas (tunjuk ke folder laravel/)
require __DIR__.'/../laravel/vendor/autoload.php';
$app = require_once __DIR__.'/../laravel/bootstrap/app.php';
```

### Corak B — Letak semua dalam `public_html`

Kalau hosting tak benarkan akses di luar `public_html`, letak semua dalam satu sub-folder dan pakai `.htaccess` redirect. (Kurang disyorkan.)

---

## 3. Upload langkah demi langkah

1. **Zip projek** di local (sekali pakai):
    ```powershell
    # Dari folder mymetting
    Compress-Archive -Path app,bootstrap,config,database,lang,public,resources,routes,storage,tests,vendor,artisan,composer.json,composer.lock,package.json -DestinationPath mymetting.zip -Force
    ```
2. **Upload `mymetting.zip`** ke cPanel File Manager → ke folder `/home/cpaneluser/`
3. **Extract** di sana → susun ikut Corak A di atas (folder Laravel di luar `public_html`, kandungan `public/` ke dalam `public_html/`).
4. **Cipta database** di cPanel → MySQL Databases → catat nama, user, password.
5. **Import database** (jika ada SQL dump dari local) melalui phpMyAdmin.

---

## 4. Konfigurasi `.env` di server

1. Salin `.env.production.example` (yang baru saya cipta) ke folder Laravel sebagai `.env`.
2. **Jana APP_KEY**:
    ```bash
    php artisan key:generate
    ```
3. Edit nilai-nilai berikut dalam `.env`:
    - `APP_URL=https://domain-anda.com` ← **WAJIB** (kalau salah → 419)
    - `APP_DEBUG=false`
    - `DB_DATABASE`, `DB_USERNAME`, `DB_PASSWORD`
    - `SESSION_DOMAIN=domain-anda.com` (tanpa http://)
    - `SESSION_SECURE_COOKIE=true` (jika ada SSL/HTTPS)

---

## 5. Permission folder (PENTING)

Lewat Terminal cPanel atau File Manager:

```bash
cd /home/cpaneluser/laravel
chmod -R 755 .
chmod -R 775 storage bootstrap/cache
chmod 600 .env
```

Pemilik fail mesti user cPanel anda (bukan root).

---

## 6. Migrate database & seed (jika perlu)

```bash
cd /home/cpaneluser/laravel
php artisan migrate --force
# Kalau nak seed admin awal:
php artisan db:seed --force
```

> Jika tabel `sessions` tiada → semua request akan 419. `php artisan migrate --force` akan ciptakan.

---

## 7. Buat symlink `storage` (PUNCA UTAMA gambar tak load)

```bash
cd /home/cpaneluser/laravel
php artisan storage:link
```

Kalau perintah di atas error (kerap berlaku di shared hosting), buat manual:

```bash
ln -s /home/cpaneluser/laravel/storage/app/public /home/cpaneluser/public_html/storage
```

Sahkan dengan:

```bash
ls -la /home/cpaneluser/public_html/storage
```

Mesti tunjuk `-> /home/cpaneluser/laravel/storage/app/public`.

---

## 8. Upload imej yang `.gitignore` skip

Folder `storage/app/public/uploads/images/` (ada `JAIS-Logo (3).png`, `image.png`) **tidak masuk git**. Kalau anda guna git deploy, fail ini takkan ada di server → semua `<img src="storage/uploads/images/...">` akan 404.

**Penyelesaian**: Upload manual folder ini ke:

```
/home/cpaneluser/laravel/storage/app/public/uploads/
```

Selepas itu, sebab `public_html/storage` adalah symlink ke situ, gambar boleh diakses melalui `https://domain/storage/uploads/images/JAIS-Logo (3).png`.

---

## 9. Optimize untuk production

```bash
cd /home/cpaneluser/laravel
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
```

Jika anda edit `.env` selepas ini → mesti `php artisan config:clear` dahulu.

---

## 10. Penyelesaian masalah biasa

### 419 Page Expired (paling kerap)

Senarai semak ikut keutamaan:

1. `APP_URL` mesti **persis** sama dengan URL anda akses (https vs http, www vs tanpa www).
2. Tabel `sessions` wujud → `php artisan migrate --force`.
3. Folder `storage/framework/sessions` writable.
4. `APP_KEY` ada (bukan kosong).
5. Cuba clear cookies pelayar selepas tukar `APP_URL`.
6. Jika website guna **HTTPS**, set `SESSION_SECURE_COOKIE=true`. Kalau **HTTP**, set `false`.
7. Jika error timbul hanya selepas login lama → naikkan `SESSION_LIFETIME`.

### Gambar 404 / tak load

1. `php artisan storage:link` sudah dijalankan?
2. Folder `storage/app/public/uploads/` ada di server?
3. `public_html/storage` adalah symlink ke folder yang betul?
4. Permission folder `storage/app/public/` adalah 755 atau 775?

### CSS / JS tak load

1. Folder `public/build/` (atau di `public_html/build/`) ada?
2. Kalau tak ada → run `npm run build` di local dan upload.

### "Whoops, something went wrong"

1. `chmod -R 775 storage bootstrap/cache`
2. Lihat `storage/logs/laravel.log` untuk error sebenar.
3. Pastikan PHP version di cPanel = **8.2 atau lebih tinggi** (lihat `composer.json`).

### Composer / vendor error

Kalau tak boleh upload `vendor/`, pakai SSH:

```bash
cd /home/cpaneluser/laravel
composer install --no-dev --optimize-autoloader
```

---

## 11. Senarai semak akhir

- [ ] `.env` ada `APP_KEY`, `APP_URL`, DB betul, `APP_DEBUG=false`
- [ ] `php artisan migrate --force` selesai
- [ ] `php artisan storage:link` selesai (atau symlink manual)
- [ ] Folder `storage/app/public/uploads/` sudah di-upload
- [ ] Permission `storage/` & `bootstrap/cache/` = 775
- [ ] `php artisan config:cache` & `route:cache` & `view:cache` selesai
- [ ] PHP version di cPanel >= 8.2
- [ ] Login berjaya, gambar JAIS Logo keluar di halaman login

Selamat deploy!
