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 95a07b31..5f223bda 100644 --- a/.env.sample +++ b/.env.sample @@ -35,3 +35,5 @@ 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 +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) \ No newline at end of file diff --git a/README.md b/README.md index 360556b4..1527d933 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 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 48c23196..78274b74 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 87% rename from start.dev.sh rename to docker-resources/api/start.dev.sh index 49b21243..a42b8f70 100644 --- a/start.dev.sh +++ b/docker-resources/api/start.dev.sh @@ -27,12 +27,12 @@ else npm run download-datasets fi -npm run import:ign-api-gestion -npm run import:cadastre -npm run import:ftth +# npm run import:ign-api-gestion +# npm run import:cadastre +# npm run import:ftth # npm run apply-batch-certification # 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/data-to-init/communes.json b/docker-resources/db_seed/data-to-init/communes.json new file mode 100644 index 00000000..fedb59ce --- /dev/null +++ b/docker-resources/db_seed/data-to-init/communes.json @@ -0,0 +1,3 @@ +[{ + "codeCommune":"12345" +}] \ 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