Pourquoi installer Node.js avec NVM sur un VPS
Node.js est un runtime JavaScript côté serveur utilisé pour déployer des API, des applications web, des bots et des outils en ligne de commande sur un serveur Unix/Linux. Sur un VPS Linux, c'est le runtime de choix pour tout ce qui ne tourne pas en PHP ou Python : serveurs WebSocket, backends Next.js ou Nuxt, scripts d'automatisation, bots Discord.
Les dépôts officiels d'Ubuntu et Debian fournissent un package Node.js souvent en retard de plusieurs versions majeures. Sur un système Unix comme Debian 12, le paquet nodejs pointe encore vers Node.js 18, alors que la version la plus récente en LTS est la 26.x. Ce décalage crée deux problèmes pour l'admin d'un VPS : les correctifs de sécurité arrivent avec du retard, et les frameworks récents refusent de démarrer sur un runtime trop ancien.
NVM (Node Version Manager) résout ce problème. C'est un script Bash téléchargé depuis GitHub qui installe Node.js dans le répertoire personnel de l'utilisateur, sans toucher aux paquets système. Chaque version est isolée dans son propre répertoire sous ~/.nvm/versions/node/. Vous pouvez installer plusieurs versions en parallèle et basculer de l'une à l'autre en une commande. Le principe est le même que pyenv pour Python ou phpenv pour PHP : un gestionnaire de versions par utilisateur, indépendant du système.
Ce tutoriel couvre l'installation de NVM, la gestion des versions du runtime Node.js, la configuration de PM2 pour le process management, et les bonnes pratiques de sécurité pour un VPS de production.
L'actualité rappelle l'importance de garder Node.js à jour : le 21 octobre 2026, le projet Node.js a publié des correctifs pour 10 vulnérabilités sur les branches 26.x, 24.x et 22.x, dont CVE-2026-111497 (Node2Shell), une faille critique (CVSS 9.2) dans le décodeur Brotli permettant une exécution de code à distance. Le CISA a ajouté cette CVE à sa liste de vulnérabilités activement exploitées le 27 octobre 2026. Avec NVM, appliquer ce type de correctif prend une seule commande.
Prérequis
- Un VPS Linux sous Ubuntu 22.04/24.04 LTS ou Debian 12 avec un accès SSH ;
- Un utilisateur non-root avec
sudo(ne jamais exécuter le runtime Node.js en root) ; - Les paquets
curl(ouwget),build-essentialetgitinstallés ; - Un accès SSH sécurisé configuré sur le VPS ;
- Un terminal avec accès en ligne de commande au serveur (toute l'administration se fait en SSH, pas en FTP).
Installez les dépendances de compilation nécessaires à certains packages npm natifs (modules qui contiennent du code C/C++) :
sudo apt update
sudo apt install -y curl build-essential git
Installer NVM
NVM s'installe via un script officiel téléchargé depuis GitHub. La version la plus récente est la v0.40.8 (septembre 2026). Le script crée le répertoire ~/.nvm et ajoute les lignes de chargement à votre fichier de config ~/.bashrc (ou ~/.zshrc si vous utilisez Zsh) :
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.8/install.sh | bash
Rechargez votre shell pour activer NVM :
source ~/.bashrc
Vérifiez l'installation depuis la ligne de commande :
nvm --version
La commande doit afficher 0.40.8. Si le terminal répond nvm: command not found, vérifiez que les trois lignes suivantes sont présentes dans votre fichier de config ~/.bashrc :
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
Installer et gérer les versions Node.js
Installez la dernière version LTS du runtime Node.js. Depuis le 28 octobre 2026, la branche 26.x (nom de code Lithium) est la version Active LTS, la branche 24.x (Krypton) passe en Maintenance LTS, et la branche 22.x (Jod) reste en Maintenance LTS :
nvm install --lts
Pour installer une version spécifique :
nvm install 26
nvm install 24
nvm install 22
Listez les versions installées sur votre VPS :
nvm ls
Basculez entre les versions du runtime :
nvm use 26
nvm use 24
Définissez la version par défaut pour chaque nouveau terminal :
nvm alias default 26
Vérifiez la version active et le chemin de l'exécutable :
node --version
which node
Le chemin doit pointer vers ~/.nvm/versions/node/, pas vers /usr/bin/node. Si le chemin pointe vers /usr/bin, c'est le package système qui répond, pas NVM.
Configurer un fichier .nvmrc par projet
Quand plusieurs projets Node.js tournent sur le même VPS, chacun peut nécessiter une version différente du runtime. Le fichier .nvmrc, placé à la racine du répertoire d'un projet, fixe la version de Node.js à utiliser :
cd /home/nodeapp/mon-projet
echo "26" > .nvmrc
Ensuite, un simple nvm use dans ce répertoire lit le fichier de config et bascule vers la bonne version :
cd /home/nodeapp/mon-projet
nvm use
Cette approche simplifie les scripts de déploiement : le script lit le .nvmrc, active la bonne version, puis lance l'application. Elle garantit aussi que chaque admin qui intervient sur le VPS utilise le même runtime, quel que soit son nvm alias default personnel.
Pour les projets utilisant les modules ES (import/export au lieu de require), vérifiez que la version dans le fichier .nvmrc est compatible : les imports ES natifs sont stables à partir de Node.js 16, mais certaines fonctionnalités récentes nécessitent Node.js 24 ou supérieur.
PM2 : gestion des processus et redémarrage automatique
PM2 est le gestionnaire de processus de référence pour les applications Node.js en production. Il maintient vos applications en vie, les redémarre automatiquement en cas de crash ou de redémarrage du VPS, et fournit des logs centralisés. La version actuelle est PM2 7.1.1 (octobre 2026), compatible avec le runtime Node.js 20 et supérieur.
Installez PM2 globalement via npm (le package manager de Node.js) :
npm install -g pm2
Lancez une application Node.js avec PM2 :
pm2 start app.js --name mon-app
PM2 peut aussi lancer des scripts npm définis dans le fichier package.json du projet :
pm2 start npm --name mon-app -- run start
Commandes de supervision courantes :
pm2 list
pm2 logs mon-app
pm2 monit
pm2 restart mon-app
pm2 stop mon-app
Pour que vos applications redémarrent automatiquement après un reboot du VPS (au boot du système), configurez le démarrage automatique de PM2 via systemd :
pm2 startup systemd
Exécutez la commande affichée par PM2 (elle contient le chemin exact vers votre installation Node.js via NVM). Puis sauvegardez la liste des processus actifs :
pm2 save
Après un redémarrage du VPS, PM2 restaurera automatiquement tous les processus sauvegardés. Vous pouvez redémarrer manuellement l'ensemble des processus avec pm2 restart all.
Sécuriser Node.js sur un VPS Linux
Exécuter une application Node.js sur un VPS Unix exposé à Internet demande les mêmes précautions que tout autre service réseau. Voici les bonnes pratiques à appliquer pour un admin de serveur.
Utilisateur dédié sans privilèges root
Créez un utilisateur système dédié à vos applications Node.js. Si le processus est compromis, l'attaquant n'obtient que les droits de cet utilisateur, pas un accès admin root au serveur :
sudo adduser --disabled-password --gecos "" nodeapp
sudo su - nodeapp
Installez NVM et Node.js dans le répertoire personnel de cet utilisateur. L'application tourne avec des droits minimaux, ce qui limite la surface d'attaque.
Reverse proxy : Nginx ou Apache devant Node.js
N'exposez jamais votre application Node.js directement sur le port 80 ou 443. Utilisez un reverse proxy (Nginx ou Apache) devant le runtime Node.js pour gérer le TLS, la compression et le cache statique. Restreignez les ports ouverts avec UFW :
sudo ufw default deny incoming
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Le port sur lequel écoute Node.js (3000, 8080, etc.) ne doit pas être ouvert dans le pare-feu. Seul le reverse proxy y accède en local. Configurez également Fail2ban pour protéger SSH contre les attaques par force brute.
Désactiver les fonctionnalités inutiles
Pour réduire la surface d'attaque, désactivez ce dont votre application n'a pas besoin :
- Désactivez l'inspecteur de debug (
--inspect) en production : un port de debug ouvert permet l'exécution de code à distance ; - Désactivez les en-têtes qui révèlent la stack technique (le header
X-Powered-Byest envoyé par défaut par Express :app.disable('x-powered-by')) ; - Limitez le nombre de connexions simultanées avec
server.maxConnectionsou via la config du reverse proxy.
Variables d'environnement et fichier .env
Stockez les secrets (clés API, identifiants de connexion à votre base de données MySQL ou PostgreSQL, tokens) dans des variables d'environnement ou un fichier .env à la racine du répertoire du projet. Ne versionnez jamais ce fichier dans Git. PM2 peut charger un fichier d'environnement au démarrage :
pm2 start app.js --name mon-app --env production
Restreignez les permissions du fichier .env pour que seul l'utilisateur dédié puisse le lire :
chmod 600 .env
Maintenir Node.js à jour
Garder le runtime Node.js à jour est la mesure de sécurité la plus importante. La release de sécurité d'octobre 2026 illustre le risque : 10 bugs de sécurité corrigés en une seule fois, dont une exécution de code à distance via le décodeur Brotli intégré (CVE-2026-111497, CVSS 9.2). Les versions corrigées sont v26.12.1, v24.22.1 et v22.23.4.
Avec NVM, installer la version la plus récente de votre branche LTS prend deux commandes en ligne de commande :
nvm install 26 --reinstall-packages-from=26
nvm alias default 26
L'option --reinstall-packages-from réinstalle vos packages globaux (PM2, etc.) dans la nouvelle version. Redémarrez ensuite vos applications PM2 :
pm2 restart all
Automatisez la surveillance des nouvelles releases de sécurité en vous abonnant au flux RSS du blog Node.js ou en surveillant la liste de diffusion nodejs-sec. Combinez cette veille avec les mises à jour automatiques du système pour couvrir l'ensemble de la pile logicielle du VPS.
Auditez régulièrement les dépendances npm de vos projets pour détecter les packages vulnérables :
npm audit
npm audit fix
Paquet système vs NVM : tableau comparatif
| Critère | Paquet système (apt) | NVM |
|---|---|---|
| Version disponible | Dépend de la distribution (souvent Node 18 sur Debian 12) | Toutes les versions, de la 4 à la 26 |
| Délai des correctifs de sécurité | Semaines à mois (attente du mainteneur Debian/Ubuntu) | Le jour même de la release officielle |
| Plusieurs versions en parallèle | Non (une seule version système) | Oui, isolées par répertoire utilisateur |
| Installation par utilisateur | Non (installation système globale, nécessite root) | Oui, sans privilège root |
| Packages globaux npm | Nécessitent sudo npm install -g | Sans sudo, dans le répertoire NVM |
| Basculement entre versions | Impossible sans outils tiers | nvm use 24 |
| Config par projet (.nvmrc) | Non supporté | Oui, un fichier .nvmrc par répertoire |
| Compatibilité PM2 startup | Oui | Oui (chemin NVM dans la commande systemd) |
Conclusion
NVM permet d'installer et de gérer le runtime Node.js proprement sur un VPS Linux, sans dépendre du rythme de mise à jour des dépôts système. Combiné à PM2 pour la supervision des processus et aux bonnes pratiques de sécurité (utilisateur dédié, pare-feu restrictif, reverse proxy Apache ou Nginx, désactivation des fonctionnalités inutiles, mises à jour rapides), votre environnement Node.js de production est à la fois fonctionnel et durci. Pour aller plus loin dans la sécurisation de votre serveur, consultez notre tuto sécuriser un VPS Ubuntu avec SSH, UFW et Fail2ban.
FiveM
Minecraft
Rust
RedM
Hytale