Utiliser HubiC comme espace de backup avec Duplicity

11 Mar

Il y a quelques temps, je vous expliquais comment mettre en place un système de sauvegardes chiffrées avec Duplicity. Je vous propose de voir aujourd’hui comment adapter ce process pour utiliser HubiC, car l’un des soucis majeurs avec les sauvegardes est de disposer d’un espace distant de stockage suffisamment volumineux. Et autant le dire HubiC est un très bon candidat.

La solution HubiC d’OVH est une solution de cloud personnel très compétitive sur le plan tarifaire. L’offre démarre avec 25 Go gratuits, 100 Go de stockage pour 1€ par mois et 10 To de stockage pour 10 € par mois. Autant dire que vous allez pouvoir faire autant de sauvegardes que vous le souhaitez.

Hubic

Le problème, par contre, c’est que cette solution de stockage personnel, que l’on souhaite utiliser comme destination de stockage pour notre backup incrémental, ne propose pas d’interface de connection FTP. Fût un temps où le protocole Webdav était actif (mais pas supporté officiellement) … mais aujourd’hui, HubiC repose sur  OpenStack / Swift.

Certains bricoleurs ont donc cherché comment utiliser l’API Swift, qui est bien documentée, étant notamment utilisée par le service d’hébergement de RackSpace, Cloud Files. Le hic, c’est que le protocole d’authentification utilisé par HubiC n’est pas tout à fait standard et que la phase d’authentification n’est pas identique à celle de Swift.

J’ai testé pas mal de solutions, l’une permettant de monter votre dossier HubiC comme un point de partage réseau, l’autre permettant de créer une sorte de proxy accessible et FTP et faisant l’interface avec le container OpenStack, ou bien encore un client Swift.

Et après pas mal de tentatives pas complètement satisfaisantes, j’ai trouvé sur un blog quelqu’un de suffisamment astucieux pour avoir modifié la librairie python-cloudfiles, utilisée par Duplicity pour le support du service CloudFiles pour supporter HubiC. J’ai repris de mon côté son travail pour supprimer un message d’alerte. Voici en détails comment la tout mettre en place.

Etape 1 : patcher la lib python-cloudfiles pour supporter l’authentification Hubic

Dans votre terminal :

apt-get install python-setuptools git
cd /usr/src
git clone https://github.com/yvangodard/python-cloudfiles-hubic.git
cd python-cloudfiles-hubic
python setup.py  install
rm -R /usr/src/python-cloudfiles-hubic

Etape 2 : enregistrer une application pour utiliser l’API

Rendez-vous sur votre compte HubiC, et dans les paramètres, choisissez « Ajouter une application » puis entrez les paramètres suivants :

  • Nom : un_nom_de_votre_choix
  • Domaine de redirection : http://localhost/

Et récupérez le client_id et le client_secret :

HubiC API

Etape 3 : tester Duplicity avec le support de HubiC

Si ce n’est pas fait, c’est le moment pour installer Duplicity :

apt-get install duplicity

Et vous pouvez ensuite faire quelques tests à l’aide des commandes suivantes. Pensez à remplacer les variables suivantes :

  • CLOUDFILES_USERNAME contiendra votre adresse de connexion associée à votre compte HubiC
  • CLOUDFILES_APIKEY contiendra le mot de passe de votre compte HubiC
  • CLOUDFILES_AUTHURL contiendra les client_id et le client_secret récupérés à l’étape 2, sous la forme : CLOUDFILES_AUTHURL="hubic|client_id|client_secret|http://localhost/"
# Désactiver le bash_history et supprimer les anciennes variables
unset HISTFILE
unset CLOUDFILES_USERNAME
unset CLOUDFILES_APIKEY
unset CLOUDFILES_AUTHURL
# Entrons les variables 
export CLOUDFILES_USERNAME=monloginhubic@monfai.fr
export CLOUDFILES_APIKEY=MotDePasseDeMonCompteHubic
export CLOUDFILES_AUTHURL="hubic|api_hubic_XXXX|YYYYY|http://localhost/"
# Lançons une première sauvegarde de test
duplicity /root cf+http://default
# Observons l'état
duplicity collection-status cf+http://default
# Listons les fichiers distants 
duplicity list-current-files cf+http://default
# Testons la restauration d'un fichier 
duplicity --file-to-restore /etc/ cf+http://default /tmp/bash_alias_recup

