Skip to content
Environnement docker pour le projet Pass Culture
Branch: master
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.circleci (PC-2040) Fix deploy config Jun 17, 2019
api @ 9b94de1 remove ftp mirrors volume from docker-compose.yml Jun 18, 2019
artillery (PC-1932) code review Jun 5, 2019
config/run_envs
doc @ 3a85f21 (PC-1932) Add ansible script to install perf server Jun 5, 2019
dockerfiles (pC-1709) internalize start sh May 28, 2019
hooks remove test config Nov 9, 2018
pro @ 3ac7e07 remove ftp mirrors volume from docker-compose.yml Jun 18, 2019
pro-packed-staging @ 95aa9c0 changed submodules to have pro May 2, 2018
scripts (PC-1722) Add proper check deployed version after deploy May 16, 2019
shared @ acfa4ea (pc-1709) used context May 28, 2019
tests Fix tests pc May 23, 2019
webapp @ 235d610 remove ftp mirrors volume from docker-compose.yml Jun 18, 2019
webapp-packed-staging @ 86f8dce updated submodules Jul 11, 2018
.gitignore (PC-1932) Add ansible script to install perf server Jun 5, 2019
.gitmodules added submodule shared Jul 10, 2018
README.md (PC-1846) add pro users for PRO May 24, 2019
anonymize.sql (PC-1882) deactivate audit trigger when anonymizing table Jun 4, 2019
anonymize_database.sh (PC-1686) Use ROOT_PATH to get anonymize sql script Mar 28, 2019
contributing.md [TECH] Updating contributing.md Jun 6, 2019
development_env_file env_file → development_env_file May 17, 2018
docker-compose.yml remove ftp mirrors volume from docker-compose.yml Jun 18, 2019
env_file Adapt docker env vars to scalingo changes Jul 9, 2018
install.sh Pass ENV to Flask Mar 27, 2018
install_lib_ci.sh freeze chrome version 74 for testcafe Jun 11, 2019
pc add container_name within docker-compose and refactor pc commands Jun 17, 2019
production_env_file added env_env_file May 15, 2018
staging_env_file added env_env_file May 15, 2018

README.md

pass-culture-main

C'est tout le framework du Pass Culture!

Minimal Process

Install

Il vous faudra une machine UNIX.

Installer:

Mais spécialement, en plus pour macosx:

  • brew install coreutils

Enfin pour tout le monde:

pc install

Le script pc sera automatiquement lié dans votre dossier /usr/local/bin

Init

Pour verifier les tests:

pc test-backend

Pour avoir une database de jeu:

pc sandbox -n industrial

Démarrage

Pour lancer l'API:

pc start-backend

Pour lancer l'appli Web:

pc start-webapp

Pour lancer le portail pro:

pc start-pro

Développeurs.ses

Rebuild

Pour reconstruire l'image docker sans cache

pc rebuild-backend

Restart

Pour effacer la base de données complétement, et relancer tous les containers:

pc restart-backend

Reset

Si vos serveurs de dev tournent, et que vous souhaitez juste effacer les tables de la db:

pc reset-sandbox-db

Si vous voulez juste enlever les recommandations et bookings crées en dev par votre navigation:

pc reset-reco-db

Migrate

Vous pouvez passer toutes les cli classiques d'alembic comme ceci:

pc alembic upgrade

Test

Pour tester les apis du backend:

pc test-backend

Pour tester les apis du frontend:

pc test-frontend

Pour tester la navigation du site web

pc -e production test-cafe-webapp -b firefox

Exemple d'une commande test en dev sur chrome pour un fichier test particulier:

pc test-cafe-pro -b chrome:headless -f signup.js

Restore DB

Pour restorer un fichier de dump postgresql (file.pgdump) en local:

pc restore-db file.pgdump

Pour anonymiser les données après restauration, et changer le mot de passe pour tout les users :

./anonymize_database.sh -p PASSWORD

Database de jeu

Afin de naviguer/tester différentes situations de données, il existe dans api des scripts permettant d'engendrer des bases de données "sandbox".

La plus conséquente est l'industrial, elle se crée via la commande:

pc sandbox -n industrial

Cette commande faite, il y a alors deux moyens pour avoir les email/mots de passe des utilisateurs sandbox :

  • on peut utiliser la commande sandbox_to_testcafe qui résume les objets utilisés de la sandbox dans les différents testcafés. Si on veut avoir tous les utilisateurs des tests pro_07_offer dans l'application pro, il faut faire:
  pc sandbox_to_testcafe -n pro_07_offer
  • on peut utiliser un curl (ou postman) qui ping directement le server à l'url du getter que l'on souhaite:
