Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

TP2e année10 livrablesQuiz corrigé

Déployer & héberger

Une application qui tourne sur ton portable n'est utile à personne. La rendre accessible depuis Internet — la déployer — c'est ce qui transforme un projet en service. Aujourd'hui tu mets AppliFrais en ligne, pour de vrai : sur un VPS ou un PaaS, avec variables d'environnement, build, reverse proxy et HTTPS. Le passage du « ça marche chez moi » au « c'est en service ».

Par Josselyn C., prof de BTS SIO. Publié le , mis à jour le .

Objectif
déployer et héberger AppliFrais sur Internet (VPS ou PaaS), proprement et de façon sécurisée
On manipule
un hébergement, SSH, des variables d'environnement, un reverse proxy, HTTPS
Pré-requis
AppliFrais qui tourne en local, notions de terminal
Pour qui
SLAM et SISR, 2e année
Durée
environ 3 h

Compétences : C1.3 Développer la présence en ligne de l'organisation, C1.5 Mettre à disposition des utilisateurs un service informatique

Déployer, c'est mettre un service à disposition des utilisateurs : le cœur du Bloc 1 (C1.5).

Avant de commencer

Pourquoi cette séance

Déployer, c'est rendre ton application accessible et disponible pour ses utilisateurs, ailleurs que sur ta machine. C'est une compétence centrale du Bloc 1 (« mettre à disposition un service informatique ») et un grand classique de l'E5 : un projet déployé, avec une vraie URL HTTPS, vaut bien plus qu'un projet qui ne tourne qu'en local. On va voir les deux grandes voies (le VPS, où tu gères tout ; le PaaS, où la plateforme gère beaucoup pour toi), puis on déroule un déploiement VPS complet : se connecter au serveur, récupérer le code, configurer les variables d'environnement, builder le front, lancer l'API en continu, exposer via Nginx, passer en HTTPS. À la fin, AppliFrais aura une URL publique sécurisée et une procédure documentée.

Ce que tu vas apprendre

ConceptCe que tu sauras faire
VPS vs PaaSchoisir le bon type d'hébergement et le justifier
SSH & mise en placete connecter à un serveur distant, y installer Node, y récupérer le code
Variables d'environnementconfigurer sans mettre un seul secret dans le code
Build du frontcompiler React en fichiers statiques optimisés (dist/)
Lancement durable (pm2)garder l'app vivante, la relancer au crash et au reboot
Reverse proxy (Nginx)exposer un seul point d'entrée, cacher le port interne
HTTPS (Let's Encrypt)servir en TLS, gratuitement et automatiquement

Vocabulaire de départ

MotEn une phrase
Serveurune machine allumée en permanence, accessible par le réseau
Production (prod)l'environnement réel où les utilisateurs accèdent au service (par opposition à « dev », ta machine)
Déploiementl'ensemble des opérations pour mettre le code en prod
Disponibilitéle fait que le service réponde quand on l'appelle (mesurée en « uptime »)

0. VPS ou PaaS ?

Deux philosophies d'hébergement. Comprendre la différence, c'est savoir quoi choisir selon le projet.

VPS (serveur privé virtuel)PaaS (plateforme as a service)
Ce que tu louesune machine Linux nueune plateforme qui héberge ton app
Tu gèrestout : OS, Node, base, Nginx, HTTPS, sécurité, mises à jourton code ; la plateforme gère le reste
Mise en lignetu te connectes en SSH et tu installes tout à la maintu connectes ton dépôt Git, ça build et déploie tout seul
ExemplesOVH, Scaleway, DigitalOcean, HetznerRender, Railway, Vercel, Heroku, Fly.io
Avantagecontrôle total, coût maîtrisé, très formateurrapide, simple, moins d'erreurs, HTTPS automatique
Inconvénientplus de travail et de responsabilitémoins de contrôle, quotas, parfois payant à l'usage

Chiffres-repères — prix, ressources et limites réels

Offre (2025)CPU / RAMPrixLimite / piège clé
Hetzner CX22 (VPS)2 vCPU / 4 Go~4 €/mois20 To trafic/mois ; tu gères tout toi-même
DigitalOcean Droplet Basic1 vCPU / 1 Go~6 $/mois1 To trafic ; bon point de départ BTS
Scaleway STARDUST (VPS)1 vCPU / 1 Go~1 €/mois200 Mbps réseau ; idéal pour apprendre
Render — Free tier (PaaS)0,1 vCPU / 512 Mo0 $ (750 h/mois)cold start 20-30 s après 15 min sans trafic
Railway — Starter (PaaS)partagé5 $/mois5 $ de crédits inclus ; no cold start
Vercel (PaaS, front only)edge functions0 $ hobbyfront statique uniquement — pas d'API persistante

Flag A1

Checkpoint

Pour AppliFrais (API Express + front React + base Mongo + fichiers sur S3), dis ce que tu choisirais (VPS ou PaaS) et pourquoi, et liste les composants à héberger.
Rends : ton choix justifié (2-3 phrases) + la liste des composants (API, front, base, fichiers).

0 sur 10 dans cette étape

1. Se connecter au serveur et y poser le code

Avant de configurer quoi que ce soit, il faut entrer dans le serveur et y mettre l'application. Trois étapes : se connecter, installer Node, récupérer le code.

1. Se connecter en SSH

bash
# remplace par l'IP que ton hebergeur t'a donnee
ssh root@203.0.113.42
Ce que tu dois voir
The authenticity of host '203.0.113.42' can't be established.
Are you sure you want to continue connecting (yes/no)? yes
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux)
root@vps-appli:~#

