# 🐉 DragonBank - Rapport de Projet ## 1. Description du Projet et des Conteneurs (Dockers) Le projet DragonBank repose sur une architecture en micro-services conteneurisĂ©e Ă  l'aide de **Docker** et **Docker-Compose**. L'architecture comprend les 4 conteneurs suivants : - **`db` (Postgres)** : Base de donnĂ©es relationnelle persistante contenant les schĂ©mas, les tables, les configurations et l'historique des opĂ©rations. - **`backend` (Python/Flask)** : Le "cerveau" de l'application. Cette API RESTful gĂšre toute la logique mĂ©tier (authentification, gestion des comptes, validations de virements, audits) en utilisant une architecture saine (*Controllers/Services/DAOs*). - **`frontend` (Python/Flask + Jinja2)** : L'interface utilisateur web. Elle agit comme un client qui appelle l'API via des requĂȘtes HTTP JSON, et affiche les informations retournĂ©es dans une belle interface graphique dynamique propulsĂ©e par Bootstrap. - **`interests` (Python)** : (Conteneur Bonus) Un conteneur "worker" autonome qui calcule et distribue le paiement asynchrone des intĂ©rĂȘts journaliers applicables (+3% ou +2%) aux comptes d'Ă©pargne (Livret A, Assurance Vie), sans jamais nĂ©cessiter d'intervention humaine et sans bloquer l'API principale de la banque. ## 2. Fonctionnement de Chaque Application - **Frontend** : L'utilisateur se connecte via `/login`. L'application authentifie l'utilisateur, rĂ©cupĂšre le token JWT de l'API et l'enregistre de maniĂšre sĂ©curisĂ©e dans la session locale (`session` en base 64 et signĂ©e). L'interface requiert ce token pour toutes les vues protĂ©gĂ©es afin de communiquer avec l'API (tableaux de bord, liste des comptes, demande de virement interne ou de virement intra-partenaires extĂ©rieurs). - **Backend API** : L'API intercepte les requĂȘtes JSON. Elle vĂ©rifie l'intĂ©gritĂ© de l'identitĂ© du client via le token JWT, et applique les rĂšgles de validations bancaires (fonds suffisants pour valider l'opĂ©ration de virement, restrictions de l'IBAN bĂ©nĂ©ficiaire, etc.). La gestion transactionnelle de la base de donnĂ©es via nos services assure que l'architecture restera toujours consistante (propriĂ©tĂ©s ACID respectĂ©es). - **Interests** : Service d'arriĂšre-plan avec un timer. Ce module exĂ©cute le SQL pour rĂ©cupĂ©rer les encours de l'Ă©pargne sur chaque client de DragonBank et gĂ©nĂšre un virement interne spĂ©cial pour matĂ©rialiser ce versement de profit au client de maniĂšre silencieuse. ## 3. SchĂ©ma de Base de donnĂ©es Le modĂšle relationnel (cf. `db/init.sql`) a Ă©tĂ© pensĂ© pour maximiser la sĂ©curitĂ© et la traçabilitĂ© de toutes les opĂ©rations de la banque : - Les tables fondamentales : **`users`** (les clients, avec la civilitĂ© et le mot de passe hashĂ©), **`accounts`** (les comptes bancaires avec association au `user_id` et garantie par une contrainte de balance positive `>= 0`), **`beneficiaries`** (le carnet d'adresses bancaires d'un usager). - La table **`transactions`** : L'historique immuable de chaque transfert d'argent (qui liste le `from_account`, `to_account`, et le type `virement_interne`, `externe` ou `interets`). - Les tables annexes de traçabilitĂ© : **`audit_logs`** et **`sessions`** enregistrent toutes les activitĂ©s douteuses (tentatives d'authentifications rĂ©pĂ©tĂ©es, de connexions par d'autres IP, et expiration stricte par token session). ## 4. Notions de SĂ©curitĂ© ImplĂ©mentĂ©es Pour garantir la fiabilitĂ© de cet environnement acadĂ©mique, de nombreuses couches sĂ©curitaires ont Ă©tĂ© intĂ©grĂ©es : 1. **Mots de passe Fortement HachĂ©s** : ConservĂ©s cĂŽtĂ© base de donnĂ©es avec `bcrypt` en utilisant des sels d'entropie (pour se prĂ©munir totalement contre les attaques Rainbow Tables). 2. **SystĂšme de Jetons JSON (JWT)** : UtilisĂ©s pour vĂ©rifier la validitĂ© des accĂšs aux points d'API sans requĂ©rir le mot de passe sur les appels courants. 3. **Protection et VĂ©rifications des Profils** : Toute intention de changer un e-mail principal ou un mot de passe bancaire (depuis le nouvel Onglet Profil) exigera nĂ©cessairement de produire son dernier mot de passe actuel en date. 4. **Isolations Docker Secrets (Bonus)** : Pour empĂȘcher la divulgation des identifiants Root de la Base de DonnĂ©es au sein des variables ou du code source, Postgres s'initialise au lancement en lisant le mot de passe confinĂ© au sein d'un "Docker Secret" (`db_password.txt`). ## 5. Explication de l'implĂ©mentation Docker-Compose Le fichier `docker-compose.yml` construit le rĂ©seau total de maniĂšre hermĂ©tique et orchestrĂ©e : - **Networks (Cloisonnement)** : Un rĂ©seau de Frontend (`dragonbank-frontend-net`) et un rĂ©seau de Backend (`dragonbank-backend-net`). Ce bridage fait que le Frontend a le droit de discuter avec l'API, mais empĂȘche physiquement le Frontend et potentiellement des attaques externes de ping la Base de DonnĂ©es directement. - **Volumes** : Un volume permanent `postgres_data` permet un maintien et une persistance sans perte des transactions et liquiditĂ©s de la banque mĂȘme si le conteneur subit un crash inopinĂ© ou une mise Ă  jour. - **Healthchecks (Bonus)** : La politique adoptĂ©e est "Fail Fast / Recover Quick". Les configurations Healthcheck imposent un ordre strict au dĂ©marrage absolu : l'interface Frontend s'interdira de dĂ©marrer et restera en pause tant que la route Health API de l'architecture Backend Python n'aura pas donnĂ© son aval (`curl -f /api/health`).