Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: add encrypted detailed files #840

Merged
merged 16 commits into from
Dec 17, 2024
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .buildpacks
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
https://github.com/Scalingo/ssh-private-key-buildpack.git
https://github.com/Scalingo/apt-buildpack.git
https://github.com/Scalingo/python-buildpack
https://github.com/MTES-MCT/ecobalyse-buildpack-run.git
https://github.com/Scalingo/nodejs-buildpack
Expand Down
1 change: 1 addition & 0 deletions .env.sample
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ MATOMO_TOKEN=xxx
NODE_ENV=development
SCALINGO_POSTGRESQL_URL=please-change-this
SENTRY_DSN=please-change-this
TRANSCRYPT_KEY=use-key-in-vaultwarden
4 changes: 4 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#pattern filter=crypt diff=crypt merge=crypt
public/data/textile/processes_impacts.json filter=crypt diff=crypt merge=crypt
public/data/food/processes_impacts.json filter=crypt diff=crypt merge=crypt
public/data/object/processes_impacts.json filter=crypt diff=crypt merge=crypt
23 changes: 10 additions & 13 deletions .github/workflows/create_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ permissions:
contents: write
pull-requests: write

env:
ECOBALYSE_DATA_DIR: ./ecobalyse-private

jobs:
create_tag_and_release:
# The tag and the release should be created only when the automated PR created by `create_pr_for_changelog` is merged
Expand All @@ -27,6 +24,13 @@ jobs:
with:
fetch-depth: 0

- name: Install transcrypt
run: |
mkdir -p $HOME/.local/bin
echo "$HOME/.local/bin" >> $GITHUB_PATH
wget https://raw.githubusercontent.com/elasticdog/transcrypt/016b2e4b31951be5ea96233d8d2badef9c9836b6/transcrypt -O "$HOME/.local/bin/transcrypt"
chmod +x "$HOME/.local/bin/transcrypt"

- name: Get latest version
uses: orhun/git-cliff-action@v4
id: git_cliff
Expand Down Expand Up @@ -60,13 +64,6 @@ jobs:
if: steps.tag_creation.outputs.tag_created
run: npm ci --prefer-offline --no-audit

- name: Clone the detailed impacts
if: steps.tag_creation.outputs.tag_created
run: |
eval `ssh-agent -s`
ssh-add - <<< '${{ secrets.PRIVATE_SSH_KEY }}'
git clone [email protected]:MTES-MCT/ecobalyse-private.git

- name: Build app
if: steps.tag_creation.outputs.tag_created
env:
Expand All @@ -84,9 +81,9 @@ jobs:
# We include the encrypted detailed processes with the dist
# so that people with the encryption key could later on use the app with the exact
# files it was using on production
npm run encrypt $ECOBALYSE_DATA_DIR/data/textile/processes_impacts.json dist/processes_impacts_textile.json.enc
npm run encrypt $ECOBALYSE_DATA_DIR/data/food/processes_impacts.json dist/processes_impacts_food.json.enc
npm run encrypt $ECOBALYSE_DATA_DIR/data/object/processes_impacts.json dist/processes_impacts_object.json.enc
npm run encrypt public/data/textile/processes_impacts.json dist/processes_impacts_textile.json.enc
npm run encrypt public/data/food/processes_impacts.json dist/processes_impacts_food.json.enc
npm run encrypt public/data/object/processes_impacts.json dist/processes_impacts_object.json.enc
vjousse marked this conversation as resolved.
Show resolved Hide resolved

- name: Generate dist archive
if: steps.tag_creation.outputs.tag_created
Expand Down
29 changes: 8 additions & 21 deletions .github/workflows/node.js.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ name: Node.js CI

env:
NODE_ENV: test
ECOBALYSE_DATA_DIR: ./ecobalyse-private
TRANSCRYPT_KEY: ${{ secrets.TRANSCRYPT_KEY }}
on:
push:
branches: [ master, staging ]
Expand All @@ -24,6 +24,13 @@ jobs:
steps:
- uses: actions/checkout@v4

