Skip to content
Snippets Groups Projects
Forked from an inaccessible project.

pipeline status

Sigma - serveur backend

Ce dépôt contient le backend de Sigma, le successeur de Frankiz, un site étudiant permettant de gérer les groupes et les étudiants du plateau de Saclay.

À terme, ce projet doit tourner sur un serveur du BR et servir d'API à un frontend React au code séparé et documenté séparément toute les données nécessaires à son bon fonctionnement (authentification, appartenance à un groupe, droits de visibilité...). Le dépôt pour le serveur front se trouve ici : https://gitlab.binets.fr/br/sigma-frontend (on l'appellera indifféremment serveur front, front ou frontend...)

Obtenir une copie du projet en mode développement

Cloner le dépôt :

git clone git@gitlab.binets.fr:br/sigma-backend.git
# ou
git clone https://gitlab.binets.fr/br/sigma-backend.git

Installer les dépendances (spécifiées dans package.json) :

npm install

Certaines dépendances doivent être installées globalement :

npm install -g knex
npm install -g webpack
npm install -g eslint

Installer PostgreSQL :

sudo apt install postgresql

Créer un rôle PostgreSQL "sigma" :

sudo -u postgres -s
createuser sigma --login --createdb --pwprompt
# penser à répercuter le mot de passe choisi dans `./db/knexfile.js` et `./db/knex_init.js`

Créer une base de données PostgreSQL "sigma_dev" :

createdb sigma_dev -U sigma -W
  • Si vous n'arrivez pas à vous connecter (createdb: could not connect to database template1: FATAL: Peer authentication failed for user) : mettre à jour votre fichier pg_hba.conf.
  • Si vous souhaitez utiliser d'autres noms que "sigma" et "sigma_dev" : ça ne pose pas de problème, il vous faudra simplement modifier ./db/knexfile.js et ./db/knex_init.js.

Exécuter les migrations et les seeds de knex :

# construire le schéma de la BDD, i.e. définir les tables et leur structure.
knex migrate:latest

# insérer des données de test dans la BDD
knex seed:run

Dire à webpack de build le projet (build le bundle main.js) :

npm run dev # en mode developpement
# ou
npm run build # en mode production

Lancer un serveur express/node (nodemon en fait) :

npm run start #see (package.json).scripts

Comme indiqué dans src/index.js, ceci lance un serveur servant l'application express sur le port 3000.

Déployer dans un conteneur Docker

L'image Docker est définie dans Dockerfile. Il s'agit d'une distro Alpine avec Node.js et libstdc++. Lors du build les dépendances runtime dont dépend le bundle.js sont installées.

Compiler l'image :

docker build -t sigma-api .

Faire tourner le conteneur :

docker run sigma-api

Idem mais avec un LDAP custom :

docker run -e LDAP_URI=ldap://172.17.0.1:8389 sigma-api

Mode développement / staging / production

TODO Ca a un rapport avec NODE_ENV ?

Dépendances npm

On utilise un serveur Node.js avec express.js ; il est configuré dans app.ts puis lancé sur le port 3000 dans index.ts. Utiliser Node.js permet d'utiliser facilement npm (Node Package Manager). Une "dépendance" est un package utilisé dans le projet.

On trouve la liste des dépendances dans package.json. Express est un exemple de dépendance normale, utilisée en production ; nodemon et ESLint (voir infra) sont des dépendances dev (devDependencies), utilisées seulement en mode développement.

Les dépendances s'installent avec npm install. Cette commande a deux comportements possibles selon la valeur de la variable NODE_ENV (vérifier avec la commande echo "$NODE_ENV"):

  • si NODE_ENV n'est pas configuré : on installe tout
  • si NODE_ENV == development : on installe tout
  • si NODE_ENV == production : on n'installe pas les dépendances développeur

Certaines d'entre elles, comme KnexJS ou Webpack, doivent être installées globalement :

npm install -g knex
npm install -g webpack
npm install -g eslint

Les dépendances principales utilisées sont

  • knex.js, qui permet de construire des requêtes SQL facilement,
  • GraphQL, qui fournit une couche d'abstraction pour l'échange de données frontend-backend,
  • ldap.js, qui permet d'interroger un serveur LDAP,
  • webpack, qui compile et optimise tout le code source javascript en un bundle.js,
  • ESlint, pour le développement, outil de vérification syntaxique.

Configuration

L'API est conçue pour êtes modulaire et pour fonctionner dans plusieurs environnements.

On peut donc le configurer via des fichiers ou des variables d'environnement.

Configuration LDAP

