deploy
Perché la tua app funziona in locale ma non sul server
Una guida in parole semplici sul perché un’app funziona in locale ma non in produzione, e su come trovare l’assunzione mancante.
La tua applicazione funziona perfettamente in ambiente di sviluppo locale, ma va in crash non appena riceve il traffico degli utenti sul server di produzione. È una situazione frustrante, perché sembra che lo stesso codice abbia cambiato comportamento all'improvviso.
In breve: Un'applicazione funziona in locale ma fallisce sul server perché l'ambiente di produzione presenta condizioni differenti: variabili d'ambiente distinte, regole di rete dedicate, percorsi dei file e permessi specifici, versioni software disallineate e traffico pubblico. La soluzione consiste nel verificare metodicamente le configurazioni dei due ambienti, analizzare i log di sistema, controllare il binding delle porte, l'accesso al database, la gestione dei domini, i certificati HTTPS e la presenza dei servizi in background. Nella maggior parte dei casi non si tratta di un malfunzionamento del server, ma della mancanza di una dipendenza o configurazione che il computer di sviluppo forniva in automatico.
Perché si verifica il problema "sul mio computer funziona"?
L'ambiente di sviluppo locale è un contesto altamente permissivo: include la sessione utente attiva, le credenziali salvate, il database di test, la struttura delle directory, i tool di sviluppo e il browser già indirizzato alla porta corretta.
Un server di produzione richiede invece una configurazione esplicita. Esegue l'applicazione in modo isolato, basandosi esclusivamente sulle istruzioni e sulle risorse fornite durante il deployment.
Il motivo per cui un'app funziona in locale ma fallisce in produzione è quasi sempre riconducibile al contesto di esecuzione. Lo sviluppo in locale è paragonabile a cucinare nella propria cucina, dove ogni strumento ha una collocazione nota. La produzione equivale a lavorare in una cucina professionale in affitto: la ricetta è la medesima, ma cambiano gli strumenti, i collegamenti e la disposizione delle risorse.
Di conseguenza, un codice corretto può generare errori se le condizioni dell'infrastruttura sottostante non coincidono.
Quali variabili cambiano nel passaggio al server?
La prima discrepanza riguarda le variabili d'ambiente. Si tratta dei parametri di configurazione che l'applicazione legge dall'esterno, come credenziali del database, API key, modalità di esecuzione, parametri SMTP o chiavi di cifratura. In locale questi valori sono spesso memorizzati in file nascosti (es. .env) o nella shell utente. Sul server devono essere definiti esplicitamente nell'ambiente di runtime dell'applicazione.
La seconda differenza riguarda l'accesso e l'instradamento di rete. Nel computer di sviluppo, l'host localhost indica la macchina locale su cui risiedono sia l'applicazione che il database. Sul server, localhost si riferisce all'istanza remota stessa e non al computer locale o a un servizio database gestito esternamente. Questo disallineamento genera tipicamente errori di connessione come ECONNREFUSED o could not connect to server.
La terza variabile concerne i percorsi dei file e i permessi di scrittura. L'applicazione potrebbe tentare di salvare caricamenti utente, file di cache o log all'interno di directory non esistenti sul server, oppure presenti ma prive dei permessi di scrittura corretti per l'utente di sistema che esegue il processo. Tali condizioni generano errori di tipo permission denied o ENOENT (no such file or directory).
La quarta differenza è rappresentata dal disallineamento delle versioni software. Una discrepanza tra le versioni di Node.js, Python, PHP, Ruby o delle librerie di sistema tra l'ambiente locale e il server può causare eccezioni come module not found, errori di build o schermate bianche in esecuzione.
L'adozione dei container Docker riduce queste difformità isolando le dipendenze, ma richiede comunque la corretta configurazione di domini, certificati SSL, porte di rete e volumi di archiviazione. Per approfondire l'uso dei container, è disponibile la nostra guida su Docker su un server per principianti.
Perché il sito viene caricato ma presenta errori nelle funzionalità?
Può accadere che il dominio risponda e la pagina principale sia visibile, ma l'applicazione generi errori durante l'autenticazione, il caricamento di file, l'invio di moduli o le chiamate API. Questo indica che il layer di rete principale è attivo, ma i servizi interni non comunicano correttamente.
Un errore comune è il 502 Bad Gateway. Questo stato indica generalmente che il reverse proxy (web server) riceve correttamente il traffico internet, ma non riesce a instradare la richiesta verso il processo dell'applicazione sottostante, che potrebbe essere arrestato, in ascolto sulla porta errata o in crash.
Un'altra problematica frequente è la presenza di contenuto misto (Mixed Content). Se l'applicazione viene servita tramite protocollo HTTPS ma effettua chiamate API verso endpoint http:// non sicuri, il browser bloccherà le richieste per ragioni di sicurezza. Per un'analisi dettagliata sui vari livelli di rete, consulta il nostro articolo su perché un sito non si carica.
I worker in background rappresentano un altro punto critico: in ambiente locale i processi per la gestione delle code, l'invio di email o i task schedulati vengono spesso avviati manualmente, mentre in produzione richiedono demoni dedicati a lunga esecuzione per funzionare continuamente.
Come effettuare la diagnosi senza procedere per tentativi
Per individuare l'origine dell'errore è consigliabile adottare una procedura di analisi strutturata:
- Analisi dei log applicativi: Consultare prioritariamente i file di log dell'applicazione e del web server, che riportano la causa esatta del blocco (es. variabili mancanti, fallimento di connessione al database, permessi insufficienti o migrazioni non eseguite).
- Isolamento per livelli: Verificare la catena di comunicazione analizzando individualmente: - La risoluzione DNS del dominio verso il server; - La comunicazione tra web server e applicazione; - La connessione tra applicazione e database; - I permessi di scrittura su disco; - L'accessibilità dei servizi terzi (gateway di pagamento, SMTP, storage esterno).
- Verifica della persistenza ai riavvii: Assicurarsi che i processi siano gestiti da un process manager (come
systemdopm2) in grado di riavviare l'applicazione automaticamente in caso di crash o reboot del server.
Per approfondire le strategie di rilascio senza infrastrutture complesse, puoi leggere la nostra guida su come pubblicare una piccola web app senza DevOps.
FAQ
Perché la mia applicazione funziona in locale ma fallisce in produzione? Il malfunzionamento è dovuto alle differenze tra i due ambienti in termini di variabili d'ambiente, percorsi dei file, permessi di sistema, regole di firewall, versioni delle dipendenze e gestione del traffico di rete.
**Un errore 502 Bad Gateway indica necessariamente un bug nel codice?** No. Indica solitamente che il web server (es. Nginx o Apache) non riesce a comunicare con il processo applicativo sottostante, perché quest'ultimo è fermo, in crash o configurato su una porta errata.
Perché la connessione al database fallisce solo sul server? Può dipendere da parametri di hostname errati, porte di rete bloccate dal firewall, credenziali d'accesso non impostate o dall'omessa esecuzione delle migrazioni dello schema del database.
L'abilitazione di HTTPS può causare malfunzionamenti all'applicazione? Sì. Certificati SSL non validi, catene di certificazione incomplete o chiamate verso endpoint HTTP non protetti (Mixed Content) causano il blocco delle richieste da parte dei browser moderni.
La soluzione intermedia
Server Manager semplifica l'amministrazione delle applicazioni rendendo esplicite le dipendenze e i componenti dell'infrastruttura. L'architettura del sistema — dai domini ai singoli servizi — rimane chiaramente tracciabile, riducendo i rischi di disallineamento delle porte, assenza di certificati SSL o conflitti tra progetti distinti.
Questa struttura consente di mantenere il controllo della configurazione nel tempo, facilitando la manutenzione e la risoluzione di eventuali errori di runtime o di rete anche a distanza di mesi dal deployment iniziale.
Server Manager trasforma la gestione dei server di produzione in un processo ordinato, garantendo la rapida individuazione e risoluzione delle problematiche di configurazione.
Un processo di deployment affidabile si basa sulla standardizzazione dell'ambiente di esecuzione: la corretta isolazione dei segreti, la verifica delle connessioni di rete, la gestione automatica dei certificati HTTPS e la persistenza dei processi garantiscono la stabilità dell'applicazione nel tempo.