Skip to content

Configuration Sync

This content is not available in your language yet.

Le système de Configuration Management (CMI) de Drupal permet d’exporter, versionner et synchroniser la configuration de votre site entre différents environnements.

Sans CMI, la configuration (types de contenu, vues, permissions…) est stockée uniquement en base de données. Cela rend difficile :

  • Le déploiement de changements
  • Le travail en équipe
  • Le retour à une version précédente
  • La reproduction d’un environnement

Drupal exporte la configuration en fichiers YAML stockés dans config/sync/. Ces fichiers peuvent être :

  • ✅ Versionnés avec Git
  • ✅ Partagés entre développeurs
  • ✅ Déployés automatiquement
  • ✅ Comparés (diff) facilement
config/
└── sync/
├── core.extension.yml # Modules et thèmes actifs
├── system.site.yml # Infos du site
├── node.type.product.yml # Type de contenu "product"
├── field.storage.node.field_price.yml
├── field.field.node.product.field_price.yml
├── views.view.products.yml # Vue "products"
├── user.role.editor.yml # Rôle "editor"
└── ...

Exemple system.site.yml :

uuid: 12345678-1234-1234-1234-123456789012
name: TailStore
mail: contact@tailstore.local
slogan: 'Votre boutique en ligne'
page:
403: ''
404: ''
front: /node
admin_compact_mode: false
weight_select_max: 100
default_langcode: fr
Fenêtre de terminal
drush cex -y
# ou
drush config:export -y

Cette commande :

  1. Lit la configuration de la base de données
  2. La convertit en fichiers YAML
  3. L’enregistre dans config/sync/
Fenêtre de terminal
drush cim -y
# ou
drush config:import -y

Cette commande :

  1. Lit les fichiers YAML de config/sync/
  2. Compare avec la configuration en base
  3. Applique les différences
Fenêtre de terminal
# Différences entre fichiers et base de données
drush cst
# ou
drush config:status

Exemple de sortie :

Name State
node.type.product Only in DB
views.view.products Different
system.site Same
ÉtatSignification
Only in DBConfiguration non exportée
Only in syncConfiguration en attente d’import
DifferentModifications non synchronisées
SameSynchronisé
  1. Développer localement

    Faites vos modifications via l’interface Drupal (créer un type de contenu, configurer une vue, etc.)

  2. Exporter

    Fenêtre de terminal
    drush cex -y
  3. Vérifier les changements

    Fenêtre de terminal
    git status
    git diff config/sync/
  4. Commiter

    Fenêtre de terminal
    git add config/sync/
    git commit -m "feat: add product content type"
  5. Pousser

    Fenêtre de terminal
    git push
  6. Sur un autre environnement

    Fenêtre de terminal
    git pull
    drush cim -y
    drush cr
  1. Créer le type de contenu (via l’interface)

    • Aller à /admin/structure/types/add
    • Nom : Article Blog
    • Identifiant machine : blog_article
    • Enregistrer
  2. Ajouter un champ

    • Aller à /admin/structure/types/manage/blog_article/fields
    • Ajouter un champ Image
  3. Exporter

    Fenêtre de terminal
    drush cex -y
  4. Vérifier les fichiers créés

    Fenêtre de terminal
    ls config/sync/ | grep blog

    Résultat :

    node.type.blog_article.yml
    field.storage.node.field_image.yml
    field.field.node.blog_article.field_image.yml
    core.entity_form_display.node.blog_article.default.yml
    core.entity_view_display.node.blog_article.default.yml
    core.entity_view_display.node.blog_article.teaser.yml
  5. Commiter

    Fenêtre de terminal
    git add config/sync/
    git commit -m "feat: add blog_article content type with image field"
  • Types de contenu
  • Définitions de champs
  • Vues
  • Taxonomies (vocabulaires)
  • Rôles et permissions
  • Menus (structure)
  • Blocs (placement)
  • Paramètres du site
  • Nœuds (articles, produits…)
  • Termes de taxonomie
  • Utilisateurs
  • Fichiers uploadés
  • Liens de menu (contenu)
Fenêtre de terminal
# Exporter une seule configuration
drush cex --destination=/tmp/export system.site
# Lister les configurations disponibles
drush config:list | grep views
Fenêtre de terminal
# Importer une seule configuration
drush config:import --partial --source=/tmp/config

