Makina Blog

Le blog Makina-corpus

Découvrez le DbToolsBundle


L'équipe PHP est fière de vous présenter son nouveau bundle à destination des développeurs Symfony : sauvegardez, restaurez et anonymisez simplement vos bases de données !

Sommaire
DbToolsBundle : import, export, anonymisation, statistiques
Avec le DbToolsBundle, sauvegardez, restaurez, anonymisez et calculez des statistiques

Introduction

Le DbToolsBundle n'a qu'un seul objectif : simplifier la vie des développeurs Symfony quand ils utilisent une base de données.

Pour vous faire une idée des possibilités offertes par le DbToolsBundle, la suite de cet article décrit trois cas d'utilisations classiques. Mais avant de rentrer dans le vif du sujet, la section suivante présente l'historique du bundle Symfony.

Historique du DbToolsBundle

Depuis plusieurs années sur nos différents projets, nous réutilisons un ensemble de commandes Symfony pour réaliser certaines opérations sur nos bases de données :

  1. Sauvegarder et restaurer une base de données
  2. Anonymiser des données provenant d'un environnement de production
  3. Avoir quelques statistiques sur la base de données

Aujourd'hui, ces commandes ont été largement éprouvées, nous avons donc décidé de les rassembler dans un bundle et d'en faire profiter à toute la communauté Symfony.

La création de ce bundle a aussi été l'occasion :

  • D'industrialiser la partie anonymisation de données
  • De faire une jolie documentation [en] que l'on a essayé de rendre la plus complète possible
  • De unit-tester l'ensemble du bundle
  • De rendre compatible le bundle avec d'autres SGBDR, le bundle étant à l'origine dédié à PostgreSQL

Utilisation 1 - Sauvegarder et restaurer sa base de données lors d'un déploiement

Dans la vie d'un projet, nous sommes souvent amenés à déployer des nouvelles versions sur différents environnements. Une migration, même en ayant pris toutes les précautions possibles, ça peut… rater. C'est pourquoi en général, on sauvegarde de la base de données avant de lancer la mise à jour.

Avec le DbToolsBundle, faire une sauvegarde est aussi simple que de lancer la commande suivante :

console db-tools:backup

Le DbToolsBundle va alors aller chercher le bon programme de sauvegarde - pg_dump, mysqldump, etc. - en fonction de votre base de données, et l'utiliser avec les bons paramètres. La sauvegarde est placée dans un répertoire configurable du disque dur.

Cette commande propose également de nettoyer du disque, les sauvegardes existantes considérées comme obsolètes.

Maintenant, imaginons que votre migration n'était finalement pas si robuste et qu'un problème est apparu au moment de la lancer. Vous ne comprenez pas immédiatement le problème : le plus sage est sans doute de revenir à la version précédente pour le moment.

Pour restaurer votre base de données, lancez :

console db-tools:restore

Cette commande va lister les sauvegardes présentes sur le disque dur et vous demander laquelle vous souhaitez restaurer. Comme pour la commande de sauvegarde, le DbToolsBundle va utiliser le bon programme en fonction de votre base de données.

Pour en savoir plus sur les configurations possibles de ces deux commandes et les différentes options qu'elles proposent, rendez-vous sur la section dédiée de la documentation [en].

Utilisation 2 - Anonymiser des données de production pour les utiliser sur un environnement local

Partons du scénario suivant :

Vous avez besoin de récupérer chez vous des données de production, mais vous ne souhaitez pas vous retrouver avec des données sensibles sur votre environnement local.

Après avoir lancer la commande db-tools:backup sur votre environnement de production, vous venez de télécharger le fichier de sauvegarde sur votre ordinateur. Vous utilisez alors la commande db-tools:restore pour injecter ces données dans votre base de données locale.

Mais en faisant ça, vous injectez aussi des données sensibles, et ça, vous ne le souhaitez pas. Premièrement, parce que c'est sans doute illégal, tout au moins en Europe avec le RGPD. Deuxièmement, parce que vous ne voulez pas avoir les données personnelles des utilisateurs de votre site ou des utilisateurs de votre client chez vous !

Pour éviter ça, vous avez besoin d'un processus d'anonymisation.

Ça peut être assez compliqué et très consommateur en temps de réaliser une anonymisation complète et efficace. Le DbToolsBundle se propose de le faire à votre place.

Paramétrer une anonymisation devient aussi simple que d'ajouter quelques attributs PHP8 sur vos entités Doctrine.

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use MakinaCorpus\DbToolsBundle\Attribute\Anonymize;

#[ORM\Entity()]
#[ORM\Table(name: 'customer')]
class Customer
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 180, unique: true)]
    #[Anonymize(type: 'email')]  // <== C'est par ici la magie !
    private ?string $emailAddress = null;

    // ...
}

Avec la configuration ci-dessus, en lançant la commande db-tool:anonymize sur un fichier de sauvegarde, toutes les adresses e-mails de vos utilisateurs seront anonymisées. À la sortie, chaque adresse e-mail aura la forme "[hash de l'adresse d'origine]@example.com".