- name: Install transcrypt
run: |
mkdir -p $HOME/.local/bin
echo "$HOME/.local/bin" >> $GITHUB_PATH
wget https://raw.githubusercontent.com/elasticdog/transcrypt/016b2e4b31951be5ea96233d8d2badef9c9836b6/transcrypt -O "$HOME/.local/bin/transcrypt"
chmod +x "$HOME/.local/bin/transcrypt"

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
Expand Down Expand Up @@ -61,26 +68,6 @@ jobs:
sudo apt-get update
sudo apt-get install -y gettext

- name: Clone the detailed impacts
run: |
eval `ssh-agent -s`
# Private ssh key used by this Github action to clone the private repo
# The corresponding public key must be set as a deploy key of the private repo
ssh-add - <<< '${{ secrets.PRIVATE_SSH_KEY }}'
git clone [email protected]:MTES-MCT/ecobalyse-private.git

- name: Checkout specific ecobalyse-private branch
if: ${{ github.event_name == 'pull_request' }}
env:
LAST_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
GITHUB_ACCESS_TOKEN: ${{ secrets.GH_REST_ACCESS_TOKEN }}
run: |
eval `ssh-agent -s`
# Private ssh key used by this Github action to clone the private repo
# The corresponding public key must be set as a deploy key of the private repo
ssh-add - <<< '${{ secrets.PRIVATE_SSH_KEY }}'
pipenv run ./bin/checkout-ecobalyse-private-branch.sh $LAST_COMMIT_SHA

- name: Build app
run: npm run build --if-present

Expand Down
19 changes: 0 additions & 19 deletions .github/workflows/score_history.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ on:

env:
NODE_ENV: test
ECOBALYSE_DATA_DIR: ./ecobalyse-private

jobs:
score_history:
Expand Down Expand Up @@ -72,24 +71,6 @@ jobs:
run: pip install numpy pandas requests python-dotenv GitPython sqlalchemy psycopg2


- name: Clone the detailed impacts
run: |
eval `ssh-agent -s`
ssh-add - <<< '${{ secrets.PRIVATE_SSH_KEY }}'
git clone [email protected]:MTES-MCT/ecobalyse-private.git

- name: Checkout specific ecobalyse-private branch
env:
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
eval `ssh-agent -s`
# Private ssh key used by this Github action to clone the private repo
# The corresponding public key must be set as a deploy key of the private repo
ssh-add - <<< '${{ secrets.PRIVATE_SSH_KEY }}'
# As this action is not triggered by the pull_request event, the current sha
# can be found in $GITHUB_SHA (setup by github actions)
pipenv run ./bin/checkout-ecobalyse-private-branch.sh $GITHUB_SHA

- name: Add scalingo to know hosts
run: echo "KNOWN_HOSTS=$(ssh-keyscan -H ssh.osc-fr1.scalingo.com)" >> $GITHUB_ENV

Expand Down
1 change: 1 addition & 0 deletions Aptfile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
bsdmainutils
64 changes: 34 additions & 30 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,35 @@ L'application est accessible [à cette adresse](https://ecobalyse.beta.gouv.fr/)

## Socle technique et prérequis

