Architecture Decision Record

Active theme: Light

← Exemples d’enregistrements de décision

Configuration par variables d’environnement

Sommaire :

Résumé

Question

Nous voulons que nos applications soient configurables au-delà des artefacts, des binaires et du code source, de sorte qu’un même build puisse se comporter différemment selon son environnement de déploiement.

  • Pour y parvenir, nous voulons utiliser la configuration par variables d’environnement.

  • Nous voulons gérer la configuration à l’aide de fichiers que nous pouvons placer sous contrôle de version.

  • Nous voulons offrir un certain confort d’ergonomie au développeur, par exemple savoir ce qui peut être configuré et quelles sont les valeurs par défaut pertinentes.

Décision

Choix de fichiers .env avec un fichier de valeurs par défaut et un fichier de schéma associés.

État

Décidé. Ouverts à l’examen de nouvelles capacités au fur et à mesure qu’elles apparaissent.

Détails

Hypothèses

Nous privilégions la séparation du code applicatif et du code d’environnement. Nous supposons que l’application doit fonctionner différemment selon les environnements, comme un environnement de développement, un environnement de test, un environnement de démonstration, un environnement de production, etc.

Nous privilégions la pratique du secteur dite « application à 12 facteurs » (12 factor app) et plus encore la pratique connexe de l’« application à 15 facteurs » (15 factor app).

Beaucoup de nos projets précédents ont utilisé la convention d’un fichier .env ou d’un répertoire .env similaire. Il est courant de les garder hors du contrôle de version et d’utiliser une autre méthode pour les déployer, les versionner et les gérer.

Contraintes

Nous voulons garder les secrets hors de notre système de contrôle de version (VCS) de gestion du code source (SCM).

Nous voulons viser la compatibilité avec les frameworks et bibliothèques logiciels populaires. Par exemple, Node dispose d’un module « dotenv » pour lire la configuration par variables d’environnement.

Positions

Nous avons envisagé quelques approches :

  • Stocker la configuration dans l’application, par exemple dans un fichier config.js.

  • Stocker la configuration dans l’environnement, par exemple dans un fichier .env.

  • Récupérer la configuration depuis un emplacement connu, comme un serveur de licences.

Argument

Nous avons retenu l’approche d’un fichier .env parce que :

  • Elle est populaire, y compris chez les experts.

  • Elle suit le patron des fichiers .env, que nos équipes ont utilisé avec succès de nombreuses fois sur de nombreux projets.

  • Elle est simple. Notamment, nous nous accommodons pour l’instant des compromis importants que nous voyons, comme l’absence de capacités d’audit par rapport à une approche de serveur de licences.

Implications

Nous devons trouver un moyen de séparer la configuration par variables d’environnement qui est publique de toute gestion de secrets.

Connexe

Décisions connexes

Nous nous attendons à ce que toutes nos applications utilisent cette approche.

Nous prévoirons de mettre à niveau toutes nos applications qui utilisent une approche moins capable, comme le codage en dur dans un binaire ou dans le code source.

Nous conserverons en l’état toutes nos applications qui utilisent une approche plus capable, comme un serveur de licences.

Exigences connexes

Nous ajouterons des capacités devops pour les fichiers, y compris des hooks, des tests et de l’intégration continue.

Nous devons former tous les coéquipiers développeurs à cette décision.

Artefacts connexes

Chaque zone où nous déployons aura besoin de son propre fichier .env et de fichiers associés.

Principes connexes

Facilement réversible.

Notes

Exemple de fichier .env :

NAME=Alice Anderson
EMAIL=alice@example.com

Exemple de fichier .env.defaults :

NAME=Joe Doe
EMAIL=joe@example.com

Exemple de fichier .env.schema avec seulement les clés :

NAME
EMAIL