1 bis. Authentification par clé SSH (méthode pro)

bash
# Sur TON portable (pas sur le serveur)
ssh-keygen -t ed25519 -C "deploiement-applifrais"
Ce que tu dois voir
Generating public/private ed25519 key pair.
Enter file in which to save the key (~/.ssh/id_ed25519): [Entrée]
Enter passphrase (empty for no passphrase): [phrase secrète optionnelle, recommandée]
Your identification has been saved in /home/toi/.ssh/id_ed25519
Your public key has been saved in /home/toi/.ssh/id_ed25519.pub
bash
# Dépose la clé publique sur le serveur (depuis ton portable)
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@203.0.113.42
Ce que tu dois voir
Number of key(s) added: 1
Now try logging into the machine: "ssh root@203.0.113.42"
# Raccourci : crée un alias dans ~/.ssh/config sur ton portable
Host appli-frais-vps
  HostName 203.0.113.42
  User root
  IdentityFile ~/.ssh/id_ed25519

2. Installer Node sur le serveur

Le serveur est nu : il n'a pas Node. On l'installe (version 20).

bash
# ajoute le depot officiel Node 20 puis installe
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
node -v
Ce que tu dois voir
v20.11.1

3. Récupérer le code et ses dépendances

powershell
# clone ton depot puis installe les paquets
git clone https://github.com/gsb/appli-frais.git
cd appli-frais
npm install
Ce que tu dois voir
added 312 packages in 14s

Chapitre 1 ter — Sécuriser l'accès au serveur

Avant d'installer quoi que ce soit, un vrai déploiement commence par trois mesures de sécurité de base : créer un compte dédié (pas root), ouvrir uniquement les ports nécessaires, et interdire l'authentification par mot de passe. Ce n'est pas du perfectionnisme : un VPS ouvert à tous les vents est scanné et attaqué dans les minutes qui suivent sa création.

1. Créer un utilisateur non-root

# toujours en root pour l'instant
adduser deployer              # crée le compte
usermod -aG sudo deployer     # lui accorde sudo
su - deployer                 # passe dessous pour tester
Ce que tu dois voir
deployer@vps-appli:~$

2. Configurer le pare-feu (UFW)

Un VPS neuf a tous les ports ouverts à Internet. On ferme tout, on n'ouvre que le strict minimum :

Règle UFWPort(s) autorisé(s)Pourquoi
allow OpenSSHTCP 22accès administrateur — à faire EN PREMIER
allow 'Nginx Full'TCP 80 et 443HTTP (redirect) et HTTPS (service public)
le restetout autre portbloqué par défaut — MongoDB 27017 inaccessible de l'extérieur
bash
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status
Ce que tu dois voir
Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere

