Data Fair

Version 3.88.7

Technical architecture

19 février 2024

1 - Introduction

L'architecture technique retenue est une plateforme composée de différents services web. La plupart de ces services sont open source et décrits ici, mais certaines extensions peuvent être disponibles sous la forme de services distants propriétaires :

  • Data Fair, le coeur de la solution : indexer, « APIfier », enrichir et partager facilement ses données ;
  • Simple Directory : se connecter au portail et gérer les comptes ;
  • Data Fair Portal : créer facilement plusieurs portails de données, pour du partage en open data ou en interne ;
  • Les connecteurs de catalogues : se synchroniser avec d'autres catalogues de données, dans les deux sens ;
  • Data Fair Processings : programmer des traitements périodiques pour mettre à jour les données et récolter les données issues de l’IOT ;
  • Notify : gérer les alertes et les notifications ;
  • Les analytics : peuvent être gérés directement dans la plateforme à l'aide de Matomo ;
  • Capture : créer les miniatures et les captures d’images des visualisations ;
  • Thumbor : permet les traitement des images des jeux de données ;
  • Backup : gérer les sauvegardes de la plateforme ;
  • Les services distants ne sont pas développés dans ce projet : ce sont des applications web développées et déployées de manière autonome qui respectent les règles d’interopérabilité d’OpenAPI 3.0 avec Data Fair. Ils sont disponibles sous forme d'extensions ;
  • Les visualisations de données : certaines sont open source, d'autres propriétaires (extensions en libre accès ou nécessitant un abonnement). Chaque application de base peut être utilisée autant de fois que désiré pour valoriser différents jeux de données. Data Fair permet de stocker et éditer les différents paramètres d'une même application de base.

Architecture technique complète

Catalogue de données

Authentification

Le mécanisme d'authentification utilisé pour sécuriser les API des différents service est le JWT (JSON Web Token). La sécurité repose sur des mécanismes de cryptograhie asymétrique (RSA). La session utilisateur est maintenue côté client, ce qui permet d'avoir un back-end sans état, et donc scalable. Le back-end n'émet pas de JWT : il doit donc être relié à un annuaire Simple Directory qui en émet. Le lien vers cet annuaire permet de télécharger sa clé publique pour ensuite vérifier que les JWT reçus sont valides.

Déploiement

Les différents services sont livrés avec Docker. Nous recommandons de les déployer et de les opérer dans un environnement tel que Kubernetes.

Il est possible de déployer ces différents services à l'aide de Docker Compose également. Cela permet de démarrer plus rapidement et est particulièrement adapté pour un déploiement en local pour tester la plateforme ou développer des extensions pour celle-ci.

Pour plus de détails, vous pouvez consulter la documentation d'installation.

Licences

Les différents services sont open source, avec comme licence l'AGPL v3, qui est une licence copyleft : tous ceux mettant le service à disposition d'autres utilisateurs doivent partager les éventuelles améliorations qu'ils y apporteraient. Nous avons choisi de rendre ces services open source pour deux raisons : pour partager des données open data, il nous paraît naturel d'utiliser un service open source, et quel que soit le type de données, l'ouverture du code offre des garanties de sécurité et de pérennité qui permet aux organisations de déployer ces services sur leurs propres serveurs en toute sérénité.

2 - Data Fair

Data Fair permet d'exposer facilement ses données via une API web, contractualisée et documentée, ce qui permet aux développeurs de les réutiliser facilement dans leurs applications. De plus les données peuvent être sémantisées, ce qui permet ensuite de les enrichir avec d'autres données sémantisées. Ainsi, des données qui ont une adresse peuvent par exemple être complétées par des coordonnées GPS, ce qui permet ensuite de les afficher sur une carte.

Le coeur de la solution permet

  • d’indexer des données
  • d’Apifier des données
  • d’enrichir des données
  • de partager des données
  • de configurer les visualisations
  • de gérer les droits d’accès aux données et aux visualisations (publication)

Cette page présente brièvement les langages de programmation, services et outils utilisés pour réaliser ce projet. Pour les développeurs vous pouvez consulter directement le README et le code source sur github.

Backend

Le backend sert l'application cliente (frontend) et l'API. Le frontend est une application Web dynamique avec un rendu côté serveur partiel et un rendu final côté client en Javascript.

Persistance

Ce service utilise 3 types de persistance : fichier, base de données et moteur de recherche.

La persistance fichier est utilisée pour stocker les jeux de données des utilisateurs : les fichiers sont stockés tels quels sur le système de fichier et sont ensuite analysés puis indexés.

