Déploiement
Déploiement • Chapitre 11 : Configuration du serveur et mise en production

Redémarrage et mise à jour de l'application

Mettre à jour une application sur un VPS ne s'improvise pas. Automatisez la procédure de livraison : pull Git, installation propre des dépendances de production, migration de base de données et rechargement PM2 sans déconnexion d'utilisateurs.

📥
git pull origin main

Rapatrie les derniers commits testés et validés depuis le dépôt GitHub central.

📦
npm ci --omit=dev

Installe exactement les versions figées dans le lockfile sans installer les outils de dev.

🗄️
Migrations de BDD

Met à jour le schéma des tables (Knex/Prisma/TypeORM) avant de basculer le code.

🔄
pm2 reload --update-env

Rechargement gracieux des instances Node tout en rechargeant les variables .env.

deploy-production-update.sh
#!/bin/bash
# Script de déploiement automatique d'une mise à jour de production :
set -e # Arrêter immédiatement si une commande échoue

echo "🚀 [1/5] Rapatriement du code source..."
cd /var/www/learnweb-api
git pull origin main

echo "📦 [2/5] Installation des dépendances de production..."
npm ci --omit=dev

echo "🏗️ [3/5] Compilation du bundle TypeScript..."
npm run build

echo "🗄️ [4/5] Exécution des migrations de base de données..."
npx prisma migrate deploy

echo "🔄 [5/5] Rechargement gracieux avec PM2..."
pm2 reload learnweb-api --update-env

echo "✅ Mise à jour déployée avec succès en zéro downtime !"

Guide Approfondi & Architecture Système

1. Pourquoi npm ci et jamais npm install sur le Serveur ?

La différence est vitale pour la stabilité :
  • npm install : Peut mettre à jour silencieusement des sous-dépendances mineures si le symbole ^ est présent, risquant d'introduire un bug imprévu en production. De plus, il modifie package-lock.json sur le serveur, provoquant des conflits Git futurs.
  • npm ci (Clean Install) : Supprime le dossier node_modules et installe à la virgule près les versions scellées dans package-lock.json. C'est la garantie absolue de tester en production exactement ce qui a été testé en local !

2. Automatiser via un Hook de Déploiement ou GitHub Actions

Plutôt que de vous connecter manuellement en SSH à chaque mise à jour :

Vous pouvez configurer un workflow GitHub Actions qui se connecte automatiquement en SSH avec une clé privée sécurisée et déclenche ce script à chaque fois qu'une Pull Request est fusionnée dans la branche main !

Tableau Récapitulatif : Checklist d'une Mise à Jour Sécurisée

ÉtapeAction TechniqueSécurité Assurée
1. Sauvegarde préventivemysqldump de la base de donnéesPossibilité de restauration immédiate si la migration échoue
2. Synchronisation Gitgit pull origin mainRécupération du code certifié sans divergence locale
3. Dépendancesnpm ci --omit=devReproductibilité stricte et exclusion des paquets de test/linter lourds
4. Migration BDDnpx prisma migrate deployÉvolution du schéma avant que le nouveau code ne requête les nouvelles colonnes
5. Rechargementpm2 reload allLes requêtes en cours se terminent sans aucune interruption de service