3. Interdire l'authentification par mot de passe

bash
sudo nano /etc/ssh/sshd_config

Localise et modifie (ou ajoute) ces deux lignes :

PermitRootLogin prohibit-password
PasswordAuthentication no
bash
sudo systemctl restart sshd

2. Les variables d'environnement

Tout ce qui change entre ta machine (dev) et le serveur (prod) — ports, URL de base de données, secrets — ne doit jamais vivre dans le code. Ça vit dans des variables d'environnement.

1. Le fichier .env

# fichier .env a la racine du projet sur le serveur
# (JAMAIS commite -- il contient des secrets)
PORT=3000
MONGO_URI=mongodb://gsbuser:motdepasse@localhost:27017/appliFrais
JWT_SECRET=une_longue_valeur_aleatoire_de_32_caracteres
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=...
NODE_ENV=production

1 bis. Générer un JWT_SECRET digne de ce nom

Un JWT_SECRET, c'est la clé qui signe tous les tokens d'AppliFrais. Si quelqu'un la connaît, il peut fabriquer un token valide pour n'importe quel compte — visiteur ou comptable. Les règles impératives :

CritèreValeur recommandéePourquoi
Longueur minimale≥ 32 octets = 256 bitsseuil de sécurité NIST pour HMAC-SHA256 (l'algo de signature JWT)
Sourcealéatoire cryptographique (CSPRNG)Math.random() est prévisible ; il ne faut pas l'utiliser pour des secrets
Format courant64 chars hex ou 44 chars base64printable, copier-collable dans un .env
Durée de vie d'un token JWT15 min à 1 h (access token)limiter l'exposition si un token fuite ; au-delà d'1 h, la session semble « ne jamais expirer »

Génère le secret en une ligne sur le serveur (Node est déjà installé) :

powershell
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
Ce que tu dois voir
a3f8c2d1e94b7f0a5c8e2d3f1b6a9c4e7d0f3b8a1c5e9f2d4b7a0c3e6f1d8b5

1 ter. Charger le .env : le module dotenv

powershell
npm install dotenv
// server.js — doit être la PREMIÈRE ligne, avant tout autre require
require('dotenv').config();

// process.env.PORT, MONGO_URI, JWT_SECRET... sont maintenant disponibles
const PORT = process.env.PORT || 3000;

2. Le tenir hors de Git

# fichier .gitignore -- empeche .env d'etre versionne
.env
node_modules/
dist/

3. Lire une variable dans le code

// server.js -- on lit la config depuis l'environnement
const PORT = process.env.PORT || 3000;
mongoose.connect(process.env.MONGO_URI);
app.listen(PORT);

Flag B1

Production (configuration)

Prépare la configuration de prod d'AppliFrais : un .env complet (variables, aucun secret en dur dans le code), un .gitignore qui exclut .env, et le code qui lit process.env.
Rends : ton .env (valeurs des secrets masquées par ***) + l'extrait de code qui lit process.env.MONGO_URI.

0 sur 10 dans cette étape

3. Builder le front pour la production

En dev, le front React tourne via un serveur de développement (Vite, port 5173) : pratique pour coder (rechargement à chaud), mais lent et non sécurisé pour la prod. En prod, on compile le front en fichiers statiques optimisés.

powershell
# dans le dossier du front, on lance le build
npm run build
Ce que tu dois voir
vite v5.0.10 building for production...
1462 modules transformed.
dist/index.html                   0.46 kB
dist/assets/index-a1b2c3.css     18.20 kB
dist/assets/index-d4e5f6.js     242.71 kB
built in 6.21s

Flag B2

Production (build)

Build le front d'AppliFrais.
Rends : la sortie de npm run build (capture) + le contenu listé du dossier dist/ (ls dist/).

0 sur 10 dans cette étape

4. Lancer l'API de façon durable (pm2)

Lancer node server.js à la main ne suffit pas : si tu fermes le terminal, ou si l'app crashe, ou si le serveur reboote, le service tombe. Un gestionnaire de processus garde l'app vivante.

# installer pm2 une fois (globalement)
sudo npm install -g pm2
# lancer l'API sous pm2 avec un nom lisible
pm2 start server.js --name appli-frais
Ce que tu dois voir
[PM2] Starting /home/deployer/appli-frais/server.js in fork_mode
[PM2] Done.
+----+--------------+--------+---------+--------+--------+
| id | name         | mode   | status  | cpu    | memory |
+----+--------------+--------+---------+--------+--------+
| 0  | appli-frais  | fork   | online  | 0%     | 48.3mb |
+----+--------------+--------+---------+--------+--------+

Survivre au reboot

pm2 startup    # genere le service systeme qui relancera pm2 au boot
pm2 save       # memorise la liste des apps a relancer

Surveiller et diagnostiquer

pm2 status            # voir l'etat de toutes les apps
pm2 logs appli-frais  # voir les logs en direct (Ctrl+C pour sortir)
Ce que tu dois voir
appli-frais | API AppliFrais en ecoute sur le port 3000
appli-frais | Connexion MongoDB etablie

Flag B3

Production (lancement durable)

Lance l'API AppliFrais sous pm2 et rends-la persistante au reboot.
Rends : la sortie de pm2 status (statut online) + la sortie de pm2 logs montrant l'API à l'écoute et connectée à Mongo.

0 sur 10 dans cette étape

5. Exposer le service : le reverse proxy Nginx

Ton API tourne sur le port 3000, en interne. Mais on ne veut pas que les utilisateurs tapent http://monserveur:3000 : on veut https://appli-frais.fr. Et le front (dist/) doit être servi quelque part. Le reverse proxy (Nginx) fait les deux.

Un seul point d'entrée public (Nginx, port 443). Le port 3000 du Node reste caché de l'extérieur.

Un seul point d'entrée public (Nginx, port 443). Le port 3000 du Node reste caché de l'extérieur.

La configuration Nginx

# /etc/nginx/sites-available/appli-frais
server {
  listen 80;
  server_name appli-frais.fr;
  root /home/deployer/appli-frais/dist;   # front statique builde

  # Taille max d'un upload (ex. justificatifs de frais)
  client_max_body_size 10M;

  # Compression à la volée
  gzip on;
  gzip_types text/plain text/css application/javascript application/json;

  # Fichiers statiques React : mise en cache longue durée
  location / {
    try_files $uri /index.html;           # routing SPA React
    add_header Cache-Control "no-cache";  # index.html : jamais mis en cache
  }

  location /assets/ {
    expires 1y;                           # fichiers hashés : 1 an
    add_header Cache-Control "public, immutable";
  }

  # Reverse proxy vers l'API Node
  location /api {
    proxy_pass http://localhost:3000;

    # Headers indispensables : sans eux, Node voit toutes les requetes
    # comme venant de 127.0.0.1, et ne sait pas la vraie IP du client
    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;

    # Timeouts raisonnables (par defaut : 60 s, peut bloquer si l'API plante)
    proxy_connect_timeout 5s;
    proxy_read_timeout    30s;
  }

  # Headers de sécurité HTTP (certbot ajoutera le bloc HTTPS/443)
  add_header X-Content-Type-Options  "nosniff"    always;
  add_header X-Frame-Options         "DENY"       always;
  add_header Referrer-Policy         "no-referrer-when-downgrade" always;
}

Activer et tester la config

bash
# activer le site (lien vers sites-enabled) puis tester la syntaxe
sudo ln -s /etc/nginx/sites-available/appli-frais /etc/nginx/sites-enabled/
sudo nginx -t
Ce que tu dois voir
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
bash
# si le test passe, on recharge Nginx (sans couper le service)
sudo systemctl reload nginx

Flag B4

Production (reverse proxy)

Configure Nginx devant AppliFrais : il sert le front dist/ et transmet /api au Node.
Rends : ta config Nginx + la sortie de nginx -t (test réussi) + la preuve que l'app répond sur l'URL sans le port 3000 visible.

0 sur 10 dans cette étape

6. Debug : quand le déploiement coince

Un déploiement qui rate la première fois, c'est normal. Savoir diagnostiquer fait partie du métier (C1.2). Deux pannes ultra-classiques.

Panne 1 — Nginx renvoie « 502 Bad Gateway »

Panne 2 — l'app ne démarre pas (variable d'env manquante)