Le frontend de cette application est écrite en [Elm](https://elm-lang.org/). Vous devez disposer d'un environnement [NodeJS](https://nodejs.org/fr/) 14+ et `npm`. Pour le backend vous devez disposer d'un environnement [python](https://www.python.org/) >=3.11, [pipenv](https://pipenv.pypa.io/) et [gettext](https://www.gnu.org/software/gettext/) sur votre machine.
Le frontend de cette application est écrite en [Elm](https://elm-lang.org/). Vous devez disposer d'un environnement [NodeJS](https://nodejs.org/fr/) 14+ et `npm`. Pour le backend vous devez disposer d'un environnement [python](https://www.python.org/) >=3.11, [pipenv](https://pipenv.pypa.io/) et [gettext](https://www.gnu.org/software/gettext/) sur votre machine. Certains fichiers d’impacts détaillés nécessitent de configurer [`transcrypt`](https://github.com/elasticdog/transcrypt) pour les lire en local.

## Configuration

Les variables d'environnement suivantes doivent être définies :

- `BACKEND_ADMINS` : la liste des emails des administrateurs initiaux, séparés par une virgule
- `DEFAULT_FROM_EMAIL` : l'email utilisé comme origine pour les mails liés à l'authentification (par défaut [email protected])
- `DJANGO_DEBUG`: la valeur du mode DEBUG de Django (par défaut `True`)
- `DJANGO_SECRET_KEY` : la [clé secrète de Django](https://docs.djangoproject.com/en/5.0/ref/settings/#std-setting-SECRET_KEY)
- `EMAIL_HOST` : le host SMTP pour envoyer les mail liés à l'authentification
- `EMAIL_HOST_USER`: l'utilisateur du compte SMTP
- `EMAIL_HOST_PASSWORD` : le mot de passe du compte SMTP pour envoyer les mail liés à l'authentification
- `ENABLE_FOOD_SECTION` : affichage ou non de la section expérimentale dédiée à l'alimentaire (valeur `True` ou `False`, par défault `False`)
- `ENABLE_OBJECTS_SECTION` : affichage ou non de la section expérimentale dédiée aux objets génériques (valeur `True` ou `False`, par défault `False`)
- `ENABLE_VELI_SECTION` : affichage ou non de la section expérimentale dédiée aux véhicules intermédiaires (valeur `True` ou `False`, par défault `False`)
- `MATOMO_HOST`: le domaine de l'instance Matomo permettant le suivi d'audience du produit (typiquement `stats.beta.gouv.fr`).
- `MATOMO_SITE_ID`: l'identifiant du site Ecobalyse sur l'instance Matomo permettant le suivi d'audience du produit.
- `MATOMO_TOKEN`: le token Matomo permettant le suivi d'audience du produit.
- `NODE_ENV`: l'environnement d'exécution nodejs (par défaut, `development`)
- `SCALINGO_POSTGRESQL_URL` : l'uri pour accéder à Postgresl (définie automatiquement par Scalingo). Si non défini sqlite3 est utilisé.
- `SENTRY_DSN`: le DSN [Sentry](https://sentry.io) à utiliser pour les rapports d'erreur.
- `TRANSCRYPT_KEY`: la clé utilisée par [transcrypt](https://github.com/elasticdog/transcrypt/blob/main/INSTALL.md) et disponible dans [https://vaultwarden.incubateur.net](https://vaultwarden.incubateur.net/).

En développement, copiez le fichier `.env.sample`, renommez-le `.env`, et mettez à jour les valeurs qu'il contient ; le serveur de développement node chargera les variables en conséquences.

Pour utiliser le PostgreSQL lancé avec docker, configurez la variable `SCALINGO_POSTGRESQL_URL` comme ceci :

SCALINGO_POSTGRESQL_URL=postgres://postgres:password@localhost:5433/ecobalyse_dev

## Installation

Expand Down Expand Up @@ -37,33 +65,6 @@ Vous devriez pouvoir y accéder via votre `psql` local avec la commande suivante

psql -U postgres -p 5433 -h localhost ecobalyse_dev

## Configuration

Les variables d'environnement suivantes doivent être définies :

- `BACKEND_ADMINS` : la liste des emails des administrateurs initiaux, séparés par une virgule
- `DEFAULT_FROM_EMAIL` : l'email utilisé comme origine pour les mails liés à l'authentification (par défaut [email protected])
- `DJANGO_DEBUG`: la valeur du mode DEBUG de Django (par défaut `True`)
- `DJANGO_SECRET_KEY` : la [clé secrète de Django](https://docs.djangoproject.com/en/5.0/ref/settings/#std-setting-SECRET_KEY)
- `ECOBALYSE_DATA_DIR`: l'emplacement du dépôt de données détaillées sur le système de fichier. Note: à terme, cette valeur deviendra optionnelle pour autoriser un fonctionnement en mode restreint.
- `EMAIL_HOST` : le host SMTP pour envoyer les mail liés à l'authentification
- `EMAIL_HOST_USER`: l'utilisateur du compte SMTP
- `EMAIL_HOST_PASSWORD` : le mot de passe du compte SMTP pour envoyer les mail liés à l'authentification
- `ENABLE_FOOD_SECTION` : affichage ou non de la section expérimentale dédiée à l'alimentaire (valeur `True` ou `False`, par défault `False`)
- `ENABLE_OBJECTS_SECTION` : affichage ou non de la section expérimentale dédiée aux objets génériques (valeur `True` ou `False`, par défault `False`)
- `ENABLE_VELI_SECTION` : affichage ou non de la section expérimentale dédiée aux véhicules intermédiaires (valeur `True` ou `False`, par défault `False`)
- `MATOMO_HOST`: le domaine de l'instance Matomo permettant le suivi d'audience du produit (typiquement `stats.beta.gouv.fr`).
- `MATOMO_SITE_ID`: l'identifiant du site Ecobalyse sur l'instance Matomo permettant le suivi d'audience du produit.
- `MATOMO_TOKEN`: le token Matomo permettant le suivi d'audience du produit.
- `NODE_ENV`: l'environnement d'exécution nodejs (par défaut, `development`)
- `SCALINGO_POSTGRESQL_URL` : l'uri pour accéder à Postgresl (définie automatiquement par Scalingo). Si non défini sqlite3 est utilisé.
- `SENTRY_DSN`: le DSN [Sentry](https://sentry.io) à utiliser pour les rapports d'erreur.

En développement, copiez le fichier `.env.sample`, renommez-le `.env`, et mettez à jour les valeurs qu'il contient ; le serveur de développement node chargera les variables en conséquences.

Pour utiliser le PostgreSQL lancé avec docker, configurez la variable `SCALINGO_POSTGRESQL_URL` comme ceci :

SCALINGO_POSTGRESQL_URL=postgres://postgres:password@localhost:5433/ecobalyse_dev

## Chargement des données par défaut

Expand Down Expand Up @@ -132,9 +133,12 @@ Pour ajouter une variable d'environnement sur une application, il est recommand

scalingo --app ecobalyse env-set "MY_VAR=$(cat fichier.key)"

### Lien avec ecobalyse-private
### Fichiers d’impacts détaillés

Les fichiers d’impacts détaillés sont chiffrés à l’aide de [transcrypt](https://github.com/elasticdog/transcrypt) sur le dépôt public Github. En revanche, la version locale est une version décryptée par `transcrypt`. Vous pouvez donc utiliser, localement, les commandes git habituelles pour voir les différences dans ces fichiers, par exemple :

git diff master HEAD public/data/textile/processes_impacts.json

Lorsqu'un déploiement est effectué sur une branche, les données utilisées du dépôt `ecobalyse-private` sont celles de la branche `main`. Cependant, si la description de la Pull Request sur le repo `ecobalyse` mentionne `ecobalyse_data: branch-a` avec branch-a étant une branche du dépôt `ecobalyse-private`, alors la PR utilisera les données de la branche `branch-a` du dépôt `ecobalyse-private`.

#### Points d'attention

Expand Down
12 changes: 2 additions & 10 deletions bin/build-db
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,13 @@
*/
require("dotenv").config();
const fs = require("fs");
const lib = require("../lib");
const { dataFiles } = require("../lib");

// Env vars
const { ECOBALYSE_DATA_DIR, NODE_ENV } = process.env;
const { NODE_ENV } = process.env;

console.log(`Building database for the ${NODE_ENV} env…`);

let dataFiles;
try {
dataFiles = lib.getDataFiles(ECOBALYSE_DATA_DIR);
} catch (err) {
console.error(`🚨 ERROR: ${err.message}`);
process.exit(1);
}

function parseAndValidate(path, idKeyName = "id") {
const raw = JSON.parse(fs.readFileSync(path).toString());
if (idKeyName && Array.isArray(raw)) {
Expand Down
30 changes: 20 additions & 10 deletions bin/build-specific-app-version.sh
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,7 @@ git clone $ECOBALYSE_GIT_REPO $PUBLIC_GIT_CLONE_DIR

cd $PUBLIC_GIT_CLONE_DIR

if git rev-parse "$COMMIT_OR_TAG" >/dev/null 2>&1; then
# Tag exists
# Use custom error handler to avoid set -eo to be triggred before displaying the error message
git checkout tags/$COMMIT_OR_TAG || error_handler $ERR_INVALID_COMMIT
TAG=$COMMIT_OR_TAG
else
# Tag doesn't exist
git checkout $COMMIT_OR_TAG || error_handler $ERR_INVALID_COMMIT
fi
git checkout $COMMIT_OR_TAG || error_handler $ERR_INVALID_COMMIT


# Check if detailed impacts are present in the directory, if not an ECOBALYSE_DATA_DIR env variable need to be set
Expand Down Expand Up @@ -141,6 +133,18 @@ if [[ ! -f "$TEXTILE_DETAILED_IMPACTS_FILE" ]]; then
cp $DATA_DIR_GIT_CLONE_DIR/data/food/processes_impacts.json $PUBLIC_GIT_CLONE_DIR/public/data/food/processes_impacts.json

export ECOBALYSE_DATA_DIR=$DATA_DIR_GIT_CLONE_DIR
else
if [ -z "$TRANSCRYPT_KEY" ]; then

echo ""
echo "🚨 This version of the application requires a TRANSCRYPT_KEY environment var to be set to be able to decrypt the detailed impacts."
echo ""
exit

fi

transcrypt -y -c aes-256-cbc -p "$TRANSCRYPT_KEY"

fi

ELM_VERSION_FILE=$PUBLIC_GIT_CLONE_DIR"/src/Request/Version.elm"
Expand All @@ -155,6 +159,7 @@ $ROOT_DIR/bin/patch_files_for_versions_compat.py version-selector $ROOT_DIR/pack

cd $PUBLIC_GIT_CLONE_DIR


# Installing node stuff
# We need to specify dev as the env to avoid errors with needed dev packages at build time like
# old husky prerequesite
Expand Down Expand Up @@ -197,11 +202,16 @@ mkdir -p $VERSION_DIR

npm run encrypt $PUBLIC_GIT_CLONE_DIR/public/data/textile/processes_impacts.json $PUBLIC_GIT_CLONE_DIR/dist/processes_impacts_textile.json.enc
npm run encrypt $PUBLIC_GIT_CLONE_DIR/public/data/food/processes_impacts.json $PUBLIC_GIT_CLONE_DIR/dist/processes_impacts_food.json.enc
npm run encrypt $PUBLIC_GIT_CLONE_DIR/public/data/object/processes_impacts.json $PUBLIC_GIT_CLONE_DIR/dist/processes_impacts_object.json.enc

# Objects are not present in old versions
if [[ -f "$PUBLIC_GIT_CLONE_DIR/public/data/object/processes_impacts.json" ]]; then
npm run encrypt $PUBLIC_GIT_CLONE_DIR/public/data/object/processes_impacts.json $PUBLIC_GIT_CLONE_DIR/dist/processes_impacts_object.json.enc
fi
vjousse marked this conversation as resolved.
Show resolved Hide resolved

# Never ship detailed impacts
rm -f -- $PUBLIC_GIT_CLONE_DIR/data/textile/processes_impacts.json
rm -f -- $PUBLIC_GIT_CLONE_DIR/data/food/processes_impacts.json
rm -f -- $PUBLIC_GIT_CLONE_DIR/data/object/processes_impacts.json

mv $PUBLIC_GIT_CLONE_DIR/server-app.js $PUBLIC_GIT_CLONE_DIR/dist
mv $PUBLIC_GIT_CLONE_DIR/openapi.yaml $PUBLIC_GIT_CLONE_DIR/dist
Expand Down
36 changes: 0 additions & 36 deletions bin/checkout-ecobalyse-private-branch.sh

This file was deleted.

31 changes: 0 additions & 31 deletions bin/extract_data_branch_from_pr.py

This file was deleted.

Loading
Loading