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
| Concept | Ce que tu sauras faire |
|---|---|
| VPS vs PaaS | choisir le bon type d'hébergement et le justifier |
| SSH & mise en place | te connecter à un serveur distant, y installer Node, y récupérer le code |
| Variables d'environnement | configurer sans mettre un seul secret dans le code |
| Build du front | compiler 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
| Mot | En une phrase |
|---|---|
| Serveur | une 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éploiement | l'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 loues | une machine Linux nue | une plateforme qui héberge ton app |
| Tu gères | tout : OS, Node, base, Nginx, HTTPS, sécurité, mises à jour | ton code ; la plateforme gère le reste |
| Mise en ligne | tu te connectes en SSH et tu installes tout à la main | tu connectes ton dépôt Git, ça build et déploie tout seul |
| Exemples | OVH, Scaleway, DigitalOcean, Hetzner | Render, Railway, Vercel, Heroku, Fly.io |
| Avantage | contrôle total, coût maîtrisé, très formateur | rapide, simple, moins d'erreurs, HTTPS automatique |
| Inconvénient | plus 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 / RAM | Prix | Limite / piège clé |
|---|---|---|---|
| Hetzner CX22 (VPS) | 2 vCPU / 4 Go | ~4 €/mois | 20 To trafic/mois ; tu gères tout toi-même |
| DigitalOcean Droplet Basic | 1 vCPU / 1 Go | ~6 $/mois | 1 To trafic ; bon point de départ BTS |
| Scaleway STARDUST (VPS) | 1 vCPU / 1 Go | ~1 €/mois | 200 Mbps réseau ; idéal pour apprendre |
| Render — Free tier (PaaS) | 0,1 vCPU / 512 Mo | 0 $ (750 h/mois) | cold start 20-30 s après 15 min sans trafic |
| Railway — Starter (PaaS) | partagé | 5 $/mois | 5 $ de crédits inclus ; no cold start |
| Vercel (PaaS, front only) | edge functions | 0 $ hobby | front 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).
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
# remplace par l'IP que ton hebergeur t'a donnee
ssh root@203.0.113.42
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)
# Sur TON portable (pas sur le serveur)
ssh-keygen -t ed25519 -C "deploiement-applifrais"
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
# Dépose la clé publique sur le serveur (depuis ton portable)
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@203.0.113.42
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).
# 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
v20.11.1
3. Récupérer le code et ses dépendances
# clone ton depot puis installe les paquets
git clone https://github.com/gsb/appli-frais.git
cd appli-frais
npm install
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
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 UFW | Port(s) autorisé(s) | Pourquoi |
|---|---|---|
allow OpenSSH | TCP 22 | accès administrateur — à faire EN PREMIER |
allow 'Nginx Full' | TCP 80 et 443 | HTTP (redirect) et HTTPS (service public) |
| le reste | tout autre port | bloqué par défaut — MongoDB 27017 inaccessible de l'extérieur |
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
3. Interdire l'authentification par mot de passe
sudo nano /etc/ssh/sshd_config
Localise et modifie (ou ajoute) ces deux lignes :
PermitRootLogin prohibit-password
PasswordAuthentication no
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ère | Valeur recommandée | Pourquoi |
|---|---|---|
| Longueur minimale | ≥ 32 octets = 256 bits | seuil de sécurité NIST pour HMAC-SHA256 (l'algo de signature JWT) |
| Source | aléatoire cryptographique (CSPRNG) | Math.random() est prévisible ; il ne faut pas l'utiliser pour des secrets |
| Format courant | 64 chars hex ou 44 chars base64 | printable, copier-collable dans un .env |
| Durée de vie d'un token JWT | 15 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é) :
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
a3f8c2d1e94b7f0a5c8e2d3f1b6a9c4e7d0f3b8a1c5e9f2d4b7a0c3e6f1d8b5
1 ter. Charger le .env : le module dotenv
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.
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.
# dans le dossier du front, on lance le build
npm run build
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/).
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
[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)
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.
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.
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
# 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
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 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.
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 :
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.
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.
# 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
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
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 :
sudo certbot renew --dry-run
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é.
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éflexe | Ce qu'il garantit |
|---|---|
| pm2 (ou systemd) | l'app redémarre seule au crash et au reboot |
| Monitoring uptime | un service externe « ping » ton URL et t'alerte si elle tombe |
| Mesure d'uptime | on chiffre la disponibilité en % sur une période |
Lire un chiffre d'uptime
| Uptime | Indisponibilité tolérée / an | Niveau |
|---|---|---|
| 99 % | ~3,65 jours | faible |
| 99,9 % | ~8,8 heures | bon (« trois neuf ») |
| 99,99 % | ~52 minutes | exigeant |
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.
| Outil | Gratuit | Fréquence minimale | Alertes |
|---|---|---|---|
| UptimeRobot | 50 moniteurs | 5 min | email, Slack, Telegram |
| Freshping | 50 moniteurs | 1 min | email, Slack |
| Better Uptime | 10 moniteurs | 3 min | email, appel téléphonique |
Mise en place UptimeRobot (5 min) :
- Crée un compte sur
uptimerobot.com. - « Add New Monitor » → type HTTP(s) → URL :
https://appli-frais.fr/api/health. - Intervalle : 5 minutes (gratuit). Alerte email si le site tombe.
- Ajoute un endpoint
/healthdans 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() });
});
{"status":"ok","uptime":3602.4}
RTO et RPO : les deux métriques pro
| Métrique | Signification | Exemple pratique |
|---|---|---|
| RTO — Recovery Time Objective | Temps 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 Objective | Perte 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).
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) :
- héberger les composants (API, front, base Mongo) ;
- configurer les variables d'environnement (aucun secret en dur,
.envhors Git) ; - builder le front (
dist/), lancer l'API en mode durable (pm2) ; - exposer via une URL propre (reverse proxy Nginx si VPS) + HTTPS (Let's Encrypt) ;
- 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.
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).
Pour finir
L'essentiel
| Notion | À retenir |
|---|---|
| VPS vs PaaS | tout gérer (formateur, contrôle) vs déléguer (rapide, HTTPS auto) |
| SSH | un terminal chiffré sur la machine distante : ta porte d'entrée |
| variables d'env | config et secrets hors du code, hors de Git (.env + .gitignore) |
| build front | npm run build → dist/ statique servi en prod (pas le serveur de dev) |
| pm2 | app vivante : redémarrage au crash et au reboot = disponibilité |
| reverse proxy | Nginx en façade : un point d'entrée (443), port 3000 caché |
| HTTPS | obligatoire ; gratuit et auto via Let's Encrypt/certbot |
| disponibilité | se maintient (pm2) et se mesure (uptime %) |
Vérifie tes acquis
Exercice Réussi À revoir
- Différence entre un VPS et un PaaS ? Donne un exemple de chaque.
- À quoi sert SSH, et qu'est-ce qui change dans ton terminal une fois connecté ?
- Pourquoi les secrets vont-ils dans des variables d'environnement et pas dans le code ?
- Pourquoi « builder » le front pour la production plutôt que lancer le serveur de dev ?
- À quoi sert pm2, et que garantit-il après un reboot du serveur ?
- Que fait un reverse proxy (Nginx) devant ton app ? Cite ses deux rôles ici.
- Pourquoi un service exposé doit-il être en HTTPS, et qu'apporte certbot ?
- Que signifie un uptime de 99,9 % en heures d'indisponibilité par an ?
Voir le corrigéMasquer le corrigé de l'exercice
- 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.
- 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. - 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).
- Le serveur Vite de dev est lent (il recompile à la demande), non optimisé, pas sécurisé pour la prod.
npm run buildgénère des fichiers statiques minifiés et optimisés dansdist/: ultra-rapides à servir par Nginx. - 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. - 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é. - 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).
- 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
| Mot | Définition |
|---|---|
| Déployer | rendre une application accessible à ses utilisateurs sur Internet |
| VPS | serveur Linux loué, qu'on administre soi-même |
| PaaS | plateforme qui héberge l'app et gère l'infrastructure à ta place |
| SSH | terminal chiffré ouvert sur une machine distante |
| Variable d'environnement | config (port, URL, secret) définie hors du code |
| Build | compilation du front en fichiers statiques optimisés (dist/) |
| pm2 | gestionnaire de processus qui garde l'app Node vivante |
| Reverse proxy | serveur (Nginx) en façade qui sert le front et route vers l'API |
| Let's Encrypt | autorité délivrant des certificats TLS gratuits |
| certbot | outil qui obtient/installe/renouvelle ces certificats |
| Uptime | pourcentage de temps où le service est disponible |