# BagIt

BagIt est un ensemble de conventions de système de fichiers hiérarchiques conçues pour prendre en charge le stockage sur disque et le transfert réseau de contenu numérique arbitraire. Un « bag » se compose d'une « charge utile » (payload, le contenu arbitraire) et de « balises » enregistrées dans des fichiers de métadonnées destinés à documenter le stockage et le transfert du bag. L'un de ces fichiers, nommé « manifeste » , est obligatoire ; il contient la liste de chaque fichier de la charge utile avec sa somme de contrôle correspondante. Le nom, BagIt, s'inspire de la méthode « enclose and deposit », parfois appelée « bag it and tag it ».
Les bags sont adaptés au transfert de contenu numérique normalement conservé sous forme d'ensemble de fichiers. Ils sont également bien adaptés à l’export, à des fins d’archivage, de contenus normalement conservés dans des structures de bases de données que le récepteur peut ne pas prendre en charge. Suivant les conventions de nommage de différents systèmes d'exploitation (Windows, MacOS et GNU/Linux), la charge utile d'un bag peut inclure n'importe quel nombre de répertoires et de sous-répertoires. Un bag peut spécifier que le contenu de la charge utile doit être récupéré sur le réseau pour compléter le bag via un fichier fetch.txt qui répertorie des URL ; une simple parallélisation (par exemple, l'exécution de 10 instances de Wget ) peut exploiter cette fonctionnalité pour transférer de gros bags très rapidement.
Parmi les avantages des bags, on peut mentionner :
* Une large adoption dans les bibliothèques numériques (par exemple par la Bibliothèque du Congrès) ;
* La facilité de mise en œuvre à l’aide d’outils de système de fichiers communs et disponibles partout ;
* Il suffit de copier le contenu provenant de fichiers dans le répertoire de charge utile ;
* Par rapport à l'empaquetage dans un fichier XML, le contenu n'a pas besoin d'être encodé (par exemple en Base64), ce qui permet d'économiser du temps et de l'espace de stockage.
* Le contenu reçu est prêt à être utilisé dans une arborescence de système de fichiers habituelle.
* Le transfert réseau est rapide et facile à mettre en œuvre en exécutant en parallèle des outils de transfert standard.

## Spécification

BagIt est actuellement défini dans la RFC 8493. Il définit une convention de nommage de fichiers simple utilisée par la communauté de la préservation numérique pour regrouper du contenu numérique arbitraire et le transporter de manière fiable via des supports physiques (disque dur, CD-ROM, DVD) ou des transferts réseau (FTP, HTTP, rsync, etc.). BagIt est également utilisé pour gérer le stockage du contenu au fil du temps. La discussion sur la spécification et ses orientations futures a lieu sur la liste de discussion Digital Curation.
La spécification BagIt est organisée autour de la notion de « bag ». Un bag est un répertoire de système de fichiers nommé qui contient au minimum :
* un fichier bagit.txt qui signale le répertoire comme étant un bag, et contient la version de la spécification BagIt à laquelle il se conforme ainsi que l'encodage de caractères utilisé pour les fichiers de métadonnées ;
* un répertoire data qui inclut la charge utile, c'est-à-dire les fichiers de données qui constituent le contenu numérique préservé. Les fichiers peuvent également être placés dans des sous-répertoires, mais les répertoires vides ne sont pas pris en charge ;
* au moins un fichier manifeste qui détaille les noms de fichiers présents dans le répertoire data, ainsi que leurs sommes de contrôle. L'algorithme de somme de contrôle utilisé est inclus dans le nom du fichier manifeste. Par exemple, un fichier manifeste avec des sommes de contrôle MD5 est nommé manifest-md5.txt.
À la réception d'un bag, un logiciel peut examiner le fichier manifeste pour s'assurer que les fichiers de la charge utile sont présents et que leurs sommes de contrôle sont correctes. Cela permet d'identifier les fichiers supprimés accidentellement ou corrompus. Vous trouverez ci-dessous un exemple d'un bag minimal « myfirstbag » qui contient deux fichiers comme charge utile. Le contenu des fichiers de métadonnées est inclus sous leurs noms de fichiers.
Dans cet exemple, la charge utile se compose d'un fichier image PNG et d'un fichier texte de reconnaissance optique de caractères. En général, l'identification et la définition des formats de fichiers sont hors du champ d'application de la spécification BagIt ; les attributs de fichiers sont également hors du champ d'application.
La spécification autorise plusieurs fichiers de métadonnées facultatifs, en plus du manifeste. Leur encodage de caractères doit être le même que celui précisé dans le fichier bagit.txt, qui lui-même doit toujours être encodé en UTF-8. La spécification définit les fichiers de métadonnées (dénommés « tagfile ») facultatifs suivants :
* un fichier bag-info.txt qui détaille les métadonnées du bag, en utilisant des paires clé/valeur séparées par le caractère deux-points (similaires aux en-têtes HTTP) ;
* un fichier manifeste des fichiers de métadonnées qui répertorie les fichiers de métadonnées et leurs sommes de contrôle associées, nommé selon l'algorithme de somme de contrôle utilisé (par exemple, tagmanifest-md5.txt)
* un fichier fetch.txt qui répertorie les URL à partir desquelles les fichiers de charge utile peuvent être récupérés en complément ou en remplacement des fichiers de charge utile localisés dans le répertoire data
Jusqu'à la version 15, le projet décrivait également comment sérialiser un bag dans un fichier d'archive, tel que ZIP ou TAR. À partir de la version 15, la sérialisation ne fait plus partie des spécifications, non pas pour des raisons techniques, mais en raison de la portée et de l'orientation de la spécification.

## Histoire

La spécification BagIt est née d'une collaboration entre la Bibliothèque du Congrès et la California Digital Library (en) (CDL) lors du transfert de contenu numérique créé dans le cadre du « National Digital Information Infrastructure and Preservation Program (en) (NDIIPP) ». Les origines de l'idée remontent aux travaux réalisés à l'Université de Tsukuba sur le modèle « enclose and deposit », pour déposer mutuellement des ressources archivées afin de permettre une préservation numérique à long terme. La pratique consistant à utiliser des manifestes et des sommes de contrôle est une pratique assez courante, comme en témoigne leur utilisation dans les fichiers ZIP (format de fichier), Deb (format de fichier), dans le format de métadonnées METS, ainsi que sur les sites FTP publics.
En 2007, la Bibliothèque numérique de Californie a dû transférer plusieurs téraoctets de contenu (essentiellement des données issues de l'archivage du Web) à la Bibliothèque du Congrès. La spécification BagIt permettait d'empaqueter le contenu dans des « bags » avec des métadonnées d'empaquetage et un manifeste détaillant les sommes de contrôle des fichiers, qui étaient ensuite vérifiées à la réception des bags. La spécification a été rédigée sous forme de brouillon (draft) soumis à l'Internet Engineering Task Force (IETF) par John Kunze en décembre 2008, où elle a fait l'objet de plusieurs révisions avant d'être publiée sous forme de RFC. En 2009, la Bibliothèque du Congrès a produit une vidéo qui décrit la spécification et les cas d'utilisation qui l'entourent$^,$. En 2018, la version 1.0 a été publiée sous forme de RFC par l'IETF.