Skip to content

Commit

Permalink
Merge pull request #93 from rv2931/folder_redisign
Browse files Browse the repository at this point in the history
[03] Folder redisign
  • Loading branch information
RonanMorgan authored Mar 8, 2024
2 parents f12b950 + 05569c1 commit e9a86a8
Show file tree
Hide file tree
Showing 77 changed files with 570 additions and 492 deletions.
40 changes: 40 additions & 0 deletions .env.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
###############################################################################################
# BLOOM VARIABLES
###############################################################################################
# these values are used in the local docker env. You can use "localhost" hostname
# if you run the application without docker
POSTGRES_HOSTNAME=postgres_bloom
POSTGRES_USER=bloom_user
POSTGRES_PASSWORD=bloom
POSTGRES_DB=bloom_db
POSTGRES_PORT=5432
SPIRE_TOKEN=
SLACK_URL=

# Folder where data are stored
DATA_FOLDER=/data

LOGGING_LEVEL=INFO


###############################################################################################
# DOCKER SPECIFIC VARIABLES
###############################################################################################
# IMAGE_PYTHON (Optional)
# Default is set in docker-compose.yaml and/or in dockerfile directly ARG IMAGE_PYTHON
# Changing this value will change the version python image used to build Docker image of Bloom
#IMAGE_PYTHON=python:3.10-slim-bullseye

# POETRY_VERSION (Optional)
# Default is set in docker-compose.yaml and/or in dockerfile directly ARG POETRY_VERSION
# Changing this value will change the version poetry used to build Docker image of Bloom
#POETRY_VERSION=1.8.1


###############################################################################################
# STREAMLIT SPECIFIC VARIABLES
###############################################################################################
# STREAMLIT_SERVER_ADDRESS (Optional)
# Default is set in docker-compose.yaml
# Changing this value will change the listening addess of streamlit server
#STREAMLIT_SERVER_ADDRESS=0.0.0.0
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# APP BLOOM

/data/
!/data/README.md


# From https://github.com/github/gitignore/blob/main/Python.gitignore
# Byte-compiled / optimized / DLL files
__pycache__/
Expand Down Expand Up @@ -126,7 +132,7 @@ celerybeat.pid

# Environments
.env
.env.test
.env.*
.venv
env/
venv/
Expand Down
19 changes: 19 additions & 0 deletions BLOOM_CONFIG.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@

De mon côté, je voulais mettre en place mon mécanisme de gestion des configurations qui me permet d'avoir une seule config pour du déploiement natif et de la surcharger à la marge directement dans le docker-compose pour du déploiement Docker et je n'y arrivais pas. @Samuel Enguehard a émis ce besoin pour pouvoir lancer en natif et utiliser les outils de débogage intégré à l'éditeur graphique j'imagine, ce qui est quand même bcp plus confort, mais de mon côté je l'utilise tous les jours et je trouve ça vraiment pratique d'avoir une seule conf sans se poser de question si c'est du natif ou du docker.

