Pourquoi déployer Node.js sur un VPS plutôt que sur une plateforme managée ?
Les plateformes serverless et PaaS sont pratiques au démarrage mais leur coût grimpe avec le trafic, et elles imposent des contraintes (timeouts, cold starts, limites de connexions WebSocket). Un VPS vous donne un process Node.js persistant, des connexions longues (WebSocket, SSE) sans limite artificielle, des ressources dédiées et un coût fixe prévisible. Vous décidez de la version de Node, du gestionnaire de processus, du reverse proxy et de la stratégie de mise à jour, sans dépendre des conventions d'un fournisseur.
Ce que vous gagnez avec un VPS pour Node.js
- Process Node.js persistant, idéal pour WebSocket, SSE et tâches longues sans cold start
- Redémarrage automatique en cas de crash et au reboot du serveur grâce à PM2
- Mode cluster pour exploiter tous les cœurs CPU du VPS sans changer votre code
- Reverse proxy Nginx devant Node pour le HTTPS, la compression et les fichiers statiques
- Coût fixe et prévisible, sans facturation à la requête ni surprise de scaling
- Contrôle total de la version de Node.js et des dépendances système
Prérequis
Une application Node.js standard (API Express, Nest, Fastify) tourne confortablement sur un VPS de 1 à 2 vCPU et 1 à 2 Go de RAM ; prévoyez davantage de RAM si vous compilez un front lourd au build ou exécutez des workers. Installez Node.js via nvm ou le dépôt NodeSource pour figer une version LTS, ainsi que PM2 comme gestionnaire de processus et Nginx comme reverse proxy. Il vous faut un domaine pointant vers l'IP du VPS et les ports 80/443 ouverts.
Déployer une application Node.js en production
Préparer le VPS et installer Node.js
Sur un VPS Ubuntu 22.04, mettez le système à jour et installez une version LTS de Node via nvm (nvm install --lts) ou le dépôt NodeSource. Vérifiez : node -v et npm -v. Créez un utilisateur non-root dédié à l'application plutôt que de tout exécuter en root.
Récupérer le code et builder
Clonez votre dépôt sur le VPS, installez les dépendances de production (npm ci --omit=dev) et lancez le build si nécessaire (npm run build). Placez les variables sensibles dans un fichier .env non commité ou dans les variables d'environnement du service.
Lancer l'application avec PM2
Installez PM2 globalement (npm install -g pm2) puis démarrez l'app : pm2 start app.js --name monapp -i max. Le flag -i max active le mode cluster sur tous les cœurs. PM2 relance automatiquement le process en cas de crash.
Activer le démarrage automatique au boot
Générez le script systemd avec pm2 startup, exécutez la commande affichée, puis figez l'état actuel avec pm2 save. Au prochain redémarrage du VPS, votre application sera relancée automatiquement, sans intervention.
Configurer Nginx en reverse proxy
Installez Nginx et créez un virtual host pour votre domaine qui proxifie vers le port local de Node (ex : proxy_pass http://localhost:3000;). Ajoutez les en-têtes Upgrade et Connection si vous utilisez les WebSocket. Testez la conf (nginx -t) puis rechargez.
Sécuriser en HTTPS avec Let's Encrypt
Installez Certbot et son plugin Nginx, puis exécutez certbot --nginx -d votredomaine.com. Certbot obtient le certificat, configure la redirection HTTP→HTTPS et programme le renouvellement automatique. Votre application Node est désormais servie en HTTPS.
Pour des déploiements sans interruption, combinez PM2 en mode cluster avec pm2 reload monapp plutôt que restart : PM2 redémarre les workers un par un, gardant toujours au moins une instance disponible pendant la mise à jour. Surveillez ensuite la mémoire avec pm2 monit et fixez une limite de redémarrage automatique (--max-memory-restart 500M) pour prévenir les fuites mémoire en production.