Catégorie : Sauvegardes

  • Un petit programme par l’IA

    J’avance sur mes outils de sauve­garde mais aussi sur mes explo­ra­tions IA.

    J’ai eu besoin d’un second programme qui va lire tous les emails d’une boite au format mail­dir, regar­der l’an­née du mail, et le dépla­cer dans une boite mail­dir spéci­fique à cette année là.

    J’au­rais pu le faire en Javas­cript ou en Ruby mais vu ce que m’a fait l’IA en quelques minutes précé­dem­ment, je me suis dit que j’al­lais conti­nuer et refaire un script Go (je n’ai jamais codé une seule ligne de Go).

    Voici le résul­tat : github.com/edas/split-mail­dir-by-year.

    Les 300 lignes de Go ont analysé l’in­té­gra­lité de mon archive Gmail (537 000 emails quand même).

    • Je ne crois pas avoir touché le code source à la main
    • Le code a toujours compilé du premier coup
    • Le code a toujours fait ce que je souhai­tais, sans erreur

    Le code est correc­te­ment struc­turé, des fonc­tions ont été créées au fur et à mesure des besoins quand le code a évolué. Quand une fonc­tion est un peu longue, il sépare en blocs et ajoute une ligne de commen­taire pour dire ce que fait le bloc, ce qui me permet de ne pas avoir à déco­der un code dans un langage que je ne connais pas.

    10 demandes courtes pour avoir le programme et le faire évoluer vers mes besoins, ques­tions de relec­ture incluses. 17 ajouts par la suite pour trai­ter des cas spéci­fiques rencon­trés.

    Je n’au­rais pas fait plus vite moi-même, ni en Go ni dans un langage que je connais très bien. Peut-être que ça aurait été un peu plus diffi­cile pour un non-déve­lop­peur, mais je vois mal ce que j’au­rais eu à y gagner à le coder à la main.

    À chaque modi­fi­ca­tion j’ai le diff à vali­der mais aussi une bonne expli­ca­tion de l’IA sur ce qui a été modi­fié, comment et pourquoi. Ma relec­ture s’est souvent faite en diago­nale sur la base des commen­taires de code. L’IA a su répondre à mes ques­tions quand j’ai rencon­tré des éléments moins évide

    Plutôt que lister les étapes, je copie direc­te­ment mes prompts.


    I have hundreds thousands of files in the "maildir/new" directory. Each file contains a raw email with headers.

    I want a program which reads all emails one by one, look for the "Date" header, return an error in the header doesn't exists or is unreadable, and otherwise move the email file in the directory "by-year/{year}/new" where {year} is the year in the Date header.

    Je relis parce que ça va toucher des données réelles et que j’ai la flemme de faire des données de tests.

    Je vois qu’il retourne toujours une date même quand il y a une erreur. Inha­bi­tué de Go, j’ai peur de certaines erreurs de débu­tants en PHP ou en JS, où on utilise une date du jour plutôt que gérer l’er­reur. Je pose ma ques­tion et je suis rassuré par sa réponse (que je trouve logique après coup vu le fonc­tion­ne­ment des erreurs en Go)

    can the parseEmailDate return nil when it doesn't find a Date header ?

    Je vois aussi un mkdir sans test d’exis­tence préa­lable. Dans d’autres langages ça jette une erreur si le réper­toire existe. Je pose la ques­tion et là aussi je suis rassuré par sa réponse.

    what if the directory already exists line 63 ?

    Je demande une adap­ta­tion, non stric­te­ment néces­saire, pour que chaque réper­toire soit bien une boite mail­dir avec les 3 réper­toires obli­ga­toires. Ce n’est pas néces­saire à ma sauve­garde mais je préfère, au cas où ça m’évite des erreurs un jour.

    Oui, j’ai parfois basculé en français. Je ne sais ni pourquoi j’ai du français ici, ni pourquoi j’ai mis de l’an­glais avant. L’IA est confi­gu­rée pour toujours me répondre en français. Le code est toujours commenté en anglais. Je pense que propres entrées dépendent ce sur quoi mon atten­tion était à ce moment là (code, page web, etc.)

    Si le répertoire "by-year/{year}" n'existe pas, il faut aussi créer "by-year/{year}/cur" et "by-year/{year}/tmp", même si nous ne nous en servons pas

    Seconde adap­ta­tion : L’IA m’a dit plus haut qu’elle avait un code de gestion de conflit. Je vois le commen­taire dans le code qui dit qu’en cas de conflit le code ajoute un suffixe avec le times­tamp du moment pour éviter d’écra­ser un fichier exis­tant. Norma­le­ment ça ne devrait jamais arri­ver mais un suffixe risque­rait de casser le format de nommage des fichiers mail­dir donc je préfère qu’on s’ar­rête avec une erreur et que j’avise.

    if there is a conflict, to not append a timestamp to make it unique. Return an error.

    Troi­sième adap­ta­tion. Je traite un demi-million de fichiers. Je préfère que ça traite les fichiers au fil de l’eau plutôt qu’a­voir la liste d’un demi-million de fichiers en mémoire.

    Au départ c’est d’abord une ques­tion. Je ne sais pas si Go retourne un tableau ou un itéra­teur (oui, j’ai été flem­mard jusqu’à ne même pas faire atten­tion au typage). Je m’at­ten­dais à deman­der la correc­tion dans le premier cas. Au final il modi­fie de lui-même le code à partir de la seconde ques­tion pour faire des itéra­tions par lots 100 fichiers, sans que je ne le demande expli­ci­te­ment.

    En réalité c’est du script maison, qui sera lancé juste une poignée de fois. L’op­ti­mi­sa­tion est tota­le­ment inutile mais je n’ai pas encore appris à tota­le­ment lâcher prise vis-a-vis de ce que j’au­rais codé moi-même.

    What does return ReadDir in line 88 ?
    Si le répertoire contient des millions de fichiers, est-ce que la variable files ligne 88 va tout avoir en mémoire ?

    Je vais jouer avec de vraies données. Je veux voir les erreurs et m’ar­rê­ter pour corri­ger, pas que ça conti­nue et que j’ai à remon­ter voir s’il y a eu des erreurs.

    The programm should stop at the first error, not continue with the next file

    Et, parce que je n’y avais pas pensé avant :

    Le programme doit aussi prendre un chemin en argument. C'est là que se trouveront les différents répertoires prévus.

    La première phase est faite. Je passe au test en condi­tions réelles, sur le demi-million d’email de mon archive. Chaque fois que j’ai une erreur, je lui indique et j’avance.

    C’est là que je vois que chaque client email fait bien ce qu’il veut avec les entêtes. J’ai croisé un nombre inat­tendu de formats diffé­rents et d’er­reurs dans les entêtes. Chaque fois le programme m’af­fiche l’er­reur, je copie-colle la date problé­ma­tique, l’IA corrige, et je relance jusqu’à l’er­reur suivante.

    We should also parse the format for "Mon, 21 Aug 2006 16:47:08 +0200 (CEST)"
    We should also parse the date "Mon, 1 Dec 2008 10:57:10 UT"

    Sur une erreur étrange, j’ouvre l’email et je me rends compte qu’il prend en compte la conti­nua­tion d’une entête Recei­ved comme si c’était une date, parce qu’il ne prend pas en compte les espaces avant le mot clé Date.

    TrimSpave at line 30 should only trim right space, not left space

    Parti­cu­la­rité Gmail, quand il récu­père un email d’une boite tierce (via POP3 ou IMAP), il crée des entêtes à lui, saute une ligne et après pose le vrai email. Rétros­pec­ti­ve­ment je pense que j’au­rais dû reti­rer la section ajou­tée par Gmail pour retrou­ver un email normal. Je le ferais peut-être plus tard. Là je me suis contenté de lui faire contour­ner le problème.

    When we find the header "X-Gmail-fetch-Info", we should ignore the blank line following if it exists

    Encore des ques­tions de dates…

    We should be able to parse the Date "Tuesday 29 May 2007, 16:03"
    We should also parse "Wed, 03 Mar 2010 22:36:13 +0100 CET"
    We should also parse "Thu, 22 Jul 2010 23:02:50"
    We should also parse "Mon, 30 Mar 2009 20:11:22 +0100"

    Ce coup-ci ça ne corrige pas mon problème. Rétros­pec­ti­ve­ment j’au­rais pu le comprendre parce que le message d’er­reur n’était pas exac­te­ment le même, mais je le laisse trou­ver seul. Le mot clé DATE était en majus­cules, c’était la première fois.

    pourtant le script fait une erreur sur la ligne "DATE: Mon, 30 Mar 2009 20:11:22 +0100". Pourquoi ?

    Le code qu’il me génère imbrique quatre fonc­tions de mani­pu­la­tion de texte sur une seule ligne. Je ne trouve pas ça lisible. Je pose la ques­tion.

    que fait la ligne 49 ?

    Ça semble redon­dant avec la ligne suivante, pré-exis­tante. Effec­ti­ve­ment, quand je pose la ques­tion il iden­ti­fie le doublon et le supprime.

    Il faut penser à relire (même si l’er­reur aurait juste était du code inutile). Cursor me fait vali­der chaque chan­ge­ment sous forme de diff donc c’est assez rapide et facile à faire.

    que fait la ligne 50 ?

    Encore des formats de date…

    Encore un format : "mon, 10 jul 2006 01:02:08 gmt"
    encore un : "wed, 23 jun 2004 01:19:32 cest"
    encore un "mon, 22 mar 2010 14:20:15 +0100 +0100". C'est probablement une erreur d'écriture mais il faut la prendre en compte
    "wen, 16 jul 2008 22:09:05 +0200"

    Les deux derniers cas sont forcé­ment des erreurs de la part de clients emails. Pour la première erreur il choi­sit d’igno­rer toutes les répé­ti­tions du déca­lage horaire.

    La seconde erreur est inté­res­sante parce que « wen » est proba­ble­ment là pour « wed » (wednes­day). Il iden­ti­fie l’er­reur et ajoute un code qui remplace toute une liste d’er­reurs de frappes habi­tuelles pour les code courts de jour de la semaine. Parfait.

    "wed, 19 apr 2006 12:15 -0800"

    J’ai mon premier cas d’email sans entête « Date ». Je ne sais pas si c’est auto­risé ou non mais peu importe. Je lui dis de fouiller les entêtes « Recei­ved » à la place. Je sais que ces entêtes peuvent être sur plusieurs lignes.

    L’IA va plus loin que moi, sait que la date est en seconde posi­tion dans ces entêtes, et regarde unique­ment après le premier point virgule. Elle sais aussi comment s’ap­pellent ses entêtes sur plusieurs lignes (lignes de conti­nua­tion). Mieux que ce que j’au­rais fait.

    Je note que je tape vite, avec des erreurs de frappe, un guille­met en trop, etc. Peu importe, c’est destiné à l’IA. Me relire est super­flu : je peux reve­nir en arrière si c’est mal compris.

    If you don't find any Date header, try again to look if you can find a date somewhere in a "Received" header (theere may be multiple "Received" headers") or in the lines begining with a space and following a "Received" header
  • Disque de sauve­garde

    J’ai un SSD de 8 To dédié à ça. L’idée c’est de me donner un peu de mou sachant que j’en utilise au moins 3 To.

    Je l’ai bran­ché sur un Mac mini, qui est la seule machine fixe chez moi et je n’ai pas envie d’al­ler ache­ter un NAS en plus.

    Le tout sera aussi sauve­gardé en ligne au cas où le disque fait défaillance (mauvaise mani­pu­la­tion, panne, vol, incen­die, dégât des eaux) mais j’ai besoin que ce soit d’abord en local et pas unique­ment dépen­dant d’un service en ligne.

    Outre la défiance vis-a-vis des services en ligne, ça me permet­tra de tout remon­ter sans attendre des jours à tout télé­char­ger.

    Montage du disque

    C’est une machine parta­gée, donc il faut des droits d’ac­cès. Macos monte par défaut tous les disques USB avec un para­mètre noow­ners qui fait que tout le monde a les mêmes droits sur tous les fichiers.

    Pour corri­ger ça il faut l’em­pê­cher de monter le disque auto­ma­tique­ment et le faire à la main avec l’op­tion owners. Je ne sais pas si c’est redon­dant mais j’ai eu des succès en ajou­tant la commande diskutil enableOwnership avec l’iden­ti­fiant du disque;

    C’est un disque de sauve­garde, je fais déjà écrire beau­coup dessus en perma­nence, il faut bien penser à ajou­ter le noatime pour éviter de géné­rer des écri­tures inutiles.

    Au final :

    # GUID du disque, les /dev/disk* ne sont pas stables
    GUID="xxxxx"
    # Point de montage
    DIR="/Volumes/data"
    mkdir -m 0750 $DIR 2> /dev/null
    diskutil mount -mountOptions noauto,nosuid,nodev,noatime,nobrowse,owners -mountPoint $DIR $GUID && diskutil enableOwnership $GUID

    On chiffre

    Le disque est chif­fré. Pour moi c’est indis­pen­sable en cas de vol. C’est aussi néces­saire si le disque semble avoir des défaillance, que je ne peux l’ef­fa­cer mais que quelqu’un risque de réus­sir à relire quand même. Je ne veux ni ne peux me permettre que tout se balade n’im­porte où.

    Je pour­rais enre­gis­trer la clé de chif­fre­ment dans le gestion­naire natif de Macos comme il m’in­vite à le faire mais je vais avoir besoin plus tard que le montage se fasse au démar­rage du disque, hors de toute session utili­sa­teur.

    Je me permets donc de mettre en clair le mot de passe du disque. Tant que le script en ques­tion n’est acces­sible que par root, ça me va.

    # GUID du disque, les /dev/disk* ne sont pas stables
    GUID="xxxxx"
    # Point de montage
    DIR="/Volumes/data"
    # Mot de passe du système de fichier
    PASS="xxxxxx"
    diskutil apfs unlockVolume $GUID -passphrase $PASS -nomount
    mkdir -m 0750 $DIR 2> /dev/null
    diskutil mount -mountOptions noauto,nosuid,nodev,noatime,nobrowse,owners -mountPoint $DIR $GUID && diskutil enableOwnership $GUID
    RES=$?
    sudo chgrp Famille $DIR
    sudo chmod 750 $DIR

    On garde actif

    Par défaut Macos démonte tous les disques USB quand on ferme la session utili­sa­teur. C’est aussi vrai pour les parti­tions chif­frées, y compris celles qu’on aurait montées à la main.

    Bref, il suffit que n’im­porte qui utilise le poste et se décon­necte pour que mon disque de sauve­garde soit aux abon­nés absents, impos­sible à remon­ter vu que seul root peut accé­der au mot de passe du disque.

    J’ai ajouté en fin de script une petite boucle qui « occupe » le disque et empêche qu’il soit démonté. Ça a l’air de fonc­tion­ner.

    cd $DIR
    while true; do
       sleep 10;
    done

    Il faut quand même pouvoir arrê­ter le système, donc le script doit savoir réagir à un signal d’in­ter­rup­tion.

    trap 'bye' SIGINT SIGTERM SIGKILL
    function bye() {
     cd /Volumes
     exit 1;
    }

    Lance­ment au démar­rage

    Je n’ai pas trouvé d’autres méthodes qu’un fichier plist dans /Library/LaunchDaemons.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
      <key>Label</key>
      <string>xxxx.backup-disk</string>
      <key>OnDemand</key>
      <false/>
      <key>UserName</key>
      <string>root</string>
      <key>GroupName</key>
      <string>wheel</string>
      <key>ProgramArguments</key>
      <array>
        <string>/usr/local/sbin/mount-data.sh</string>
      </array>
      <key>RunAtLoad</key>
      <true />
      <key>KeepAlive</key>
      <false/>
      <key>LaunchOnlyOnce</key>
      <true/>
    </dict>
    </plist>

    Le script de montage complet est dans /usr/local/sbin, en lecture unique­ment pour root.

    #!/bin/sh
    # GUID du disque, les /dev/disk* ne sont pas stables
    GUID="xxxxx"
    # Point de montage
    DIR="/Volumes/data"
    # Mot de passe du système de fichier
    PASS="xxxxxx"
    trap 'bye' SIGINT SIGTERM SIGKILL
    function bye() {
     cd /Volumes
     exit 1;
    }
    diskutil apfs unlockVolume $GUID -passphrase $PASS -nomount
    mkdir -m 0750 $DIR 2> /dev/null
    diskutil mount -mountOptions noauto,nosuid,nodev,noatime,nobrowse,owners -mountPoint $DIR $GUID && diskutil enableOwnership $GUID
    RES=$?
    sudo chgrp Famille $DIR
    sudo chmod 750 $DIR
    cd $DIR
    while true; do
       sleep 10;
    done

  • Sauve­gar­der Gmail

    J’ai un histo­rique de 25 ans d’emails et j’y tiens. Il m’ar­rive encore régu­liè­re­ment d’al­ler fouiller pour retrou­ver trace de contacts ou d’échanges d’il y a 10 ans. Je l’ai fait encore ce matin.

    Je tiens donc à assu­rer la péren­nité de tout ça. J’ai confiance en Google1 mais j’ai déjà lu les récits de personnes qui se sont vus clôtu­rer leur compte sans préavis ni possi­bi­lité de récu­pé­ra­tion. Je ne suis pas non plus à l’abri de faire moi-même des bêtises dans mon compte.

    J’ai déjà utilisé Getmail par le passé pour télé­char­ger un à un tous mes emails en prove­nance de Google. Il n’a cepen­dant pas été mis à jour pour Python3. Getmail6 semble avoir pris le relai et il a la bonne idée d’être dispo­nible sous macos via home­brew.

    POP3

    Mon compte dépasse le demi-million d’emails archi­vés. La synchro­ni­sa­tion IMAP semble prendre des années à balayer tous les emails pour savoir lesquels sont nouveaux depuis la dernière fois. C’est jouable si vous avez juste quelques dizaines de milliers d’emails. Au-delà il faut utili­ser le bon vieux POP3.

    1. Acti­ver POP3 dans les options de Gmail
    2. S’as­su­rer de le confi­gu­rer pour récu­pé­rer tous les emails et pas unique­ment ceux qui arrivent à partir d’aujourd’­hui.

    Si vous aviez déjà utili­ser POP3 par le passé, il faut lui deman­der de réac­ti­ver le télé­char­ge­ment de tous les emails, y compris ceux qui ont déjà été télé­char­gés.

    Si vous avez déjà un client email qui se connecte en POP3, passez-le en IMAP. Ils se feraient concur­rence. Vous auriez une partie des emails d’un côté et une partie de l’autre.

    Confi­gu­ra­tion

    Ma confi­gu­ra­tion getmailrc ressemble à ça :

    L’uti­li­sa­teur est l’adresse email complète. N’uti­li­sez pas votre mot de passe Google et créez un mot de passe d’ap­pli­ca­tion dédié, ça vous permet­tra de le révoquer un jour. Pensez à proté­ger ce fichier de confi­gu­ra­tion parce que celui qui y aura accès aura aussi accès à votre compte Google.

    Le para­mètre recei­ved assure que Getmail récu­père le message tel quel, sans ajou­ter d’en­tête.

    Erreurs de synchro­ni­sa­tion

    Google envoie tous les emails par groupes de 200 à 1000 non télé­char­gés à chaque appel POP3. Si le para­mètre read_all est à false, Getmail ne télé­charge pas les emails qu’il a déjà vu.

    Pour une raison ou une autre, ça peut partir en boucle si Getmail pense avoir déjà vu un email que Google pense pour­tant ne pas être déjà télé­chargé : L’email va être repro­posé à chaque fois. Si ça fait ça sur plusieurs centaines d’emails, vous prenez le risque que vous restiez bloqué sur le même groupe d’emails indé­fi­ni­ment à chaque appel.

    Véri­fiez bien que le read_all est à true. Si le problème persiste, une solu­tion est de passer par le type BrokenUIDLPOP3SSLRe­trie­ver plutôt que SimplePOP3SSLRe­trie­ver. Getmail télé­charge alors systé­ma­tique­ment les messages sans se préoc­cu­per de ce qu’il a déjà lu ou non.

    Quota

    Gmail a des quota sur ses APIs. Pour initia­li­ser mon demi-million d’emails j’ai lancé Getmail en boucle et je suis tombé sur des erreurs 403. Si vous devez comme moi initia­li­ser plusieurs dizaines de Go, ça demande un peu de surveillance.

    Le quota semble toute­fois très très large. En rythme de croi­sière je compte proba­ble­ment synchro­ni­ser 1 à 2 fois par jours mais on peut sans problèmes faire plusieurs synchro­ni­sa­tion par heures si ça vous semble indis­pen­sable.

    Mail­dir

    Il y a deux formats, mbox et mail­dir. Mbox c’est un unique gros fichier, un peu comme une archive tar. Mail­dir c’est un réper­toire avec un fichier par email, ce qui me semble plus adapté pour des sauve­gardes avec de nouveaux emails tous les jours.

    Initia­li­ser un mail­dir c’est juste un réper­toire qui contient un sous-réper­toire tmp, un new, et un cur. Tous les emails envoyés par Getmail iront dans new.

    Il reste que pour mon demi-million d’emails ça commence à faire beau­coup de fichiers dans un seul réper­toire. J’ai fait un petit script qui parcourt l’in­té­gra­lité des emails, lit la date2, et les répar­tit dans des mail­dir spéci­fiques par année. Ça faci­li­tera aussi la sauve­garde et me permet­tra éven­tuel­le­ment de faire un zip pour les vieilles années.

    Emails envoyés

    Le problème du POP3 c’est que ça ne télé­charge que les emails reçus, pas les emails envoyés. J’ai donc dû ajou­ter une seconde synchro­ni­sa­tion IMAP sur le dossier des emails envoyés. Là j’ai dans les 30 000 emails. C’est long à parcou­rir mais encore jouable tant que je ne lance pas la récu­pé­ra­tion toutes les deux minutes.

    J’ai donc deux fichiers getmailrc, un pop.getmailrc (emails reçus) et un imap.getmailrc (emails envoyés). Je dois donc manuel­le­ment spéci­fier les para­mètres –rcfile= quand j’ap­pelle Getmail. On peut spéci­fier plusieurs fois le para­mètre, les synchro­ni­sa­tions sont alors lancées l’une après l’autre.

    J’en­vois ça vers le même dossier mail­dir, puis fais la même répar­ti­tion par année.

    Enre­gis­trer en tâche plani­fiée

    Sous Linux il suffit proba­ble­ment de faire une entrée dans le cron.

    Sous Macos, si je veux que la synchro­ni­sa­tion s’exé­cute même quand je ne suis pas connecté, il faut enre­gis­trer le script dans /Library/Laun­chDae­mons.

    Comme le réper­toire desti­na­tion de mes sauve­garde est hors de mon disque prin­ci­pal, Macos impose aussi que le programme lancé ait la permis­sion spéciale « full disk access ». Getmail n’est qu’un script Python et je n’ai pas voulu donner des droits larges à tout Python. J’ai dû faire un programme natif qui lance mon script Getmail et donner les droits sur le disque à ce script là.

    Je ferai proba­ble­ment un billet dédié à tout ça.

    Entre temps j’ai presque 40 Go d’his­to­rique email à synchro­ni­ser depuis Google par batch de 200 à 1000 mails. Ça va me prendre un peu de temps.


    1. Oui, j’uti­lise Google. J’ai soupesé plein de fois les alter­na­tives mais toutes auraient demandé un compro­mis signi­fi­ca­tif et je ne suis pas encore passé à l’ac­tion. Ça vien­dra. J’ai besoin de trou­ver le bon équi­libre et de ne pas perdre la recherche dans le passé. ↩︎
    2. Je ferais un billet spéci­fique, ça s’est révélé bien moins évident que je ne l’ima­gi­nais naïve­ment. ↩︎
  • Orga­ni­sa­tion des sauve­gardes

    Je me suis remis à mes sauve­gardes. Le dernier épisode était en septembre et ça commence à faire presque deux ans que rien n’est fina­lisé.

    Je reste sur mon plan précé­dent. J’ai juste aban­donné l’idée d’uti­li­ser Crash­plan. Ça part de messages sur des forums où ils disent expli­ci­te­ment qu’ils ne pouvaient pas garan­tir le bon fonc­tion­ne­ment quand on dépasse quelques To de sauve­garde. Derrière j’ai exploré plus et les débits famé­liques rendent de toutes façons illu­soire une restau­ra­tion complète sur des volumes de cet ordre de gran­deur en cas de défaillance disque.

    J’irai chez BorgBase ou Hetz­ner, proba­ble­ment Hetz­ner parce que même en coupant l’inu­tile j’ai quand même au moins 3 To aujourd’­hui et que va commen­cer à faire cher chez BorgBase avec l’aug­men­ta­tion natu­relle.

    Disque externe – Disque interne

    Le vrai sujet de ce week-end, c’est comment monter une parti­tion chif­frée depuis un disque externe. C’était déjà mon problème en septembre.

    Macos consi­dère que les disques externes sont comme des clés usb, lisibles par tous les utili­sa­teurs, sans droits d’ac­cès, et démon­tées dès qu’on se décon­necte de sa session.

    Passer à un système chif­fré empêche qu’il soit montable par tout le monde tant qu’on n’ajoute pas la clé de chif­fre­ment dans le trous­seau.

    Si c’est monté manuel­le­ment, on peut ajou­ter le para­mètre owners pour faire en sorte que le système respecte les permis­sions sur les fichiers et n’ouvre pas tout à tout le monde.

    J’ai pu faire monter le disque au démar­rage en ajou­tant un plist dans /Library/Laun­chDea­mons et en le char­geant avec un laun­chctl load. Le plist exécute un script au démar­rage qui déver­rouille le disque et le monte avec les bonnes options. Ça veut dire que la clé de chif­fre­ment est en clair dans un fichier du disque interne. Le disque interne est chif­fré lui aussi, le fichier n’est lisible que par root. Ce n’est pas parfait mais suffi­sant pour mon usage.

    Ça reste visible comme un disque externe, donc tout le monde peut deman­der à l’éjec­ter. J’ai palier au problème ajou­tant un petit code dans le script de démar­rage qui entre dans le disque et attend indé­fi­ni­ment. Le disque étant occupé, personne ne peut l’éjec­ter.

    J’ai l’im­pres­sion de batailler à faire du brico­lage sur ce qui m’au­rait pris quelques minutes sous Linux mais ça fonc­tionne.

    L’étape suivante ça va être de s’as­su­rer que tous les fichiers se retrouvent sur le disque prévu pour, en synchro­ni­sant tous les comptes Google Drive et Treso­rit. Ensuite je vais instal­ler un getmail pour archi­ver en temps réel les boites email, proba­ble­ment un script pour archi­ver le Github. La dernière étape sera de bran­cher Borg pour envoyer le backup en ligne et d’at­tendre un bon mois qu’il finisse la synchro­ni­sa­tion initiale.

  • Et si on repar­lait backup ?

    Il y a quelques temps j’avais le setup suivant :

    Expli­ca­tions

    Chaque poste a ses fichiers en local, et synchro­ni­sés en ligne pour faire des partages et y avoir accès de n’im­porte où.

    • Le macbook pro (bleu) a des fichiers sensibles que je ne veux nulle part en clair (le disque du mac est chif­fré, treso­rit fait du chif­fre­ment côté client). Il a aussi plus de fichiers en ligne que je ne peux en stocker en local.
    • Le macbook air (rouge) a aussi ses fichiers sur clé usb pour les utili­ser au travail sur des postes parta­gés. La synchro­ni­sa­tion de la clé est aujourd’­hui manuelle (et c’est un problème).

    J’avais un poste Linux avec des gros disques pour quelques archives mais aussi synchro­ni­ser les comptes Google Drive et Treso­rit. Ensuite le tout était sauve­gardé en ligne via Crash­plan.

    Le petit poste Linux qui me servait de relai vers la sauve­garde est mort. Il me faut une autre solu­tion et c’est pour imagi­ner quelque chose que je fais appel à vous.

    Vous avez des sugges­tions ?

    Tout est imagi­nable, y compris ache­ter du maté­riel ou rempla­cer Google Drive et Treso­rit. Je n’ai pas de bons retours de Crash­plan donc je ne cherche pas parti­cu­liè­re­ment à le garder.

    Note : Les fichiers du macbook pro (bleu) et du linux (jaunes) doivent restés chif­frés en toute occa­sion (chif­fre­ment côté client si c’est stocké en ligne). C’est donc aussi vrai sur la sauve­garde finale. Ceux du macbook pro (bleu) doivent pouvoir être accé­dés de n’im­porte où en ligne, et parta­gés à des tiers.

    Idéa­le­ment j’ai­me­rais aussi résoudre le problème de la synchro­ni­sa­tion entre la clé usb et le macbook air (rouge). Elle se fait manuel­le­ment, donc on oublie souvent et la gestion des versions est pénible.

    S’il faut ache­ter un NAS ou un appa­reil supplé­men­taire, il est quasi­ment indis­pen­sable pour moi qu’il soit head­less et fanless.


    Pour l’ins­tant ce que j’ob­tiens c’est ce qui suit :

    Je garde Crash­plan faute de mieux parce que les alter­na­tives me semblent hors de prix pour ce quota. Je peux poten­tiel­le­ment synchro­ni­ser direc­te­ment les macbook avec le mac mini mais passer par le cloud ne me gêne pas vrai­ment pour mon usage.

    Je vais devoir ajou­ter des disques à côté du Mac mini et trou­ver un truc pour qu’ils soient chif­frés sans être acces­sibles à tous les utili­sa­teurs du Mac mini. Pour l’ins­tant c’est terrain inconnu. Mes précé­dents essais n’avaient pas été concluants.

    Si vous avez mieux, je suis preneur.


    En alter­na­tive, pour la partie sauve­garde, je peux rempla­cer Crash­plan par Borg­base (plus cher mais j’ai des vraies vitesses de trans­fert), Back­blaze ou Carbo­nite (pas très cher pour les deux mais les vitesses ne sont pas formi­dables) ou une Stora­geBox de Hetz­ner (qui devrait être un bon compro­mis sur tout ça).

    Je peux aussi poten­tiel­le­ment placer un NAS — que ce soit un NAS custom ou Syno­logy — entre la partie backup et les mac. S’il fait aussi le partage/accès des fichiers en ligne, ça peut me faire sauter Google Drive et Treso­rit.

  • Crash­plan et BorgBase

    J’ai long­temps utilisé Crash­plan pour mes sauve­gardes. C’était honnê­te­ment la solu­tion idéale quand ils avaient une offre pour les parti­cu­liers. 30 € par an pour une sauve­garde en temps réel, espace non limité avec chif­fre­ment de bout en bout. Le seul défaut était le non-support offi­ciel de Linux.

    Avec le temps ils ont supprimé l’offre pour parti­cu­liers et n’ont laissé que celle pour les entre­prises. Désor­mais je paye 10 € par mois pour une machine. Je suis resté parce que les offres de sauve­garde en temps réel sont quasi­ment inexis­tantes sous Linux, encore plus pour des gros quota comme le mien.

    Et puis c’est de plus en plus lent. J’ai vu des messages où ils disent qu’ils n’ont pas de limite mais qu’a­près quelques To leur système devient instable et non garanti. Aujourd’­hui j’ai 300 Go à rattra­per et la vitesse d’en­voi est famé­lique. On me prévoit de l’ordre de 15 jours pour envoyer mes données.

    Je n’ai aucune envie d’at­tendre 2 jours à chaque fois que je décharge ma carte mémoire suite à une séance photo.

    Bref… il est temps de chan­ger.


    J’ai exploré et je n’ai rien trouvé d’équi­valent sur le marché, peu importe le prix. Je vais me rabattre sur des sauve­gardes qui fonc­tionnent par incré­ments régu­liers plutôt qu’en continu.

    Pour mon usage j’ai l’im­pres­sion que la seule alter­na­tive qui se dégage vrai­ment est celle de Borg­base. Avec 2 à 3 To de données, je m’en sors quand même dans les 200 € par an et ça commence à piquer un peu. Je suis aussi à la limite où trou­ver un héber­ge­ment de serveur dédié avec un gros disque pour­rait être inté­res­sant finan­ciè­re­ment.

  • Recherche d’un nouveau NAS

    Je cherche de quoi faire mon prochain NAS.

    Mon idéal serait un petit boitier fanless avec un CPU type i5 ou i7 de dernière géné­ral (ou équi­valent chez AMD), un port Thun­der­bolt, ainsi qu’au moins un espace pour disque 2.5″ et un pour NVMe. Je peux me conten­ter d’un CPU plus raison­nable mais j’ai­me­rais garder quelque chose qui n’est pas juste du mini­mum.

    Malheu­reu­se­ment ce n’est pas une confi­gu­ra­tion que je trouve faci­le­ment, encore moins à prix raison­nable.

    Une alter­na­tive serait un Mac Mini. Ça me permet­trait de l’uti­li­ser comme poste de bureau­tique d’ap­point. Ça n’est pas fanless mais ils ne ventilent quasi­ment pas. Le défaut est que ça demande de mettre un disque externe par USB et que ce n’est pas vrai­ment fait pour tour­ner ainsi 24/7.

    Est-ce que vous auriez des sugges­tions ?


    La petite FAQ, parce que je vous connais…

    Tu utili­sais quoi et pourquoi chan­ger ?

    J’avais un Shut­tle XS35V4 depuis 8–10 ans dans lequel j’avais fini par ajou­ter un module de RAM supplé­men­taire pour arri­ver à 8 Go et sur lequel je faisais tour­ner un Linux de base. Il se bloque systé­ma­tique­ment au bout de quelques jours depuis plus d’un an, le rendant un peu inutile pour mes backups. J’ai tenté la réins­tal­la­tion logi­cielle, mais sans résul­tat.

    Tu fais quoi avec ?

    Le NAS me sert d’ac­cès local mais aussi de hub pour centra­li­ser la sauve­garde.

    Mes fichiers persos sont synchro­ni­sés en ligne avec Treso­rit, qui me permet le chif­fre­ment de bout en bout. Ceux de ma femme sont sur pCloud. On a du Google Drive et d’autres trucs qui trainent. Le NAS va aussi sauve­gar­der mes dépôts git, stocker une copie de tous mes emails, et synchro­ni­ser ou récu­pé­rer en local tout ce qui traine un peu partout à moi sur Inter­net.

    Tout est stocké sur un disque en local, chif­fré au repos, et acces­sible loca­le­ment via SMB. C’est aussi sur ce disque que je stocke mes archives, qui elles ne sont dupliquées nul part ailleurs.

    Le NAS lui-même est sauve­gardé en ligne avec du chif­fre­ment de bout en bout, histoire d’avoir une copie hors-ligne histo­ri­sée. J’avoue que je me sers parfois de cette sauve­garde en ligne pour récu­pé­rer à un fichier d’ar­chive quand je suis hors de chez moi.

    Pourquoi autant de puis­sance ? C’est déme­suré pour un NAS

    Certains logi­ciels de synchro­ni­sa­tion de fichiers ne sont pas faits pour tour­ner en pure ligne de commande. J’ai donc un desk­top Linux qui tourne 24/7. Certains de ces logi­ciels sont aussi parti­cu­liè­re­ment gour­mands en RAM. Rien que Crash­plan m’a forcé à monter à 8 Go de RAM pour ne pas plan­ter lors des dédu­pli­ca­tions. Côté CPU je suis un gros adepte de chif­fre­ment pour mes données donc tout ça fait du chif­fre­ment de partout.

    Enfin, parfois le NAS m’a servi comme PC bureau­tique secon­daire, et là j’ai vrai­ment souf­fert.

    L’ex­pé­rience m’a montré que les carac­té­ris­tiques actuelles étaient proba­ble­ment le plan­cher et que j’au­rais plutôt inté­rêt à cher­cher plus puis­sant en CPU. Avoir la capa­cité d’aug­men­ter la RAM un jour ne ferait pas de mal aussi.

    Ce serait poten­tiel­le­ment diffé­rent si je remplaçais mes logi­ciels de synchro­ni­sa­tion et de backup par des choses plus effi­caces et en pure ligne de commande, mais avec des si

    Pourquoi Fanless ?

    J’ai besoin de pouvoir connec­ter ce NAS à un écran. Il sera donc soit sur mon bureau de travail soit à côté de la télé­vi­sion. Dans les deux cas je suis très réfrac­taire à un bruit de venti­la­teur. J’ai toujours regretté par le passé les options avec venti­la­tion active à cause de ça, et j’avais beau­coup appré­cié par le passage en fanless.

    Pourquoi pas Syno­logy ou autre NAS dédié ?

    Certains logi­ciels que j’uti­lise ne four­nissent de binaire que pour x86 ou Apple Sili­con. Côté OS j’ai bien du Linux mais c’est déjà un peu bancale et ça ne tour­ne­rait pas sur des Linux moins stan­dard. Certains logi­ciels ont d’ailleurs besoin d’une inter­face graphique desk­top.

    Ces NAS ne sont de plus jamais fanless à la connais­sance. Mes expé­riences passées avec Syno­logy me les font exclure à cause du bruit.

    Quel est ton budget ?

    Le moins cher possible, mais sans limite haute ;-)

    Si j’ai l’im­pres­sion que ça vaut le coup, que ça me libère de nouveaux usages (par exemple s’en servir aussi comme vrai poste de travail), je peux mettre le prix qu’il faut.

  • Cherche nouvelle solu­tion de sauve­garde

    J’uti­lise Crash­plan aujourd’­hui pour avoir une sauve­garde hors ligne de ce que contient mon NAS. Les dernières versions sont des goinfres en RAM et j’ai du chan­ger ma barrette récem­ment pour juste faire en sorte que ça ne se crash pas au démar­rage. Malgré tout c’est lent, très lent. Le support lui même dit que rien n’est garan­tit au delà de quelques To.

    Pour l’ins­tant ça tient mais je cherche autre chose.

    Objec­tif : Sauve­gar­der le petit poste debian qui me sert de NAS et ses 1.5 To de données. Ça peut augmen­ter de 500 à 1 To par an mais une fois posées les données changent peu.

    Les pré-requis à priori :

    • Le client doit tour­ner sur un Linux x86
    • Sauve­garde en ligne (pas de mani­pu­la­tion de disque pour faire du hors site)
    • Chif­fre­ment local (ce qui est mis en ligne est chif­fré)
    • Peut stocker 1.5 To aujourd’­hui (versions incluses)
    • Peut évoluer au moins jusqu’à 4 To à terme
    • Permet de récu­pé­rer un fichier ou un groupe de fichiers sans télé­char­ger toute la sauve­garde
    • Permet de récu­pé­rer les versions horaires des fichiers modi­fiés les derniers jours
    • Permet de récu­pé­rer les versions quoti­diennes des fichiers des dernières semaines
    • Permet de récu­pé­rer les versions hebdo­ma­daires des fichiers des derniers mois
    • Permet de récu­pé­rer les versions trimes­trielles des fichiers sur x années (x à déter­mi­ner par moi)
    • Permet de restau­rer le contenu d’un réper­toire à un instant T (modulo les règles de versions plus haut)
    • Perfor­mances correctes (ne mettra pas 2 mois pour envoyer les premiers 1.5 To ni à récu­pé­rer les 4 To si un jour ils crashent)
    • Pas de solu­tion à base de brico­lages de scripts person­nels
    • Budget d’en­vi­ron 5 € TTC mensuels par To stockés en ligne

    Pas indis­pen­sable mais je ne crache­rai pas dessus :

    • Pas besoin de GUI locale hors confi­gu­ra­tion (head­less)
    • Compa­tible avec une Debian stable
    • Permet d’éla­guer les versions (ne garde pas les versions quoti­diennes à vie)
    • Permet d’ef­fa­cer les fichiers suppri­més depuis plus de X années (ceux là je veux vrai­ment les effa­cer)
    • Surveillance conti­nue du système de fichier (et pas des scan complets de plusieurs To à chaque fois qu’on veut véri­fier si quelque chose a changé)
    • Inter­face de restau­ra­tion simple
    • Inter­face de restau­ra­tion graphique
    • Email d’aver­tis­se­ment de la part de l’es­pace en ligne si je ne me suis pas synchro­nisé depuis long­temps
    • Inter­face pour savoir quel % est déjà sauve­gardé een ligne et quel % est en attente de trans­fert
    • Fait de la dédu­pli­ca­tion au moins par fichier
    • Si on peut ajou­ter des clients mac orien­tés laptop (donc souvent inter­rom­pus et qui ne doivent pas réduire l’au­to­no­mie ou occu­per le cpu à faire des scan disque inutiles), ce serait top

    Si néces­saire, je suis prêt à envi­sa­ger de faire le version­ne­ment en local et avoir unique­ment l’état courant sauve­gardé en ligne (en gros, si mon disque local crash, je perds l’his­to­rique mais je peux récu­pé­rer la dernière version). Si vous avez des solu­tions pas trop chères de ce type là, je suis prêt à étudier.


    Je sais, vous voulez des détails. Aujourd’­hui je ne gère qu’un bloc de 1, 5 To mais il pour­rait théo­rique­ment se décou­per ainsi.

    • Une zone d’en­vi­ron 50 Go avec dans les 600 000 fichiers d’email au format mail­dir. C’est de l’im­port. Les fichiers ajou­tés ne sont jamais modi­fiés ou effa­cés ensuite.
      Ça ne montera proba­ble­ment pas de plus de 10% par an.
    • Une zone photo avec 300 Go de jpeg et raw de quelques Mo et quelques vidéos mp4 de quelques dizaines de Mo. Les fichiers ajou­tés peuvent être excep­tion­nel­le­ment dépla­cés mais ne sont quasi­ment jamais modi­fiés.
      Ça ne devrait pas gros­sir de plus de 10 à 20% par an.
    • Une seconde zone photo avec 750 Go avec de gros raw et gros jpeg de quelques dizaines de Mo plus des fichiers de méta­don­nées de quelques ko. Les fichiers ajou­tés peuvent être excep­tion­nel­le­ment dépla­cés mais ne sont quasi­ment jamais modi­fiés. Les fichiers de méta­don­nées seront par contre modi­fiés par périodes, et j’y aime­rais un version­ne­ment au moins à la jour­née.
      Cette zone peut-être amenée à gros­sir de 500 Go à 1 To par an.
    • Une zone d’ar­chi­vage d’en­vi­ron 150 Go de fichiers de quelques Mo qui ne chan­ge­ment jamais ou presque, et qui peut gonfler d’au plus 10% par an.
    • Un zone avec 300 Go de fichiers de travail, essen­tiel­le­ment des images, docu­ments bureau­tiques, mais aussi des archives zip, poten­tiel­le­ment des vidéos. L’écra­sante majo­rité est histo­rique et change peu. C’est toute­fois une zone de travail et les chan­ge­ments doivent être version­nés, idéa­le­ment à l’heure ou à la demie-jour­née. Contrai­re­ment aux autres zones, une partie des docu­ments y sont effa­cés à court ou moyen terme.
      Cette zone ne devrait pas gros­sir de plus de 10% par an.
    • Une zone de synchro de moins de 100 Go, avec des copies des fichiers qui viennent de l’ex­té­rieur et qui sont amenés à toujours chan­ger.
      La taille devrait rester globa­le­ment constante.

    Si rien ne ressort, ça peut se termi­ner par « poser un jeu de gros disques chez un tiers qui a la fibre et faire de la sauve­garde chif­frée dedans » mais ça néces­site de trou­ver quelqu’un qui peut effec­ti­ve­ment stocker ça dans sa cave avec une connexion filaire et qui sait faire les redi­rec­tions appro­priées.

  • Aujourd’­hui c’est (encore et toujours) backup day

    Je note ici toutes mes itéra­tions de backup day.

    La dernière était il y a plus d’un an. J’avais 2 portables et un NAS, tous trois sous Crash­plan.

    Au delà de la sauve­garde, un des portables avait un Drop­box gratuit pour la synchro­ni­sa­tion en ligne, l’autre un Treso­rit payant à 200 Go.

    3 appa­reils crash­plan indé­pen­dants plus un abon­ne­ment à la première offre treso­rit, ça allait finir par faire cher à la fin des offres promo­tion­nelles de nouvel abonné.

    En paral­lèle le Drop­box et le Treso­rit commençaient à être plus qu’à l’étroit sur leurs offres respec­tives donc il y avait quelque chose à chan­ger. Sur le papier ça allait passer de moins de 20 € à plus de 40.


    Au lieu de gérer 3 postes indé­pen­dants, j’ai profité de la synchro­ni­sa­tion et installé Treso­rit sur le NAS.

    L’idée c’est que si tout ce qui est synchro­nisé en ligne se retrouve aussi synchro­nisé sur le NAS, on peut se conten­ter de sauve­gar­der le NAS et reti­rer Crash­plan des portables.

    Je ne m’en sors pas pour moins cher, parce qu’au final j’ai basculé sur l’offre supé­rieure de Treso­rit (afin d’avoir plus d’es­pace) et que je risque aussi de lancer une offre Treso­rit payante pour rempla­cer le Drop­box gratuit du second portable. Au final ce que je vais payer c’est du stockage synchro­nisé en ligne.

    Si vous avez des besoins plus légers ou que vous êtes prêts à ne pas avoir de chif­fre­ment côté client sur l’offre de synchro de fichier, il y a des offres moins chères que Treso­rit.


    Pour l’ins­tant je garde Crash­plan sur le NAS. J’ai plusieurs To et Crash­plan est le seul fiable que j’ai vu à me propo­ser ça sans des prix déli­rants et sans solu­tion brico­lée à la main.

    Si toute­fois vous avez d’autres propo­si­tions à moins de 10 € par mois pour un petit NAS sous Linux (2 To grand mini­mum, chif­fre­ment côté client), je suis toute ouie.

  • Recom­man­da­tions de sauve­garde

    Je vois encore des gens parler sauve­garde et le sujet est trop souvent mal maîtrisé alors j’ajoute quelques notes à mes billets précé­dents :

    Un disque dur ne suffit pas. Ça peut durer plusieurs décen­nies mais aussi tomber en panne dès demain. Une surten­sion élec­trique ou un peu de pous­sière mal placée sur la carte mère du PC peuvent suffire. Un DVD ou une clef USB ont une espé­rance de vie encore plus faible.

    Deux disques en RAID ne suffisent pas. Une surten­sion peut tout à fait les griller en même temps. Le moindre crash de l’OS ou la moindre mauvaise mani­pu­la­tion humaine qui corrom­prait les données risque de toutes façons d’im­pac­ter les deux disques à la fois (et des mauvaises mani­pu­la­tions vous en ferez, la seule ques­tion est quand).

    Un logi­ciel de synchro­ni­sa­tion dans le cloud ne suffit pas non plus. La moindre mauvaise mani­pu­la­tion (et vous en ferez une) y serait auto­ma­tique­ment répliquée. Il vous faut un histo­rique de vos fichiers pour pouvoir reve­nir en arrière d’au moins deux versions.

    Un NAS à la maison avec un logi­ciel de sauve­garde auto­ma­tique c’est déjà mieux (mais vous ne serez couverts que pour les données qui sont à la fois sur votre poste de travail et sur le NAS, celles qui ne sont que sur le second auront un problème de sauve­garde). Main­te­nant il suffit d’un dégât des eaux, un incen­die ou un cambrio­lage pour tout perdre d’un coup.

    Un disque externe stocké chez un ami ou au boulot, que vous rame­nez régu­liè­re­ment chez vous pour faire vos sauve­gardes et débran­chez ensuite ne suffit pas, même si vous avez l’auto-disci­pline suffi­sante pour bien le faire très régu­liè­re­ment. Un jour vous ferez une mauvaise mani­pu­la­tion qui risque de suppri­mer les données sur les deux supports à la fois (« oups, j’ai copié mes anciennes données vers les nouvelles par erreur »), et vous risquez toujours tout à chaque fois que vous le rame­nez chez vous.


    Il vous faut une sauve­garde sur un second support, avec histo­rique, dans un lieu tiers… et bannir toute solu­tion maison ainsi que toute opéra­tion manuelle, qui forcé­ment faillira un jour.

    Il y a de superbes solu­tions en ligne. Ça coute cher mais on branche et on ne s’oc­cupe plus de rien. Pour le même prix ces sauve­gardes sont chif­frées donc la confi­den­tia­lité est garan­tie même si les données fuitent un jour.

    L’al­ter­na­tive maison c’est la sauve­garde par inter­net sur un NAS hébergé ailleurs (ami, bureau, famille) et qui sait garder un histo­rique des anciennes versions. C’est moins cher sur le long terme mais plus cher en coût initial. Ça demande un peu de main­te­nance et ça pose d’autres problèmes (un NAS auto-géré ouvert sur inter­net c’est un problème de sécu­rité poten­tiel si vos données sont confi­den­tielles). C’est encore mieux si le NAS sait chif­frer les données lui aussi (histoire qu’un cambrio­leur n’ac­cède pas aux données confi­den­tielles).

    Les plus para­nos auront les deux, un NAS (local ou distant) et une solu­tion en ligne par dessus. Cein­ture et bretelle mais la solu­tion en ligne suffit géné­ra­le­ment. C’est opéré par des profes­sion­nels qui gère­ront ça vingt mille fois mieux que je ne le ferais avec mon NAS, autant sur la péren­nité, sur la fiabi­lité que sur la sécu­rité.

    La solu­tion du pauvre ce sont deux disques externes. Vous en rame­nez régu­liè­re­ment un à la maison pour y faire une sauve­garde avec un logi­ciel qui garde l’his­to­rique. À tout moment il y en a un à distance au cas où il y ait un inci­dent lors de la mani­pu­la­tion de l’autre (fausse manip humaine, cambrio­lage, incen­die, je ne sais quoi). Ça ne coûte pas cher mais ça demande de l’or­ga­ni­sa­tion, une grande disci­pline pour faire les sauve­gardes régu­liè­re­ment, de l’em­mer­de­ment pour trans­por­ter les disques, et du temps à perdre.