Motusom est un jeu inspiré du jeu Motus.
L'objectif de ce projet est de créer une application web mettant en oeuvre différents micro-services indépendants, connecter ces micro-services entre eux et les rendre interopérables.
Le fichier docker-compose.yml permet de lancer l'ensemble des micro-services en une seule commande.
La structure du projet est la suivante :
motus
: toute la logique métier du jeu Motus (serveur NodeJS + Express)front
: application web (serveur Angular)auth
: service d'authentification (serveur NodeJS + Express)score
: service de gestion des scores (serveur NodeJS + Express)auth_db
: base de données de l'authentification (serveur PostgreSQL)score_db
: base de données des scores (serveur PostgreSQL)proxy
: proxy qui gère les redirections (serveur HAProxy)monitoring
: service de monitoring (serveur Prometheus + Grafana)
- Cloner le projet
git clone https://github.com/Youplala/Motus.git
- Naviguer dans le dossier du projet
cd Motus
- Lancer les conteneurs
docker-compose up -d
- Se rendre sur http://localhost
- Amusez-vous !
L'application est composée de plusieurs Microservices repartis selon le schema suivant:
stateDiagram-v2
[*] --> Proxy
Proxy --> Front
Proxy --> Score
Proxy --> Motus
Proxy --> Auth
Front --> Proxy
Motus --> Proxy
Score --> Proxy
Auth --> Proxy
Auth --> PGSQL_Auth
Motus --> Node_Exporter
Score --> Node_Exporter
Auth --> Node_Exporter
Node_Exporter --> Prometheus
Prometheus --> Grafana
Score --> PGSQL_Score
[*] --> Grafana
Le frontend est une application qui utilise le framework Angular. Il est composé d'une page de connexion et d'une page de jeu.
Le service Haproxy permet dispacher les requêtes entre les différents services.
Le service d'authentification permet de gérer les utilisateurs et les sessions. Il est basé sur Node.js et Express. Il utilise une base de données PostgreSQL pour stocker les noms d'utilisateur et leur mot de passe hashé.
À chaque nouvelle connexion, un JWT (JSON Web Token) est généré. Ce token est utilisé pour vérifier l'identité de l'utilisateur lors de ses requêtes. Ce token a une durée de vie de 1 heure. Au bout de cette durée, l'utilisateur doit se reconnecter. Le token est stocké dans le localStorage du navigateur. Cela peut poser des problèmes de sécurité car une personne malveillante peut récupérer le token et l'utiliser pour usurper l'identité de l'utilisateur. Cependant, le token est signé avec une clé secrète qui n'est pas stockée sur le serveur. Cela permet de s'assurer que le token n'a pas été modifié.
La table Score est composée des colonnes suivantes:
id
: identifiant unique de l'utilisateurguess
: mot proposé par l'utilisateurnb_try
: compteur du nombre d'essaisday
: date de la partieìndice
: indice donné par le serveur
La table Auth est composée des colonnes suivantes:
id
: identifiant unique de l'utilisateurusername
: nom d'utilisateurpassword
: mot de passe hashé
Afin de se connecter, l'utilisateur doit entrer son nom d'utilisateur et son mot de passe. Si les informations sont correctes, un token est généré et stocké dans le localStorage du navigateur. Ce token est utilisé pour vérifier l'identité de l'utilisateur lors de ses requêtes.
Afin de mettre en place le jeu, l'application va aller chercher l'indice du mot du jour.
L'application va ensuite rechercher les essais de l'utilisateur pour ce mot. Si l'utilisateur n'a pas encore joué, il n'y aura pas d'essais.
Enfin, l'application va rechercher les scores du joueur pour toutes les parties jouées.
L'utilisateur doit proposer un mot. L'application va verifier que le mot proposé est bien un mot français et qu'il a la bonne taille. Si le mot est valide, l'application va envoyer le mot au serveur Motus qui lui renverra un indice. Si le mot est trouvé, l'application va enregistrer le score et afficher le score du joueur, sinon elle affichera le nombre d'essais restants.
Le monitoring est réalisé avec Prometheus et Grafana.
Pour y accéder, se rendre sur http://localhost:3004.
Prometheus est un outil de monitoring open-source qui permet de collecter et d'analyser des métriques. Il est composé d'un serveur qui collecte les métriques et d'un client qui les envoie au serveur.
Grafana est un outil de visualisation de données qui permet de créer des tableaux de bord. Il permet de visualiser les métriques collectées par Prometheus.
- Se connecter à Grafana via http://localhost:3004.
- Se connecter avec les identifiants suivants :
- Identifiant : admin
- Mot de passe : admin
- Ajouter un nouveau data source
- Nom : Prometheus
- Type : Prometheus
- URL : http://prometheus:9090
- Créer un nouveau tableau de bord
- Choisir le data source Prometheus
- Choisir une métrique
- Un graphique est créé, il est possible de le modifier en ajoutant des métriques, des filtres, etc.
sequenceDiagram;
participant F as Frontend;
participant A as Auth;
participant DBA as PSQL Auth;
participant M as Motus;
participant S as Score;
participant DBS as PSQL Score;
Note left of F: Register
F ->>+ A: Uname Pwd
A ->>+ DBA: Uname Pwd Id
DBA -->>- A: Ok - Nok
A -->>- F: Ok - Nok
Note left of F: Login
F ->>+ A: Uname
A ->>+ DBA: Uname Pwd
DBA -->>- A: Id
A -->>- F: JWT Token
Note left of F: FirstIndice
F ->>+ M: Token
M ->>+A: Token
A-->>-M: Id / Token-Not-Valid
M -->>- F: Indice
Note left of F: IsWord
F ->>+ M: Word, Token
M ->>+A: Token
A-->>-M: Id / Token-Not-Valid
M -->>- F: Is Word: T/F & Is Same Length T/F
Note left of F: Guess
F ->>+ M: Word, Token
M ->>+A: Token
A -->>-M: Id / Token-Not-Valid
M ->>+S: Id Word Score
S ->>+A: Token
A -->>-S: Id / Token-Not-Valid
S ->>+ DBS: Id Word Score Date
DBS -->>- S: Ok - Nok
S -->>-M: Ok - Nok
M -->>-F: Score
#### Score
Note left of F: Get Today
F ->>+ S: Token
S ->>+A: Token
A -->>-S: Id / Token-Not-Valid
S ->>+DBS: Id
DBS -->>- S: Today Guesses
S -->>- F: Today Guesses
Note left of F: Get Score
F ->>+ S: Token
S ->>+A: Token
A -->>-S: Id / Token-Not-Valid
S ->>+DBS: Id
DBS -->>- S: Daily Score
S -->>- F: Daily Score
- Améliorer le monitoring via Prometheus.
- Séparer les bases de données Auth et Score
- Utiliser une API pour la gestion des listes de mots.
- Utiliser oAuth2 pour l'authentification.
- Améliorer le monitoring de logs via Loki.