Dans settings.php :

// Configurations à ignorer lors de l'import
$settings['config_exclude_modules'] = ['devel', 'kint'];

Chaque site Drupal a un UUID unique dans system.site.yml. Si vous clonez un site, vous devrez peut-être synchroniser les UUIDs :

Fenêtre de terminal
# Voir l'UUID actuel
drush config:get system.site uuid
# Modifier l'UUID (si nécessaire)
drush config:set system.site uuid "12345678-1234-1234-1234-123456789012"

Dans settings.php, vérifiez :

$settings['config_sync_directory'] = '../config/sync';
Fenêtre de terminal
# Récupérer l'UUID des fichiers
grep uuid config/sync/system.site.yml
# L'appliquer au site
drush config:set system.site uuid "UUID-ICI" -y
drush cim -y
Fenêtre de terminal
# Forcer l'import (écrase les changements locaux)
drush cim -y --diff
# Ou exporter d'abord pour voir les différences
drush cex -y
git diff config/sync/
Fenêtre de terminal
# Voir les erreurs détaillées
drush cim -y --debug
# Vérifier la syntaxe YAML
cat config/sync/fichier.yml | python -c "import yaml,sys; yaml.safe_load(sys.stdin)"
CommandeAliasDescription
drush config:exportdrush cexExporter la configuration
drush config:importdrush cimImporter la configuration
drush config:statusdrush cstVoir les différences
drush config:getdrush cgetLire une configuration
drush config:setdrush csetModifier une configuration
drush config:listLister les configurations

Les modules custom peuvent définir leur configuration par défaut dans config/install/ :

modules/custom/mon_module/
├── config/
│ └── install/
│ └── mon_module.settings.yml

Exemple :

# config/install/mon_module.settings.yml
ma_cle: ma_valeur

Cette configuration sera automatiquement installée lors de l’activation du module. Pour exporter des modifications ultérieures :

Fenêtre de terminal
drush cex -y

🌍 Configurations spécifiques par environnement

Section intitulée « 🌍 Configurations spécifiques par environnement »

Certaines configurations doivent varier selon l’environnement (dev/staging/prod). Utilisez $config dans settings.php :

// settings.php
// Mode maintenance automatique en production
if (getenv('ENVIRONMENT') === 'prod') {
$config['system.maintenance']['message'] = 'Site en maintenance.';
}
// Configuration de mail en dev (ne pas envoyer de vrais emails)
if (getenv('ENVIRONMENT') === 'dev') {
$config['system.mail']['interface']['default'] = 'test_mail_collector';
}
// API keys différentes par environnement
$config['mon_module.settings']['api_key'] = getenv('API_KEY');

Pour des besoins avancés (modules différents par environnement, configurations conditionnelles), utilisez le module Config Split :

Fenêtre de terminal
composer require drupal/config_split
drush en config_split -y

Exemple d’usage : activer Devel uniquement en dev, désactiver le cache en local, etc.

Après un import de configuration, videz toujours le cache :

Fenêtre de terminal
drush cim -y
drush cr # cr = cache:rebuild

Le cache peut contenir d’anciennes références à la configuration. Sans le vider, certains changements peuvent ne pas apparaître.

  1. Exportez la configuration actuelle

    Fenêtre de terminal
    drush cex -y
  2. Modifiez le nom du site via l’interface

    • Aller à /admin/config/system/site-information
    • Changer le nom en “TailStore - E-Commerce”
  3. Vérifiez les différences

    Fenêtre de terminal
    drush cst
  4. Exportez à nouveau

    Fenêtre de terminal
    drush cex -y
  5. Vérifiez le fichier modifié

    Fenêtre de terminal
    cat config/sync/system.site.yml | grep name
  6. Commitez

    Fenêtre de terminal
    git add config/sync/system.site.yml
    git commit -m "chore: update site name"
  7. Testez le cycle complet

    Fenêtre de terminal
    # Modifier à nouveau le nom via l'interface
    # Puis annuler en réimportant
    drush cim -y
    drush cr
    # Le nom doit revenir à "TailStore - E-Commerce"

Vous maîtrisez maintenant la gestion de configuration de Drupal !

Passez à l’Interface d’administration pour découvrir les principales sections de l’admin Drupal.