Tu lances l'app, mais pm2 status affiche errored. Tu regardes les logs :

Ce que tu dois voir
appli-frais | /home/deployer/appli-frais/server.js:14
appli-frais | mongoose.connect(process.env.MONGO_URI);
appli-frais | MongooseError: The `uri` parameter must be a string,
appli-frais |               got "undefined".
appli-frais | App crashed -- waiting for file changes before starting

Flag C1

Debug (bug volontaire)

On a déployé AppliFrais sans renseigner MONGO_URI : l'app crashe au démarrage avec le log ci-dessus.
Reproduis la panne (retire MONGO_URI du .env, relance via pm2), diagnostique, puis corrige.
Rends : la ligne exacte du log qui révèle la cause + ta correction (ce que tu as changé) + la preuve que l'app repasse online.

0 sur 10 dans cette étape

7. HTTPS avec Let's Encrypt

Une app accessible depuis Internet doit être en HTTPS (rappel cyber : sinon, mots de passe et tokens transitent en clair, lisibles par tout intermédiaire). Bonne nouvelle : c'est gratuit et automatisé avec Let's Encrypt.

bash
# installer certbot une fois
sudo apt install -y certbot python3-certbot-nginx
# obtenir + installer le certificat et configurer Nginx automatiquement
sudo certbot --nginx -d appli-frais.fr
Ce que tu dois voir
Requesting a certificate for appli-frais.fr
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/appli-frais.fr/fullchain.pem
Deploying certificate
Successfully deployed certificate for appli-frais.fr to /etc/nginx/sites-enabled/appli-frais
Congratulations! You have successfully enabled HTTPS on https://appli-frais.fr

