Solutions / Laravel and PHP
Push to main, and the panel runs composer install, swaps in your encrypted .env, runs php artisan migrate, rotates an atomic symlink, and reloads PHP-FPM with zero dropped requests. Bring any $5 VPS and ship Laravel the boring way.
One-click Laravel deploy
Point a domain at your VPS, click Install Laravel, pick the PHP version, and the panel does the rest. No SSH, no config files, no copy-paste from a Stack Overflow answer from 2019.
The installer ships a sensible Nginx server block, a dedicated php-fpm pool, and a fresh database with a random password stored in your .env. It links storage, generates the app key, and runs the first migration so the welcome page is live on HTTPS the moment Let’s Encrypt hands back a cert.
Every server ships with Composer 2 on the PATH. The installer runs composer create-project, seeds the database with a fresh migration, and wires app key generation so your site is live on HTTPS with a working Artisan command the moment it boots.
Point the site at a GitHub, GitLab, or Bitbucket repo and pick a branch. Every webhook triggers a build, runs your deploy script, and streams logs to the browser. No runners, no self-hosted agents, no GitHub Actions quota burn.
Every site has a terminal pinned to the release directory with the right PHP version active. Run tinker, artisan db:seed, composer scripts, or one-off debugging commands. Every command lands in the audit log.
Queue workers via Supervisor
Open the Queues tab, pick a connection (redis, database, sqs, or sync), set the worker count, pick a memory limit, and click save. The panel writes the Supervisor config, restarts the service, and starts tailing worker logs live to the dashboard.
Workers run as the site user, never as root. The panel sizes worker count against free RAM so you cannot accidentally over-provision a $5 box. Scaling up is a slider, scaling down is a slider, and every change restarts cleanly under Supervisor control.
One Supervisor group per site, with separate programs per queue name. Auto-restart on crash, auto-restart on memory leak, graceful SIGTERM on deploy. You never edit a .conf file by hand, and you never forget the laravel-worker:* restart step.
Click Install Horizon and the panel runs composer require, writes the Supervisor config, gates the dashboard route behind your app auth, and restarts cleanly. Every redeploy runs horizon:terminate so workers reload with the new code.
Scheduled tasks
Flip the Enable Scheduler switch and the panel writes a single cron entry that runs php artisan schedule:run every minute as the correct user. You write your schedule in app/Console/Kernel.php and it runs. Nothing else to set up.
Scheduler output streams into the dashboard with full stdout and stderr, so you see exactly when a nightly report job ran and how long it took. A watchdog pings you if the scheduler goes silent for more than five minutes, which usually means a server ran out of disk or Redis evicted a lock key.
Environment config
Edit env vars in the panel, and we encrypt them at rest with a per-project key. At deploy time the worker decrypts and writes them to the server filesystem only. Rotate a secret and the next deploy picks it up, with a full audit trail of who changed what.
You can paste an entire .env file into the editor, and the panel parses it into typed rows. Mark values as secret to mask them in the UI, pin them to specific branches for preview deploys, and import from Doppler or Vault if your team already lives there.
Every env value is encrypted with a per-project key that lives in a separate keystore. The control plane never writes plaintext secrets to its database, and a stolen database dump leaks ciphertext only.
Keep separate values for staging, production, and preview branches. The deploy worker picks the right set based on the branch or the manual deploy target, and never mixes them up.
Every secret rotation, add, and delete lands in the audit log with the user, the IP, and a diff (keys only, never values). Roll back to any prior version with one click.
PHP version management
PHP 7.4, 8.0, 8.1, 8.2, and 8.3 coexist on every server the panel manages. Pick the version per site from a dropdown. We keep the right php-fpm pools running, each with its own ondemand workers and memory limits.
CLI tools follow the site version too. When you open the browser terminal for a site on PHP 8.1, typing php --version returns 8.1. Composer, artisan, and tinker all run under the same binary, so a legacy site never accidentally picks up an 8.3-only syntax feature.
Each PHP version runs a dedicated php-fpm pool with isolated workers. A memory leak in one site on PHP 8.2 never touches a sibling site on PHP 8.3. Pool size auto-scales based on server RAM.
Change a site from PHP 8.1 to 8.3 by clicking the dropdown. The panel updates the Nginx fastcgi_pass target, reloads Nginx gracefully, and the next request hits the new pool. No restart, no dropped connections.
Zero-downtime deploys
Every release lands in /releases/{timestamp}. The panel symlinks shared storage and .env in, runs migrations, warms OPcache via a curl to the health endpoint, atomically swaps the current symlink, and reloads PHP-FPM. In-flight requests finish on the old release, new ones hit the new one.
The deploy worker runs your deploy.sh hook if you ship one, or uses a sensible default script that covers composer, npm build, migrate, and cache warming. Every step streams logs live, and if any step exits non-zero the symlink never swaps. A failing deploy leaves the live site on the last known good release.
The panel keeps the last five release directories on disk. Rollback walks the current symlink one step back and reloads FPM. No rebuild, no re-install, no waiting.
After the symlink swap, the deploy worker hits your health endpoint a few times to prime OPcache on the new release. The first real user request hits a warm cache, not a cold compile.
Configure a health URL per site. If the new release fails the check after the symlink swap, the panel rolls back automatically and pages you. A broken deploy never serves a 500 for longer than a few seconds.
Horizon and Octane
Horizon and Octane are point-and-click installs, not a 40-step guide with a prayer. Flip a switch and the panel handles composer, Supervisor, Nginx routing, and the graceful restart dance.
Telescope works alongside both for local or staging debugging. The panel gates Telescope behind a server-side IP allowlist by default, so you never ship the debugger to a production visitor. Flip it off in one click when you go live.
Install Horizon once and the panel gates the dashboard behind your app auth, tunes the Supervisor process for your queue throughput, and runs horizon:terminate on every deploy so workers reload with fresh code.
Pick Swoole or FrankenPHP from the Octane panel. We install the binary, write the Supervisor config for the Octane server, update Nginx to proxy to the right port, and restart on deploy. Telescope works alongside it in dev.
Every feature on this page is part of the wider panel. Dig into the pieces that matter to your stack.
FAQ
PHP 7.4, 8.0, 8.1, 8.2, and 8.3 live side by side on the same VPS. Each site picks its version from a dropdown, and we run a dedicated php-fpm pool per version with its own memory limit and worker count. Switching versions is a click, and the panel reloads fpm cleanly so no request gets dropped.
Yes. Click Install Horizon on any site, and we run the composer requires, write the Supervisor config, register the dashboard route behind your app auth, and restart the process. You get the queue throughput UI without touching a config file, and every redeploy restarts Horizon cleanly.
Supervisor auto-restarts crashed workers. The panel tails worker logs live in the browser, pages you in Slack or Discord on repeated failures, and shows memory graphs per worker. Failed jobs land in the failed_jobs table as usual, and you can retry them from the UI without SSH.
You edit env vars in the panel, and we store them encrypted at rest with a per-project key. At deploy time the worker decrypts and writes .env to the server filesystem only. Secrets never enter git, never enter CI, and never show up in build logs. Rotate a value and the next deploy picks it up.
Yes. Every server has a browser terminal pinned to the site directory with the correct PHP version active. Run tinker, artisan commands, or composer scripts directly. For team safety, tinker access is role-gated and every command is logged to the audit trail with the user who ran it.
Connect your existing Forge server to the panel as an unmanaged node, and we import your sites, deploy scripts, and env vars. Run a test deploy on a staging site first, confirm the atomic symlink flow matches what you expect, then flip your DNS or webhook. Most teams finish the move in under an hour.