Les informations sur les jeux de données, les services distants et les configurations d'applications sont stockées dans une base de données MongoDB, qui est une base NoSQL open source orientée documents. Les jeux de données incrémentaux sont également stockés dans cette base.

Les datasets sont indexés dans un moteur de recherche open source ElasticSearch. Très performant et puissant il permet de faire des recherches textuelles et des agrégations pour des temps de réponse irréprochables.

Front end

L'interface du service est une applications Web (HTML/CSS/JS).

Le framework Javascript utilisé est VueJS 2 complété principalement par Nuxt et Vuetify. Le tout forme un environnement très complet pour développer des interfaces graphiques dynamiques et claires. La documentation sur cet écosystème est bien fournie et de qualité. Ce n'est pas pour rien que VueJS fait partie des projets Github les plus populaires.

Code source

Le code du backend est écrit en NodeJS, en respectant la syntaxe ES7. Le code utilise donc massivement les promesses, cachées derrières des mots clés comme async ou await. Cela permet d'avoir du code clair, concis et facilement compréhensible, tout en étant très performant grâce à une gestion non bloquante des opérations asynchrones.

Un autre aspect de NodeJS est très utilisé dans ce projet : la gestion d'opérations en flux (streams). Cela permet de réaliser des traitements sur des volumes importants sans abuser des ressources de la machine. Ce service demande donc peu de mémoire vive pour fonctionner (mais il en faudra par contre une bonne quantité pour ElasticSearch).

Le serveur web et l'API sont écrits avec le framework express 4 qui est utilisé dans de nombreux projets Web NodeJS. Les briques fonctionnelles sont séparées dans des router Express, qui permettent par exemple de définir les opérations autour d'un certain concept.

3 - Simple Directory

La connexion et la gestion des comptes est assurée par Simple Directory. Il permet de gérer deux types de comptes : les comptes utilisateurs et les comptes organisations.

Gestion de session décentralisée

Le rôle principal de Simple Directory est de permettre aux utilisateurs de s'authentifier sur la plateforme. Cela se fait au moyen de JWT (JSON Web Tokens) qui sont stockés côté clients. Les clients envoient leur JWT à chaque requête HTTP, et chaque service dans l'infrastructure est capable de vérifier qu'un JWT est correct : le jeton est vérifié avec la clé publique mise à leur disposition par Simple Directory.

Connection des utilisateurs

Les utilisateurs peuvent se connecter avec un mot de passe et une adresse e-mail ou en utilisant un compte externe, tel qu'un compte Gmail, Facebook, Github ou Linkedin, via le protocole oAuth2.

D’autres protocoles ou fournisseurs d’identités, tels que LDAP ou SSO, seront bientôt implémentés.

Stack technique

Le back-end de Simple Directory est écrit en Node.js avec le framework Express.js. La persistance est assurée avec MongoDB. Le front-end est réalisé avec les frameworks Vue.js, Vuetify.js et Nuxt.js. La création et gestion des JWT est assurée grâce à différentes librairies open source.

Il n'y a pour l'instant qu'un mode de distribution qui est Docker, et il est recommandé d'opérer ce service dans un environnement tel que Kubernetes.

4 - Data Fair Portal

Data Fair Portal permet de réaliser des portails de données, publics ou privés.

Une organisation peut avoir plusieurs portails, et il sera bientôt possible de réaliser des portails multi-organisations. Chaque portail peut être publié sur un nom de domaine différent, Data Fair Portal agit à la manière d'un reverse proxy pour que chaque requête HTTP soit traitée dans le contexte du portail auquel elle fait référence.

L'authentification avec Simple Directory n'étant possible que sur le même domaine (ou sur un sous-domaine de celui pour lequel Simple Directory est configuré), les portails de données sur un autre domaine ne peuvent être que des portails open data.

Stack technique

Le back-end de Data Fair Portal est écrit en Node.js avec le framework Express.js. La persistance est assurée avec MongoDB. Le front-end est réalisé avec les frameworks Vue.js, Vuetify.js et Nuxt.js. La configuration des pages est faites à l'aide de JSON schémas interprétés par la librairie VJFS.

Il n'y a pour l'instant qu'un mode de distribution qui est Docker, et il est recommandé d'opérer ce service dans un environnement tel que Kubernetes.

5 - Connecteurs de catalogues

Les connecteurs de catalogues permettent d'interagir avec des catalogues de données, pour moissonner leurs données ou, au contraire, y publier des jeux de données hébergés sur Data Fair. Contrairement aux traitements de données périodiques, les connecteurs de catalogues permettent de synchroniser des ensembles de jeux de données.

