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 :
# 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 --versionLTS 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.
# 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 .envContenu typique du .env :
NODE_ENV=production
PORT=3000
MONGO_URL=mongodb://localhost:27017/mon-app
JWT_SECRET=une-clé-secrète-très-longue-et-aléatoireTestez que l'app démarre correctement :
node server.js
# Vérifiez que c'est OK, puis Ctrl+C3. 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.
# 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 100Fichier de configuration PM2
Plutôt qu'une longue commande, créez un fichier ecosystem.config.js à la racine de votre projet :
nano /var/www/mon-app/ecosystem.config.jsmodule.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',
}]
};# 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 saveCommandes PM2 essentielles
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 logs4. 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.
apt install nginx -y
nano /etc/nginx/sites-available/mon-app.frserver {
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;
}
}ln -s /etc/nginx/sites-available/mon-app.fr /etc/nginx/sites-enabled/
nginx -t && nginx -s reload5. Activer HTTPS
apt install certbot python3-certbot-nginx -y
certbot --nginx -d mon-app.fr -d www.mon-app.frSuivez 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 :
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 50Votre 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.