Laravel Forge
Laravel Forge
On Forge, the autoscaler is just another Daemon. It runs like any other Laravel long-running process.
1. Add the Daemon
In your Forge site: Daemons → Add New Daemon
| Field | Value |
|---|---|
| Command | php /home/forge/your-app.com/current/artisan queue:autoscale |
| User | forge |
| Directory | /home/forge/your-app.com/current |
| Processes | 1 |
| Stop Wait Seconds | 60 |
| Stop Signal | SIGTERM |
Click Create. Forge starts it immediately.
2. Remove any competing Queue Workers
Forge has a separate Queue Workers section. Delete any entry whose queues the autoscaler will manage. Two worker supervisors on one queue will fight:
- The autoscaler spawns
queue:work --queue=payments - Forge's queue worker UI also spawns
queue:work --queue=payments - Both claim the same jobs; unpredictable behaviour follows
You can keep Forge queue workers for queues you list in queue-autoscale.excluded. That's exactly what the excluded config is for — see Queue Topology.
3. Deploys
Add this after the new release is active and migrations/config-cache steps are done:
php artisan queue:autoscale:restart
The command works like Laravel's queue:restart: it writes a cache signal, the running autoscale manager notices it on the next evaluation tick, gracefully stops spawned workers, and exits. Forge's Daemon supervisor then relaunches php artisan queue:autoscale from the current release.
For a manual graceful restart, run:
php artisan queue:autoscale:restart
If the manager is wedged and does not exit, use Forge's Daemons → Restart button or sudo supervisorctl restart daemon-<daemon-id> as an operational fallback.
4. Verify
Forge → Daemons shows the process status. Inspect logs via Forge's log viewer, or SSH:
tail -f /home/forge/.forge/daemon-<id>.log
You should see Autoscale manager started shortly after deploy, then periodic worker-spawn/terminate activity once jobs arrive.
Gotchas
.envchanges don't propagate without a Daemon restart. Forge does this automatically after "Update Secrets" in the UI.- PHP version mismatch. Forge servers usually run multiple PHP versions. Make sure the Daemon command uses the same
phpbinary your web layer uses (php8.3or similar if you pin a specific version). - Long-running manager holds old code until restart. A fresh deploy that changes scaling thresholds won't take effect until the Daemon restarts. Keep
php artisan queue:autoscale:restartin the deploy script.