Une refonte est en cours concernant ces connecteurs qui devront être réalisés sous la forme d'API Rest respectant un certain contrat spécifié au format OpenAPI 3.1.

6 - Data Fair Processings

Data Fair Processings permet de programmer des traitements périodiques. Ils permettent d'aller chercher des données à certains endroits, les transformer et les publier sur Data Fair. Il est aussi prévu de pouvoir faire prochainement l'inverse. Il permet, en pratique, de mettre à jour automatiquement des jeux de données spécifiques.

Stack technique

Le back-end de Data Fair Processings est écrit en Node.js avec le framework Express.js. La persistance est assurée avec MongoDB. Le front-end est réalisé avec les frameworks Vue.js, Vuetify.js et Nuxt.js. Les plugins pour ajouter de nouveaux types de traitements sont à écrire en Node.js, mais il est prévu dans le futur de pouvoir supporter des plugins écrits dans d'autres langages.

Il n'y a pour l'instant qu'un mode de distribution qui est Docker, et il est recommandé d'opérer ce service dans un environnement tel que Kubernetes.

7 - Notify

Le service Notify permet de gérer les notifications d'une plateforme. Celles-ci peuvent être transmises dans le navigateur, sur un smartphone ou par e-mail.

Stack technique

Le back-end de Notify est écrit en Node.js avec le framework Express.js. La persistance est assurée avec MongoDB. Le front-end est réalisé avec les frameworks Vue.js, Vuetify.js et Nuxt.js.

Il n'y a pour l'instant qu'un mode de distribution qui est Docker, et il est recommandé d'opérer ce service dans un environnement tel que Kubernetes.

8 - Analytics

La gestion des analytics et autres statistiques d'utilisation de la plateforme peut se faire de deux manières :

  • à l'aide d'un service en ligne externe à la plateforme, tel que Google Analytics ;
  • avec un service d'analytics déployé sur la même infrastructure que Data Fair ; dans ce cas nous recommandons le logiciel open source Matomo (anciennement Piwik).

Matomo

Matomo est écrit en PHP et nécessite une base de données MySQL, comme par exemple MariaDB. Il est distribué sous forme de conteneurs Docker, et nous recommandons de l'intégrer à la plateforme de cette manière.

9 - Capture

Le service Capture permet de créer des images à partir de visualisations web ou des documents PDF à partir de pages web.

Stack technique

Le backend de Capture est écrit en NodeJS avec le framework ExpressJS. Ce service ne possède pas de persistance ni de frontend. Ce service utilise un navigateur headless pour faire les rendu qui est Puppeteer

Il n'y a pour l'instant qu'un mode de distribution qui est Docker, et il est recommandé d'opérer ce service dans un environnement tel que Kubernetes.

10 - Thumbor

Thumbor est un service qui permet d'effectuer des traitements sur les images, dans le but d'améliorer leur affichage :

  • découpe d'une image (Crop) pour, par exemple, avoir des images ayant une proportion bien définie ;
  • redimensionnement d'une image pour diminuer sa taille et ainsi gagner en vitesse d'affichage dans le portail ou dans les visualisations.

11 - Backup

Le service Backup permet de sauvegarder les données des différents services de la plateforme dans un format compressé.

Les différentes bases MongoDB, les données de Data Fair et les utilisateurs de Simple Directory sont enregistrés lors d’une sauvegarde. Il est possible de configurer une sauvegarde périodique ou de déclencher une sauvegarde manuellement.

Stack technique

Le back-end de Backup est écrit en Node.js avec le framework Express.js. La persistance est assurée avec MongoDB. Le front-end est réalisé avec les frameworks Vue.js, Vuetify.js et Nuxt.js. Étant donné son rôle, il est important d'avoir des volumes très fiables avec ce service.

Il n'y a pour l'instant qu'un mode de distribution qui est Docker, et il est recommandé d'opérer ce service dans un environnement tel que Kubernetes.

12 - Statistiques d'API

HTTP logs permet d'extraire des statistiques d'utilisation des API à partir des logs HTTP de services tels que NGINX. Dans la mesure où Data Fair et les différents services associés utilisent beaucoup les mécanismes de cache pour améliorer les temps d'accès aux ressources, des statistiques précises d'utilisation des différents points d'accès de la plateforme ne peuvent être extraites qu'après coup.

Les logs d'accès aux API sont publiés sur Data Fair sous la forme d'un jeu de données qui peut ensuite être exposé partiellement à des organisations en leur proposant les données filtrées les concernant.