Héberger une application Express.js sur un VPS, du code à la production

Votre note nous aide à améliorer nos contenus ! Partagez votre avis.

Réponse rapide : Express.js est un framework web minimaliste pour Node.js. Héberger une application Express.js en production consiste à la faire tourner sur un serveur accessible en continu, piloté par un gestionnaire de processus comme PM2, et exposé via un reverse proxy comme Nginx. Voici comment procéder, étape par étape.

Mettre une application Node.js en ligne n’est pas simplement une question de copier des fichiers sur un serveur. Node.js fonctionne différemment d’un site PHP classique : il ne s’appuie pas sur Apache pour exécuter chaque requête, il fait tourner un processus persistant qui écoute sur un port. Cette architecture offre des performances remarquables, mais elle exige une configuration que ni l’hébergement mutualisé ni un simple node app.js en ligne de commande ne peuvent assurer durablement.

Ce guide accompagne les développeurs qui ont une application fonctionnelle en local et veulent la déployer proprement sur un VPS. Vous y trouverez les commandes exactes à exécuter, les deux éléments clés que beaucoup de tutoriels passent sous silence PM2 et Nginx et les erreurs à éviter pour ne pas se retrouver avec une application qui disparaît au premier redémarrage du serveur.

Récap 👇

Ce qu’il faut avant de déployer

Une application Express.js fonctionnelle en local

Avant d’aborder le serveur, l’application doit démarrer proprement sur votre machine. Vérifiez que npm start ou node index.js lance le processus sans erreur, que les routes répondent, et que les variables d’environnement sensibles (clés API, chaînes de connexion à la base de données) sont bien isolées dans un fichier .env exclu de votre dépôt Git.

Un package.json complet avec un script start défini est indispensable :

"scripts": {
"start": "node index.js"
}

Un VPS et un accès SSH

Un VPS (serveur privé virtuel) vous donne les droits administrateur sur une machine Linux. C’est la condition minimale pour installer Node.js, PM2 et Nginx. À la commande de votre VPS, notez l’adresse IP et les identifiants SSH fournis par votre hébergeur.

Pour une distribution, Ubuntu 22.04 LTS ou Debian 12 sont les choix les plus stables et les mieux documentés pour Node.js en production.

Un nom de domaine, si vous voulez une adresse propre

Techniquement, une application Express.js peut être atteinte via l’IP du serveur. En pratique, un domaine est nécessaire dès que vous voulez activer HTTPS. Créez un enregistrement A qui pointe votre domaine vers l’IP de votre VPS avant de commencer la configuration Nginx.

➡️​ Hébergement Node.js et Python : Les Solutions pour 2026

Pourquoi un VPS plutôt qu’un hébergement mutualisé pour Express.js

Node.js a besoin d’un processus qui tourne en continu

Le modèle d’exécution de Node.js repose sur une boucle d’événements unique qui traite les requêtes en continu. Contrairement à PHP, qui est instancié à chaque requête puis détruit, un processus Node démarre une fois et reste actif. Ce processus doit être maintenu en vie, relancé s’il plante, et protégé du monde extérieur par une couche réseau dédiée. Un VPS rend tout cela possible. Un hébergement mutualisé, non.

Les limites du mutualisé pour une application Node

Sur un hébergement mutualisé, vous n’avez pas accès à un terminal root, pas de gestionnaire de processus, et l’environnement d’exécution est partagé entre des dizaines d’autres clients. Certains hébergeurs proposent une compatibilité Node via cPanel, mais ces solutions imposent des versions figées et ne permettent pas de configurer Nginx ni de gérer les processus avec PM2. Pour une application Express.js en production réelle, ces contraintes sont bloquantes.

Quand un hébergement Node managé suffit

Si vous déployez un projet personnel, un prototype ou une API à faible trafic, des plateformes comme Railway, Render ou Fly.io peuvent suffire. Ces services abstraient la gestion du serveur et déploient depuis GitHub en quelques clics. En contrepartie, vous perdez le contrôle sur l’infrastructure et les coûts peuvent grimper rapidement. Pour un projet avec des exigences de performance, de souveraineté des données ou de personnalisation, le VPS reste la solution la plus adaptée.

Installer l’environnement sur le serveur

Se connecter au VPS en SSH

Depuis votre terminal local :

ssh utilisateur@IP_DU_SERVEUR

Si vous utilisez une clé SSH (recommandé) :

ssh -i ~/.ssh/ma_cle utilisateur@IP_DU_SERVEUR

Une fois connecté, commencez par mettre à jour les paquets :

sudo apt update && sudo apt upgrade -y

Installer Node.js et npm

La méthode recommandée passe par NodeSource, qui fournit des versions récentes et maintenues de Node.js :

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

Vérifiez l’installation :

node -v
npm -v

Vous devriez voir les numéros de version s’afficher. Si ce n’est pas le cas, relancez la commande setup en adaptant le numéro de version.

Transférer le code de l’application, par git ou scp

