-
Quentin CHEVALIER authoredQuentin CHEVALIER authored
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...)
Le but des lignes qui suivent est de permettre au lecteur de rapidement mettre en place et lancer un sigma local et se familiariser avec son administration. Comment obtenir la documentation détaillée du projet est expliqué à la fin de ce document.
Pour obtenir une copie du projet, cloner le dépôt par :
git clone git@gitlab.binets.fr:br/sigma-backend.git
# ou
git clone https://gitlab.binets.fr/br/sigma-backend.git
Démarrer le serveur (en mode développement)
Installer les dépendances npm
On utilise un serveur node.js avec express.js. 1 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
Pour installer les dépendances spécifiées dans package.json
il faut donc lancer :
npm install
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.
Et une dépendance supplémentaire, PostgreSQL (linux est supposé) :
sudo apt install postgresql
Setup la BDD PostgreSQL
La BDD PostgreSQL est utilisée pour stocker permissions, écoles des utilisateurs, annonces et événements.
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 fichierpg_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
Voilà, vous avez une base de données à jour !
Démarrer le serveur
Dire à webpack de build le projet (build le bundle ../build/bundle.js
) :
npm run dev # en mode developpement
# ou
npm run build # en mode production
Lancer un serveur express/node :
npm run start # ou le raccourci: npm start
Comme indiqué dans src/index.js, ceci lance un serveur servant l'application express sur le port 3000. Ce serveur va ensuite éxecuter le reste du code comme si il était déployé ou presque.
Alternative : 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 ?
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 :
-
npm run build
: transpiler avec Webpack, en mode production -
npm run dev
: idem, mais en mode développement -
npm run watch
: idem, mais retranspile automatiquement dès que le code est modifié. -
npm run start
: lancer un serveur Node avec nodemon -
npm run doc
: générer la doc JSDoc -
npm run lint
: vérifier la syntaxe de tous les fichiers .js et .ts du dossier src/
npm run start
démarre en fait le serveur buildé build/bundle.js
avec nodemon, un outil de dév qui le redémarre automatiquement après toute modification du bundle.
Donc, lancer npm run watch
dans un terminal et npm run start
dans un autre permet de rebuilder et relancer automatiquement le serveur, après toute modification du code source.
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>"
}