From 3ef37f6dc4fa578b0a9648d6c1b67562c6ddcfe3 Mon Sep 17 00:00:00 2001 From: fserres Date: Mon, 9 Dec 2024 12:55:13 -0500 Subject: [PATCH 1/2] Ajout de la doc opentofu --- .../docs/developpeur/backend/auth.md | 44 ++++++++++++------- .../developpeur/backend/base-de-donnees.md | 2 +- .../docs/developpeur/backend/katex.md | 16 ++++--- .../docs/developpeur/backend/salle-de-quiz.md | 34 ++++++++------ .../docs/developpeur/deploiements/ansible.md | 10 +++-- .../docs/developpeur/deploiements/local.md | 8 ++-- .../docs/developpeur/deploiements/opentofu.md | 41 +++++++++++++++++ .../docs/developpeur/deploiements/prod.md | 16 ++++--- .../developpeur/documentation/a-propos.md | 17 ++++--- .../docs/developpeur/frontend/index.md | 5 ++- documentation/docs/developpeur/index.md | 25 ++++++----- .../docs/utilisateur/configuration.md | 5 ++- documentation/docs/utilisateur/deploiment.md | 9 +++- 13 files changed, 162 insertions(+), 70 deletions(-) create mode 100644 documentation/docs/developpeur/deploiements/opentofu.md diff --git a/documentation/docs/developpeur/backend/auth.md b/documentation/docs/developpeur/backend/auth.md index 82b72c9..736202c 100644 --- a/documentation/docs/developpeur/backend/auth.md +++ b/documentation/docs/developpeur/backend/auth.md @@ -2,17 +2,23 @@ ## Introduction -Le but du module d'authentification est de pouvoir facilement faire des blocks de code permettant une authentification personalisée. Il est possible de le faire grâce a cette architecture. Pour la première version de cette fonctionalitée, l'introduction de OICD et de OAuth sont priorisé ainsi que la migration du module d'authentification simple. +Le but du module d'authentification est de pouvoir facilement faire des blocs de code permettant une authentification +personalisée. Il est possible de le faire grâce à cette architecture. Pour la première version de cette fonctionalité, +l'introduction de OIDC et de OAuth sont priorisé ainsi que la migration du module d'authentification simple. ## Déconstruction simple de la structure La structure est la suivante : -Le AuthManager s'occupe de centraliser les requetes d'authentifications. Ce qui veux dire d'initialiser les autres modules et d'être la source de véritée dans au sujet de l'authentification. Les modules sont automatiquement chargé par l'utilisation de variables d'environment. +Le AuthManager s'occupe de centraliser les requêtes d'authentification. Ce dernier initialise les autres modules et est +la source de vérité dans les aspects liés à l'authentification. Les modules sont automatiquement chargés par +l'utilisation de variables d'environment. -Le module s'occupe de creer les routes nécéssaires pour son fonctionnement et de créer les utilisateurs. Ces modules vont appeller le AuthManager afin de confirmer leurs actions avec le login/register de celui-ci +Le module s'occupe de créer les routes nécessaires pour son fonctionnement et de créer les utilisateurs. Ces modules +vont appeller le AuthManager afin de confirmer leurs actions avec le login/register de celui-ci. -Dans le cas de modules plus complexe, tels que le module Passport, la chaine peut être prolongée afin de maintenir centralisée les actions. Chaque connecteur de PassportJs est initialisé par le module de PassportJs. +Dans le cas de modules plus complexe, tels que le module Passport, la chaine peut être prolongée afin de maintenir +les actions centralisée . Chaque connecteur de PassportJs est initialisé par le module de PassportJs. ## Besoins exprimés @@ -20,32 +26,38 @@ Dans le cas de modules plus complexe, tels que le module Passport, la chaine peu Modularité et généricité : -- Le système d'authentification doit être adaptable à diverses configurations, notamment pour répondre aux exigences spécifiques des différentes universités ou institutions. +- Le système d'authentification doit être adaptable à diverses configurations, notamment pour répondre aux exigences +spécifiques des différentes universités ou institutions. Utilisation de différentes méthodes d'authentification : -- L'application doit permettre de gérer plusieurs fournisseurs d'authentification (SSO, LDAP, OAuth, etc.) de manière centralisée et flexible. +- L'application doit permettre de gérer plusieurs fournisseurs d'authentification (SSO, LDAP, OAuth, etc.) de manière +centralisée et flexible. Facilité de configuration : -- Le système doit permettre une configuration simple et flexible, adaptée à différents environnements (développement, production, etc.). +- Le système doit permettre une configuration simple et flexible, adaptée à différents environnements (développement, +production, etc.). Gestion des permissions : -- Il doit être possible de définir et de mapper facilement les permissions et les rôles des utilisateurs pour sécuriser l’accès aux différentes fonctionnalités de l’application. +- Il doit être possible de définir et de mapper facilement les permissions et les rôles des utilisateurs pour sécuriser +l’accès aux différentes fonctionnalités de l’application. Maintien de la connexion : -- Le système doit garantir la persistance de la connexion pendant toute la durée de l'utilisation de l'application (exemple : quiz), avec la possibilité de se reconnecter sans perte de données en cas de déconnexion temporaire. +- Le système doit garantir la persistance de la connexion pendant toute la durée de l'utilisation de l'application +(exemple : quiz), avec la possibilité de se reconnecter sans perte de données en cas de déconnexion temporaire. -## Recis utilisateurs pris en comptes +## Recits utilisateurs pris en comptes -- En tant qu'utilisateur de projet FOSS, je veux que le module d'authentifcation soit modulaire et générique afin de l'adapter a mes besoins. +- En tant qu'utilisateur de projet FOSS, je veux que le module d'authentification soit modulaire et générique afin de +l'adapter à mes besoins. - En tant qu'administrateur, je veux que les droits des utilisateurs soient inférés par l'authentificateur de l'établissement. -- En tant qu'administrateur, je veux que la configuration des authentificateur soit simple -- En tant qu'administrateur, je veux configurer les connections a partir de variables d'env ou fichier de config. +- En tant qu'administrateur, je veux que la configuration des authentificateurs soit simple +- En tant qu'administrateur, je veux configurer les connexions à partir de variables d'environnement ou fichier de config. - En tant qu'utilisateur, je veux que ma connexion soit stable. -- En tant qu'utilisateur, je veux pouvoir me reconnecter a une salle s'il y arrive un problème de connexion. +- En tant qu'utilisateur, je veux pouvoir me reconnecter à une salle s'il survient un problème de connexion. ## Diagrammes @@ -137,7 +149,7 @@ package Frontend{ ``` -### Explication des communications : Passport Js +### Explication des communications : Passport Js ```plantuml @startuml @@ -349,7 +361,7 @@ Example de configuration du fichier : `server/auth_config.json` : "OAUTH_USERINFO_URL": "https://auth.gmatte.xyz/application/o/userinfo/", "OAUTH_CLIENT_ID": "--redacted--", "OAUTH_CLIENT_SECRET": "--Redacted--", - "OAUTH_ADD_SCOPE": "groups", // scopes supplémentaire nécéssaire pour le pivot + "OAUTH_ADD_SCOPE": "groups", // scopes supplémentaire nécessaire pour le pivot "OAUTH_ROLE_TEACHER_VALUE": "groups_evaluetonsavoir-prof", // valeur de pivot afin de définir un enseignant "OAUTH_ROLE_STUDENT_VALUE": "groups_evaluetonsavoir" // valeur de pivot afin de définir un étudiant } diff --git a/documentation/docs/developpeur/backend/base-de-donnees.md b/documentation/docs/developpeur/backend/base-de-donnees.md index 52bdb12..68821ee 100644 --- a/documentation/docs/developpeur/backend/base-de-donnees.md +++ b/documentation/docs/developpeur/backend/base-de-donnees.md @@ -1,5 +1,5 @@ # Type de base de données -La base de données est une mongoDB +La base de données est une MongoDB. # Collections disponibles * Files : Ceci est la collection qui contient les différents quiz et leurs questions. diff --git a/documentation/docs/developpeur/backend/katex.md b/documentation/docs/developpeur/backend/katex.md index 73a6e5d..d1deac1 100644 --- a/documentation/docs/developpeur/backend/katex.md +++ b/documentation/docs/developpeur/backend/katex.md @@ -10,12 +10,14 @@ alors que les formules entourées de $ s'afficheront sur la même ligne `.replace(/\$(.*?)\$/g, (_, inner) => katex.renderToString(inner, { displayMode: false }))` -La configuration du formatage peut être trouvée dans le fichier TextType.ts situé dans le dossier EvalueTonSavoir/client/src/components/GiftTemplate/templates +La configuration du formatage peut être trouvée dans le fichier TextType.ts situé dans le dossier +EvalueTonSavoir/client/src/components/GiftTemplate/templates C'est aussi dans ce fichier que le format markdown est pris en charge. ## Éditeur de quiz -Pour l'affichage dans l'éditeur de quiz, on peut retrouver la classe TextType être appliquée sur différents éléments du dossier templates, par exemple la classe Numerical.ts. +Pour l'affichage dans l'éditeur de quiz, on peut retrouver la classe TextType être appliquée sur différents éléments +du dossier templates, par exemple la classe Numerical.ts. On peut voir ici que le TextType est appliqué sur le contenu de la question: ```typescript @@ -26,14 +28,16 @@ Selon ce qui avait été écrit dans la question, la classe s'occupera de format ## Affichage de questions -Le module React-latex était utilisé pour le formatage des questions durant un quiz, mais cela a apporté le problème de disparité d'affichage entre la création et l'affichage des questions avec des formules mathématiques. +Le module React-latex était utilisé pour le formatage des questions durant un quiz, mais cela a apporté un problème +de disparité d'affichage entre la création et l'affichage des questions avec des formules mathématiques. Les classes affichant les questions durant un quiz peuvent utiliser ce format, mais avec une manipulation de plus. -Les variables contenant la question doivent d'abord avoir un type TextFormat pour pouvoir faire appel à la classe qui s'occupe du format sous le module KaTeX. -Puis, étant sur un environnement React, il faut utiliser la propriété dangerouslySetInnerHTML pour afficher la question correctement. +Les variables contenant la question doivent d'abord avoir un type TextFormat pour pouvoir faire appel à la classe qui +s'occupe du format sous le module KaTeX. Puis, étant sur un environnement React, il faut utiliser la propriété +dangerouslySetInnerHTML pour afficher la question correctement. `
` -Ce type de manipulation peut être utilisé dans d'autre environnement React si on veut éviter d'utiliser React-latex. \ No newline at end of file +Ce type de manipulation peut être utilisé dans d'autres environnements React si on veut éviter d'utiliser React-latex. \ No newline at end of file diff --git a/documentation/docs/developpeur/backend/salle-de-quiz.md b/documentation/docs/developpeur/backend/salle-de-quiz.md index 977d816..08d76c7 100644 --- a/documentation/docs/developpeur/backend/salle-de-quiz.md +++ b/documentation/docs/developpeur/backend/salle-de-quiz.md @@ -2,44 +2,51 @@ ## Introduction -Les salles de quiz ont été extraites dans leur propre container afin de limiter les dégats liés soit a une surutilisation d'une salle ou une attaque sur le logiciel. +Les salles de quiz ont été extraites dans leur propre conteneur afin de limiter les dégâts liés soit à une +surutilisation d'une salle soit à une attaque sur le logiciel. -En éffet, le découplement permet a un quiz de: +En effet, le découplement permet a un quiz de: - Survivre même si le backend est non-fonctionnel - Mourir sans entrainer toute l'application avec elle - Créer/Supprimer des salles automatiquement dépendant de la demande - Pour éffectuer ceci il faut éffectuer une petite gymnastique. Il y a une route dans l'api servant à gerer les salles. Lorsqu'un utilisateur demande le socket d'une salle : "/api/rooms/{id}/socket", la requette rebondit sur le proxy Nginx. Celui-ci contacte le backend afin d'obtenir l'addresse de l'ordinateur auquel envoyer la requette et redirige le socket vers ce pc. +Pour effectuer ceci, il faut faire une petite gymnastique. Il y a une route dans l'api servant à gérer les salles. +Lorsqu'un utilisateur demande le socket d'une salle : "/api/rooms/{id}/socket", la requête rebondit sur le proxy Nginx. +Celui-ci contacte le backend afin d'obtenir l'adresse de l'ordinateur auquel envoyer la requête et redirige le socket +vers cette adresse. ## Déconstruction simple de la structure -Un module supplémnetaire a été ajouté à la structure : Rooms. +Un module supplémentaire a été ajouté à la structure : Rooms. -L'objet `room` est la définition d'une salle de façon minimaliste, cette définission est aggrandie avec l'information récotlé du "provider". -Le `provider` est le système gérant les différentes salles. Dans l'implémentation éffectuée, il s'agit de docker. +L'objet `room` est la définition d'une salle de façon minimaliste. Cette définition est aggrandie avec l'information +récoltée du "provider". +Le `provider` est le système gérant les différentes salles. Dans l'implémentation effectuée, il s'agit de docker. Lorsque l'api des salles est instantié, celui-ci est lié avec un "provider", définissant comment les salles seront créées. -L'api des salles permet de les ajouter, les supprimer, et les consulter les salles. +L'api des salles permet de les ajouter, les supprimer, et les consulter. L'api lance deux "jobs": - Une vérification de l'état de santé des salles. Celle-ci roule tous les 10 secondes et met a jour les salles. -- Une suppression des salles. Celle-ci roule tous les 30 secondes et supprimme automatiquement les salles ayant la mention de suppression. +- Une suppression des salles. Celle-ci roule tous les 30 secondes et supprimme automatiquement les salles ayant la +mention de suppression. ## Besoins exprimés Fiabilite : -- Nous voulons s'assurer qu'il soit possible d'avoir un grand nombre d'élèves présent sans qu'il y ait des problèmes de déconnexions -- Nous voulons que le temps de réponse soit bas +- Nous voulons s'assurer qu'il soit possible d'avoir un grand nombre d'élèves présent sans qu'il y ait des problèmes de +déconnexions +- Nous voulons que le temps de réponse soit faible - Nous voulons que le système soit capable de fonctionner de facon indépendante ## Recis utilisateurs pris en comptes -- En tant qu'enseignant, je veux que tous mes élèves soient capable de se connecter a la salle de classe rapidement +- En tant qu'enseignant, je veux que tout mes élèves soient capable de se connecter à la salle de classe rapidement - En tant qu'enseignant, je veux que la salle de quiz puisse survivre des pannes liées aux autres modules de l'aplication -- En tant qu'administrateur, je veux que les salles soient indépendantes et qui ne touche pas aux performances des autres salles +- En tant qu'administrateur, je veux que les salles soient indépendantes et n'impactent pas les performances des autres salles - En tant qu'administrateur, je veux que les salles puissent être hébergées séparément du projet ## Diagrammes @@ -114,7 +121,8 @@ class QuizRoom{ } @enduml ``` -Remarque: Les signatures de fonctions semblent un peu partout car il y a des fonctions de classes standard, des appels HTTPS et des appels de sockets dans le même diagramme. +Remarque: Les signatures de fonctions semblent un peu partout car il y a des fonctions de classes standard, des appels +HTTPS et des appels de sockets dans le même diagramme. ### Diagramme de séquence démontrant les communications ```plantuml diff --git a/documentation/docs/developpeur/deploiements/ansible.md b/documentation/docs/developpeur/deploiements/ansible.md index a701b95..ada79d4 100644 --- a/documentation/docs/developpeur/deploiements/ansible.md +++ b/documentation/docs/developpeur/deploiements/ansible.md @@ -1,4 +1,4 @@ -# Documentation de Déploiement avec Ansible +# Documentation de déploiement avec Ansible Ce guide explique comment utiliser **Ansible** pour déployer facilement le projet **ÉvalueTonSavoir**. @@ -42,14 +42,14 @@ ansible-playbook -i inventory.ini deploy.yml ``` ### Structure des fichiers utilisés -- **`inventory.ini`** : Définit les cibles du déploiement. Par défaut, il est configuré pour un déploiement local. +- **`inventory.ini`** : Défini les cibles du déploiement. Par défaut, il est configuré pour un déploiement local. - **`deploy.yml`** : Playbook contenant les instructions pour installer, configurer et déployer l'application. ### Étapes effectuées par Ansible 1. **Installation des dépendances** : - Vérifie et installe Docker si nécessaire. 2. **Démarrage des services** : - - Télécharge le fichier `docker-compose.yaml` depuis le dépôt. + - Télécharge le fichier `docker-compose.yaml` depuis le dépôt Github. - Lance les services définis avec Docker Compose. 3. **Vérification des conteneurs** : - Vérifie que les conteneurs sont en cours d'exécution et fonctionnent correctement. @@ -72,4 +72,6 @@ Un code de réponse `200 OK` indiquera que le déploiement est réussi. ## Résumé -Le déploiement avec **Ansible** simplifie la gestion des configurations et l'installation des dépendances nécessaires pour le projet **ÉvalueTonSavoir**. Avec cette méthode, vous pouvez déployer rapidement l'application dans un environnement local tout en assurant une configuration cohérente. +Le déploiement avec **Ansible** simplifie la gestion des configurations et l'installation des dépendances nécessaires +pour le projet **ÉvalueTonSavoir**. Avec cette méthode, vous pouvez déployer rapidement l'application dans un +environnement local tout en assurant une configuration cohérente. diff --git a/documentation/docs/developpeur/deploiements/local.md b/documentation/docs/developpeur/deploiements/local.md index fff9869..239b95d 100644 --- a/documentation/docs/developpeur/deploiements/local.md +++ b/documentation/docs/developpeur/deploiements/local.md @@ -11,14 +11,15 @@ git clone https://github.com/ets-cfuhrman-pfe/EvalueTonSavoir.git ``` -## Étape 1 - démarrage du backend +## Étape 1 - Démarrage du backend 1. Naviguez vers le répertoire du projet en utilisant la commande suivante : ``` cd .\EvalueTonSavoir\server\ ``` -2. Assurez-vous de créer le fichier .env et d'y ajouter les paramètres appropriés. Vous pouvez vous inspirer du fichier .env.example pour connaître les paramètres nécessaires. +2. Assurez-vous de créer le fichier .env et d'y ajouter les paramètres appropriés. Vous pouvez vous inspirer du fichier +.env.example pour connaître les paramètres nécessaires. [[Voir ici la documentation des configurations|Configurations]] @@ -44,7 +45,8 @@ > Assurez-vous que le backend est en cours d'exécution avant de démarrer le frontend. \ > Notez également l'URL du serveur pour le fichier `.env`. -2. Assurez-vous de créer le fichier .env et d'y ajouter les paramètres appropriés. Vous pouvez vous inspirer du fichier .env.example pour connaître les paramètres nécessaires. +2. Assurez-vous de créer le fichier .env et d'y ajouter les paramètres appropriés. Vous pouvez vous inspirer du fichier +.env.example pour connaître les paramètres nécessaires. [[Voir ici la documentation des configurations|Configurations]] diff --git a/documentation/docs/developpeur/deploiements/opentofu.md b/documentation/docs/developpeur/deploiements/opentofu.md new file mode 100644 index 0000000..f3ee2e8 --- /dev/null +++ b/documentation/docs/developpeur/deploiements/opentofu.md @@ -0,0 +1,41 @@ +# Documentation de déploiement avec OpenTofu + +Ce guide explique comment **OpenTofu** est utilisé pour déployer facilement le projet **ÉvalueTonSavoir**. + +## Déploiement + +### Étapes à réaliser pour faire le déploiement + +Pour déployer à l'aide de OpenTofu, il suffit de suivre les étapes du fichier [README.md](https://github.com/ets-cfuhrman-pfe/EvalueTonSavoir/blob/main/opentofu/README.md). + +### Structure des fichiers utilisés pour le déploiement sur Azure +- **`app.tf`** : Défini les configurations de la machine virtuelle qui exécute l'application. +- **`database.tf`** : Défini les configurations de la base de données. +- **`main.tf`** : Défini le fournisseur utilisé pour le déploiement, dans ce cas-ci Azure. +- **`network.tf`** : Défini les configurations réseau et les règles de sécurité réseau. +- **`resource_group.tf`** : Défini les configurations du groupes de ressources dans Azure. +- **`storage.tf`** : Défini les configurations pour stocker et pouvoir utiliser le fichier auth_config.json. +- **`terraform.tfvars`** : Défini les valeurs des variables à utiliser lors du déploiement. +- **`variables.tf`** : Défini toutes les variables qui sont utilisées lors du déploiement. + +### Étapes effectuées par OpenTofu +1. **Création des éléments du réseau** : + - Création d'un réseau virtuel. + - Création d'un sous-réseau. + - Création d'une adresse ip publique. + - Création d'un groupe de sécurité réseau. + - Création d'une interface réseau. +2. **Création de la base de données** : + - Création du serveur de base de données. + - Création de la base de données (collection puisqu'on utilise MongoDB) +3. **Création de la machine virtuelle** : + - Création de la machine virtuelle. + - Installation de Docker + - Récupération du fichier `docker-compose.yaml` depuis le dépôt Github. + - Exécution de l'application avec le fichier `docker-compose.yaml` + +## Résumé + +Le déploiement avec **OpenTofu** simplifie la gestion des éléments nécessaires pour déployer le projet +**ÉvalueTonSavoir**. dans l'infonuagique. Avec cette méthode, vous pouvez déployer rapidement et facilement +l'application dans un environnement infonuagique. \ No newline at end of file diff --git a/documentation/docs/developpeur/deploiements/prod.md b/documentation/docs/developpeur/deploiements/prod.md index 47e1176..478ad89 100644 --- a/documentation/docs/developpeur/deploiements/prod.md +++ b/documentation/docs/developpeur/deploiements/prod.md @@ -1,9 +1,11 @@ ## Introduction -Nous avons choisi d'exécuter les composantes de cette application avec Docker, car cela simplifie le processus de gestion des processus d'application. +Nous avons choisi d'exécuter les composantes de cette application avec Docker, car cela simplifie le processus de +gestion des processus d'application. -Voici un diagramme de déploiement expliquant la relation des composantes et comment les images Docker sont créées et déployées dans un serveur. +Voici un diagramme de déploiement expliquant la relation des composantes et comment les images Docker sont créées et +déployées dans un serveur. ```plantuml @startuml @@ -70,9 +72,11 @@ Les STI nous a fourni un serveur avec les spécifications suivantes : - HDD : 100 Go - Certificat SSL -Les STI ont déjà effectué la configuration initiale de la machine selon leurs normes de mise en place d'un serveur pour assurer la bonne maintenance et sécurité au sein de leur infrastructure. Cette configuration inclut un utilisateur non root. +Les STI ont déjà effectué la configuration initiale de la machine selon leurs normes de mise en place d'un serveur pour +assurer la bonne maintenance et sécurité au sein de leur infrastructure. Cette configuration inclut un utilisateur non root. -Vous aurez également besoin d'un compte Docker Hub, ou vous pouvez simplement créer une PR sur le projet principal et elle sera déployée automatiquement. +Vous aurez également besoin d'un compte Docker Hub, ou vous pouvez simplement créer une PR sur le projet principal et +elle sera déployée automatiquement. ## Étape 1 - Installation de Docker @@ -207,7 +211,9 @@ curl -SL https://raw.githubusercontent.com/ets-cfuhrman-pfe/EvalueTonSavoir/main ``` > [!NOTE] -> Avant de continuer, veuillez noter qu'il est crucial de mettre à jour les variables d'environnement dans le script, car les valeurs actuelles sont des modèles génériques. Assurez-vous de personnaliser ces variables selon les besoins spécifiques de votre environnement avant d'exécuter le script. +> Avant de continuer, veuillez noter qu'il est crucial de mettre à jour les variables d'environnement dans le script, +> car les valeurs actuelles sont des modèles génériques. Assurez-vous de personnaliser ces variables selon les besoins +> spécifiques de votre environnement avant d'exécuter le script. Avec le fichier docker-compose.yml en place, vous pouvez maintenant exécuter Docker Compose pour démarrer votre environnement : ``` diff --git a/documentation/docs/developpeur/documentation/a-propos.md b/documentation/docs/developpeur/documentation/a-propos.md index 407e09a..5d9183a 100644 --- a/documentation/docs/developpeur/documentation/a-propos.md +++ b/documentation/docs/developpeur/documentation/a-propos.md @@ -4,20 +4,25 @@ Pour lancer la documentation, il faut installer python et entrer dans le dossier documentation. Il faut ensuite installer les dépendances avec `pip install -r requirements.txt`. Pour lancer le mode développement il faut executer `python -m mkdocs serve` -Afin d'accellerer le déploiement et ne pas être touché par des érreurs de "rate-limiting", il est préférable d'utiliser une image docker de plantuml. Pour cela, il faut utiliser la commande suivante : `docker run -d --name plantuml -p 8080:8080 plantuml/plantuml-server:tomcat` +Afin d'accélérer le déploiement et ne pas être touché par des erreurs de "rate-limiting", il est préférable d'utiliser +une image docker de plantuml. Pour cela, il faut utiliser la commande suivante : +`docker run -d --name plantuml -p 8080:8080 plantuml/plantuml-server:tomcat` -## Deploiement +## Déploiement Le code est automatiquement déployé par la github-action `create-docs.yaml` -Celle-ci ouvre le repo et fait les memes étapes que "lancer la documentation". +Celle-ci ouvre le repo et fait les mêmes étapes que "lancer la documentation". Il y a une différence, elle utilise `build` au lieu de `serve` pour ensuite publier avec l'outil [`ghp-import`](https://github.com/c-w/ghp-import). La page est poussée sur la branche [`gh-pages`](https://github.com/ets-cfuhrman-pfe/EvalueTonSavoir/tree/gh-pages) et ensuite publié en tant que [gh-page](https://pages.github.com/) ## Themes et Plugins Si vous ajoutez des plugins, veuillez mettre a jour le fichier `requirements.txt`. -La documentation utilise [MkDocs](https://www.mkdocs.org/) avec [le theme matérial]((https://squidfunk.github.io/mkdocs-material/)). Il y a bien des fonctionalitées tel que les code-blocks qui peuvent être activés. +La documentation utilise [MkDocs](https://www.mkdocs.org/) avec [le theme matérial]((https://squidfunk.github.io/mkdocs-material/)). Il y a bien des fonctionalités tel que les c +ode-blocks qui peuvent être activés. Vous pouvez avoir accès a la documentation ici : [https://squidfunk.github.io/mkdocs-material/reference/code-blocks/](https://squidfunk.github.io/mkdocs-material/reference/code-blocks/) ## Autre méthode de lancement (virtuel) -Si vous avez un probleme avec votre environement et vous avez besoin d'un environement virtuel, il s'agit de faire `python -m venv .venv` dans le dossier document et d'activer cet environemment avec le fichier activate (changeant depedant de votre invite de commande) : `.venv\script\activate` -vous pouvez ensuite continuer les autres étapes. \ No newline at end of file +Si vous avez un probleme avec votre environement et vous avez besoin d'un environement virtuel, il s'agit de faire +`python -m venv .venv` dans le dossier document et d'activer cet environemment avec le fichier activate (changeant +dépendant de votre invite de commande) : `.venv\script\activate`. +Vous pouvez ensuite continuer les autres étapes. \ No newline at end of file diff --git a/documentation/docs/developpeur/frontend/index.md b/documentation/docs/developpeur/frontend/index.md index 008623c..1ab89b5 100644 --- a/documentation/docs/developpeur/frontend/index.md +++ b/documentation/docs/developpeur/frontend/index.md @@ -8,12 +8,13 @@ Le code original a été développé pour créer une extension VS afin de prendr Le code peut être trouvé ici: [https://codesandbox.io/s/gift-templates-iny09](https://codesandbox.io/s/gift-templates-iny09) -Nous avons décidé de réutiliser ce code car il fournit un aperçu proche de ce à quoi ressemblent les quiz dans Moodle. Ce qui est une plateforme bien connue à l'École de technologie supérieure (ÉTS). +Nous avons décidé de réutiliser ce code car il fournit un aperçu proche de ce à quoi ressemblent les quiz dans Moodle, +étant une plateforme bien connue à l'École de Technologie Supérieure (ÉTS). Pour réutiliser le code, nous avons dû installer les packages NPM suivants: - [katex](https://www.npmjs.com/package/katex) : Une bibliothèque JavaScript rapide et facile à utiliser pour le rendu mathématique TeX sur le web. -- [marked](https://www.npmjs.com/package/marked) : Un analyseur syntaxique et un compilateur de markdown. Construit pour la vitesse. +- [marked](https://www.npmjs.com/package/marked) : Un analyseur syntaxique et un compilateur de markdown construit pour la vitesse. - [nanoid](https://www.npmjs.com/package/nanoid) : Un générateur d'identifiants de chaîne unique, sécurisé, convivial pour les URL et minuscule (108 octets) pour JavaScript. - [gift-pegjs](https://www.npmjs.com/package/gift-pegjs) : Un analyseur GIFT pour JavaScript utilisant PEG.js. - [@types/katex](https://www.npmjs.com/package/@types/katex) : Définitions TypeScript pour katex. diff --git a/documentation/docs/developpeur/index.md b/documentation/docs/developpeur/index.md index 4d53da6..f11bb04 100644 --- a/documentation/docs/developpeur/index.md +++ b/documentation/docs/developpeur/index.md @@ -1,22 +1,24 @@ # Structure haut niveau ## But du projet -ÉvalueTonSavoir a été créer dû aux gros coûts des versions entreprises des logiciels similaires tels que Socrative et Kahoot. Le bût principal est d’être capable d’avoir une plateforme auto-hébergée et bien intégrée dans les systèmes déjà présents des établissements scolaire. +ÉvalueTonSavoir a été créé dû aux coûts importants des versions entreprises des logiciels similaires tels que Socrative et +Kahoot. Le but principal est d’être capable d’avoir une plateforme auto-hébergée et bien intégrée dans les systèmes +déjà présents des établissements scolaire. ## Requis -Le but du projet étant un outils gratuis/libre afin d'améliorer l'apprentissage, celui-ci a les bûts suivants : +Le but du projet est d'avoir un outil gratuit et libre afin d'améliorer l'apprentissage avec les fonctionnalités suivantes : -- Permettre aux personnels enseignant de créer des tests -- Permettre aux enseignant de collecter les résultats des tests -- Permettre aux étudiants de prendre ces tests +- Permettre aux personnel enseignant de créer des quizs +- Permettre aux enseignant de collecter les résultats des quizs +- Permettre aux étudiants de faire ces quizs - Permettre aux étudiants d'avoir une rétroaction Afin de limiter le niveau de difficulté d'intégration du personnel enseignant: - L'utilisation du format [`GIFT`](https://docs.moodle.org/405/en/GIFT_format) déja présent dans moodle doit être utilisé - Le personnel et les étudiants doivent être capable de s'authentifier avec le portail de l'école -- Le démarage du quiz doit se faire de facon rapide et éfficace. +- Le démarrage du quiz doit se faire de façon rapide et efficace. Afin de faciliter le déploiement de masse : @@ -59,13 +61,16 @@ Frontend --up-> Nginx ### Details techniques -Le tableau ci-dessus est simplifié grandement car toutes les composantes sont individuelles. Ce qui veux dire qu'une toutes les parties pouraient être déployé sur un serveur différent et tout de même fonctionner, permettant de distribuer la charge de travail facilement. +Le tableau ci-dessus est simplifié grandement car toutes les composantes sont individuelles. Ce qui veut dire que chacune +des parties pouraient être déployées sur un serveur différent et tout de même fonctionner. Ceci permettrai de distribuer +la charge de travail facilement entre plusieurs serveurs. -Le proxy Nginx permet de camoufler la séparation du backend et frontend en réunissant les deux parties sous la même url. Il a aussi la tache de diriger les appels de sockets vers leurs machine interne dans le provider. +Le proxy Nginx permet de camoufler la séparation du backend et frontend en réunissant les deux parties sous la même url. +Il a aussi la tâche de diriger les appels de sockets vers leur machine interne dans le provider. -Le frontend déssert la partie visuel de l'application. +Le frontend dessert la partie visuelle de l'application. -Le backend s'occupe de tous les services tel quel : +Le backend s'occupe de tout les services suivants : - La gestion des utilisateurs - La gestion des quizs diff --git a/documentation/docs/utilisateur/configuration.md b/documentation/docs/utilisateur/configuration.md index 54677d0..9280a1b 100644 --- a/documentation/docs/utilisateur/configuration.md +++ b/documentation/docs/utilisateur/configuration.md @@ -1,5 +1,6 @@ > [!NOTE] -> Chaque projet contient un fichier `.env.example` fournissant des exemples de configuration. Assurez-vous de consulter ce fichier pour vous inspirer des paramètres nécessaires à votre configuration. +> Chaque projet contient un fichier `.env.example` fournissant des exemples de configuration. +> Assurez-vous de consulter ce fichier pour vous inspirer des paramètres nécessaires à votre configuration. > [!NOTE] > Ce sont toutes les options de configuration. N'hésitez pas à ouvrir une PR si vous en voyez qui manquent. @@ -30,7 +31,7 @@ | `PORT` | Numero de port sur lequel la NGINX écoute | http://localhost:80 | oui| | `FRONTEND_HOST` | Url relié au Frontend | http://localhost |oui | `FRONTEND_PORT` | Port relié au Frontend | http://localhost:5173 | oui| -| `BACKEND_HOST` | Url relié au Backend | http://localhost |oui +| `BACKEND_HOST` | Url relié au Backend | http://localhost |oui | `BACKEND_PORT` | Port relié au Backend | http://localhost:3000 | oui| ## Options de Configuration de la salle de Quiz diff --git a/documentation/docs/utilisateur/deploiment.md b/documentation/docs/utilisateur/deploiment.md index 34e0806..48a975d 100644 --- a/documentation/docs/utilisateur/deploiment.md +++ b/documentation/docs/utilisateur/deploiment.md @@ -6,8 +6,13 @@ Ansible est utilisés afin de faire un déploiement sur un serveur local, opento ## Ansible Le déploiement avec ansible est un déploiement simplifié. -Il vous suffis d'avoir un ordinateur linux/mac ou pouvant faire exécuter [WSL2](https://learn.microsoft.com/en-us/windows/wsl/install) dans le cas de windows. Il faut ensuite utiliser le gestionnaire de paquet (souvent apt) afin d'installer le paquet `ansible-core`, d'autres méthodes sont indiquées dans la [documentation officielle de ansible](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html). Une fois le tout fais, vous pouvez telécharger [les fichiers nécéssaire](https://github.com/ets-cfuhrman-pfe/EvalueTonSavoir/ansible) et lancer la commande `ansible-playbook -i inventory.ini deploy.yml` +Il vous suffit d'avoir un ordinateur linux/mac ou pouvant faire exécuter [WSL2](https://learn.microsoft.com/en-us/windows/wsl/install) +dans le cas de windows. Il faut ensuite utiliser le gestionnaire de paquet (souvent apt) afin d'installer +le paquet `ansible-core`, d'autres méthodes sont indiquées dans la [documentation officielle de ansible](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html). +Une fois le tout fait, vous pouvez telécharger [les fichiers nécéssaire](https://github.com/ets-cfuhrman-pfe/EvalueTonSavoir/ansible) et lancer la commande +`ansible-playbook -i inventory.ini deploy.yml` ## OpenTofu Le déploiement avec OpenTofu est un peu plus complexe mais il permet d'héberger la solution sur votre cloud préféré. -Il suffit [d'installer OpenTofu](https://opentofu.org/docs/intro/install/) et de téléchgarger [les fichiers nécéssaires](https://github.com/ets-cfuhrman-pfe/EvalueTonSavoir/opentofu). Un Readme est inclus afin d'organiser votre grape de serveurs. \ No newline at end of file +Il suffit [d'installer OpenTofu](https://opentofu.org/docs/intro/install/) et de téléchgarger [les fichiers nécéssaires](https://github.com/ets-cfuhrman-pfe/EvalueTonSavoir/opentofu). +Un Readme est inclus afin d'organiser votre grappe de serveurs. \ No newline at end of file From 75e669b8b4a48673b97b272c0c0dd97bdc5ef403 Mon Sep 17 00:00:00 2001 From: fserres Date: Mon, 9 Dec 2024 14:58:48 -0500 Subject: [PATCH 2/2] Add deployment with opentofu --- .gitignore | 10 +- opentofu/README.md | 44 +++++ opentofu/auth_config.json.example | 35 ++++ opentofu/azure/app.tf | 67 ++++++++ opentofu/azure/database.tf | 43 +++++ opentofu/azure/main.tf | 14 ++ opentofu/azure/network.tf | 87 ++++++++++ opentofu/azure/resource_group.tf | 5 + opentofu/azure/storage.tf | 74 ++++++++ opentofu/azure/terraform.tfvars.example | 7 + opentofu/azure/variables.tf | 214 ++++++++++++++++++++++++ opentofu/docker-compose.yaml | 80 +++++++++ 12 files changed, 679 insertions(+), 1 deletion(-) create mode 100644 opentofu/README.md create mode 100644 opentofu/auth_config.json.example create mode 100644 opentofu/azure/app.tf create mode 100644 opentofu/azure/database.tf create mode 100644 opentofu/azure/main.tf create mode 100644 opentofu/azure/network.tf create mode 100644 opentofu/azure/resource_group.tf create mode 100644 opentofu/azure/storage.tf create mode 100644 opentofu/azure/terraform.tfvars.example create mode 100644 opentofu/azure/variables.tf create mode 100644 opentofu/docker-compose.yaml diff --git a/.gitignore b/.gitignore index 551aa14..f6ed4f9 100644 --- a/.gitignore +++ b/.gitignore @@ -130,4 +130,12 @@ dist .pnp.* db-backup/ -.venv \ No newline at end of file +.venv + +# Opentofu state +opentofu/*/.terraform +opentofu/*/.terraform.lock* +opentofu/*/terraform.tfstate* +opentofu/*/terraform.tfvars +# Opentofu auth config +opentofu/auth_config.json \ No newline at end of file diff --git a/opentofu/README.md b/opentofu/README.md new file mode 100644 index 0000000..b7de6e5 --- /dev/null +++ b/opentofu/README.md @@ -0,0 +1,44 @@ +# Déploiement avec Opentofu + +## Microsoft Azure + +### Installer opentofu + +https://opentofu.org/docs/intro/install/ + +### Installer Azure CLI + +https://learn.microsoft.com/en-us/cli/azure/install-azure-cli#install + +### Se connecter à Azure et récupérer l'id de l'abonnement Azure + +Pour se connecter à Azure, faites la commande suivante + +`az login` + +Avec cette commande, vous allez sélectionner un abonnement Azure. Copiez l'id de l'abonnement, vous en aurez besoin +dans l'étape suivant. + +### Modifier les configurations + +Créer un fichier **terraform.tfvars** sur la base du fichier **terraform.tfvars.example** dans le répertoire **azure**. +Vous pouvez changer toutes les variables utilisée lors du déploiement dans ce fichier. +Toutes les variables, leur description et leur valeur par défaut sont disponibles dans le fichier **variables.tf**. + +Créer un fichier **auth_config.json** sur la base du fichier **auth_config.json.example** dans le répertoire **opentofu**. + +L'url est défini comme suit: http://..cloudapp.azure.com. +Par défaut, l'url est http://evaluetonsavoir.canadacentral.cloudapp.azure.com/ + +### Lancer le déploiement + +Pour lancer le déploiement, faites les commandes suivantes + +`cd azure` +`az login` +`tofu init` +`tofu apply` + +Ensuite, opentofu va afficher toutes les actions qu'il va effectuer avec les valeurs configurées. +Entrez `yes` pour appliquer ces actions et lancer le déploiement. + diff --git a/opentofu/auth_config.json.example b/opentofu/auth_config.json.example new file mode 100644 index 0000000..6e15147 --- /dev/null +++ b/opentofu/auth_config.json.example @@ -0,0 +1,35 @@ +{ + auth: { + passportjs: [ + { + provider1: { + type: "oauth", + OAUTH_AUTHORIZATION_URL: "https://www.testurl.com/oauth2/authorize", + OAUTH_TOKEN_URL: "https://www.testurl.com/oauth2/token", + OAUTH_USERINFO_URL: "https://www.testurl.com/oauth2/userinfo/", + OAUTH_CLIENT_ID: "your_oauth_client_id", + OAUTH_CLIENT_SECRET: "your_oauth_client_secret", + OAUTH_ADD_SCOPE: "scopes", + OAUTH_ROLE_TEACHER_VALUE: "teacher-claim-value", + OAUTH_ROLE_STUDENT_VALUE: "student-claim-value", + }, + }, + { + provider2: { + type: "oidc", + OIDC_CLIENT_ID: "your_oidc_client_id", + OIDC_CLIENT_SECRET: "your_oidc_client_secret", + OIDC_CONFIG_URL: "https://your-issuer.com", + OIDC_ADD_SCOPE: "groups", + OIDC_ROLE_TEACHER_VALUE: "teacher-claim-value", + OIDC_ROLE_STUDENT_VALUE: "student-claim-value", + }, + }, + ], + "simpleauth": { + enabled: true, + name: "provider3", + SESSION_SECRET: "your_session_secret", + }, + }, +} \ No newline at end of file diff --git a/opentofu/azure/app.tf b/opentofu/azure/app.tf new file mode 100644 index 0000000..a1dada5 --- /dev/null +++ b/opentofu/azure/app.tf @@ -0,0 +1,67 @@ +# Create Virtual Machine +resource "azurerm_linux_virtual_machine" "vm" { + name = var.vm_name + resource_group_name = azurerm_resource_group.resource_group.name + location = azurerm_resource_group.resource_group.location + size = var.vm_size + admin_username = var.vm_user + admin_password = var.vm_password + disable_password_authentication = false + + network_interface_ids = [azurerm_network_interface.nic.id] + + os_disk { + name = var.vm_os_disk_name + caching = "ReadWrite" + storage_account_type = var.vm_os_disk_type + } + + source_image_reference { + publisher = var.vm_image_publisher + offer = var.vm_image_offer + sku = var.vm_image_plan + version = var.vm_image_version + } + + custom_data = base64encode(<<-EOT + #!/bin/bash + sudo apt-get update -y + sudo apt-get install -y docker.io + sudo apt-get install -y docker-compose + sudo systemctl start docker + sudo systemctl enable docker + + sudo usermod -aG docker ${var.vm_user} + sudo newgrp docker + + su - ${var.vm_user} -c ' + + curl -o auth_config.json \ + "https://${azurerm_storage_account.storage_account.name}.file.core.windows.net/${azurerm_storage_share.backend_storage_share.name}/auth_config.json${data.azurerm_storage_account_sas.storage_access.sas}" + + curl -L -o docker-compose.yaml ${var.docker_compose_url} + + export VITE_BACKEND_URL=http://${var.dns}.${lower(replace(azurerm_resource_group.resource_group.location, " ", ""))}.cloudapp.azure.com + export PORT=${var.backend_port} + export MONGO_URI="${azurerm_cosmosdb_account.cosmosdb_account.primary_mongodb_connection_string}" + export MONGO_DATABASE=${azurerm_cosmosdb_mongo_collection.cosmosdb_mongo_collection.database_name} + export EMAIL_SERVICE=${var.backend_email_service} + export SENDER_EMAIL=${var.backend_email_sender} + export EMAIL_PSW="${var.backend_email_password}" + export JWT_SECRET=${var.backend_jwt_secret} + export SESSION_Secret=${var.backend_session_secret} + export SITE_URL=http://${var.dns}.${lower(replace(azurerm_resource_group.resource_group.location, " ", ""))}.cloudapp.azure.com + export FRONTEND_PORT=${var.frontend_port} + export USE_PORTS=${var.backend_use_port} + export AUTHENTICATED_ROOMS=${var.backend_use_auth_student} + export QUIZROOM_IMAGE=${var.quizroom_image} + + docker-compose up -d + ' + EOT + ) + + depends_on = [ + azurerm_cosmosdb_mongo_collection.cosmosdb_mongo_collection, + data.azurerm_storage_account_sas.storage_access] +} diff --git a/opentofu/azure/database.tf b/opentofu/azure/database.tf new file mode 100644 index 0000000..efc9fbf --- /dev/null +++ b/opentofu/azure/database.tf @@ -0,0 +1,43 @@ +resource "azurerm_cosmosdb_account" "cosmosdb_account" { + name = var.cosmosdb_account_name + resource_group_name = azurerm_resource_group.resource_group.name + location = azurerm_resource_group.resource_group.location + offer_type = "Standard" + kind = "MongoDB" + mongo_server_version = "7.0" + + is_virtual_network_filter_enabled = true + + virtual_network_rule { + id = azurerm_subnet.subnet.id + } + + capabilities { + name = "EnableMongo" + } + + consistency_policy { + consistency_level = "Session" + } + + geo_location { + failover_priority = 0 + location = azurerm_resource_group.resource_group.location + } + + depends_on = [azurerm_resource_group.resource_group] +} + +resource "azurerm_cosmosdb_mongo_collection" "cosmosdb_mongo_collection" { + name = var.mongo_database_name + resource_group_name = azurerm_resource_group.resource_group.name + account_name = azurerm_cosmosdb_account.cosmosdb_account.name + database_name = var.mongo_database_name + + index { + keys = ["_id"] + unique = true + } + + depends_on = [azurerm_cosmosdb_account.cosmosdb_account] +} \ No newline at end of file diff --git a/opentofu/azure/main.tf b/opentofu/azure/main.tf new file mode 100644 index 0000000..1d1329d --- /dev/null +++ b/opentofu/azure/main.tf @@ -0,0 +1,14 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "~> 4.0" + } + } + required_version = ">= 1.0" +} + +provider "azurerm" { + features {} + subscription_id = var.subscription_id +} \ No newline at end of file diff --git a/opentofu/azure/network.tf b/opentofu/azure/network.tf new file mode 100644 index 0000000..d9db2c8 --- /dev/null +++ b/opentofu/azure/network.tf @@ -0,0 +1,87 @@ +# Create Virtual Network +resource "azurerm_virtual_network" "vnet" { + name = var.vnet_name + location = azurerm_resource_group.resource_group.location + resource_group_name = azurerm_resource_group.resource_group.name + address_space = ["10.0.0.0/16"] +} + +# Create Subnet +resource "azurerm_subnet" "subnet" { + name = var.subnet_name + resource_group_name = azurerm_resource_group.resource_group.name + virtual_network_name = azurerm_virtual_network.vnet.name + address_prefixes = ["10.0.1.0/24"] + + service_endpoints = ["Microsoft.AzureCosmosDB"] +} + +# Create Public IP Address +resource "azurerm_public_ip" "public_ip" { + name = var.public_ip_name + location = azurerm_resource_group.resource_group.location + resource_group_name = azurerm_resource_group.resource_group.name + allocation_method = "Static" + domain_name_label = var.dns +} + +resource "azurerm_network_security_group" "nsg" { + name = var.nsg_name + location = azurerm_resource_group.resource_group.location + resource_group_name = azurerm_resource_group.resource_group.name + + security_rule { + name = "SSH" + priority = 1000 + direction = "Inbound" + access = "Allow" + protocol = "Tcp" + source_port_range = "*" + destination_port_range = "22" + source_address_prefix = var.nsg_ssh_ip_range + destination_address_prefix = "*" + } + + security_rule { + name = "HTTP" + priority = 1001 + direction = "Inbound" + access = "Allow" + protocol = "Tcp" + source_port_range = "*" + destination_port_range = "80" + source_address_prefix = var.nsg_http_ip_range + destination_address_prefix = "*" + } + + security_rule { + name = "HTTPS" + priority = 1002 + direction = "Inbound" + access = "Allow" + protocol = "Tcp" + source_port_range = "*" + destination_port_range = "443" + source_address_prefix = var.nsg_https_ip_range + destination_address_prefix = "*" + } +} + +# Create Network Interface +resource "azurerm_network_interface" "nic" { + name = var.network_interface_name + location = azurerm_resource_group.resource_group.location + resource_group_name = azurerm_resource_group.resource_group.name + + ip_configuration { + name = "internal" + subnet_id = azurerm_subnet.subnet.id + private_ip_address_allocation = "Dynamic" + public_ip_address_id = azurerm_public_ip.public_ip.id + } +} + +resource "azurerm_network_interface_security_group_association" "example" { + network_interface_id = azurerm_network_interface.nic.id + network_security_group_id = azurerm_network_security_group.nsg.id +} diff --git a/opentofu/azure/resource_group.tf b/opentofu/azure/resource_group.tf new file mode 100644 index 0000000..ed83082 --- /dev/null +++ b/opentofu/azure/resource_group.tf @@ -0,0 +1,5 @@ +# Create Resource Group +resource "azurerm_resource_group" "resource_group" { + name = var.resource_group_name + location = var.location +} \ No newline at end of file diff --git a/opentofu/azure/storage.tf b/opentofu/azure/storage.tf new file mode 100644 index 0000000..1eb6db7 --- /dev/null +++ b/opentofu/azure/storage.tf @@ -0,0 +1,74 @@ +resource "azurerm_storage_account" "storage_account" { + name = var.config_volume_storage_account_name + resource_group_name = azurerm_resource_group.resource_group.name + location = azurerm_resource_group.resource_group.location + account_tier = "Standard" + account_replication_type = "LRS" + + depends_on = [azurerm_resource_group.resource_group] +} + +resource "azurerm_storage_share" "backend_storage_share" { + name = var.backend_storage_share_name + storage_account_name = azurerm_storage_account.storage_account.name + quota = 1 + + depends_on = [azurerm_storage_account.storage_account] +} + +resource "null_resource" "upload_file" { + provisioner "local-exec" { + command = <