Au final j'ai trouvé pourquoi, c'est parce que le mécanisme de chargement automatique du fichier .env activé dans docker-compose est prioritaire sur les sections "environment:" décrites dans le fichier docker-compose.yaml et vient donc écraser les valeurs qui ont pu être mises dans le fichier (je l'utilise par exemple pour forcer la valeur POSTGRES_HOSTNAME|PORT:postgres:5432 dans le fichier docker-compose peu importe la valeur du fichier .env initial mais avec ce mécanisme, c'est la valeur du .env qui mise systématiquement. Du coup quand on passe du natif à docker on est quand même obligé de venir modifier la valeur des paramètres dans le fichier de .env POSTGRES_HOST/PORT mais aussi mettre des chemins typé "Docker" pour les secrets: /run/secrets/postgres_password au lieu POSTGRES_PASSWORD_FILE=./secrets/postges_password quand on passe de l'un à l'autre... c'est un peu dommage mais soit
Ca devient donc impossible d'avoir une conf native par fichier+surcharge Docker au niveau du docker compose au sein des ces sections "environment"

Bref ça me rappelle pourquoi je n'utilise jamais le chargement .env par défaut de docker-compose autant pour le dev mais surtout pour le déploiement en compose, c'est pas flexible (https://docs.docker.com/compose/environment-variables/envvars-precedence/)

De ce fait on en arrive à privilégier un déploiement des paramètres par variable d'environnement et non pas par fichier au niveau d'application (comme certain préféraient dans nos discussions) puisque c'est le mode un peu forcé si on utilise le chargement des fichiers .env de docker-compose et que c'est préférable que le fonctionnement de l'application soit équivalent en natif comme en Docker.
Perso, dans tous mes projets, je mets en place un chargement hybride des settings par fichier + env avec priorité pour l'env (standard Docker mais c'est hyper pratique) donc je fais les deux mais de manière maitrisée, mais l'idée là est juste qu'on se fixe officiellement pour le projet bloom, c'est pour ça que je voulais savoir si au final ce sera déployé en natif ou en Docker pour valider que c'était pratique sur toute la chaine et non pas que pour les développeurs

Pour ce qui est de la flexibilité pour lancer en natif @Samuel Enguehard, pour ceux qui alternent natif/docker ou ceux qui alternent dev/test/prod/... j'aurais une proposition qui n'impacte pas le fonctionnement par défaut utilisant le .env et docker-compose:
on utilise une variable (optionnelle) d'environnement BLOOM_CONFIG=.env.dev par exemple (.env par défaut) (qui peut d'ailleurs se trouver hors du dépôt Git dans ce cas, ce qui est très utile dans le cas des déploiement automatisés Docker comme natif avec une conf locale au serveur en dehors du dossier gitlab/github
Dans cette solution il suffit d'exporter la variable COMPOSE_ENV_FILES qui précise le nom du fichier par environnement à charger (par défaut c'est bien .env) et lui donner la valeur de BLOOM_CONFIG à savoir " export COMPOSE_ENV_FILES=${BLOOM_CONFIG}" sous Linux et set COMPOSE_ENV_FILES=%BLOOM_CONFIG% sous windows et de faire simplement
export BLOOM_CONFIG=.env.dev ;
puis, pour Docker: docker compose up (il prend automatiquement la valeur COMPOSE_ENV_FILES qui est égale à la valeur de BLOOM_CONFIG
puis, pour du natif charge à l'application d'aller chercher les valeurs du fichier BLOOM_CONFIG si cette variable est définie, sinon on charge le .env par défaut (=> évolution de bloom.config)
Dans les deux cas Docker/Natif, bloom.config doit charger le fichier BLOOM_CONFIG si présent sinon .env, puis surcharger les éventuelles valeurs qui seraient aussi présentes dans les variables d'environnement
Je précise que ce mécanisme apporte de la flexibilité pour ceux qui alternent entre natif et docker (il suffit de faire BLOOM_CONFIG=.env.docker et BLOOM_CONFIG=.env.local) et en vue des contraintes de déploiement natif/Docker (BLOOM_CONFIG=/my/secured/folder/.env.prod), cependant pour les développeurs qui utilisent toujours le même environnement, il suffit de laisser la config par défaut (.env) sans modifier la valeur COMPOSE_ENV_FILES et/ou exporter BLOOM_CONFIG, ça utilisera le .env partout comme actuellement
26 changes: 13 additions & 13 deletions bloom/Makefile → Makefile
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
VERSION ?= 1.0.0

#BLOOM_DEV_DOCKER = @docker run --name bloom-test --mount type=bind,source="$(shell pwd)",target=/source_code --env-file ./.env.test --network=bloom_net -p 8501:8501
BLOOM_DEV_DOCKER = @docker run --name bloom-test --mount type=bind,source=.,target=/source_code --env-file ./.env.template --network=bloom_net -p 8501:8501
BLOOM_PRODUCTION_DOCKER = @docker run --mount type=bind,source="$(shell pwd)",target=/source_code --env-file ./.env --log-driver json-file --log-opt max-size=10M --log-opt max-file=3 --entrypoint /entrypoint.sh
#BLOOM_DEV_DOCKER = @docker run --name bloom-test --mount type=bind,source="$(shell pwd)",target=/project --env-file ./.env.test --network=bloom_net -p 8501:8501
BLOOM_DEV_DOCKER = @docker run --name bloom-test -v "$(shell pwd)/data:/data" -v "$(shell pwd)/:/project" --env-file ./.env.template --network=bloom_net -p 8501:8501
BLOOM_PRODUCTION_DOCKER = @docker run -v "$(shell pwd)/data:/data" -v "$(shell pwd)/:/project" --env-file ./.env --log-driver json-file --log-opt max-size=10M --log-opt max-file=3 --entrypoint /entrypoint.sh

build:
@docker build -t d4g/bloom:${VERSION} --platform linux/amd64 -f docker-env/Dockerfile .
@docker build -t d4g/bloom:${VERSION} --platform linux/amd64 -f docker/Dockerfile .
@docker tag d4g/bloom:${VERSION} d4g/bloom:latest

launch-dev-db:
@docker compose -f docker-env/docker-compose-db.yaml up -d
@docker compose -f docker/docker-compose-db.yaml up -d
@sleep 20
$(BLOOM_DEV_DOCKER) --rm d4g/bloom:${VERSION} alembic upgrade head
$(BLOOM_DEV_DOCKER) --rm d4g/bloom:${VERSION} /venv/bin/python3 alembic/init_script/load_vessels_data.py
$(BLOOM_DEV_DOCKER) --rm d4g/bloom:${VERSION} /venv/bin/python3 src/alembic/init_script/load_vessels_data.py

load-amp-data:
$(BLOOM_DEV_DOCKER) --rm d4g/bloom:${VERSION} /venv/bin/python3 alembic/init_script/load_amp_data.py
$(BLOOM_DEV_DOCKER) --rm d4g/bloom:${VERSION} /venv/bin/python3 src/alembic/init_script/load_amp_data.py

load-test-positions-data:
$(BLOOM_DEV_DOCKER) --rm d4g/bloom:${VERSION} /venv/bin/python3 alembic/init_script/load_positions_data.py
$(BLOOM_DEV_DOCKER) --rm d4g/bloom:${VERSION} /venv/bin/python3 src/alembic/init_script/load_positions_data.py

launch-dev-container:
$(BLOOM_DEV_DOCKER) -dti d4g/bloom:${VERSION} /bin/bash

launch-dev-app:
$(BLOOM_DEV_DOCKER) --rm d4g/bloom:${VERSION} /venv/bin/python3 app.py
$(BLOOM_DEV_DOCKER) --rm d4g/bloom:${VERSION} /venv/bin/python3 src/app.py

launch-test:
$(BLOOM_DEV_DOCKER) --rm d4g/bloom:${VERSION} tox -vv

rm-dev-db:
@docker-compose -f docker-env/docker-compose-db.yaml stop
@docker-compose -f docker-env/docker-compose-db.yaml rm
@docker compose -f docker/docker-compose-db.yaml stop
@docker compose -f docker/docker-compose-db.yaml rm

rm-dev-env:
@docker stop bloom-test
Expand All @@ -48,7 +48,7 @@ launch-production-app:
$(BLOOM_PRODUCTION_DOCKER) --name bloom-production-app --rm d4g/bloom:${VERSION} /venv/bin/python3 app.py

dump-dev-db:
$(BLOOM_DEV_DOCKER) --rm postgres:latest sh -c 'export PGPASSWORD=$$POSTGRES_PASSWORD && pg_dump -Fc $$POSTGRES_DB -h $$POSTGRES_HOSTNAME -p $$POSTGRES_PORT -U $$POSTGRES_USER> /source_code/bloom_$(shell date +%Y%m%d_%H%M).dump'
$(BLOOM_DEV_DOCKER) --rm postgres:latest sh -c 'export PGPASSWORD=$$POSTGRES_PASSWORD && pg_dump -Fc $$POSTGRES_DB -h $$POSTGRES_HOSTNAME -p $$POSTGRES_PORT -U $$POSTGRES_USER> /project/bloom_$(shell date +%Y%m%d_%H%M).dump'

dump-db:
@docker run --mount type=bind,source="$(shell pwd)",target=/source_code --env-file ./.env.test --network=bloom_net --rm postgres:latest sh -c 'export PGPASSWORD=$$POSTGRES_PASSWORD && pg_dump -Fc $$POSTGRES_DB -h $$POSTGRES_HOSTNAME -p $$POSTGRES_PORT -U $$POSTGRES_USER> /source_code/bloom_$(shell date +%Y%m%d_%H%M).dump'
@docker run --mount type=bind,source="$(shell pwd)",target=/project --env-file ./.env.test --network=bloom_net --rm postgres:latest sh -c 'export PGPASSWORD=$$POSTGRES_PASSWORD && pg_dump -Fc $$POSTGRES_DB -h $$POSTGRES_HOSTNAME -p $$POSTGRES_PORT -U $$POSTGRES_USER> /project/bloom_$(shell date +%Y%m%d_%H%M).dump'
14 changes: 14 additions & 0 deletions bloom/README.md → README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,20 @@

**BLOOM** is a non-profit organization founded in 2005 that works to preserve the marine environment and species from unnecessary destruction and to increase social benefits in the fishing sector. **BLOOM** wages awareness and advocacy campaigns in order to accelerate the adoption of concrete solutions for the ocean, humans and the climate. **BLOOM** carries out scientific research projects, independent studies and evaluations that highlight crucial and unaddressed issues such as the financing mechanisms of the fishing sector. **BLOOM**’s actions are meant for the general public as well as policy-makers and economic stakeholders.

## Installing Trawl Watch with Docker Compose

* Ensure [Docker](https://docs.docker.com/get-docker/) is installed.
* git clone https://github.com/dataforgoodfr/12_bloom.git
* cd 12_bloom
* docker compose build
* docker compose pull
* copy and paste bloom/env.template at the same level than docker-compose.yaml and rename it .env
* docker compose run --service-ports bloom /bin/bash
* streamlit run Trawlwatcher.py
* working mmsi : 261084090



## Installing Trawl Watch with `poetry`

### Prerequisites:
Expand Down
17 changes: 0 additions & 17 deletions README.txt

This file was deleted.

2 changes: 1 addition & 1 deletion bloom/alembic.ini → alembic.ini
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[alembic]
# path to migration scripts
script_location = alembic
script_location = src/alembic

# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s
# Uncomment the line below if you want the files to be prepended with date and time
Expand Down
8 changes: 0 additions & 8 deletions bloom/.env.template

This file was deleted.

38 changes: 0 additions & 38 deletions bloom/alembic/init_script/load_positions_data.py

This file was deleted.

39 changes: 0 additions & 39 deletions bloom/alembic/init_script/load_vessels_data.py

This file was deleted.

30 changes: 0 additions & 30 deletions bloom/bloom/config.py

This file was deleted.

Binary file removed bloom/data/_info_subset_data.docx
Binary file not shown.
11 changes: 0 additions & 11 deletions bloom/data/vessels_subset_02022024.csv

This file was deleted.

63 changes: 0 additions & 63 deletions bloom/docker-env/Dockerfile

This file was deleted.

Loading

0 comments on commit e9a86a8

Please sign in to comment.