curl -H "Content-Type: application/json" \
     -H "Origin: http://localhost:3000" \
     GET http://localhost:80/sandboxes/pro_07_offer/get_existing_pro_validated_user_with_validated_offerer_validated_user_offerer_with_physical_venue

Il est important que votre server api local tourne.

Pour les développeur.ses, quand vous écrivez un testcafé, il faut donc la plupart du temps écrire aussi un getter côté api dans sandboxes/scripts/getters/<moduleNameAvecleMêmeNomQueLeFichierTestcafe>, afin de récupérer les objets souhaités dans la sandbox.

Si vous voulez avoir un aperçu global de l'application webapp, vous pouvez tout de même vous connecter avec cet user toujours présent:

email: pctest.jeune93.has-booked-some@btmx.fr
password: pctest0.Jeune93.has-booked-some

Pour l'application PRO, vous pouvez naviguer en tant qu'admin avec:

email: pctest.admin93.0@btmx.fr
password: pctest0.Admin93.0

Ou en tant qu'user avec :

email: pctest.pro93.0@btmx.fr
password: pctest.pro93.0

(Ces deux utilisateurs existent également pour le 97, pour les utiliser, il suffit de remplacer 93 par 97)

Tagging des versions

La politique de tagging de versions est la suivante :

  • on n'utilise pas de semantic versioning
  • on utilise le format I.P.S
    • I => incrément d'Itération
    • P => incrément de fix en Production
    • S => incrément de fix en Staging

Exemple

  • Je livre une nouvelle version en staging en fin d'itération n°20 => 20.0.0
  • Je m'aperçois qu'il y a un bug en staging => 20.0.1
  • Le bug est corrigé, je livre en production => 20.0.1
  • On détecte un bug en production, je livre en staging => 20.1.0
  • Tout se passe bien en staging, je livre en production => 20.1.0
  • On détecte un autre bug en production, je livre en staging => 20.2.0
  • Je m'aperçois que mon fix est lui-même buggé, je relivre un fix en staging => 20.2.1
  • Mes deux fix sont cette fois OK, je livre en production => 20.2.1

Deploy

FRONTEND WEB

Pour déployer une nouvelle version web, par exemple en staging: (Attention de ne pas déployer sur la production sans concertation !)

pc -t I.P.S tag-version-webapp
pc -e staging -t I.P.S deploy-frontend-webapp

Et pour pro sur staging, il suffit de remplacer la dernière commande par celle-ci :

pc -t I.P.S tag-version-pro
pc -e staging -t I.P.S deploy-frontend-pro

Pour déployer en production ensuite :

pc -e production -t I.P.S deploy-frontend-webapp

Publier shared sur npm

Pour publier une version de pass-culture-shared sur npm

cd shared
npm adduser
yarn version
yarn install
npm publish

Puis sur webapp et/ou pro, mettre à jour la version de pass-culture-shared dans le fichier package.json :

yarn add pass-culture-shared@x.x.x
git add package.json yarn.lock

avec x.x.x nouvelle version déployée sur shared.

BACKEND

Pour déployer une nouvelle version de l'API, par exemple en staging: (Attention de ne pas déployer sur la prod sans autorisation !)

pc -t I.P.S tag-version-backend
pc -e staging -t I.P.S deploy-backend

Avec vI.P.S, le tag de la version à déployer. Ensuite pour mettre en production le tag qui a été déployé sur l'environnement staging :

pc -e production -t I.P.S deploy-backend

Administration

Connexion à la base postgreSQL d'un environnement

Par exemple, pour l'environnement staging :

pc -e staging psql

Connexion à en ligne de commande python à un environnement

Par exemple, pour l'environnement staging :

pc -e staging python

Il est également possible d'uploader un fichier dans l'environnement temporaire grâce à la commande suivante :

pc -e staging -f myfile.extension python

L'option -f est également disponible pour la commande bash :

pc -e staging -f myfile.extension bash

Gestion des objects storage OVH

Pour toutes les commandes suivantes, vous devez disposer des secrets de connexion.

Pour lister le contenu d'un conteneur sépcific :

pc list_content --container=storage-pc-staging

Pour savoir si une image existe au sein d'un conteneur :

pc does_file_exist --container=storage-pc-staging --file="thumbs/venues/SM"