Ce que certbot a modifié dans Nginx

Certbot a édité automatiquement ta config Nginx. Voici les lignes ajoutées (extrait) :

server {
  listen 443 ssl;
  ssl_certificate     /etc/letsencrypt/live/appli-frais.fr/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/appli-frais.fr/privkey.pem;
  include /etc/letsencrypt/options-ssl-nginx.conf;  # TLS 1.2 + 1.3, ciphers modernes
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;    # Diffie-Hellman 2048 bits
  ...
}
server {
  listen 80;
  return 301 https://$host$request_uri;  # redirige tout HTTP vers HTTPS
}

Ajouter HSTS (un cran de plus)

HSTS (HTTP Strict Transport Security) demande aux navigateurs de ne jamais contacter le site en HTTP, même si l'utilisateur tape http:// à la main. Ça évite les attaques de type « SSL stripping ».

# dans le bloc server { listen 443 ssl; ... }
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

Vérifier la qualité TLS avec SSL Labs

# depuis ton navigateur
https://www.ssllabs.com/ssltest/analyze.html?d=appli-frais.fr
Ce que tu dois voir
Overall Rating: A+
Certificate: 100/100
Protocol Support: 100/100 (TLS 1.3 + TLS 1.2)
Key Exchange: 90/100
Cipher Strength: 90/100

Le renouvellement automatique

Les certificats Let's Encrypt durent 90 jours. Certbot installe une tâche planifiée qui les renouvelle tout seul. On vérifie que ça marche, à blanc :

bash
sudo certbot renew --dry-run
Ce que tu dois voir
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/appli-frais.fr/fullchain.pem (success)

Flag B5

Production (HTTPS)

Active HTTPS sur ton déploiement AppliFrais (certbot, ou HTTPS auto du PaaS).
Rends : la capture du cadenas dans le navigateur + une phrase : pourquoi HTTPS est obligatoire pour un service exposé.

0 sur 10 dans cette étape

8. La disponibilité se mesure

« Mettre à disposition un service » (Bloc 1) ne s'arrête pas au déploiement : il faut qu'il reste disponible. Déployer, c'est le début ; maintenir en condition opérationnelle, c'est le métier.

Les trois réflexes de disponibilité

RéflexeCe qu'il garantit
pm2 (ou systemd)l'app redémarre seule au crash et au reboot
Monitoring uptimeun service externe « ping » ton URL et t'alerte si elle tombe
Mesure d'uptimeon chiffre la disponibilité en % sur une période

