Molixa Forge

Solutions / Laravel and PHP

Laravel Hosting Panel for Your VPS

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.

  • PHP 7.4 through 8.3 on the same server
  • Supervisor queue workers and Horizon install
  • Zero-downtime atomic releases built in
  • Free tier covers one server and one site

One-click Laravel deploy

Install a fresh Laravel site in under a minute

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.

Composer baked in

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.

Git-based on every push

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.

Browser terminal per site

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

Queues that restart themselves

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.

Supervisor, set up right

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.

Horizon, one click away

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

One cron entry, every schedule

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.

  • Single crontab line, owned by the site user, not root
  • Scheduler output tees to /logs/schedule.log, visible in the browser
  • Lock files so overlapping runs do not double-fire
  • Pager alert if scheduler silences for over 5 minutes

Environment config

Encrypted .env, rotated on deploy

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.

AES-256 at rest

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.

Per-environment values

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.

Audit every change

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

Five PHP versions, one server

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.

Dedicated FPM pool per version

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.

Switch with no downtime

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

Atomic releases, rollback in one click

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.

Five rolling releases

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.

OPcache prewarm

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.

Health gate

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

First-class support for 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.

Horizon dashboard wired up

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.

Octane with Swoole or FrankenPHP

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.

Keep exploring the platform

Every feature on this page is part of the wider panel. Dig into the pieces that matter to your stack.

FAQ

Laravel hosting panel questions

Which PHP versions does the Laravel hosting panel support?

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.

Does the panel set up the Horizon dashboard for me?

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.

What happens when a queue worker fails or runs out of memory?

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.

How do you keep .env secrets safe during deploys?

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.

Can I run php artisan tinker from the panel?

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.

How do I migrate from Laravel Forge without breaking my deploys?

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.

Ship Laravel apps the easy way

Laravel Hosting Panel for Your VPS | Molixa Forge · Molixa Forge