1. Installer Node.js avec NVM

NVM (Node Version Manager) est la façon recommandée d'installer Node.js sur un serveur. Il permet de gérer plusieurs versions de Node.js en parallèle et évite les problèmes de permissions liés à l'installation système.

Sur votre VPS :

bash
# Télécharger et installer NVM curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # Recharger le shell pour que NVM soit disponible source ~/.bashrc # Vérifier que NVM est installé nvm --version # Installer la version LTS de Node.js (Long Term Support = stable) nvm install --lts nvm use --lts # Définir cette version comme défaut nvm alias default node # Vérifier node --version npm --version
💡

LTS vs Current : La version LTS (Long Term Support) est maintenue pendant 3 ans et reçoit des correctifs de sécurité réguliers. C'est toujours le bon choix pour la production. La version "Current" a les dernières fonctionnalités mais est moins stable.

2. Déployer votre code

Plusieurs méthodes pour mettre votre code sur le VPS. La plus propre pour du déploiement continu : Git.

bash
# Installer Git si pas déjà installé apt install git -y # Cloner votre dépôt git clone https://github.com/votre-user/mon-app.git /var/www/mon-app cd /var/www/mon-app # Installer les dépendances (--omit=dev n'installe pas devDependencies) npm install --omit=dev # Créer votre fichier .env de production nano .env

Contenu typique du .env :

bash
NODE_ENV=production PORT=3000 MONGO_URL=mongodb://localhost:27017/mon-app JWT_SECRET=une-clé-secrète-très-longue-et-aléatoire

Testez que l'app démarre correctement :

bash
node server.js # Vérifiez que c'est OK, puis Ctrl+C

3. PM2 : le gestionnaire de processus

Si vous lancez votre app avec node server.js et fermez le terminal, l'app s'arrête. PM2 (Process Manager 2) résout ça : il fait tourner votre app en arrière-plan, la redémarre automatiquement si elle plante, et la relance au reboot du serveur.

bash
# Installer PM2 globalement npm install -g pm2 # Lancer l'application pm2 start server.js --name mon-app # Voir l'état de vos apps pm2 status # Voir les logs en temps réel pm2 logs mon-app # Voir les logs des dernières lignes pm2 logs mon-app --lines 100

Fichier de configuration PM2

Plutôt qu'une longue commande, créez un fichier ecosystem.config.js à la racine de votre projet :

bash
nano /var/www/mon-app/ecosystem.config.js
javascript
module.exports = { apps: [{ name: 'mon-app', script: 'server.js', // Mode cluster : utilise tous les coeurs CPU disponibles instances: 'max', exec_mode: 'cluster', // Redémarre automatiquement si la RAM dépasse 500Mo max_memory_restart: '500M', // Redémarre si l'app plante restart_delay: 3000, // Variables d'environnement env: { NODE_ENV: 'production', PORT: 3000 }, // Logs log_date_format: 'YYYY-MM-DD HH:mm:ss', error_file: '/var/log/pm2/mon-app-error.log', out_file: '/var/log/pm2/mon-app-out.log', }] };
bash
# Créer le dossier de logs mkdir -p /var/log/pm2 # Démarrer avec le fichier de config pm2 start ecosystem.config.js # Activer le démarrage automatique au boot du serveur pm2 startup # Copiez-collez la commande affichée (elle ressemble à "sudo env PATH=...") pm2 save

Commandes PM2 essentielles

bash
pm2 status # Voir toutes les apps et leur état pm2 restart mon-app # Redémarrer une app (0 downtime en mode cluster) pm2 reload mon-app # Rechargement gracieux (recommandé en prod) pm2 stop mon-app # Arrêter une app pm2 delete mon-app # Supprimer une app de PM2 pm2 logs mon-app # Voir les logs pm2 monit # Interface de monitoring temps réel pm2 flush # Vider tous les fichiers de logs

4. Exposer l'app avec Nginx

Votre app tourne sur 127.0.0.1:3000 (accessible uniquement localement). Nginx va l'exposer sur votre domaine en HTTPS.

bash
apt install nginx -y nano /etc/nginx/sites-available/mon-app.fr
nginx
server { listen 80; server_name mon-app.fr www.mon-app.fr; location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; # Transmettre les vraies infos du client à Node.js proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # Support WebSocket (Socket.IO) proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_cache_bypass $http_upgrade; # Timeout généreux pour les longues requêtes proxy_read_timeout 90; } }
bash
ln -s /etc/nginx/sites-available/mon-app.fr /etc/nginx/sites-enabled/ nginx -t && nginx -s reload

5. Activer HTTPS

bash
apt install certbot python3-certbot-nginx -y certbot --nginx -d mon-app.fr -d www.mon-app.fr

Suivez les instructions. Certbot configure automatiquement le SSL et la redirection HTTP → HTTPS.

6. Déploiement d'une mise à jour

Quand vous avez une nouvelle version à déployer :

bash
cd /var/www/mon-app # Récupérer les nouvelles modifications git pull origin main # Installer les nouvelles dépendances si nécessaire npm install --omit=dev # Recharger l'app sans downtime (mode cluster) pm2 reload mon-app # Vérifier que tout va bien pm2 status pm2 logs mon-app --lines 50

Votre app Node.js est en production. PM2 la maintient active 24h/24 et la redémarre automatiquement en cas de problème. Nginx gère le HTTPS et peut équilibrer la charge entre plusieurs instances. Prochaine étape : mettre en place un pipeline CI/CD pour automatiser les déploiements.