Introduction : du serveur local à une solution prête pour la production
\nVous avez créé une puissante application JavaScript avec Node.js, vous l'avez testée localement, et il est maintenant temps de la montrer au monde. Se contenter de télécharger les fichiers sur un VPS et d'exécuter node app.js est la voie du débutant. Au niveau avancé, le déploiement inclut la configuration d'un serveur proxy inverse, d'un gestionnaire de processus, le renouvellement automatique des certificats SSL, un système d'intégration et de livraison continues (CI/CD), ainsi qu'un monitoring et une journalisation appropriés.
Dans cet article, nous allons détailler le processus étape par étape du déploiement d'une application Node.js sur un VPS (Ubuntu 22.04) à un niveau avancé. Nous configurerons Nginx comme reverse proxy, PM2 pour la gestion des processus, Let's Encrypt pour le HTTPS, GitHub Actions pour le déploiement automatique lors d'un push vers le dépôt, et nous ajouterons un monitoring de base.
\n\nPrérequis
\n- \n
- Serveur VPS (Ubuntu 22.04) avec accès SSH. \n
- Domaine lié à l'IP de votre serveur (par exemple,
myapp.example.com). \n - Node.js (v18+) et npm installés sur le serveur. \n
- Git installé sur le serveur. \n
- Dépôt de votre application sur GitHub. \n
1. Configuration du serveur et du gestionnaire de processus PM2
\nCommençons par la préparation de base de l'environnement. Après vous être connecté au serveur via SSH, mettons à jour les paquets et installons les utilitaires nécessaires :
\nsudo apt update && sudo apt upgrade -y\nsudo apt install nginx git curl -y\nAssurons-nous que Node.js est installé. Sinon, installons-le via NodeSource :
\ncurl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -\nsudo apt install -y nodejs\nnode -v\nnpm -v\nMaintenant, installons globalement PM2 — un gestionnaire de processus avancé pour Node.js qui redémarre automatiquement l'application en cas de panne, gère les journaux et le clustering :
\nsudo npm install -g pm2\nClonons le dépôt de votre application et installons les dépendances :
\ngit clone https://github.com/votre-utilisateur/votre-depot.git /var/www/myapp\ncd /var/www/myapp\nnpm install --production\nCréons un fichier d'écosystème PM2 (ecosystem.config.js) pour un réglage fin :
// ecosystem.config.js\nmodule.exports = {\n apps: [{\n name: 'myapp',\n script: 'app.js', // ou server.js\n instances: 'max', // utiliser tous les cœurs du CPU\n exec_mode: 'cluster',\n env: {\n NODE_ENV: 'production',\n PORT: 3000\n },\n error_file: '/var/log/node-app/err.log',\n out_file: '/var/log/node-app/out.log',\n log_date_format: 'YYYY-MM-DD HH:mm Z'\n }]\n};\nCréons un répertoire pour les journaux et lançons l'application via PM2 :
\nsudo mkdir -p /var/log/node-app\nsudo chown -R $USER:$USER /var/log/node-app\npm2 start ecosystem.config.js\npm2 save\npm2 startup systemd\nLa commande pm2 startup créera un service systemd qui démarrera PM2 au démarrage du système. Votre application fonctionne maintenant sur le port 3000, mais y accéder directement n'est pas sécurisé. Passons à la configuration de Nginx.
2. Configuration de Nginx comme reverse proxy et SSL via Let's Encrypt
\nNginx acceptera les requêtes entrantes sur les ports 80 (HTTP) et 443 (HTTPS), les transférera à votre processus Node.js fonctionnant sur le port 3000, et servira également les fichiers statiques directement — ce qui réduit la charge sur Node.js.
\nCréons un fichier de configuration pour notre domaine :
\nsudo nano /etc/nginx/sites-available/myapp\nInsérez la configuration suivante (remplacez myapp.example.com par votre domaine) :
server {\n listen 80;\n server_name myapp.example.com;\n return 301 https://$server_name$request_uri; # redirection vers HTTPS\n}\n\nserver {\n listen 443 ssl http2;\n server_name myapp.example.com;\n\n # SSL ser