# Deployment - Cron Job (cPanel)

Command: orders:reconcile

## Setup cron cPanel
1. cPanel > Cron Jobs > Add New Cron Job
2. Interval: * * * * *
3. Command:
* * * * * cd /home/USERNAME/public_html && php artisan schedule:run >> /dev/null 2>&1

Ganti USERNAME dan path sesuai hosting. Scheduler Laravel akan menjalankan orders:reconcile tiap menit dengan withoutOverlapping().

## Kenapa bukan queue:work permanen
Shared hosting cPanel tidak mendukung proses long-running. Fulfillment sinkron (dipicu webhook) plus cron-based (retry/expire), bukan queue worker permanen.

## Backup Database

Backup database mengandalkan fitur bawaan hosting cPanel (JetBackup/Backup Wizard),
tidak dibuat backup custom di level aplikasi. Pastikan:
1. Backup otomatis MySQL di cPanel diaktifkan (biasanya harian).
2. Interval retensi backup dicek sesuai kebijakan hosting.
3. Proses restore sudah diuji minimal sekali di lokal (lihat langkah di bawah)
   sebelum go-live, supaya tim tahu caranya kalau production butuh restore darurat.

## Test Restore Lokal (WSL)

```bash
mysqldump -u gtgstore -p gtgstore > backup_test.sql
mysql -u gtgstore -p -e "DROP DATABASE gtgstore; CREATE DATABASE gtgstore;"
mysql -u gtgstore -p gtgstore < backup_test.sql
php artisan migrate:status
```
Kalau `migrate:status` menampilkan semua migrasi "Ran" dan data masih ada, restore berhasil.
