etalab / annuaire-entreprises-sirene-api

MIT License
15 stars 11 forks source link

Gestion de backend pour la base SIRENE Open Data

Ce repo a pour objectif de proposer une architecture simplifiée pour la mise en API de la base open data SIRENE de l'INSEE.

Architecture

L'architecture proposée est basée sur Docker (docker-compose). Deux services y sont proposés :

La base SIRENE open data se mettant à jour une fois par mois, il est proposé d'articuler ces services avec le reverse proxy Traefik pour limiter le temps d'indisponibilité du backend lors des migrations d'une ancienne base de données vers une nouvelle base de données.

Le workflow est donc le suivant :

Services

service db

Le service db est basé sur l'image docker postgresql 12.

Au démarrage du service, un certain nombre de scripts contenu dans db/init/ sont exécutés :

service postgrest

Le service postgrest permet de s'interfacer avec la base postgresql et offre une interface d'API sur celle-ci.

Les labels suivants permettent à Traefik de rerouter le traffic vers le port 3000 du container :

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.postgrest.rule=Host(`localhost`)"
      - "traefik.http.routers.postgrest.entrypoints=postgrest"
      - "traefik.port=3000"

Un Healthcheck est ajouté afin d'indiquer à Traefik (via les docker Healthcheck) si le container est prêt ou non. Le healthcheck consiste à vérifier si la view etablissements_view est disponible ou non (étape réalisée à la fin de la préparation du container db):

HEALTHCHECK --interval=1s --timeout=3s \
  CMD PGPASSWORD=$POSTGRES_PASSWORD psql -h $POSTGRES_DB_HOST -p 5432 -U $POSTGRES_USER -d $POSTGRES_DB -c "select * from etablissements_view limit 1;"

script deploy.sh

Ce script permet de gérer les différents jeux de données d'un mois à l'autre. Un environnement courant est taggé avec la couleur blue (ou green). Le script détecte le tag courant et lance un docker-compose avec un tag de la couleur opposée Une fois les services up et healthy, le script coupe l'ancien service.

conf Nginx

Dans le dossier utils est déposé un exemple de configuration nginx permettant de créer des routes au-dessus de postgrest. Dans ce backend, on retrouve trois routes principales :

Recherche plain text d'une entreprise. Attention, le paramètre q ne doit pas comporter d'accent :

http://recherche.entreprise.dataeng.etalab.studio/search?q=la%20poste&page=1&per_page=10

# 3 paramètres :
# q : recherche plain text
# page : page désirée
## per_page : nombre de résultats par page désiré

Recherche des établissements d'un siren :

http://recherche.entreprise.dataeng.etalab.studio/siren?q=130025265

# 1 paramètre :
# q : siren rencherché

Recherche des unités légales commençant par un string (utilisé pour l'autocomplete) :

http://recherche.entreprise.dataeng.etalab.studio/autocomplete?q=DIRECTION%20INTERMI

# 1 paramètre :
# q : string recherchée

Installation

  1. Clone du repo

  2. Mise en place de Traefik et création d'un réseau docker dédié

docker-compose -f docker-compose-traefik.yml up --build -d
  1. Changement des valeurs des variables d'environnement dans les fichiers docker-compose-blue.yml et docker-compose-green.yml. Mettre les valeurs de votre choix pour les services db et postgres:
...
  db-<COLOR>:
    ...
    environment:
      - POSTGRES_DB=sirene
      - POSTGRES_USER=sirene
      - POSTGRES_PASSWORD=sirene
  postgrest:
    ...
    environment:
      - POSTGRES_DB_HOST=db-blue
      - POSTGRES_DB=sirene
      - POSTGRES_USER=sirene
      - POSTGRES_PASSWORD=sirene
      ...
  1. Première mise en production du backend
docker-compose -f docker-compose-blue.yml build --no-cache
docker-compose -f docker-compose-blue.yml --project-name=blue up --build -d
  1. Accès à l'API

Vous pouvez accéder à l'API via http://IP:3000/ et requêter la base via la documentation postgrest. Exemple :

http://localhost:3000/etablissements_view?tsv=plfts.boucherie&limit=100 # Retourne les 100 premiers résultats de boucherie dans la base
  1. Lorsqu'une nouvelle version des données est disponible :
./deploy.sh