Every PHP developer eventually hits the same wall: your app is ready to ship, but the server setup is a weekend project in itself. Laravel Forge solved this beautifully — but at a per-server monthly cost that adds up fast. Vito does everything Forge does, runs on your own hardware, and costs nothing beyond the VPS you are already paying for.
What is Vito?
Vito is a self-hosted server management and deployment platform built with Laravel. You install it once on a dedicated VPS, then use it to provision and manage as many other servers as you need — deploying PHP and Laravel applications, managing databases, configuring SSL, setting up cron jobs, controlling firewalls, and monitoring queues, all from one dashboard.
“Vito is a self-hosted web application that helps you manage your servers and deploy your PHP applications into production servers without a hassle.”
Vito Source Code on GitHub Vito Documentation Live Demo
Why PHP developers choose Vito
- 🚀 Deploy Laravel apps in seconds — git push triggers zero-downtime deployment pipelines
- 🖥️ Provision servers directly from DigitalOcean, Hetzner, AWS, Vultr, and more — or bring your own VPS
- 🗄️ Database management — create and manage MySQL and MariaDB databases and users from the UI
- 🔒 SSL made easy — Let’s Encrypt certificates with one click, or paste your own
- 🔥 Firewall control — manage UFW rules without touching the terminal
- ⏱️ Cron jobs — create and manage cron entries on any managed server from the UI
- 🔔 Notifications — Slack, Discord, Telegram, email alerts for deployments and events
- 🧩 Plugin system — extend with community or custom plugins
- 🔄 Workflows — visual pipeline editor for complex multi-step deployments
- ⚖️ AGPL-3.0 licensed — fully open source, self-hosted forever
Vito Tech Overview
Vito is a Laravel 12 / PHP 8.4 application. The frontend is built with React 19 via Inertia.js — meaning there is no separate API for the UI; PHP controllers return Inertia responses that React renders client-side, giving a SPA feel with server-side routing.
How it manages servers
The key technology is PHPSecLib — a pure PHP SSH2 implementation. Vito opens SSH connections to your managed servers and runs shell commands directly, the same way a sysadmin would. This means your target servers need only SSH access — no agents, no Docker, no sidecars.
When you trigger a deployment, Vito dispatches Laravel jobs to a Redis-backed Horizon queue. Workers pick them up and execute SSH commands in sequence: pull the latest code, run composer install, rebuild assets, symlink the new release, restart Horizon workers. All of this is logged and visible in real time in the dashboard.
Stack at a glance
| Layer | Technology |
|---|---|
| Backend | Laravel 12, PHP 8.4 |
| SSH | PHPSecLib 3 (pure PHP, no system ssh binary needed) |
| Queue | Laravel Horizon + Redis |
| Database | SQLite (zero external dependency) |
| Auth | Laravel Fortify + Sanctum API tokens |
| Frontend | React 19 + Inertia.js + TailwindCSS 4 |
| UI components | shadcn/ui (Radix UI) |
| Workflow editor | React Flow |
| Charts | Recharts |
The SQLite default is intentional — Vito itself is not a data-heavy application. Switching to MySQL or PostgreSQL is supported for larger installations.
Self-Hosting Vito with Docker
Get Docker 🐋
Install Docker on your system before proceeding:
- Linux: Official Docker Engine install guide
- Windows / Mac: Docker Desktop
Verify installation: docker --version && docker compose version
Vito ships a fully self-contained Docker image. Everything — Nginx, PHP-FPM, Redis, Supervisor, and the Laravel Scheduler cron — runs inside a single Ubuntu 24.04 container. No external database required.
services:
vito:
image: ghcr.io/vitodeploy/vito:3.x
container_name: vito
environment:
NAME: "Your Name"
EMAIL: "[email protected]"
PASSWORD: "change_this_password"
APP_KEY: "base64:UodiJrx3DkcMlizmoimNlDn+yd4q5f2VbkBay19rJwM="
APP_URL: "http://your-server-ip:8000"
APP_PORT: 8000
extra_hosts:
- 'host.docker.internal:host-gateway'
ports:
- '8000:80'
volumes:
- vito-storage:/var/www/html/storage
restart: unless-stopped
volumes:
vito-storage:
Start it:
docker compose up -d
Then open http://your-server-ip:8000 and log in with the EMAIL and PASSWORD you set.
Generate a fresh APP_KEY before going to production:
docker run --rm ghcr.io/vitodeploy/vito:3.x php artisan key:generate --show
Paste the output as the APP_KEY value.
What runs inside the container
| Process | Managed by |
|---|---|
| Nginx | Supervisor |
| PHP-FPM 8.4 | Supervisor |
| Redis | Supervisor |
php artisan horizon (queue worker) |
Supervisor |
php artisan schedule:run (every minute) |
Cron |
The /var/www/html/storage volume persists your SQLite database, logs, and file storage across container restarts. Back this volume up.
Install directly on a VPS (recommended for production)
For production, the bare-metal install is simpler to maintain — one less container layer, and SSH key management is easier when Vito runs natively on the server:
bash <(curl -Ls https://raw.githubusercontent.com/vitodeploy/vito/3.x/scripts/install.sh)
The install script runs on Ubuntu 22.04/24.04 and sets up:
- PHP 8.4 + all extensions
- Nginx
- Redis
- Supervisor (managing Horizon + scheduler)
- Vito itself with an admin account
After install, Vito is available on port 80 of your server.
Setting up email notifications (SMTP)
Add to your docker-compose.yml environment block:
environment:
MAIL_MAILER: smtp
MAIL_HOST: smtp.yourdomain.com
MAIL_PORT: 587
MAIL_USERNAME: [email protected]
MAIL_PASSWORD: your_smtp_password
MAIL_ENCRYPTION: tls
MAIL_FROM_ADDRESS: [email protected]
MAIL_FROM_NAME: Vito
Vito will send deployment success/failure notifications, server alerts, and team invitations via email. You can also configure Slack, Discord, or Telegram channels per project in the UI.
Deploying Your First Laravel App
Once Vito is running:
-
Add a server — connect an existing VPS via SSH credentials, or provision a new one from a supported cloud provider. Vito installs Nginx, PHP, MySQL/MariaDB, and Supervisor automatically.
-
Add a source control provider — connect GitHub, GitLab, or Bitbucket under Settings → Source Control. Vito uses this to clone your repository and set up deploy webhooks.
-
Create a site — point a domain at the server, choose your PHP version, and select your repository. Vito creates the Nginx vhost, configures the document root, and sets up your
.envfile. -
Deploy — click “Deploy” in the UI, or push to your configured branch to trigger an automatic deployment. Vito pulls the code, runs
composer install, executes your deployment script, and zero-downtime swaps the release.
The deployment script is fully customisable — add php artisan migrate, npm run build, php artisan horizon:terminate, or anything else your app needs.
Conclusion
Vito fills a real gap for the PHP and Laravel community: a self-hosted server management platform that matches the features of commercial services like Forge and Ploi, without the per-server subscription cost. The SQLite default and single-container Docker setup make it genuinely easy to get running in under five minutes.
The plugin system and visual workflow editor give it room to grow beyond simple deployments into CI/CD territory — making it a solid long-term investment for teams running their own infrastructure.
Alternatives worth comparing:
- Laravel Forge — the gold standard, cloud-hosted, per-server pricing, tightest Laravel integration
- Ploi — similar to Forge, supports more languages, cloud-hosted
- Coolify — self-hosted, Docker/Kubernetes focused, broader language support but less PHP-native
- Deployer — PHP CLI deployment tool, no UI or server provisioning
Frequently Asked Questions
Does Vito deploy Docker containers to my servers?
No — Vito manages bare VPS instances via SSH, installing Nginx, PHP-FPM, and MySQL directly on the OS. If you want to deploy Docker containers, Coolify is a better fit. Vito’s strength is traditional LEMP-stack PHP deployments.
Which cloud providers does Vito support for server provisioning?
DigitalOcean, Hetzner, AWS, Vultr, and Linode — plus any existing server accessible via SSH (custom provider). You can add servers from multiple providers in the same Vito instance.
Can I manage Node.js or Python apps?
Vito is PHP-first. You can run custom scripts in deployments, but the built-in features (PHP version management, Composer, Artisan commands) target PHP/Laravel. For polyglot deployments, Coolify or Dokku are better suited.
How many servers can one Vito instance manage?
There is no hard limit. Vito itself is lightweight (SQLite + PHP) and the bottleneck will be your Vito host’s RAM and the speed of SSH connections, not application logic.
Is there a Vito SaaS version?
No — Vito is exclusively self-hosted. The team does not offer a managed cloud version, keeping the project fully FOSS.
How do I back up my Vito data?
Back up the /var/www/html/storage directory (Docker: the vito-storage volume). It contains the SQLite database, logs, and any file uploads. A daily docker run --rm -v vito-storage:/data busybox tar czf /backup/vito-$(date +%F).tar.gz /data cron job is sufficient.
Comments