Laravel Horizon on one VPS: queue discipline for a CMS that sends mail and images
Short answer: aviwebsquad.in runs Horizon on the same VPS as nginx because queue volume is modest—media conversions, mail, and occasional imports—not millions of jobs/hour.
Queues on this stack
| Job type | Queue | Notes |
|---|---|---|
| Spatie image conversions | default |
CPU-heavy; timeout > longest conversion |
| Contact form mail | mail |
isolated so bulk work does not delay |
| Future: newsletter sends | newsletter |
rate-limited |
Supervisor settings (pragmatic)
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default', 'mail'],
'balance' => 'auto',
'maxProcesses' => 3,
'tries' => 3,
],
],
On a 2 vCPU box, maxProcesses: 3 is already aggressive when Vite builds run on deploy.
Horizon auth
Gate viewHorizon restricts dashboard to admin users—never public /horizon.
Monitoring hooks
horizon:snapshotin scheduler- Pulse slow jobs card
- Telemetry basics for log correlation
When I would split workers
Traffic 10× or dedicated newsletter bursts—until then, CI/CD deploy script restarts Horizon after release.
FAQ
Redis on aaPanel?
Installed via panel app store; bind localhost only.
Failed jobs pile up?
horizon:purge after fixing bug; do not silence LongWaitDetected without investigation.
Related: scheduling posts
Published_at scheduling does not use queues—DB time comparison only.
Maintenance note (Sep 2026)
Re-validated internal links and examples against the live aviwebsquad.in CMS after the Hostinger migration; guidance in this article still matches production.