From 165f9c4d0a422fed8e0498dde86a621d95c20e21 Mon Sep 17 00:00:00 2001 From: antoineludeau <52679050+antoineludeau@users.noreply.github.com> Date: Wed, 12 Jul 2023 18:30:02 +0200 Subject: [PATCH] Added db seed service to import data inside db with docker-compose --- .dockerignore | 4 +- .env.sample | 4 +- .gitignore | 2 + README.md | 116 +++++++++++------- docker-compose.yml | 14 ++- .../api/Dockerfile.dev | 4 +- .../api/process.dev.yml | 0 .../api/start.dev.sh | 2 +- docker-resources/db_seed/Dockerfile.dev | 5 + docker-resources/db_seed/start.dev.sh | 19 +++ 10 files changed, 120 insertions(+), 50 deletions(-) rename Dockerfile.dev => docker-resources/api/Dockerfile.dev (81%) rename process.dev.yml => docker-resources/api/process.dev.yml (100%) rename start.dev.sh => docker-resources/api/start.dev.sh (95%) create mode 100644 docker-resources/db_seed/Dockerfile.dev create mode 100644 docker-resources/db_seed/start.dev.sh diff --git a/.dockerignore b/.dockerignore index 1aee5005..ef10297c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -44,10 +44,10 @@ reports .editorconfig #Docker config -Dockerfile* docker-compose.yml .dockerignore #Other +nodemon.json *.md -LICENSE \ No newline at end of file +LICENSE diff --git a/.env.sample b/.env.sample index 8ef6997e..018ff7d8 100644 --- a/.env.sample +++ b/.env.sample @@ -35,4 +35,6 @@ JOB_STATUS_LIMIT_DURATION='90d' # Duration max of job status in database MAX_CONCURRENT_WORKERS=1 DATAGOUV_API_KEY= PROXY_URL= # To use only if you are behind a proxy -DISTRICT_TO_SNAPSHOT= # Comma separated list of district to snapshot (used only for dev toolbox) \ No newline at end of file +DISTRICT_TO_SNAPSHOT= # Comma separated list of district to snapshot (used only for dev toolbox) +ACTIVATE_DB_SEED= # To activate the seed of the database (only used with docker deployment) +OVERRIDE_DATA_ON_IMPORT= # To override data on import (only used with docker deployment) diff --git a/.gitignore b/.gitignore index 6689f91c..b91faad6 100644 --- a/.gitignore +++ b/.gitignore @@ -67,3 +67,5 @@ typings/ # Toolbox /toolbox.dev/data +# Data for intial DB seed +/docker-resources/db_seed/data-to-init diff --git a/README.md b/README.md index 360556b4..e4ee56e8 100644 --- a/README.md +++ b/README.md @@ -1,72 +1,102 @@ -# Plateforme Base Adresse Nationale +# Plateforme de la Base Adresse Nationale -Ce dépôt regroupe l'essentiel des briques faisant partie de la plateforme Base Adresse Nationale, à savoir : +## Architecture -- les routines d'import ; -- les routines de consolidation ; -- les routines de production des fichiers ; -- un service "worker" réagissant en temps réel à toute modification. +La BAN Plateforme contient : +- Une API synchrone et asynchrone : serveur Express (point d'entrée : server.js). +L'API asynchrone envoit des tâches dans la queue du redis, pris en charge par le worker. +- Un worker (point d'entrée : worker.js) qui récupère les tâches du redis (qui ont été déposées soit par l'API, soit par les scripts). +- Des scripts (imports, consolidation, exports, ...). -## Installer un environnement de développement +La BAN Plateforme import et export des données d'une base MongoDB. -### Pré-requis - -- Node.js 16 ou supérieur -- MongoDB 4 ou supérieur -- Redis -- yarn ou npm +## Installation ### Configuration +Pour mettre en place un environnement fonctionnel, vous pouvez partir du fichier .env.sample et le copier en le renommant .env. -Pour mettre en place un environnement fonctionnel, vous pouvez partir du fichier `.env.sample` et le copier en le renommant `.env`. +### Deploiement local avec Docker -Compte-tenu de la puissance de calcul nécessaire pour effectuer les traitements sur France entière il est conseillé de restreindre à un seul département pour les développements. Par exemple `DEPARTEMENTS=57`. +#### Pré-requis +- Docker +- Docker-compose -### Installation des dépendances +#### Commandes +Pour déployer l'environnement, lancer la commande suivante : -```bash -yarn +```sh +docker-compose up --build -d ``` -### Préparation des contours administratifs +--build : permet de builder les images locales. +-d : permet de lancer les conteneurs en arrière plan. -```bash -yarn prepare-contours -``` -Prepare les contours France entière sans prendre en compte le .env. +La commande précédente va déployer une architecture locale, interconnectée, avec : +- un conteneur "db" (image mongo:4.2.23) +- un conteneur "redis" (image redis:4.0.9) +- un conteneur "api" (à partir de l'image définie dans le fichier docker-resources/api/Dockerfile.dev) => Au lancement de ce conteneur, un script d'initialisation (défini dans le fichier docker-resources/api/start.sh) va permettre le téléchargement des données requises au démarrage de la plateforme. +- un conteneur "db_seed" (à partir de l'image définie dans le fichier docker-resources/db_seed/Dockerfile.dev) => Ce conteneur éphémère permet d'initialiser (de façon optionnelle) de la donnée dans le conteneur "db". + +#### Initialisation de données dans la BDD (optionnel) + +Pour initialiser des données dans la base MongoDB: +- remplir le dossier docker-resources/db_seed/data-to-init (si le dossier n'existe pas, il faut le créer) avec des fichiers .json (le nom des fichiers correspondront au nom des collections qui seront importées. Exemple: si le dossier contient le fichier 'communes.json', la donnée contenue dans ce fichier sera importée dans la collection "communes"). +- activer la fonctionnalité d'import en passant la variable d'environnement ACTIVATE_DB_SEED à : -### Téléchargement des données nécessaires +```sh +ACTIVATE_DB_SEED = true +``` +- les données seront soit ajoutées soit écrasées selon la valeur de la variable d'environnement -```bash -yarn download-datasets +```sh +OVERRIDE_DATA_ON_IMPORT = true ##true: données écrasées, false: données ajoutées ``` -Télécharge fantoir.sqlite, gazetteer.sqlite, communes-locaux-adresses.json. -### Import des différentes sources +### Deploiement local sans Docker -```bash -yarn import:ign-api-gestion -yarn import:cadastre -yarn import:ftth +#### Pré-requis +- Node.js 16 ou supérieur +- MongoDB 4 ou supérieur +- Redis +- yarn ou npm + +#### Commandes +Pour installer les dépendances, lancer la commande suivate : + +```sh +yarn ``` -Prend en compte le .env pour ne télécharger les données que sur le département concerné. -### Consolidation des adresses +Il faut ensuite télécharger les fichiers requis au démarrage de la plateforme avec les commandes suivantes : -```bash -yarn compose +```sh +yarn prepare-contours ## Prepare les contours administratifs de la France entière. ``` -### Production des fichiers +```sh +yarn download-datasets ## Télécharge fantoir.sqlite, gazetteer.sqlite, communes-locaux-adresses.json. +``` -```bash -yarn dist +Pour déployer l'api et le worker, lancer les deux commandes suivantes en parrallèle : + +```sh +yarn dev ``` -## Opérations d’exploitation +```sh +yarn worker:dev +``` -### Appliquer la mise à jour de la liste des communes certifiées d'office +### Autres commandes -```bash -yarn apply-batch-certification +```sh +yarn compose ## Consolidation des adresses ``` + +```sh +yarn dist ## Production des fichiers d'export +``` + +```sh +yarn apply-batch-certification ## Appliquer la mise à jour de la liste des communes certifiées d'office +``` \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 20367ddb..28fb09ea 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,6 +6,18 @@ services: - "${MONGODB_PORT:-27017}:27017" volumes: - db:/data/db + db_seed: + # Version of mongoDB currently in production + build: + dockerfile: docker-resources/db_seed/Dockerfile.dev + depends_on: + - db + environment: + - MONGODB_DBNAME=${MONGODB_DBNAME} + - ACTIVATE_DB_SEED=${ACTIVATE_DB_SEED} + - OVERRIDE_DATA_ON_IMPORT=${OVERRIDE_DATA_ON_IMPORT} + ports: + - "27016:27017" redis: # Version of Redis currently in production image: redis:4.0.9 @@ -13,7 +25,7 @@ services: - "${REDIS_PORT:-6379}:6379" api: build: - dockerfile: 'Dockerfile.dev' + dockerfile: docker-resources/api/Dockerfile.dev depends_on: - db - redis diff --git a/Dockerfile.dev b/docker-resources/api/Dockerfile.dev similarity index 81% rename from Dockerfile.dev rename to docker-resources/api/Dockerfile.dev index 49932cc6..190e751f 100644 --- a/Dockerfile.dev +++ b/docker-resources/api/Dockerfile.dev @@ -5,7 +5,7 @@ RUN npm install pm2 -g # optimzing caching for yarn install WORKDIR /app -COPY package.json yarn.lock . +COPY package.json yarn.lock ./ RUN yarn install # creating /data and /dist folder to be able to map volumes @@ -14,4 +14,4 @@ RUN mkdir data && mkdir dist # copying the root folder into the workdir taking into account the .dockerignore file COPY . . -CMD ["sh", "start.dev.sh"] \ No newline at end of file +CMD ["sh", "docker-resources/api/start.dev.sh"] \ No newline at end of file diff --git a/process.dev.yml b/docker-resources/api/process.dev.yml similarity index 100% rename from process.dev.yml rename to docker-resources/api/process.dev.yml diff --git a/start.dev.sh b/docker-resources/api/start.dev.sh similarity index 95% rename from start.dev.sh rename to docker-resources/api/start.dev.sh index b64a84f7..a42b8f70 100644 --- a/start.dev.sh +++ b/docker-resources/api/start.dev.sh @@ -35,4 +35,4 @@ fi # npm run compose # npm run dist -pm2-runtime process.dev.yml \ No newline at end of file +pm2-runtime docker-resources/api/process.dev.yml \ No newline at end of file diff --git a/docker-resources/db_seed/Dockerfile.dev b/docker-resources/db_seed/Dockerfile.dev new file mode 100644 index 00000000..35197132 --- /dev/null +++ b/docker-resources/db_seed/Dockerfile.dev @@ -0,0 +1,5 @@ +FROM mongo:4.2.23 + +COPY docker-resources/db_seed/data-to-init/ ./data-to-init +COPY docker-resources/db_seed/start.dev.sh ./start.dev.sh +CMD ["bash", "start.dev.sh"] \ No newline at end of file diff --git a/docker-resources/db_seed/start.dev.sh b/docker-resources/db_seed/start.dev.sh new file mode 100644 index 00000000..fab92338 --- /dev/null +++ b/docker-resources/db_seed/start.dev.sh @@ -0,0 +1,19 @@ +## This script is used to import data into the database +## It looks into the data-to-init folder and import all the json files +## The name of the collection imported will be the name of the file without the extension + +echo "ACTIVATE_DB_SEED : $ACTIVATE_DB_SEED" +echo "OVERRIDE_DATA_ON_IMPORT : $OVERRIDE_DATA_ON_IMPORT" + +if [[ "$ACTIVATE_DB_SEED" = "true" ]]; then + for file in `ls data-to-init`; do + filename="${file%.*}" + echo "Importing $file data into $filename collection..." + if [[ "$OVERRIDE_DATA_ON_IMPORT" = "true" ]]; then + mongoimport --host db --db $MONGODB_DBNAME --collection $filename --type json --file /data-to-init/$file --jsonArray --drop + else + mongoimport --host db --db $MONGODB_DBNAME --collection $filename --type json --file /data-to-init/$file --jsonArray + fi + + done +fi