Open akarzim opened 2 years ago
Je suis carrément chaud pour séparer les différentes configs dans des fichiers YAML séparés (et là où c'est pertinent mettre la conf dans Rails.application.x.config.*).
On pourrait même commencer par un branding.yml
, qui contiendrait les éléments de branding non-localisables (nom de l'app, du logo, etc)
Pour moi c'est oui pour un branding.yml
chargé via config_for
.
Je serai aussi pour dans le futur ne plus avoir de globales et ne plus avoir d'accès au ENV dans le code de l'app. Mais j'ai l'impression que je suis assez seul là-dessus.
Je serai aussi pour dans le futur ne plus avoir de globales et ne plus avoir d'accès au ENV dans le code de l'app. Mais j'ai l'impression que je suis assez seul là-dessus.
@tchak je te soutiens à 100% sur cette approche !
Je suis en train de penser à un système comme ce que fait Mattermost :
# config.yml
ds:
app_host: "ds.example.org"
matomo:
enabled: "false"
url: "https://matomo.example.org"
sentry:
enabled: "false"
client_id: "00000000"
# etc…
# branding.yml
ds:
app_name: "demarches-simplifiees.fr"
contact_email: "contact@example.org"
# etc…
DS_
overrident la config au runtime :
DS_MATOMO_URL="https://stats.data.gouv.fr"
DS_SENTRY_ENABLED="true"
DS_SENTRY_CLIENT_ID="33625537"
Rails.config.x.sentry.enabled
(mais plus aux variables d'env directement)if
s dans la configurationVous en pensez quoi ?
Ça m'a l'air prometteur !
Si je comprends bien, pour que la surcharge puisse se faire de manière transparente, les YAML ressembleraient plutôt à ceci :
# branding.yml
ds:
app_name: "<%= ENV.fetch('DS_APP_NAME', 'demarches-simplifiees.fr') %>"
contact_email: "<%= ENV.fetch('DS_CONTACT_EMAIL', 'contact@example.org') %>"
# etc…
Concernant la configuration, il est tout à fait possible de mettre des conditions et de surcharger Rails.config.x.*
au besoin, je ne vois pas de point de blocage de ce côté là. Tu as un exemple en tête ?
Non, l'idée ça serait d'overrider les variables automatiquement.
Un truc du genre :
# config/initializers/read_env.rb
# For each env var that begins by `DS_`, override the matching setting in Rails.application.config.x.*
ENV.filter { |name, _| name.has_prefix?('DS_') }.each do |name, value|
Rails.application.config.set('x.' + name.lowercase) = value
end
(En vrai il faudrait plutôt faire dans le sens inverse : énumérer les clefs de la config, et ensuite voir s'il y a une variable d'env correspondante. Mais c'est l'idée.)
Ah oui, c'est une approche un peu plus « méta » mais ça marche aussi, je vois l'idée.
Ce qui serait parfait, en peaufinant cette approche, ce serait de pouvoir gérer proprement :
enabled
/disabled
)["amazon", "local", "openstack"]
)Par exemple, ici la variable d'env vaut enabled
mais la clé de configuration est bien un booléen :
config.x.france_connect.enabled = ENV.fetch("DS_FRANCE_CONNECT_ENABLED", "enabled") == "enabled"
Il faudrait ainsi pouvoir être en mesure de lever une exception si une variable d'environnement prend une valeur inattendue. Une piste pourrait être de se tourner vers l'une des gems dry-rb, comme dry-types par exemple, pour décrire les clés et valeurs acceptées, et faire de la coercition quand nécessaire.
Résumé
mots-clés : convention, env, rails, variable
tickets liés : #6935, #6936
Actuellement
Voici l'usage qui en est fait actuellement :
config/env.example
ou, si elle est optionnelle, dansconfig/env.example.optional
;Constats
Comportement attendu
Rails nous met à disposition un ensemble d'outils pour répondre aux besoins de configuration de l'application. Cela passe notamment par :
config.x
pour gérer les configuration imbriquées (ex:config.x.sentry.enabled
)config_for
pour charger un fichier de configuration YAMLcredentials.yml.enc
Proposition
Adopter les conventions de Rails pour configurer l'application DS apporterait plusieurs avantages : Rails serait responsable du bon chargement de la configuration de l'application (plus besoin d'ordonner les initializers) ; et nous pourrions, au sein d'un même fichier YAML, embrasser d'un seul regard la configuration d'une brique applicative pour l'ensemble des environnements Rails (ex: un fichier
sentry.yml
avec la configuration de Sentry dont les valeurs par défaut pourraient différer d'un environnement à l'autre). Un exemple de ce à quoi cela ressemblerait peut être observé sur le commit 74c31f2ebd4fb321c943ae0bdad5eacdd71aa59f traitant de la configuration de FranceConnect.Cela reste un gros chantier, sur lequel il faudra évidemment se coordonner si on l'entreprend, mais apporterait beaucoup à la stabilité de l'application et faciliterait la paramétrabilité by design de l'applicaiton.
Note 1 : Au sujet du chiffrement des secrets, voir le ticket #6936.
Note 2 : Au sujet des variables d'environnement qui tiennent davantage de l’internationalisation, voir le ticket #6935.
voir : PR à venir / @adullact & @synbioz
trackingAdullactContrib