Gérer ses secrets dans des variables d’environnement

Vous vous demandez sans doute pourquoi un article sur ce sujet alors qu’on trouve plein de documentation sur le sujet sur le web. Eh bien parce que j’ai un tout petit peu galéré pour savoir où il fallait mettre ces satanées variables d’environnement pour que tout fonctionne bien.

J’ai 3 environnements :
– Environnement de développement, sur un PC sous Linux, j’utilise le serveur django de base et sqlite comme base de donnée.
– Environnement de pré-production et de production, sur un serveur avec Apache comme serveur d’applications et PostgreSQL en serveur de base de données.

Pour l’environnement de développement, les variables d’environnement sont à mettre dans le /etc/environment, pour être utilisées par le compte qui fait le développement. Ce n’est donc pas sorcier.

Pour les environnements de pré-production et de production, il y a une petite subtilité. Il faut mettre vos variables à la fois dans /etc/envvars pour que apache puisse les utiliser, et aussi dans /etc/environment pour que l’utilisateur qui exécute les commandes python puisse aussi les utiliser. Je pense notamment aux commandes du type « python manage.py makemigrations » ou « python manage.py migrate » bien utiles pour mettre à jour votre base de donnée lors des évolutions.

Le /etc/environment ressemble à ça :

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:"
MYSECRETKEY="whatever your secret key is for django"
PREPRODDBUSER="name_of_your_db_preprod_user"
PREPRODPW="password_of_your_db_preprod_user"
PRODDBUSER="name_of_your_db_prod_user"
PRODPW="password_of_your_db_prod_user"

Le /etc/apache2/envvars ressemble à ceci :

#Django env vars
export MYSECRETKEY="whatever your secret key is for django"
export PREPRODDBUSER="name_of_your_db_preprod_user"
export PREPRODPW="password_of_your_db_preprod_user"
export PRODDBUSER="name_of_your_db_prod_user"
export PRODPW="password_of_your_db_prod_user"

Ensuite, vous pourrez utiliser vos variables d’environnement en ayant importé le module os en début de fichier settings, puis comme suit :

if ENV == 'dev':
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }
elif ENV == 'preprod':
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'preprod_db',
            'USER': os.environ['PREPRODDBUSER'],
            'PASSWORD': os.environ['PREPRODPW'],
            'HOST': 'localhost',
            'PORT': '5432',
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'prod_db',
            'USER': os.environ['PRODDBUSER'],
            'PASSWORD': os.environ['PRODPW'],
            'HOST': 'localhost',
            'PORT': '5432',
        }
    }

Pour comprendre comment on récupère la variable ENV qui permet de faire le test, voir l’article précédent qui parle de la gestion des environnements de développement, pré-production et production.

Enjoy !