Description des fichiers application.ini et de leur utilisation

Edit me

Introduction

Cet article vise à préciser les bonnes pratiques concernant l’utilisation du fichier application.ini pour la configuration des applications Voozanoo 4.

Généralités

Le format .ini ---- - Les fichiers INI sont des fichiers texte : ils peuvent être manipulés avec un logiciel courant de type éditeur de texte. - Les fichiers sont divisés en **sections**. Chaque section comporte un certain nombre de paramètres de configuration. - Chaque section commence par un titre placé entre crochets « [ » et « ] ». - La valeur de chaque paramètre de configuration est indiquée par une formule : **paramètre = valeur**. - Les fichiers peuvent contenir des commentaires. Les commentaires sont souvent utilisés pour décrire les paramètres et les valeurs à introduire. Ils sont généralement précédés d'un **point-virgule**. ----

L’application.ini sur GitHub

Sur GitHub, on trouve l’application.ini ici :

 [mon-application]/configs/application.ini

Ce fichier est versionné et ne doit pas contenir (par exemple) le mot de passe pour la base de données. Cette entrée (resources.db.params.password) est réécrite sur les serveurs (voir plus loin).

Les sections

Voici un exemple d’utilisation des sections :

[production]
resources.db.adapter = "PDO_MYSQL"
resources.db.params.date_format = "YYYY-MM-ddTHH:mm:ss"
resources.db.isDefaultTableAdapter = true
resources.db.params.host = "probdd-crypted"
resources.db.params.username = "respedecl"
resources.db.params.password = ""
resources.db.params.dbname = "respedecl"
; To avoid misunderstanding when retrieving text or varchar fields from DB encoded in UTF8
resources.db.params.charset = "UTF8"

; Base url from the DocumentRoot to the public directory of the application
; Ex : "/apps/my_project/public/"
voozanoo.protocole = "https"
voozanoo.baseurl = "/"
voozanoo.host = "respe-decl.voozanoo.net"