Pour supprimer une image au sein d'un conteneur :

pc delete_file --container=storage-pc-staging --file="thumbs/venues/SM"

Pour faire un backup de tous les fichiers du conteneur de production vers un dossier local :

pc backup_prod_object_storage --container=storage-pc --folder="~/backup-images-prod"

Pour copier tous les fichiers du conteneur de production vers le conteneur d'un autre environnement :

pc copy_prod_container_content_to_dest_container --container=storage-pc-staging

Gestion OVH

CREDENTIALS

Vérifier déjà que l'un des admins (comme @arnoo) a enregistré votre adresse ip FIXE (comment savoir son adress ip? http://www.whatsmyip.org/)

Se connecter à la machine OVH

pc -e production ssh

Dump Prod To Staging

ssh to the prod server

cd ~/pass-culture-main && pc dump-prod-db-to-staging

Then connect to the staging server:

cd ~/pass-culture-main
cat "../dumps_prod/2018_<TBD>_<TBD>.pgdump" docker exec -i docker ps | grep postgres | cut -d" " -f 1 pg_restore -d pass_culture -U pass_culture -c -vvvv
pc update-db
pc sandbox --name=webapp

Updater le dossier private

Renseigner la variable d'environnement PC_GPG_PRIVATE. Puis lancer la commande suivante :

pc install-private

Updater la db

Une fois connecté:

cd /home/deploy/pass-culture-main/ && pc update-db

Note pour une premiere configuration HTTPS (pour un premier build)

Pour obtenir un certificat et le mettre dans le nginx (remplacer par le domaine souhaité, qui doit pointer vers la machine hébergeant les docker)

docker run -it --rm -v ~/pass-culture-main/certs:/etc/letsencrypt -v ~/pass-culture-main/certs-data:/data/letsencrypt deliverous/certbot certonly --verbose --webroot --webroot-path=/data/letsencrypt -d <domaine>

Puis mettre dans le crontab pour le renouvellement :

docker run -it --rm -v ~/pass-culture-main/certs:/etc/letsencrypt -v ~/pass-culture-main/certs-data:/data/letsencrypt deliverous/certbot renew --verbose --webroot --webroot-path=/data/letsencrypt

Version mobile (outdated, but can be useful someday)

Emuler avec Cordova

yarn global add cordova-cli
cd webapp && cordova run ios

Développer en Android

Vous pouvez utiliser une ptite config ngrok pour l'api et la webapp par exemple:

cd webapp/ && yarn run ngrok

Ensuite il faut lancer l'application configurée avec ces tunnels:

pc start-browser-webapp -t

Vous pourrez alors utiliser l'url ngrok webapp pour dans votre navigateur android.

Déployer le FRONTEND MOBILE

Pour déployer une nouvelle version phonegap (par default c'est en staging)

pc build-pg

Lancer les tests de performance

Environnement

Les tests requièrent d'avoir un environnement spécifique sur Scalingo, ici pass-culture-dev-perf, comportant notamment une base utilisateur. Pour la remplir, il faut jouer les sandboxes industrial et activation.

Execution des sandboxes sur le conteneur :

scalingo -a pass-culture-dev-perf run 'PYTHONPATH=. python scripts/pc.py sandbox -n industrial'
scalingo -a pass-culture-dev-perf run 'PYTHONPATH=. python scripts/pc.py sandbox -n activation'

Ensuite, lancer le script d'import des utilisateurs avec une liste d'utilisateurs en csv prédéfinie placée dans le dossier artillery sous le nom user_list. On passe en paramètre un faux email qui ne sera pas utilisé.

scalingo -a pass-culture-dev-perf run 'ACTIVATION_USER_RECIPIENTS=<email> python scalingo/import_users.py user_list' -f user_list

Un exemple de csv utilisateur user_list :

1709,Patricia,Chadwick,ac@enimo.com,0155819967,Drancy (93),16282,2001-05-17,secure_password

Lancement d'un scénario

Pour lancer les tests de performance il faut installer le logiciel artillery : npm install -g artillery et son plugin metrics-by-endpoint : npm install artillery-plugin-statsd, puis se munir du fichier csv contenant les users valides.

Puis se placer dans le dossier artillery et lancer la commande :

artillery run scenario.yml -o reports/report-$(date -u +"%Y-%m-%dT%H:%M:%SZ").json

Un rapport des tests daté sera généré dans le sous-dossier reports (qui doit être crée).

You can’t perform that action at this time.