L'API de Sigma nécessite de se connecter au LDAP Frankiz, à la fois pour obtenir des données et pour l'authentification des utilisateurs. Cela est fait à l'aide de la librairie ldapjs pour faire les requêtes au LDAP et passportJS pour l'authentification.

  • La configuration LDAP de base se situe dans ldap_config.json.
  • Les identifiants utilisés que authentifier le serveur au LDAP sont dans ldap_credentials.json. Ils prennent la forme suivante:
{
    "dn": "uid=<username>,ou=eleves,dc=frankiz,dc=net",
    "passwd": "<password>"
}
  • Elle est importée dans l'application depuis src/ldap/config.ts.
  • Si la variable d'environnement LDAP_URI est définie, l'adresse où trouver le LDAP est remplacée.

Exemple

Si on développe en dehors du plâtal et qu'on ouvre un proxy SSH avec port forwarding du LDAP de Frankiz (frankiz.polytechnique.fr:389) vers localhost:8389, on s'y connecte en définissant

LDAP_URI=ldap://localhost:8389

soit en faisant export LDAP_URI=..., soit en écrivant un fichier .env. Le fichier config.js s'occupe du reste.

Variables d'environnement

Variable Description Défaut (ldap_config.json)
LDAP_URI URI vers le serveur LDAP. ldap://frankiz.eleves.polytechnique.fr:389
TARGET_ENV Type de l'environnement ciblé : development, staging ou production development
HOST Addresse sur laquelle le serveur écoute des requêtes. localhost en développement, 0.0.0.0 en staging/prod.
DB_HOST Addresse de la base de données. localhost ou 129.104.201.10 en staging/prod.
DB_PASSWD Mot de passe de la BDD password

On peut définir ces variables d'environnement, dans l'ordre décroissant de priorité :

  • dans sa session de terminal (équivalent à docker run -e KEY=value) :
    export KEY=value
  • au moment de lancer l'application :
    KEY=value npm start
  • dans un fichier .env :
    KEY1=value1
    KEY2=value2
    ...

Panneau d'administration

Il est accessible par navigateur au path /adminview/admin ; n'importe quel path devrait rediriger dessus.

L'accès y est protégé par une page d'authentification, les identifiants à utiliser sont ceux de Frankiz. Le hruid (i.e. prenom.nom) de l'utilisateur doit de plus être sur une whitelist des hruid autorisés. Pour l'instant cette whitelist est hardcodée dans le code source.

Accès direct à la BDD

Le panneau d'administration sert (ou plutôt, servira à terme) à accéder directement à la BDD propre de sigma, grâce à une API REST. Autrement dit :

  • on accède à la table table_name par une requête GET à /adminview/db/table_name'
  • et aux colonnes columns de cette table par une requête GET à /adminview/db/table_name?columns=columns.

GraphQL Voyager

L'application Voyager, accessible à /adminview/voyager, permet de visualiser le « graphe » sous-jacent à la structure de l'API.

GraphQL Playground

Accéder via un navigateur à /graphql renvoie l'application GraphQL Playground.

Il s'agit du même /graphql que l'endpoint de l'API, mais le serveur est configuré de sorte à renvoyer Playground lorsqu'il détecte un accès via navigateur. Comme tout GraphQL Playground est géré directement par la package graphql, les requêtes dans le Playground sont soumises au mêmes permissions que dans l'API GraphQL 1. GraphQL Playground est désactivé en production.

Scripts

Les scripts sont des instructions en ligne de commande que l'on peut faire tourner avec la commande npm run. Ce sont des raccourcis pour gagner du temps sur des opérations un peu longues. Ils sont définis dans package.json.

Les plus importants sont détaillées ci-dessous (ne pas oublier npm install déjà mentionné plus tôt) :

On utilisera Webpack pour transpiler le fichier source src/index.js en build/bundle.js qui est suit la syntaxe ES5 compatible Node. Pour ça, on utilise :

  • npm run build qui exécute la commande webpack avec le fichier de configuration webpack.config.js, ou
  • npm run watch qui recompile automatiquement dès que le code est modifié.

Démarrer le serveur

Pour faire tourner le serveur, lancer

npm start

démarre le serveur compilé build/bundle.js avec nodemon, outil dév, et le redémarre automatiquement après modification.

Donc, lancer npm run watch dans un terminal et npm start dans un autre permet de recompiler le serveur et le relance automatiquement.

Le script pour faire tourner JSDoc et régénérer la documentation est : npm run doc

Documentation

La documentation détaillée du projet est ici. Elle a été compilée avec JSDoc sous format hmtl selon le fichier de configuration configfile_doc.json à la racine du projet.

Les fichiers compilés se situent dans doc avec leurs fichiers image. Par nature de l'outil JSDoc il est facile de documenter en détail des fonctions .js mais plus compliqué de documenter un fichier.

A la fin de ce fichier JSDoc rajoute les commentaires placés dans chacun des fichiers et des hyperliens pour y accéder.

  1. euuuuh à vérifier...