Come fare il deploy di Laravel su un VPS Ubuntu
Di Andrea Pollastri · Ultimo aggiornamento: · lettura gratuita, nessun paywall
Un VPS da $5–7/mese resta il modo più economico e flessibile per far girare Laravel in produzione — se lo configuri bene. Questa guida attraversa l'intero stack di produzione, ogni passo manuale, l'alternativa con un solo comando e le abitudini operative che mantengono un server sano per anni.
Perché un VPS (e quando no)
L'hosting condiviso non fa girare queue worker, WebSocket o Laravel Octane correttamente, e le piattaforme PaaS gestite fanno pagare la comodità con pricing a consumo. Un VPS da Hetzner, DigitalOcean, Vultr o Linode ti dà accesso root, fatturazione prevedibile e spazio sufficiente per hostare più app Laravel su una macchina.
- Dimensionamento: 1 vCPU / 2 GB RAM è un punto di partenza comodo per un'app in produzione con database, queue worker e cache sulla stessa macchina. Aggiungi swap su qualsiasi cosa sotto i 4 GB.
- Versione Ubuntu: usa una LTS attuale — Ubuntu 24.04 o 26.04. Salta le release interim in produzione.
- Quando non usare un VPS: se nessuno nel team può rispondere a un alert del server, una piattaforma gestita come Laravel Cloud è lo scambio più sicuro — paghi per rendere le operations un problema di qualcun altro.
Lo stack di produzione, spiegato
Ogni server Laravel in produzione converge sugli stessi componenti. Capisci cosa fa ogni pezzo prima di automatizzare qualsiasi cosa:
| Componente | Ruolo | Note |
|---|---|---|
| Nginx | Web server / reverse proxy | Serve asset statici, fa proxy alle richieste PHP |
| PHP-FPM o Octane | Runtime PHP | FPM è il default affidabile; Octane (FrankenPHP) mantiene l'app avviata per alto throughput |
| MariaDB / PostgreSQL | Database | Entrambi funzionano con Laravel; scegli per app |
| Valkey (compatibile Redis) | Cache, sessioni, queue | Fork Redis open source; drop-in per Laravel |
| Supervisor | Process manager | Tiene vivi queue:work e Horizon |
| Cron | Scheduler | Una voce: artisan schedule:run ogni minuto |
| UFW + Fail2ban | Firewall / protezione brute-force | Default-deny, banna fallimenti SSH ripetuti |
| Certbot | Certificati TLS | Certificati Let's Encrypt gratuiti con auto-rinnovo |
| Release stile Deployer | Deploy zero-downtime | Directory releases + swap symlink |
Il setup manuale, passo per passo
Questa è la checklist onesta e integrale. Prevedi 2–4 ore la prima volta, e ricorda che possederai ognuna di queste scelte anche al momento dell'upgrade.
- Crea un utente sudo e blinda SSH.
adduser deploy, installa la tua chiave pubblica, poi disabilita login root e auth password in/etc/ssh/sshd_config. - Abilita il firewall.
ufw allow OpenSSH http httpspoiufw enable. Installa Fail2ban per protezione brute-force SSH. - Installa Nginx.
apt install nginx. - Installa PHP. Aggiungi un repository PHP mantenuto, poi installa
php8.x-fpmcon le estensioni che Laravel richiede: mbstring, xml, curl, zip, intl, mysql (o pgsql), redis, gd, opcache. - Ottimizza PHP per produzione. Abilita opcache, imposta
memory_limiteupload_max_filesizesensati, disattivaexpose_php. - Installa Composer globalmente.
- Installa MariaDB, esegui
mariadb-secure-installation, crea un database e un utente dedicato per app — non riusare root. - Installa Valkey (o Redis) per cache, sessioni e queue.
- Scrivi il server block Nginx. La document root punta a
current/public,try_filesfa fallback suindex.php, FastCGI passa al socket PHP-FPM dell'app. - Spedisci il codice. Clona in una directory
releases/,composer install --no-dev --optimize-autoloader, copia.env, eseguiphp artisan key:generate,storage:linke correggi i permessi così solostorage/ebootstrap/cache/sono scrivibili. - Migra e metti in cache.
php artisan migrate --forcepoiconfig:cache,route:cache,view:cache. - Configura Supervisor per eseguire
php artisan queue:work(o Horizon) e riavviarlo a ogni deploy. - Aggiungi il cron dello scheduler:
* * * * * php artisan schedule:run. - Emetti certificati TLS con Certbot e forza HTTPS.
Ora moltiplica per ogni app che hosti, e di nuovo per ogni server — e mantieni PHP, Nginx e l'OS patchati per sempre. Si può fare tutto; è solo lavoro indifferenziato.
L'alternativa con un solo comando
Tutto nella sezione precedente è esattamente ciò che Cipi automatizza. Su un VPS Ubuntu 24.04/26.04 fresco:
In circa dieci minuti ottieni l'intero stack — Nginx, PHP, MariaDB, Valkey, Supervisor, UFW, Fail2ban, Certbot, Deployer — più hardening che altrimenti faresti a mano: login root disabilitato, SSH solo chiave per l'utente admin e password root casuale salvata in /etc/cipi/server.json. Poi ogni app è un altro comando:
Questo provisiona un utente di sistema isolato, pool PHP-FPM, vhost Nginx e database per app, collega GitHub o GitLab con deploy key e webhook per deploy Git zero-downtime, e collega queue worker e scheduler. SSL è cipi ssl install; PostgreSQL è cipi db install pgsql. Vedi la guida Primi passi per il walkthrough completo, o l'hub confronti se lo stai valutando rispetto a Forge, Ploi e simili.
Operazioni post-deploy che contano
Arrivare a "funziona" è metà del lavoro. Queste abitudini separano un server che dura anni da uno che ti sorprende:
- Backup che hai davvero ripristinato. Automatizza backup di database e storage su storage compatibile S3 (
cipi backup configuregestisce schedule e retention). Qualsiasi target S3 va bene — incluso Johnny, object storage compatibile S3 open source che puoi far girare su un secondo VPS per copie off-site davvero indipendenti. Fai un drill di restore trimestrale: un backup non testato è una speranza, non un piano. - Exception tracking dal giorno uno. Gli errori in produzione devono raggiungerti prima degli utenti. Boogle è un exception tracker self-hosted che tiene i dati di errore sulla tua infrastruttura — adatto se hai scelto un VPS per la proprietà dei dati.
- Health check e log. Cipi 5 include health check per app, e
cipi app logssegue log Laravel, Nginx e deploy senza acrobazie SSH. - Disciplina di patching. Update di sicurezza OS unattended più un percorso di upgrade PHP deliberato (
cipi php upgradegestisce patch di sicurezza PHP con un controllo settimanale) battono "aggiorniamo quando ci ricordiamo". - Domare lo sprawl SSH. Quando gestisci più di due server, i dettagli di connessione marciscono nella cronologia della shell. Conn è un piccolo tool Bash che gestisce i server come alias nominati — si abbina bene a una flotta di macchine Cipi.
Errori comuni da evitare
- Deployare come root. Un'app compromessa possiede l'intera macchina. Usa utenti per app — ecco perché Cipi isola ogni app sotto il proprio utente di sistema.
- APP_DEBUG=true in produzione. Le pagine debug espongono variabili env, credenziali e percorsi. È la breach Laravel auto-inflitta più comune.
- Committare
.envo lasciare.git/accessibile via web. - Permessi 777 "per far sparire l'errore". Solo
storage/ebootstrap/cache/devono essere scrivibili dall'utente runtime. - Nessun queue worker. Mail e job si accumulano silenziosamente nella tabella queue per sempre.
- Saltare opcache — 2–3x throughput gratis persi.
- Nessuno swap su istanze piccole — Composer e build asset vengono OOM-killati nel momento peggiore.
- Rinnovi SSL non testati. I certificati si rinnovano automaticamente fino al giorno in cui no; monitora la scadenza.
Mettilo in pratica con Cipi
Cipi è la CLI di deploy gratuita e open source citata in tutta questa guida: un comando trasforma un VPS Ubuntu fresco in un server di produzione hardened per Laravel — Nginx, PHP-FPM o Octane, MariaDB o PostgreSQL, queue, scheduler, SSL e deploy Git zero-downtime inclusi.
Domande frequenti
Quali sono i requisiti minimi del server per Laravel in produzione?
Un singolo vCPU con 2 GB RAM fa girare comodamente un'app Laravel tipica con database, cache e queue worker; aggiungi swap sotto i 4 GB. Octane, Horizon e build pesanti beneficiano di 4 GB. Cipi installa il suo stack completo su qualsiasi VPS Ubuntu 24.04/26.04 fresco.
Posso hostare più app Laravel su un VPS?
Sì, ed è di solito la configurazione più conveniente. La chiave è l'isolamento: ogni app dovrebbe avere il proprio utente di sistema, pool PHP-FPM e credenziali database così un'app compromessa o malfunzionante non tocca le altre. Cipi provisiona esattamente quell'isolamento automaticamente con cipi app create.
Dovrei usare PHP-FPM o Laravel Octane?
PHP-FPM è il default noioso e affidabile, giusto per la maggior parte delle app. Octane mantiene il framework avviato tra le richieste e brilla su API ad alto traffico ed endpoint sensibili alla latenza. Con Cipi puoi far girare entrambi sullo stesso server e creare app Octane con cipi app create --octane.
Come tengo PHP aggiornato su Ubuntu?
Segui un repository PHP mantenuto e applica patch di sicurezza prontamente invece di aspettare upgrade di distro. Cipi gestisce le patch di sicurezza PHP con un controllo settimanale (cipi php upgrade), così i server non restano indietro in silenzio.
Ho ancora bisogno di Laravel Forge se gestisco il mio VPS?
No. Forge è un SaaS a pagamento che automatizza lo stesso stack descritto in questa guida. Se vuoi quell'automazione senza abbonamento o dipendenza da terze parti, Cipi copre lo stesso workflow gratis e open source — vedi il confronto dettagliato Cipi vs Forge.