Pour réaliser le backup, il vous sera demandé d’entrer une passphrase (utilisée pour le chiffrement). Vous pouvez en générer une ici en créant un mot de passe de 50 caractères par exemple.

Pour vérifier que tout fonctionne, vérifiez en ligne, sur votre espace HubiC que les volumes de backup ont été uploadés. Vous devriez trouver là tout une liste de fichier commençant pas « duplicity-****** ». Sélectionnez-les tous, supprimez les.

Ensuite nous allons faire un peu de ménage en local :

duplicity cleanup cf+http://default

Comme l’explique David Mercereau sur son blog, il ne e semble pas possible d’écrire dans un sous-répertoire. Si vous souhaitez isoler les fichiers de backup, il est possible d’écrire dans un autre “container” sur HubiC (autre que « default »), par exemple en faisant votre backup ainsi :

duplicity /root cf+http://backup

Vous ne verrez pas en ligne les fichiers sans modifier manuellement l’URL ainsi https://hubic.com/home/browser/#backup/ (n’oubliez pas ‘/’ à la fin) :

HubiC

Etape 4 : mettre en place les scripts de backup de Duplicity

Comme je l’avais indiqué dans mon premier billet sur Duplicity, nous allons installer ces script dans le répertoire /usr/local/sbin :

# On récupère les scripts
wget -O /usr/local/sbin/master-backup-cleanup.sh --no-check-certificate https://raw.github.com/yvangodard/Scripts-Utiles/master/duplicityscripts/scripts/master-backup-cleanup.sh
wget -O /usr/local/sbin/master-backup-listing.sh --no-check-certificate https://raw.github.com/yvangodard/Scripts-Utiles/master/duplicityscripts/scripts/master-backup-listing.sh
wget -O /usr/local/sbin/master-backup-restore.sh --no-check-certificate https://raw.github.com/yvangodard/Scripts-Utiles/master/duplicityscripts/scripts/master-backup-restore.sh
wget -O /usr/local/sbin/master-backup-status.sh --no-check-certificate https://raw.github.com/yvangodard/Scripts-Utiles/master/duplicityscripts/scripts/master-backup-status.sh
wget -O /usr/local/sbin/master-backup-verify.sh --no-check-certificate https://raw.github.com/yvangodard/Scripts-Utiles/master/duplicityscripts/scripts/master-backup-verify.sh
wget -O /usr/local/sbin/master-backup.sh --no-check-certificate https://raw.github.com/yvangodard/Scripts-Utiles/master/duplicityscripts/scripts/master-backup.sh

# On les rends exécutables
sudo chmod +x /usr/local/sbin/master-backup*

Je vous invite ensuite à vous reporter à mon premier billet sur Duplicity pour voir comment utiliser ces scripts. Il vous faudra juste éditer le fichier de configuration (par exemple /etc/master-backup.conf) et y entrer les variables suivantes :

  • URL=cf+http://default (ou tout autre containter, comme indiqué à l’étape 3)
  • HUBICUSER= votre adresse de connexion associée à votre compte HubiC
  • HUBICPASSWORD= votre mot de passe de connexion associée à votre compte HubiC
  • HUBICAPPID= client_id récupéré à l’étape 2
  • HUBICAPPSECRET= client_secret récupéré à l’étape 2
  • HUBICAPPURLREDIRECT=http://localhost/

