Déploiement d'une API Express dans Azure
Préparer le code pour l'exécution dans Azure
Fichier config.ts
Mettre en commentaires la section qui traite dotenv :
/* eslint-disable n/no-process-env */
import path from "path";
import dotenv from "dotenv";
import moduleAlias from "module-alias";
// Check the env
const NODE_ENV = process.env.NODE_ENV ?? "development";
// Mettre en commentaire
// // Configure "dotenv"
// const result2 = dotenv.config({
// path: path.join(__dirname, `./config/.env.${NODE_ENV}`),
// });
// if (result2.error) {
// throw result2.error;
// }
// Configure moduleAlias
if (__filename.endsWith("js")) {
moduleAlias.addAlias("@src", __dirname + "/dist");
}
Fichier build.ts
Le fichier build.ts sert à préparer et compiler l'API Express en production. C'est ce script qui sera exécuté dans Azure. Il faut s'assurer qu'il s'exécute sans erreur. (Peut varier d'un projet à l'autre...)
import fs from "fs-extra";
import logger from "jet-logger";
import childProcess from "child_process";
/**
* Start
*/
(async () => {
try {
// Remove current build
await remove("./dist/");
await exec("npm run lint", "./");
await exec("tsc --build tsconfig.prod.json", "./");
// Copy
await copy("./src/public", "./dist/public");
await copy("./src/views", "./dist/views");
// Mettre en commentaire
// await copy('./src/repos/database.json', './dist/repos/database.json');
await copy("./temp/config.js", "./config.js");
await copy("./temp/src", "./dist");
await remove("./temp/");
} catch (err) {
logger.err(err);
// eslint-disable-next-line n/no-process-exit
process.exit(1);
}
})();
/**
* Remove file
*/
function remove(loc: string): Promise<void> {
return new Promise((res, rej) => {
return fs.remove(loc, (err) => {
return !!err ? rej(err) : res();
});
});
}
/**
* Copy file.
*/
function copy(src: string, dest: string): Promise<void> {
return new Promise((res, rej) => {
return fs.copy(src, dest, (err) => {
return !!err ? rej(err) : res();
});
});
}
/**
* Do command line command.
*/
function exec(cmd: string, loc: string): Promise<void> {
return new Promise((res, rej) => {
return childProcess.exec(cmd, { cwd: loc }, (err, stdout, stderr) => {
if (!!stdout) {
logger.info(stdout);
}
if (!!stderr) {
logger.warn(stderr);
}
return !!err ? rej(err) : res();
});
});
}
Pour le tester, faire la commande suivante :
Pousser les modifications sur GitHub
Assurez-vous que le code est complet et fonctionnel avant de le pousser dans GitHub.
Création de la ressource dans Azure
Lancer la création dans le portail Azure
Remplir le formulaire
1- Sélectionner le groupe de ressources créé avec MongoDB
2- Donner un nom au service
3- Sélectionner node 22 LTS
4- Créer un plan de tarification
5- Nommer le plan de tarification 6- Clique sur OK
7- Sélectionner Gratuit F1
7- Cliquer sur Vérifier et créer
Réviser et créer
1- Vérifier que c'est bien gratuit
2- Cliquer sur Créer
Attendre la fin de la création
Aller au centre de déploiement (à partir de la page de la ressource)
Configurer la source
1- Cliquer sur source
2- Sélectionner GitHub
Configurer GitHub
1- Se connecter sur son compte GitHub
2- Sélectionner l'organisation
3- Sélectionner le dépôt
4- Séletionner la branche
5- Ajouter un workflow à votre dépôt
Enregistrer la source
Faire un git pull dans le dossier sur votre machine. (Pour recevoir le workflow créé par Azure)
Adapter le workflow
Ouvrir le workflow dans VSCode et ajuster les paramètres (par exemple, on peut retirer l'exécution des tests lors du déploiement)
Une fois le workflow modifié, le pousser dans GitHub.
Configer les variables d'environnement
1- Entrer le nom de la variable utilisée dans votre API.
2- Entrer la valeur de la variable.
3- Cliquer sur appliquer.
1- Cliquer sur appliquer.
Redémarrer le service
1- Aller à la vue d'ensemble.
2- Cliquer sur redémarrer.
Aller voir les journaux d'exécution de l'API
1- Menu supervision.
2- Option Flux de journaux.
3- Vérifier que votre serveur soit bien démarré.
Tester votre API
Trouver l'URL de votre API
Tester l'API dans bruno
Configurer CORS pour votre application React sur localhost
1- Menu API
2- Option CORS
1- Ajouter http://localhost:5173
2- Cliquer save