Lire un chiffre d'uptime

UptimeIndisponibilité tolérée / anNiveau
99 %~3,65 joursfaible
99,9 %~8,8 heuresbon (« trois neuf »)
99,99 %~52 minutesexigeant

Mettre en place un moniteur uptime (UptimeRobot)

Un moniteur uptime envoie un ping HTTP à ton URL toutes les N minutes et t'alerte par email si elle ne répond plus. C'est la base de la surveillance d'un service en production.

OutilGratuitFréquence minimaleAlertes
UptimeRobot50 moniteurs5 minemail, Slack, Telegram
Freshping50 moniteurs1 minemail, Slack
Better Uptime10 moniteurs3 minemail, appel téléphonique

Mise en place UptimeRobot (5 min) :

  1. Crée un compte sur uptimerobot.com.
  2. « Add New Monitor » → type HTTP(s) → URL : https://appli-frais.fr/api/health.
  3. Intervalle : 5 minutes (gratuit). Alerte email si le site tombe.
  4. Ajoute un endpoint /health dans l'API pour qu'il réponde toujours 200 :
// server.js — endpoint de santé (health check)
app.get('/api/health', (req, res) => {
  res.json({ status: 'ok', uptime: process.uptime() });
});
Ce que tu dois voir
{"status":"ok","uptime":3602.4}

RTO et RPO : les deux métriques pro

