Projet Déploiement
| Champ | Valeur |
|---|---|
| Auteur·e | Élise C. Philippe |
| Édition | 2025-03-10 |
| Rammassages | Étape 1 : 2025-03-27 Étape 2 : 2025-04-14 Étape 3 : 2025-05-23 Étape 4 : 2025-06-20 |
| Taille des équipes | 2~4 personnes |
| Rendu | Sur la forge droits en lectures à delivery-collectordépôt frontend : 2024_grad_frontdépôt backend : 2024_grad_backdépôt déploiement : 2024_grad_deploy |
Barème du module
Étape 1 : 4 points Étape 2 : 6 points Étape 3 : 7 points Étape 4 : 3 points
Pour chaque étape :
- OK : les consignes sont respectées, la totalité des points est accordée ;
- POK : les consignes sont partiellement respectées, la moitié de points est accordée ;
- NOK : les consignes sont insuffisamment respectées, aucun point accordé.
Étape 1 : identification des dépendances
Comment les identifier
Les dépendances se manifestent de plusieurs façon. Il y a :
- les dépendances internes, celles qui sont écrites dans votre
package.json,Cargo.toml,composer.json, etc. - les dépendances externes, les paquets/programmes/bibliothèques installés sur l’hôte/la machine/l’ordinateur
- comme l’exécutable
nodeet sa version, la bibliothèquebcryptet sa version (c’est un exemple, vous ne devriez pas vous servir debcrypt)
- comme l’exécutable
- les dépendances de service : les API, bases de données et autres services que votre service doit pouvoir joindre à l’exécution
- ça implique la connaissance d’une version, d’une adresse et d’un secret ;
Parmi les dépendances internes, certaines ne sont utiles qu’au développement ou à la construction : typiquement :
- les bundlers à la
viteetwebback; - les
linterset formateurs à laeslint,prietter; - les compilateurs à la
tsc.
Ces dépendances sont distinguées des autres pour :
- accélérer les déploiements (et donc faire des économies de temps et d’ARGENT) ;
- peser moins lourd en déploiement (et donc faire des économies d’ARGENT).
Consignes
Dans les dépôts de votre backend et de votre frontend:
- assurez-vous que vos dépendances internes sont bien distinguées entre nécessaires au développement et nécessaires en toutes circonstances y compris en production.
Dans le dépôt de déploiement, dans un README.md, pour le frontend et le backend :
- Listez les dépendances externes et leurs versions.
- Listez les dépendances de services :
- les URL que vous prévoyez si c’est un service que vous allez déployer (une BDD), ou les URL existants si c’est un service accessible publiquement ;
- quelles variables d’environnement ou clés de configuration faut-il définir du côté de vos livrables pour qu’ils connaissent URL et secrets.
Étape 2 : écriture scripts/configurations
Les dépendances maintenant identifiées : on sait ce que l’on doit déployer sur nos serveurs, ou pour enrôler de nouveaux développeurs.
Un outil très utile pour préparer un déploiement c’est Docker avec des images de base comme :
- node pour compiler votre FE et BE et faire tourner votre BE (voir votre frontend s’il inclus du SSR) ;
- postgres, mariadb pour votre BDD ;
- caddy, ngnix comme proxy inverse et serveur du FE pré-compilé.
Construction vs. exécution
En général dans un Dockerfile on défini deux images. Dans la première on installe tout ce dont on a besoin pour construire le livrable. Dans la seconde seulement ce qui est nécessaire pour l’exécuter, et on y copie le livrable construit dans la première.
Exemple de Dockefile à deux stages pour du typescript, généré par Copilot, que vous pouvez adapter à vos besoin (en fonction du port que vous utilisez, de votre dossier destination pour le code transpilé, de votre gestionnaire de projet et des variables d’environnement dont vous pouvez avoir besoin) :
Creating a two-stage Dockerfile for a TypeScript project can help you optimize the build process by separating the build environment from the runtime environment. Here’s an example of how you can set this up:
# Stage 1: Build FROM node:16 AS builder # Set the working directory WORKDIR /app # Copy package.json and package-lock.json COPY package*.json ./ # Install dependencies RUN npm install # Copy the rest of the application code COPY . . # Compile TypeScript to JavaScript RUN npm run build # Stage 2: Production FROM node:16-alpine # Set the working directory WORKDIR /app # Copy only the necessary files from the build stage COPY --from=builder /app/package*.json ./ COPY --from=builder /app/dist ./dist # Install only production dependencies RUN npm install --only=production # Expose the application port EXPOSE 3000 # Command to run the application CMD ["node", "dist/index.js"]Explanation:
Stage 1: Build
- Uses the
node:16image as the base.- Sets the working directory to
/app.- Copies
package.jsonandpackage-lock.jsonto the container and installs dependencies.- Copies the rest of the application code and compiles TypeScript to JavaScript.
Stage 2: Production
- Uses a smaller
node:16-alpineimage to keep the final image size small.- Sets the working directory to
/app.- Copies only the necessary files (
package.json,package-lock.json, and the compileddistfolder) from the build stage.- Installs only production dependencies.
- Exposes port 3000 and sets the command to run the application.
This setup ensures that your final Docker image is as small as possible and contains only the necessary files to run your application. If you have any questions or need further assistance, feel free to ask!
ref: typescript two stages dockerfile | dans Microsoft 365 Copilot
Consignes
- Écrivez les
Dockerfilepour le FE et le BE dans leur dépôts respectifs. - Écrivez un
docker-compose.ymldans le dépôt de déploiement, il doit- décrire comment déployer votre FE et BE
- décrire le déploiement d’un proxy inverse (vous avez le droit de faire de votre FE le proxy inverse, en utilisant
caddypour servir le front et rediriger les requêtes sur/apivers le BE par exemple)
- Écrivez la configuration pour un environnement d’intégration continue (exemple : GitHub Actions, CircleCI) qui vérifie la construction de votre FE et de votre BE.
Étape 3 : préparation machine et déploiement
- installez Linux sur un serveur
- configurez le SSH sans mot de passe pour chaque membre du groupe sur votre serveur
- créez une clé SSH de déploiement par dépôt et enregistrez-la dans la configuration de ces dépôts (sur la forge, sur github, etc.)
- configurez le par-feu de la machine, de sorte à ne permettre les connexions entrantes que sur les ports 80 (si vous n’avez pas d’IP publique), 443 (si vous avez une IP publique) et 22.
- installez Docker et Docker Compose
- clonez FE, BE et dépôt de déploiement
- lancez votre stack avec
docker compose up -d, le FE doit être accessible sur le port 80 si vous n’avez pas d’IP publique ou sur le port 443 en HTTPS si vous avec une IP publique, le BE doit être accessible via/apisur le même port.
Étape 4 : déploiement continu
- à travers un hook, ou une tâche automatique, faites déployer automatiquement au serveur les nouvelles version de votre FE ou BE.