~/saidqb cat wiki/stack/server-extra/laravel.md
commit by saidqb
Laravel: setup tambahan (Queue, Reverb, Scheduler)
Lanjutan dari deploy-laravel.md — tiga hal yang paling sering dibutuhkan begitu deploy dasar sudah jalan: queue worker (proses background), Reverb (websocket/realtime), dan task scheduler (cron Laravel). Path & user (laravelapp, /home/laravelapp/app) ikut konvensi dokumen deploy utama.
1. Queue Worker (Supervisor)
php artisan queue:work itu proses long-running — kalau cuma dijalankan manual di terminal, mati begitu SSH terputus. Butuh process manager yang auto-restart kalau crash: Supervisor.
sudo apt install supervisor -y
/etc/supervisor/conf.d/laravelapp-worker.conf
[program:laravelapp-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/laravelapp/app/artisan queue:work --sleep=3 --tries=3 --max-time=3600
directory=/home/laravelapp/app
autostart=true
autorestart=true
user=laravelapp
numprocs=2
redirect_stderr=true
stdout_logfile=/home/laravelapp/app/storage/logs/worker.log
stopwaitsecs=3600
numprocs=2 — jalankan 2 worker paralel, sesuaikan sama beban queue. stopwaitsecs=3600 kasih waktu worker nyelesain job yang sedang jalan sebelum dipaksa berhenti (dibatasi biar tidak infinite kalau job-nya macet).
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravelapp-worker:*
Kenapa php artisan queue:restart (di langkah "tiap kali deploy update" dokumen utama) butuh Supervisor: queue:restart sendiri cuma nyalain sinyal — worker yang sedang jalan bakal nyelesain job yang lagi diproses lalu keluar, tidak otomatis nyala lagi. Supervisor-lah (autorestart=true) yang langsung start ulang proses barunya, otomatis kebaca kode terbaru. Tanpa Supervisor (atau sejenisnya), queue:restart cuma mematikan worker selamanya.
Command yang berguna:
sudo supervisorctl status # cek worker jalan/tidak
sudo supervisorctl restart laravelapp-worker:* # restart manual kalau perlu
tail -f /home/laravelapp/app/storage/logs/worker.log
2. Laravel Reverb (WebSocket server)
sudo -iu laravelapp
cd app
composer require laravel/reverb
php artisan reverb:install
exit
reverb:install otomatis nambah konfigurasi ke .env — set BROADCAST_CONNECTION=reverb, isi REVERB_APP_ID/REVERB_APP_KEY/REVERB_APP_SECRET yang di-generate.
Reverb butuh proses sendiri yang selalu nyala — bikin subdomain terpisah (ws.app.example.com) biar gampang di-proxy Nginx, dan systemd service:
/etc/systemd/system/laravelapp-reverb.service
[Unit]
Description=Laravel Reverb WebSocket server
After=network.target
[Service]
User=laravelapp
WorkingDirectory=/home/laravelapp/app
ExecStart=/usr/bin/php artisan reverb:start --host=0.0.0.0 --port=8080
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now laravelapp-reverb
Nginx — WebSocket butuh header Upgrade/Connection khusus, koneksi HTTP biasa tidak cukup:
server {
listen 80;
server_name ws.app.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
sudo ln -s /etc/nginx/sites-available/ws-app /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d ws.app.example.com # pasang HTTPS di subdomain ini juga — lihat deploy-laravel.md
Setelah subdomain-nya HTTPS, update .env: REVERB_HOST=ws.app.example.com, REVERB_PORT=443, REVERB_SCHEME=https — dan value yang sama di sisi frontend (config Laravel Echo, biasanya VITE_REVERB_*).
3. Task Scheduler (cron)
Scheduler Laravel ($schedule->... di kode) butuh satu entri cron yang manggil schedule:run tiap menit — jadwal sebenarnya didefinisikan di kode, bukan di crontab. Pasang di crontab milik laravelapp (bukan root), konsisten sama model 1-user-per-project:
sudo -u laravelapp crontab -e
Tambahkan baris:
* * * * * cd /home/laravelapp/app && php artisan schedule:run >> /dev/null 2>&1
Cek jadwal yang terdaftar & kapan berikutnya jalan tanpa nunggu cron:
sudo -iu laravelapp
cd app
php artisan schedule:list
php artisan schedule:run # jalankan manual sekali buat tes
exit