Amusez-vous bien maintenant !

  • Kevin C.

    Bonjour,

    Merci pour ce tutoriel !

    Je l’ai suivi à la lettre mais me retrouve malheureusement coincé à l’étape de test
    « Connection failed, please check your credentials: AuthenticationFailed Incorrect/unauthorized credentials received »

    J’ai beau double et triple checker login hubic/pwd hubic/client id/client secret. J’arrive à court d’idée. Est-ce que ça fonctionne toujours de votre côté ?
    (j’ai même changé mail et pwd du compte en pensant que le pb pouvait venir d’éventuels caractères spéciaux…)

    Merci pour votre réponse !

    Kevin

    • http://about.me/ygodard Yvan GODARD

      De mon côté, sur plusieurs petits serveurs qui sont sauvegardés ainsi, aucun problème.
      Par contre, assez curieusement, de manière complètement aléatoire, je rencontre ce problème de temps à autre (environ une fois par semaine sur chaque backup). Attentez quelques temps et retentez … et tenez-moi au courant.

      • Kevin C.

        Bonjour,
        Bon j’ai réalisé d’autres tests sur plusieurs jours… avec un autre compte hubic (sait-on jamais) et depuis une autre connexion (histoire de m’assurer que je n’ai pas un problème de proxy) et même un autre PC… rien n’y fait : toujours la même erreur.
        À chaque fois, j’ai travaillé sur une installation « fraîche » d’Ubuntu 14.04 avec duplicity 0.6.23 préinstallé. Je me demande donc si c’est moi qui rate quelque chose dans l’installation ou s’il est possible que le patch ne fonctionne pas avec cette version de duplicity (?)…
        Une question, à tout hasard : j’exécute avec succès les étapes 1 et 2 du tutoriel. Lorsque j’exécute le script de l’étape 3, j’obtiens l’erreur suivante :
        “BackendException: This backend requires the pyrax library available from Rackspace.” ;
        que je corrige à l’aide des commandes suivantes :
        “apt-get install python-pip
        pip install pyrax”
        Celà vous paraît-il correct ?
        C’est ensuite, seulement, que je rencontre le fameux :
        “Connection failed, please check your credentials: AuthenticationFailed Incorrect/unauthorized credentials received”

        • http://about.me/ygodard Yvan GODARD

          Vous avez essayé avec une version plus ancienne ?
          De mon côté ça tourne sur du Debian 6 et Debian 7 … donc pas tout à fait la même config que vous …

          • Kevin C.

            Alors, il semble qu’il y ait un bug, mais pas celui auquel je pensais.

            duplicity, depuis sa version 0.6.23 utilise pyrax à la place du backend cloudfiles. cf. changelog :
            “* Changed to default to pyrax backend rather than cloudfiles backend.
            To revert to the cloudfiles backend use ‘–cf-backend=cloudfiles’”
            (c’est confirmé par un Wireshark qui me montre que je ne tape pas du tout chez Hubic)

            Le problème est que l’option cf-backend n’est apparemment plus supportée malgré le fait qu’elle est mentionnée dans man.
            “duplicity: error: no such option: –cf-backend”
            (erreur soulevée dans le ticket Launchpad mentionné plus haut)

            Donc oui, il va me falloir downgrader duplicity, ou trouver comment faire fonctionner cf-backend, ou faire fonctionner Hubic avec le backend pyrax.
            Je recommenterai quand j’aurai trouvé la solution. :)

          • http://about.me/ygodard Yvan GODARD

            Pour info, la version que j’utilise est la suivante : duplicity 0.6.08b

          • Alexis

            Merci Yvan, j’ai utilisé ta solution pendant un bon moment….

            Mais depuis quelques temps, même problème que Kevin.

            « BackendException: This backend requires the pyrax library available from Rackspace. »

            après avoir installé pyrax avec pip, j’ai le message dessous…

            Bref, Kevin, as-tu trouvé une solution ?

            ——-

            Traceback (most recent call last):

            File « /usr/bin/duplicity », line 1494, in

            with_tempdir(main)

            File « /usr/bin/duplicity », line 1488, in with_tempdir

            fn()

            File « /usr/bin/duplicity », line 1322, in main

            action = commandline.ProcessCommandLine(sys.argv[1:])

            File « /usr/lib/python2.7/dist-packages/duplicity/commandline.py », line 1036, in ProcessCommandLine

            backup, local_pathname = set_backend(args[0], args[1])

            File « /usr/lib/python2.7/dist-packages/duplicity/commandline.py », line 929, in set_backend

            globals.backend = backend.get_backend(bend)

            File « /usr/lib/python2.7/dist-packages/duplicity/backend.py », line 163, in get_backend

            return _backends[pu.scheme](pu)

            File « /usr/lib/python2.7/dist-packages/duplicity/backends/_cf_pyrax.py », line 67, in __init__

            % (e.__class__.__name__, util.uexc(e)),

            NameError: global name ‘util’ is not defined

            exit…

          • http://about.me/ygodard Yvan GODARD

            Alexis, je ne sais pas si cela t’intéressera encore, mais je viens de détailler comment utiliser une version plus récente de Duplicity avec Hubic pour éviter le problème rencontré …
            http://www.yvangodard.me/hubic-backup-duplicity-backend-pyrax

          • Alexis

            Merci Yvan de m’avoir prévenu !

          • http://about.me/ygodard Yvan GODARD

            Si vous voulez tester, il semble qu’un gus a mis en place l’authentification Pyrax + Hubic : http://gu1.aeroxteam.fr/2013/03/17/hubic-et-duplicity/

          • Kevin C.

            Oui, j’avais vu et je garde ce lien au chaud… mais ça va me demander un peu plus de bidouille, il va falloir que je me penche un peu plus sur le problème (c’est autre chose que de suivre bêtement un tutoriel)…

          • http://about.me/ygodard Yvan GODARD

            Pour info, c’est maintenant intégré dans Duplicity. Voici le tuto pour l’utilisation de Duplicity avec le backend pyrax adapté à Hubic : http://www.yvangodard.me/hubic-backup-duplicity-backend-pyrax/

  • kartoch2

    Bonjour,

    J’ai proposé une solution + simple mais potentiellement moins « intégré » que votre proposition:

    http://www.lifl.fr/~iguchi-c/posts/2013/12/12/duplicity-hubic/

    Je serai intéressé d’avoir une comparaison entre nos solutions…

    Merci.

  • kartoch2

    Bonsoir,

    je viens de proposer l’intégration de Hubic comme backend dans duplicity. Cela permettra le support natif (afin d’éviter les bricolages).

    Le merge proposal est ici:

    https://code.launchpad.net/~kartoch/duplicity/hubic/+merge/231126

    Plus d’explication ici:

    https://forums.hubic.com/showthread.php?3519-native-support-of-Hubic-in-Duplicity&p=10190#post10190

  • Nico

    Bonjour j’ai un petit problème en suivant votre tutoriel.

    Je suis bloqué à la ligne suivante

    « git clone https://github.com/yvangodard/python-cloudfiles-hubic.git »

    En effet lorsque l’on me demande d’appuyer sur « RETURN » j’ai le message suivant qui apparaît et qui me stop la procédure.

    « /usr/bin/gitfm: fatal error: `chdir’ failed: permission denied. »

    Je précise que je suis logué en root.

    Avez-vous une idée du pourquoi du comment.

    En vous remerciant par avance

  • Antonio

    Bonjour, j’ai bien vu qu’il y avait un nouvel article sur l’usage de pyrax en backend, mais j’avais quelques questions par rapport à tes scripts :
    – est-ce qu’ils permettent de garder plusieurs versions des fichiers, à la manière de la sauvegarde hubic ?

    – comment apparaissent ces sauvegardes dans hubic ? comme un contenu du répertoire de sync ou comme une sauvegarde ?
    – dans la mesure ou j’ai 600 go à sauvegarder, ne vaut-il pas mieux découper ces volumes en x sauvegardes plus petites et plus faciles à manipuler ?
    – si je comprends bien, une sauvegarde = 1 fichier compressé qui contient tous le contenu ?

    Merci bien pour tes réponses

    • http://about.me/ygodard Yvan GODARD

      Bonjour,
      le principe de Duplicity c’est bien de gérer des backup en incrémental (et donc de garder x versions du fichier/dossier) et les scripts proposés permettent bien d’utiliser cette fonctionnalité native de Duplicity.
      Quelque soit l’endroit où seront stockés les backups par Duplicity (en FTP, SSH, sur Hubic ou autre) ils sont stockés sous forme de volumes chiffrés de 100 Mo chacun. Donc en fonction du volume de sauvegarde il y aura x volumes.
      Impossible donc d’accéder directement aux fichiers sur Hubic. Il faudra utiliser Duplicity (en direct en ligne de commande ou en utilisant mon script master-backup-restore.sh) pour déchiffrer le contenu et le télécharger.

  • greg

    Bonjour et merci pour ce tuto !! Savez-vous s’il est possible d’obtenir la liste (et autres infos si possible) des « containers » ?

  • Eric Doutreleau

    Bonjour
    Bravo pour cette documentation cela fonctionne vraiment parfaitement.
    j’ai maintenant un petit souci. Y a t il un moyen de limiter la bande passante utilisée?
    j’ai bien peur que ma ligne vdsl souffre pendant la sauvegarde si je ne limite pas un peu le processus.

  • Christophe Furmaniak

    Y-a-t’il un moyen que les fichiers duplicity sauvegardés apparaissent dans la partie « sauvegarde » de hubic plutôt que dans l’espace « classique » (qui est potentiellement donc synchronisé avec tous les postes connectés à ce compte)?

#JeSuisCharlie