# Setup Supervisor untuk Queue Worker (Production)

Dokumen ini menjelaskan cara setup Supervisor untuk menjalankan Laravel queue worker di server production.  
**Asumsi:** Supervisor sudah terinstall di server production.

---

## 1. Pastikan Environment Production Benar

Sebelum setup supervisor, pastikan konfigurasi `.env` di server production sudah benar:

```bash
# .env (production)
QUEUE_CONNECTION=database
```

> **Jangan** pakai `QUEUE_CONNECTION=sync` di production. Sync menjalankan job langsung dalam request dan tidak memanfaatkan queue.

---

## 2. Buat Konfigurasi Supervisor

Login ke server production, lalu buat file konfigurasi baru:

```bash
sudo nano /etc/supervisor/conf.d/msjhris-queue.conf
```

Paste konfigurasi berikut (sesuaikan path project):

```ini
[program:msjhris-queue-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/msjhris/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/msjhris/storage/logs/supervisor-queue.log
stopwaitsecs=3600
```

**Penjelasan parameter penting:**

| Parameter | Keterangan |
|-----------|------------|
| `command` | Path ke `artisan queue:work` project |
| `user` | User yang menjalankan worker (biasanya `www-data`) |
| `numprocs` | Jumlah worker yang berjalan paralel (2–4 biasanya cukup) |
| `stdout_logfile` | Log output supervisor |
| `stopwaitsecs` | Waktu tunggu sebelum force kill |

---

## 3. Reload & Jalankan Supervisor

Setelah konfigurasi dibuat, jalankan perintah berikut:

```bash
# Reload konfigurasi supervisor
sudo supervisorctl reread

# Update daftar process
sudo supervisorctl update

# Start worker
sudo supervisorctl start msjhris-queue-worker:*
```

---

## 4. Cek Status Worker

Untuk melihat status worker:

```bash
sudo supervisorctl status
```

Output contoh:
```
msjhris-queue-worker_00   RUNNING   pid 12345, uptime 0:05:23
msjhris-queue-worker_01   RUNNING   pid 12346, uptime 0:05:23
```

---

## 5. Perintah Supervisor yang Sering Dipakai

| Perintah | Fungsi |
|----------|--------|
| `sudo supervisorctl status` | Melihat status semua worker |
| `sudo supervisorctl restart msjhris-queue-worker:*` | Restart semua worker |
| `sudo supervisorctl stop msjhris-queue-worker:*` | Stop semua worker |
| `sudo supervisorctl start msjhris-queue-worker:*` | Start semua worker |
| `sudo tail -f /var/www/msjhris/storage/logs/supervisor-queue.log` | Monitoring log realtime |

---

## 6. Restart Worker Setelah Deployment

Setiap kali ada deployment yang mengubah kode (terutama job class), **restart worker** agar perubahan kode ter-load:

```bash
sudo supervisorctl restart msjhris-queue-worker:*
```

Atau, alternatif lebih cepat:

```bash
php artisan queue:restart
```

> `queue:restart` memberitahu worker yang sedang berjalan untuk berhenti setelah job saat ini selesai, lalu supervisor akan otomatis menjalankan ulang worker.

---

## 7. Troubleshooting

### Worker tidak berjalan (status FATAL / EXITED)

```bash
# Cek log supervisor
sudo tail -n 50 /var/www/msjhris/storage/logs/supervisor-queue.log

# Pastikan permission folder storage/logs benar
sudo chown -R www-data:www-data /var/www/msjhris/storage
sudo chmod -R 775 /var/www/msjhris/storage

# Pastikan tabel `jobs` ada di database
php artisan queue:table
php artisan migrate
```

### Job tidak diproses / stuck di queue

```bash
# Cek jumlah job di queue
php artisan queue:monitor

# Cek failed jobs
php artisan queue:failed

# Retry failed job
php artisan queue:retry all
```

### Memory bengkak (memory leak)

Jika worker berjalan lama dan memory terus naik, tambahkan `--max-jobs` atau `--max-memory`:

```ini
command=php /var/www/msjhris/artisan queue:work --sleep=3 --tries=3 --max-jobs=1000 --max-memory=128
```

Supervisor akan otomatis restart worker setelah mencapai limit.

---

## 8. Tips Production

- Gunakan `database` atau `redis` untuk `QUEUE_CONNECTION` — jangan `sync`.
- Monitor log secara berkala: `storage/logs/supervisor-queue.log` dan `storage/logs/laravel.log`.
- Setup notifikasi (opsional) jika ada failed jobs.
- Jika queue sering penuh, tingkatkan `numprocs` di supervisor atau tambahkan queue terpisah.

---

## Referensi

- [Laravel Queue — Official Docs](https://laravel.com/docs/10.x/queues)
- [Supervisor Documentation](http://supervisord.org/)