Via Git (approche recommandée pour le redéploiement) :

git clone https://github.com/votre-compte/votre-app.git /var/www/mon-app

Via scp si vous n’utilisez pas Git :

scp -r ./mon-app utilisateur@IP_DU_SERVEUR:/var/www/mon-app

Créez le répertoire cible si nécessaire :

sudo mkdir -p /var/www/mon-app
sudo chown -R $USER:$USER /var/www/mon-app


Lancer l’application Express.js en production

Installer les dépendances et tester le démarrage

Placez-vous dans le répertoire de l’application :

cd /var/www/mon-app
npm install --production

L’option --production exclut les dépendances de développement pour réduire le poids du déploiement. Testez ensuite le démarrage :

node index.js

Si l’application répond sur son port (par exemple 3000), le démarrage est validé. Arrêtez-la avec Ctrl+C.

Gérer les variables d’environnement et le port

Créez un fichier .env sur le serveur (ne le commitez jamais dans Git) :

nano /var/www/mon-app/.env

Exemple de contenu :

PORT=3000
NODE_ENV=production
DATABASE_URL=postgresql://user:password@localhost:5432/mabase

Dans votre application Express.js, lisez le port depuis l’environnement :

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Serveur démarré sur le port ${PORT}`));

Pourquoi ne jamais laisser node démarrer seul en production

Un processus lancé avec node index.js depuis le terminal s’arrête dès que vous fermez la session SSH. Même en utilisant nohup node index.js &, l’application ne redémarre pas automatiquement après un crash ou un reboot du serveur. Pour une application accessible en permanence, il faut un gestionnaire de processus dédié.

➡️​ Installer wordPress sur un VPS : Guide complet 2026

Garder l’application en vie avec PM2

PM2 est le gestionnaire de processus de référence pour les applications Node.js en production. Il surveille l’application, la relance en cas de crash, gère les logs, et s’intègre au système d’init du serveur pour un redémarrage automatique.

Installer et configurer PM2

sudo npm install -g pm2

Lancez l’application avec PM2 :

pm2 start /var/www/mon-app/index.js --name "mon-app"

Vérifiez que le processus est actif :

pm2 list

Le tableau affiché indique l’état (online), le PID, l’utilisation mémoire et le nombre de redémarrages. Un processus en online est opérationnel.

Redémarrage automatique au reboot du serveur

Pour que PM2 relance l’application après un redémarrage du VPS, générez et activez le script de démarrage système :

pm2 startup

PM2 affiche une commande à exécuter avec sudo. Copiez-la et exécutez-la. Ensuite, sauvegardez l’état actuel des processus :

pm2 save

À partir de là, chaque redémarrage du serveur relancera automatiquement votre application Express.js.

Consulter les logs et surveiller l’application

pm2 logs mon-app
pm2 monit

pm2 logs affiche les sorties en temps réel. pm2 monit ouvre un tableau de bord interactif avec les métriques CPU et mémoire. Pour redémarrer l’application après un redéploiement :

pm2 reload mon-app

reload effectue un redémarrage sans interruption de service (zero-downtime).

Exposer l’application avec un reverse proxy Nginx

Pourquoi placer Nginx devant Express.js

Express.js écoute sur un port interne (ex. 3000). Nginx joue le rôle d’intermédiaire entre Internet et ce port. Ce n’est pas une contrainte architecturale, c’est une décision qui apporte plusieurs avantages concrets : gestion du HTTPS, mise en cache des ressources statiques, protection contre certaines attaques de couche application, et possibilité de faire tourner plusieurs applications sur le même serveur avec des domaines distincts.

Laisser Express.js directement exposé sur le port 80 ou 443 est une pratique déconseillée. Nginx est conçu pour gérer la terminaison TLS et la gestion des connexions réseau à grande échelle ; Express.js, lui, est conçu pour la logique applicative.

Configurer Nginx comme reverse proxy vers le port de l’app

Installez Nginx :

sudo apt install -y nginx

Créez un bloc serveur pour votre application :

sudo nano /etc/nginx/sites-available/mon-app

Contenu de la configuration :

server {
listen 80;
server_name mondomaine.com www.mondomaine.com;

location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}

Activez le site et rechargez Nginx :

sudo ln -s /etc/nginx/sites-available/mon-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

nginx -t vérifie la syntaxe avant de recharger. Ne sautez jamais cette étape.

Ajouter le domaine et activer HTTPS avec un certificat

Certbot, l’outil officiel de Let’s Encrypt, automatise la génération et le renouvellement des certificats TLS :

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d mondomaine.com -d www.mondomaine.com

Certbot modifie automatiquement votre bloc Nginx pour activer HTTPS et rediriger le HTTP vers HTTPS. Le certificat se renouvelle automatiquement via un timer systemd. Vérifiez-le avec :

sudo systemctl status certbot.timer

Vérifier, sécuriser et maintenir

Pare-feu et ports ouverts

Activez UFW (Uncomplicated Firewall) et autorisez uniquement les ports nécessaires :

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status

Nginx Full autorise les ports 80 et 443. Le port de votre application (ex. 3000) n’a pas besoin d’être ouvert publiquement, puisque Nginx s’en charge en interne.

Mises à jour et redéploiement propre

Adoptez ce workflow pour chaque mise à jour de l’application :

cd /var/www/mon-app
git pull origin main
npm install --production
pm2 reload mon-app

Pour les mises à jour système, exécutez régulièrement :

sudo apt update && sudo apt upgrade -y

Les erreurs de déploiement les plus fréquentes

  • L’application ne démarre pas : vérifiez les logs PM2 avec pm2 logs mon-app. La cause est souvent un fichier .env manquant ou une dépendance absente.
  • Nginx retourne une erreur 502 Bad Gateway : l’application Express.js n’écoute pas sur le port configuré dans le proxy_pass. Vérifiez que PM2 signale le processus comme online.
  • HTTPS ne fonctionne pas : assurez-vous que l’enregistrement DNS A pointe bien vers l’IP du serveur et que le domaine est accessible avant de lancer Certbot.
  • L’application disparaît après un reboot : la commande pm2 save n’a pas été exécutée, ou le script de démarrage système n’a pas été activé.

Un VPS avec le système de votre choix : Ubuntu, Debian et autres

Systalink propose des VPS configurables dès la commande. Choisissez votre distribution Linux : Ubuntu 22.04 LTS, Debian 12 ou d’autres systèmes selon vos préférences et obtenez un environnement prêt à accueillir Node.js, PM2 et Nginx sans restriction. Aucune dépendance à un panneau de contrôle imposé : vous administrez votre serveur comme vous le souhaitez.

Connexion par clé SSH ou mot de passe dès le déploiement

Dès que votre VPS est provisionné sur platform.systalink.com, vous recevez les identifiants de connexion. L’accès SSH par clé publique est supporté nativement, ce qui vous permet de sécuriser votre serveur dès la première connexion, sans étape intermédiaire.

Un datacenter à Dakar, une facturation en euros

L’infrastructure Systalink s’appuie sur un datacenter à Dakar, pensé comme point de présence multi-région pour réduire la latence vers les utilisateurs d’Afrique de l’Ouest et du continent. La facturation en euros apporte la lisibilité nécessaire pour les équipes et entreprises basées en Europe ou en zone CFA. Un SLA de 99,9 % et un support technique disponible 24h/24 complètent l’offre parce qu’une application en production ne prend pas de congés.

➡️​ VPS gratuit développeur : les options en 2026

FAQ

Peut-on héberger une application Express.js sur un hébergement mutualisé ?

Non, dans la grande majorité des cas. Un hébergement mutualisé ne permet pas de faire tourner un processus Node.js persistant, d’installer PM2, ni de configurer Nginx. Certains panneaux de contrôle comme cPanel proposent une compatibilité partielle avec Node.js, mais les restrictions sur les versions, les ports et les processus en arrière-plan rendent cette option inadaptée à une application Express.js en production réelle. Un VPS est la solution minimale viable pour déployer Express.js correctement.

À quoi sert PM2 pour une application Node.js ?

PM2 est un gestionnaire de processus qui maintient votre application Node.js en vie en production. Sans PM2, un crash de l’application ou un redémarrage du serveur la met hors ligne définitivement, jusqu’à intervention manuelle. PM2 surveille le processus, le relance automatiquement en cas d’arrêt inattendu, l’intègre au système de démarrage du serveur, et centralise les logs. C’est l’outil standard pour toute application Node.js déployée sur un VPS.

Pourquoi mettre Nginx devant Express.js ?

Nginx remplit plusieurs fonctions qu’Express.js ne gère pas nativement à l’échelle de la production. Il termine les connexions TLS (HTTPS), redistribue le trafic vers le bon port applicatif, sert les fichiers statiques sans solliciter Node.js, et protège l’application des requêtes malformées. Nginx est conçu pour gérer des milliers de connexions simultanées avec une consommation mémoire très faible ; Express.js est conçu pour la logique métier. Les faire travailler ensemble permet à chacun de faire ce qu’il fait le mieux.

Comment garder mon application Express.js en ligne après un redémarrage du serveur ?

Deux commandes PM2 suffisent. La première génère et installe un script de démarrage système adapté à votre distribution Linux :

pm2 startup

Exécutez ensuite la commande affichée par PM2 (elle commence par sudo env PATH=...). La seconde sauvegarde l’état actuel des processus gérés par PM2 :

pm2 save

Après ces deux étapes, chaque redémarrage du VPS relancera automatiquement votre application Express.js, sans intervention manuelle.

Plus de Systalink

Acheter un nom de domaine pour WordPress

Acheter un nom de domaine pour WordPress : le guide d’achat complet

nom de domaine .ci

Prix nom de domaine .ci en 2026 : comparatif et guide complet