MétriqueSignificationExemple pratique
RTO — Recovery Time ObjectiveTemps maximum pour remettre le service en marche après une panne« On doit être de retour en moins de 30 min » — pm2 + procédure documentée
RPO — Recovery Point ObjectivePerte de données maximale acceptable (jusqu'à quel moment on peut remonter)« On peut perdre au max 1 h de données » → dump MongoDB toutes les heures

Flag D1

Investigation

Choisis une question et documente-la :
(a) compare deux PaaS (ex. Render vs Railway) sur 4 critères : offre gratuite, HTTPS auto, base de données incluse, limites/quotas ; OU
(b) mets en place un moniteur uptime gratuit sur ton URL et relève le % d'uptime après 24 h.
Rends : ton tableau comparatif (a) ou la capture du moniteur avec le % (b).

0 sur 10 dans cette étape

9. Mini-projet : mettre AppliFrais en service

La mission

Déploie AppliFrais de bout en bout, sur un VPS ou un PaaS, et documente la procédure (un futur toi — ou un collègue — doit pouvoir refaire sans toi) :

  1. héberger les composants (API, front, base Mongo) ;
  2. configurer les variables d'environnement (aucun secret en dur, .env hors Git) ;
  3. builder le front (dist/), lancer l'API en mode durable (pm2) ;
  4. exposer via une URL propre (reverse proxy Nginx si VPS) + HTTPS (Let's Encrypt) ;
  5. vérifier le service de bout en bout (login visiteur, ajout d'une fiche de frais, validation comptable).

Flag B6

Mini-projet (livrable)

Livre AppliFrais déployé et fonctionnel : l'URL publique (HTTPS) + une procédure de déploiement documentée (étapes reproductibles, du clone jusqu'au certbot).
Rends : l'URL + ta doc de déploiement (Markdown).
Un service en ligne avec sa doc = une réalisation de portfolio E5 en or.

0 sur 10 dans cette étape

Flag E1

Extension (déploiement continu)

Va plus loin : mets en place un déploiement continu (CD) — un git push qui redéploie automatiquement.
Sur PaaS : active le déploiement auto sur push de la branche main.
Sur VPS : un petit script (git pull && npm install && npm run build && pm2 reload appli-frais) déclenché par un webhook ou une GitHub Action.
Rends : la preuve qu'un push déclenche le redéploiement (capture du log de déploiement).

0 sur 10 dans cette étape

Pour finir

L'essentiel

NotionÀ retenir
VPS vs PaaStout gérer (formateur, contrôle) vs déléguer (rapide, HTTPS auto)
SSHun terminal chiffré sur la machine distante : ta porte d'entrée
variables d'envconfig et secrets hors du code, hors de Git (.env + .gitignore)
build frontnpm run build → dist/ statique servi en prod (pas le serveur de dev)
pm2app vivante : redémarrage au crash et au reboot = disponibilité
reverse proxyNginx en façade : un point d'entrée (443), port 3000 caché
HTTPSobligatoire ; gratuit et auto via Let's Encrypt/certbot
disponibilitése maintient (pm2) et se mesure (uptime %)

Vérifie tes acquis

Exercice Réussi À revoir

  1. Différence entre un VPS et un PaaS ? Donne un exemple de chaque.
  2. À quoi sert SSH, et qu'est-ce qui change dans ton terminal une fois connecté ?
  3. Pourquoi les secrets vont-ils dans des variables d'environnement et pas dans le code ?
  4. Pourquoi « builder » le front pour la production plutôt que lancer le serveur de dev ?
  5. À quoi sert pm2, et que garantit-il après un reboot du serveur ?
  6. Que fait un reverse proxy (Nginx) devant ton app ? Cite ses deux rôles ici.
  7. Pourquoi un service exposé doit-il être en HTTPS, et qu'apporte certbot ?
  8. Que signifie un uptime de 99,9 % en heures d'indisponibilité par an ?
Voir le corrigéMasquer le corrigé de l'exercice
  1. VPS = machine Linux louée, tu gères tout (ex. Hetzner, DigitalOcean) ; PaaS = plateforme qui gère l'infra, tu déploies ton code (ex. Render, Railway). VPS : plus formateur, contrôle total, ~4-6 €/mois. PaaS : rapide, moins de config, parfois limité ou avec cold start.
  2. SSH ouvre un terminal chiffré sur la machine distante. Une fois connecté, le prompt change (root@vps:~#) : toutes les commandes que tu tapes s'exécutent sur le serveur, pas sur ton portable.
  3. Les secrets dans le code → visibles dans l'historique Git, dans les dépôts publics, dans les captures. Les variables d'env → lues uniquement au runtime, non versionnées, différentes par environnement (dev/prod).
  4. Le serveur Vite de dev est lent (il recompile à la demande), non optimisé, pas sécurisé pour la prod. npm run build génère des fichiers statiques minifiés et optimisés dans dist/ : ultra-rapides à servir par Nginx.
  5. pm2 lance l'app en arrière-plan, la redémarre si elle crashe, et avec pm2 startup && pm2 save, elle repart automatiquement au reboot du serveur.
  6. Nginx joue deux rôles : (1) servir le front statique (dist/) ; (2) router les appels /api vers le Node sur le port interne 3000 (proxy_pass). L'utilisateur ne voit que le port 443 — le port 3000 reste caché.
  7. Sans HTTPS, mots de passe et tokens transitent en clair sur le réseau (lisibles par n'importe quel intermédiaire). Certbot obtient un certificat Let's Encrypt gratuit, l'installe dans Nginx et programme le renouvellement automatique (certificats valables 90 jours).
  8. 99,9 % d'uptime = 0,1 % d'indisponibilité par an ≈ 8 h 45 min (soit 365 × 24 × 0,001 ≈ 8,76 h). C'est le niveau « trois neuf ».

Tu avais trouvé ?

Glossaire

MotDéfinition
Déployerrendre une application accessible à ses utilisateurs sur Internet
VPSserveur Linux loué, qu'on administre soi-même
PaaSplateforme qui héberge l'app et gère l'infrastructure à ta place
SSHterminal chiffré ouvert sur une machine distante
Variable d'environnementconfig (port, URL, secret) définie hors du code
Buildcompilation du front en fichiers statiques optimisés (dist/)
pm2gestionnaire de processus qui garde l'app Node vivante
Reverse proxyserveur (Nginx) en façade qui sert le front et route vers l'API
Let's Encryptautorité délivrant des certificats TLS gratuits
certbotoutil qui obtient/installe/renouvelle ces certificats
Uptimepourcentage de temps où le service est disponible

TP terminé ?

Coche chaque livrable quand tu l'as : c'est la preuve que l'étape est acquise.

livrables
–
quiz réussi
–
de série
–
Voir tous les TP