; ===================
; [ ici d'autres lignes que je ne reprends pas pour gagner de la place ]
; ===================

[dev_rhe : development]
duplicates.limit = 10

resources.frontController.displayExceptions = true

voozanoo.baseurl = "/respedecl/"
voozanoo.host = "localhost"

voozanoo.upload.directory = "/home/rodrigue/workspace/workdata/respe/storage"
voozanoo.upload.chunk.directory = "/home/rodrigue/workspace/workdata/respe/chunk"

dir.temp = "/tmp"

resources.db.params.dbname  = "respedecl"
resources.db.params.password = "root"

Ici, on voit deux sections :

  • [production] qui s’appliquera sur l’environnement de production
  • [dev_rhe : development] qui s’appliquera sur le poste du développeur RHE uniquement

Un principe d’héritage fait que les propriétés écrites dans le sections les plus haute s’applique sur tous les environnements mais peuvent être réécrites dans les sections plus basses.

Écrasement des propriétés sur les serveurs

Sur les serveurs, dans le dossier /space/www/configuration/voozanoo4/configuration/, sont stockés les fichiers .ini des application. Pour chaque application, il y a plusieurs fichiers de configuration :

  • un fichier [mon-appli].ini, créé à la première installation du paquet
  • un ou plus fichier(s) [mon-appli]_[numéro version].ini, livré(s) avec l’application

Lorsqu’une application est mise à jour, le application.ini de la version mise à jour est surchargé par le contenu du fichier [mon-appli].ini. Par exemple, si les lignes suivantes sont présentes dans le fichier [mon-appli].ini, les valeurs correspondants dans [mon-appli]_[numéro version].ini seront remplacées :

db.params.host     = localhost
db.params.dbname   = [nom-base]
db.params.username = [username]
db.params.password = [password]

Attention : ces 4 lignes sont aussi une exception, car elles ont une syntaxe différente des application.ini classiques. Ces 4 lignes iront remplacer les propriétés suivantes du fichier [mon-appli]_[numéro version].ini :

  • resources.db.params.host
  • resources.db.params.username
  • resources.db.params.password
  • resources.db.params.dbname

Cas pratique d’utilisation

Cas 1 : Docker n’est pas utilisé

application.ini sur GitHub

Une bonne méthode consiste à mettre dans le application.ini commité sur GitHub le paramétrage commun entre la preprod et la production. Par exemple, la configuration du protocole (https), le baseurl, le host, le dossier temporaire etc.

Les différentes sections du application.ini sont présentes dans cette configuration ([staging], [production], et sections des développeurs)

application.ini sur le poste d’un développeur

Le application.ini livré avec l’application n’a pas besoin d’être changé si le développeur possède sa section dans la configuration. Il suffit alors de paramétrer l’environnement pour utiliser la section correspondante (par exemple, APPLICATION_ENV = “dev_mzz”)

.ini sur les serveurs

Dans le fichier [mon-appli].ini, on voudra par exemple mettre la configuration de la base de données, la configuration des logs (le chemin étant différent pour la production et la pré-production), la configuration des urls de mailmerge, du hub et du module de stats etc.

Exemple:

db.params.host     = localhost
db.params.dbname   = [nom-base]
db.params.username = [username]
db.params.password = [password]

voozanoo.log.enable = TRUE
voozanoo.log.conf.timestampFormat = 'Y-m-d H:i:s'
voozanoo.log.conf.stream.writerName = "Stream"
voozanoo.log.conf.stream.writerParams.stream = "/space/log/[mon-appli].preprod.voozanoo.net/php/voozanoo.log"
voozanoo.log.conf.stream.writerParams.mode = "a"

mailmerge.url      = "https://mailmerge.preprod.voozanoo.net"
mailmerge.login    = [login]
mailmerge.password = [password]

Cas 2 : Docker est utilisé

Actuellement

La recommandation pour le moment est gérer le application.ini de la même manière que dans le cas 1.

Lorsqu’un conteneur d’une application voozanoo4 est créé, un template d’application.ini est copié dans le conteneur Docker dans /var/www/app/config/application.ini (ce template se trouve dans le dossier docker/build/ du projet par convention). Le script entrypoint de la stack Docker remplace des variables pour configurer automatiquement la base de donnés et les autres paramètres propres à l’environnement Docker

Pour modifier la configuration d’une stack de développeur sous Docker, il faut donc modifier le fichier /var/www/app/configs/application.ini directement dans le conteneur Docker.


Attention, il ne faut pas monter le dossier /var/www/app/configs/ en volume, sinon vous modifierez en même temps le application.ini versionné dans GitHub. Vous risquez ensuite de le commiter par erreur, et de versionner des configuration comme “conteneur-mysql” pour la base de données.


À l’avenir

Nous allons changer de mode de fonctionnement prochainement pour utiliser un seul et unique application.ini. Il s’agira de celui qui est dans le dossier configs/ de l’application. Nous mettrons une section [Docker] qui sera écrasée à la création du conteneur, pour adapter la configuration à l’environnement Docker.

Exemple complet de fichier application.ini

Voici un exemple de fichier application.ini contenant déjà les directives importantes pour une application appelée mon-appli.

Ne pas oublier de l’adapter (nom de l’application, clef de salage, etc.).

[production]

resources.db.adapter = "PDO_MYSQL"
resources.db.params.date_format = "YYYY-MM-ddTHH:mm:ss"
resources.db.isDefaultTableAdapter = true
resources.db.params.host = "probdd-crypted"
resources.db.params.username = "[mon-appli]"
resources.db.params.password = ""
resources.db.params.dbname = "[mon-appli]"
; To avoid misunderstanding when retrieving text or varchar fields from DB encoded in UTF8
resources.db.params.charset = "UTF8"

; Base url from the DocumentRoot to the public directory of the application
; Ex : "/apps/my_project/public/"
voozanoo.protocole = "https"
voozanoo.baseurl = "/"
voozanoo.host = "[mon-appli].voozanoo.net"

; Absolute path where to store temporary files
dir.temp = "/space/applistmp/[mon-appli]/"

; Absolute path where to store chunks during Large File upload
; Optionnal if you don't use the Y.LargeFileUploader component
voozanoo.upload.chunk.directory = "/space/applisdata/[mon-appli]/chunk"

; Absolute path where files will be indefinitely stored (like a storage)
voozanoo.upload.directory = "/space/applisdata/[mon-appli]/storage"

; If application own custom widgets (for ALL projects
lib.voozanoo.javascript.extended_yui_conf.default.version = "1.0.0"
lib.voozanoo.javascript.extended_yui_conf.default.jsuri = "javascript/"
lib.voozanoo.javascript.extended_yui_conf.default.resource = APPLICATION_PATH "/resources/xml/default_yui_conf_modules.xml"

; If a project own custom widgets
; Replace |PROJECT_NAME| by the project name wich had custom widgets
; lib.voozanoo.javascript.extended_yui_conf.|PROJECT_NAME|.version = "1.0.0"
; lib.voozanoo.javascript.extended_yui_conf.|PROJECT_NAME|.jsuri = "javascript/"
; lib.voozanoo.javascript.extended_yui_conf.|PROJECT_NAME|.resource = APPLICATION_PATH "/resources/xml/|PROJECT_NAME|_yui_conf_modules.xml"

; Clé de salage utilisée pour les mots de passe des utilisateurs système
voozanoo.saltKey = "clef_de_salage_a_changer"
                               
; Timeout de la session utilisateur en secondes
; Si absent la durée est de 4h (14400s)
voozanoo.session.time_out = 28800
                               
; Mise en cache des formulaires
;resources.cachemanager.account.frontend.name = Core
;resources.cachemanager.account.frontend.customFrontendNaming = false
;resources.cachemanager.account.frontend.options.lifetime = 7200
;resources.cachemanager.account.frontend.options.automatic_serialization = true
; L'utilisation d'APC nécessite l'installation de APCU
;resources.cachemanager.account.backend.name = Apc

; équivalent à un set_include_path( APPLICATION_PATH "/library" . PATH_SEPARATOR . get_include_path() );
includePaths.library = APPLICATION_PATH "/library"
; Notez bien l'underscore final "_", il est ABSOLUMENT necessaire
autoloadernamespaces[] = "Admin_"
autoloadernamespaces[] = "App_"
autoloadernamespaces[] = "Rando_"
autoloadernamespaces[] = "Archive_"

; Utilisation du widgetDateAdvanced pour les champs dates
voozanoo.use_date_advanced = true

;Si cette directive vaut true, les droits de l'utilisateur seront respectés au lancement des tests de cohérence
query.respect_rights = false

; Sert à désactiver la mise à jour des groupes d'une fiche en cas de update de la fiche (https://github.com/Epiconcept-Paris/Voozanoo4/issues/671)
disable.data_group.update = false

; Config pour l'utilisation du module statistiques
modstat.url = 'https://stats.voozanoo.net'
modstat.login = ''
modstat.password = ''

; Config pour l'utilisation de mailmerge
mailmerge.url = 'https://mailmerge.voozanoo.net'
mailmerge.login = ''
mailmerge.password = ''

; Config pour l'utilisation du mobile
hub.url = "https://prohub2.voozanoo.net"
hub.login = ""
hub.password = ""

; Signale que la structure JSON des projets EpiCraft doivent être stockés dans les ressources (nécessaire pour le mobile)
epicraft.store_project_str = true
mobile.[mon-appli].files.build.path = "/space/applisdata/[mon-appli]/storage/epimob/build.js"

voozanoo.resources.path = APPLICATION_PATH "/resources"

voozanoo.oauth.consumers_auto_disconnect = FALSE

voozanoo.log.enable = TRUE
voozanoo.log.conf.timestampFormat = 'Y-m-d H:i:s'
voozanoo.log.conf.stream.writerName = "Stream"
voozanoo.log.conf.stream.writerParams.stream = "/space/log/[mon-appli].voozanoo.net/php/voozanoo.log"
voozanoo.log.conf.stream.writerParams.mode = "a"


[staging : production]

resources.db.params.host = "bdd-preprod-crypted"
resources.db.params.username = "[mon-appli]"
resources.db.params.password = ""
resources.db.params.dbname = "[mon-appli]"

; Application host name
voozanoo.host = "[mon-appli].preprod.voozanoo.net"

resources.frontController.displayExceptions = true
lib.voozanoo.javascript.static = false
lib.yui.debug = true

; Absolute path where to store temporary files
;dir.temp = "/space/applistmp/[PROJECT_NAME]"

; Absolute path where files will be indefinitely sotred (like a storage)
;voozanoo.upload.directory = "/space/applisdata/[PROJECT_NAME]/storage"

; Absolute path where to store chunks during Large File upload
;voozanoo.upload.chunk.directory = "/space/applisdata/[PROJECT_NAME]/chunk"

; Absolute path of resources
voozanoo.resources.path = APPLICATION_PATH "/resources"

; Base url from the DocumentRoot to the public directory of the application
voozanoo.baseurl = "/"

voozanoo.log.conf.stream.writerParams.stream = "/space/log/[mon-appli].preprod.voozanoo.net/php/voozanoo.log"


[development : production]

resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = ""
resources.db.params.dbname = "[mon-appli]"

lib.voozanoo.javascript.static = false
lib.yui.debug = true
  
voozanoo.migration.log.enable = TRUE
voozanoo.migration.log.conf.timestampFormat = 'Y-m-d H:i:s'
voozanoo.migration.log.conf.stream.writerName = "Stream"
voozanoo.migration.log.conf.stream.writerParams.stream = "migration.log"
voozanoo.migration.log.conf.stream.writerParams.mode = "a"


[dev_kgr : development]

resources.frontController.displayExceptions = true

voozanoo.protocole = "http"
voozanoo.host = "192.168.33.37"
voozanoo.baseurl = "/apps/[mon-appli]/public/"
voozanoo.upload.directory = "C:\wamp\www\storage"
voozanoo.upload.chunk.directory = "C:\wamp\www\\tmp"
dir.temp = "C:\wamp\www\storage"

lib.voozanoo.javascript.static = false
lib.yui.debug = true

; Mise en cache des formulaires
;resources.cachemanager.account.frontend.name = Core
;resources.cachemanager.account.frontend.customFrontendNaming = false
;resources.cachemanager.account.frontend.options.lifetime = 7200
;resources.cachemanager.account.frontend.options.automatic_serialization = true
;resources.cachemanager.account.backend.name = File
;resources.cachemanager.account.backend.options.cache_dir = "/tmp"

voozanoo.log.conf.stream.writerParams.stream = "C:\wamp\logs\php_error.log"