Ici l'exemple est très basique, pour en apprendre plus sur les possibilités d'anonymisation avec le DbToolsBundle, référez-vous à la section dédiée de la documentation [en].

Selon les recommandations du RGPD, vous ne pouvez pas lancer l'anonymisation sur votre environnement local : votre fichier de sauvegarde contient des données sensibles et ces données sensibles ne devraient jamais transiter par un environnement non-sécurisé.

À la place, nous pouvons par exemple utiliser l'environnement de préproduction pour effectuer cette tâche :

console db-tools:anonymize /chemin/vers/mon-backup.sql

À la sortie de cette commande, le fichier mon-backup.sql sera anonymisé. Vous pouvez maintenant le télécharger sur votre machine et l'importer sur votre environnement local avec la commande db-tools:restore et l'option --filename pour spécifier le fichier à restaurer.

Pour avoir une vue d'ensemble sur le fonctionnement de cette commande et sur comment mettre un place un workflow d'anonymisation RGPD-compatible, référez-vous à la section dédiée de la documentation [en].

Utilisation 3 - Avoir des statistiques sur sa base de données lorsqu'on n'a pas de vrai monitoring

Sur des petits projets, nous n'avons pas toujours le budget pour avoir un vrai outil de monitoring pour la base de données. Bien souvent, pour aller voir ce qu'il se passe, nous n'avons qu'un accès CLI via une connexion SSH.

Dans ce cas, en général pour avoir des statistiques sur la base, nous nous retrouvons à copier/coller de grosses requêtes SQL dans un prompt de shell. C'est fastidieux et la sortie n'est pas toujours facile à lire.

Si le contenu du paragraphe précédent vous est familier, essayez de lancer :

console db-tools:stats

Cette commande vous retourne un beau tableau rempli de statistiques sur votre base de données. Et honnêtement, rien que cette commande pourrait justifier l'installation sur votre projet du DbToolsBundle !

Des options sont disponibles pour obtenir différentes statistiques, plus d'informations dans la section dédiée de la documentation [en].

Un bundle Symfony communautaire

Pour finir cette présentation, nous voulions insister sur le fait que nous souhaitons que le DbToolsBundle soit un outil communautaire.

Vous pouvez contribuer au bundle [en] en lui-même mais il est également possible de contribuer en créant et distribuant des packs d'anonymiseurs [en].

Si vous avez lu la partie sur l'anonymisation de la documentation du bundle [en], vous avez pu constater que le bundle fournit un certain nombre de ces anonymiseurs. Mais ceux-ci ne peuvent pas couvrir tous les cas d'usage.

Plutôt que de faire grossir le bundle en y ajoutant tous les anonymiseurs possibles et imaginables, nous avons choisi d'avoir une approche plus modulaire et de donner la possibilité à chacun de fournir à la communauté sa propre collection : des packs d'anonymiseurs.

Certains de ces packs sont considérés comme "officiels" [en], cette liste ne demande qu'à grossir !

En savoir plus sur le DbToolsBundle

En tout cas, nous avons hâte de connaître les retours de développeurs Symfony sur notre travail, les issues sont bien sûr ouvertes sur le dépôt GitHub du projet, alors n'attendez plus :

composer require makinacorpus/db-tools-bundle

 

Pour plus d'information sur le DbToosBundle, retrouvez directement :

 

Formations associées

Formation Symfony

Formation Symfony Initiation

Nantes Du 26 au 28 mars 2024

Voir la formation

Formations Outils et bases de données

Formation PostgreSQL

Nantes Du 29 au 31 janvier 2024

Voir la formation

Formations Outils et bases de données

Formation Git, gestionnaire de versions

Toulouse Du 14 au 15 mai 2024

Voir la formation

Actualités en lien

Image
Encart article 2 : Itéra­tions vers le DDD et la clean archi­tec­ture avec Symfony
20/02/2024

Itéra­tions vers le DDD et la clean archi­tec­ture avec Symfony (2/2)

Quels virages avons-nous pris après un premier projet expé­ri­men­tal pour stabi­li­ser notre concep­tion logi­cielle, et que ferons-nous plus tard ?

Voir l'article
Image
AFUP Meet-up DBToolsBundle
15/02/2024

Meetup AFUP Nantes de février : parlons anony­mi­sa­tion avec le DbTools­Bundle Symfony

Notre expert Symfony / PHP prend la parole au Meet-up de l’AFUP Nantes le 21 février pour présen­ter le nouveau bundle Symfony déve­loppé par Makina Corpus : le DbTools­Bundle !

Voir l'article
Image
Encart Article Symfony Pierre
13/02/2024

Itéra­tions vers le DDD et la clean archi­tec­ture avec Symfony (1/2)

Pourquoi et comment avons nous fait le choix de faire évoluer la concep­tion de nos projets Symfony, et quelles erreurs avons-nous faites ?

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus