11. Déploiement
En développement, deux serveurs travaillent ensemble : le serveur de développement d'[Angular] (le client) et le serveur JSON (l'API). En production, il n'y en a plus qu'un :

1. Construire le client. Dans le dossier [rdvmedecins-angular] :
La console affiche :
Le dossier [dist/rdvmedecins-angular/browser/] contient toute l'application : une page [index.html], une feuille de style, et des fichiers [JavaScript] optimisés (le code d'[Angular], du routeur, de [ngx-translate]... et le nôtre) :
- les fichiers initiaux sont téléchargés au démarrage : environ 135 ko une fois compressés par le serveur ;
- chaque page chargée à la demande ([loadComponent]) a son propre fichier, téléchargé à la première visite ;
- le nom de chaque fichier contient une empreinte de son contenu ([main-ZNWESYGE.js]) : une nouvelle version aura un autre nom, et un navigateur ne pourra jamais garder en cache une version périmée ;
- le compilateur a vérifié les budgets fixés dans [angular.json] : un avertissement signalerait une application devenue trop lourde.
2. Le déposer dans le serveur. On copie le CONTENU du dossier [dist/rdvmedecins-angular/browser/] dans un dossier [client/] à la racine du serveur JSON ([rdvmedecins-nestjs-json/client/index.html], [rdvmedecins-nestjs-json/client/main-ZNWESYGE.js]...), puis on relance le serveur. Il affiche :
L'application complète est alors à l'adresse http://localhost:8080. Le serveur sert les fichiers du client, et renvoie [index.html] pour toute autre adresse hors de /api : recharger la page /agenda fonctionne (c'est le routeur du client qui l'affiche). Pour le lecteur curieux, c'est le fichier [src/web/client-spa.ts] du serveur qui fait ce travail.
3. En production réelle, on n'oubliera pas le fichier [.env] du serveur :
- un [JWT_SECRET] long et aléatoire ;
- [CAPTCHA_TEST] vide ;
- [COOKIE_SECURE=true] si le site est servi en HTTPS (il doit l'être : les mots de passe circulent) ;
- [TRUST_PROXY=true] si le serveur est placé derrière un proxy ([nginx]...), pour que la limitation des tentatives voie l'adresse IP réelle des clients.
On lance alors le serveur compilé : [npm run build], puis [npm run start:prod].