EDIT 24/02/2015 : ‘Il n’est plus nécessaire d’utiliser cloudfiles comme backend pour duplicity. À la place, il faut utiliser un backend spécial hubic intégré à duplicity récemment » voir le commentaire de blankoworld
EDIT 02/2015 : suppression du « DeprecationWarning » dans le log.
EDIT 17/02/2014 : suite à des changements sur Hubic.com, Gu1 à mis à jour python-cloudfiles-hubic. J’ai donc mis à jour mon script en conséquence
Mon ADSL est depuis peut chez OVH. De ce fait je bénéficie d’un compte hubiC avec un espace de stockage d’1To. Quelle aubaine pour des sauvegardes ! Mais bon donner mes mails, mes sites, mes documents administratifs à un tiers… bof bof. Il faudrait un minimum de chiffrage !
Et bien comme disait les autres nuls : « Hassan Cehef c’est possible » avec duplicity et python-cloudfiles-hubic !
python-cloudfiles-hubic est nécessaire car duplicity n’intègre pas nativement le service cloud « HubiC » pour une sombre histoire de protocole d’authentification non standard de la part d’OVH (détail par l’auteur)
Installation
On commence par le plus simple (duplicity) :
aptitude install duplicity
Maintenant python-cloudfiles-hubic :
aptitude install python-setuptools git cd /usr/src git clone https://github.com/Gu1/python-cloudfiles-hubic.git cd python-cloudfiles-hubic python setup.py install
Utilisation
Dans vos paramètre sur hubic.com dans votre menu « Vos application » il va falloir ajouter une application :
- Nom : cequevousvoulez
- Domaine de redirection : http://localhost/
Quand l’application est créer récupérer le « client id » ainsi que le « client secret » dans l’interface
Quelques petits tests pour la prise en main :
# Désactiver le bash_history (c'est pénible avec les mots de passes) unset HISTFILE # Les variables export CLOUDFILES_USERNAME=toto@toujours.lui export CLOUDFILES_APIKEY=je.vais.pas.vous.donner.le.mot.de.passe.de.toto # CLOUDFILES_AUTHURL="hubic|client id|client secret|http://localhost/" export CLOUDFILES_AUTHURL="hubic|api_hubic_XXXX|YYYYY|http://localhost/" # Sauvegarde duplicity /root cf+http://default # Observer l'état duplicity collection-status cf+http://default # Liste les fichiers distants duplicity list-current-files cf+http://default # Test la restauration d'un fichier duplicity --file-to-restore .bash_alias cf+http://default /tmp/bash_alias_recup
Rendez-vous ensuite dans votre interface hubiC. Et là normalement il y a plein de fichier duplicity-BLABLA-blabla.bla ! On supprime tout ! (c’était juste pour les tests)
Il ne semble pas possible d’écrire dans un sous répertoire. Mais, comme je l’ai signalé dans mon commentaire, il semble possible d’écrire dans un autre « container » sur hubiC (autre que default). Il ne sera visible qu’après modification de l’URL. Exemple si vous avez écrit dans le conteneur backup rendez vous sur l’URL : https://hubic.com/home/browser/#backup
Le script
Voici mon script :
#!/bin/bash ################################### ## Backup sur HubiC avec duplicity # Script sous licence BEERWARE # Version 0.4.1 02/2015 ################################### set -eu ##### Paramètres # Utilisateur Hubic HUBICUSER="leuserdevotrehubic" # Mot de passe HubiC HUBICPASSWORD="lemotdepassedevotrehubic" # Application client id Hubic HUBICAPPID="api_hubic_XXXXX" # Application client secret Hubic HUBICAPPSECRET="YYYYYY" # Application domaine de redirection Hubic HUBICAPPURLREDIRECT="http://localhost/" # Liste à sauvegarder (voir le man duplicity avec le filelist) DUPLICITYFILELIST="/etc/backup-`hostname`.filelist" # Passphrase pour le chiffrement PASSPHRASE="VotrePassPhraseDeOufQueYaQueVousEtVousSeulQuiSavez:-p" # Fréquence des sauvegardes complètes FULLIFOLDERTHAN="1W" # Rétention des sauvegardes RETENTION="2M" # Log d'erreur LOGERROR="/var/tmp/backup-hubic-error.log" # Bin de duplicity DUPLICITY_BIN="/usr/bin/duplicity" # Email pour les erreurs (0 pour désactiver) EMAIL="toto@mondomaine.com" # Envoyer un rapport par email sur l'état des backup RAPPORT=1 # Log d'erreur exec 2> ${LOGERROR} ##### Début du script function cleanup { echo "exit..." unset CLOUDFILES_USERNAME unset CLOUDFILES_APIKEY unset PASSPHRASE grep -v "has been deprecated" ${LOGERROR} > ${LOGERROR}.tmp mv ${LOGERROR}.tmp ${LOGERROR} if [ "`stat --format %s ${LOGERROR}`" != "0" ] && [ "$EMAIL" != "0" ] ; then cat ${LOGERROR} | mail -s "$0 - Error" ${EMAIL} fi } trap cleanup EXIT # Gentil avec le système ionice -c3 -p$$ &>/dev/null renice -n 19 -p $$ &>/dev/null if ! [ -f ${DUPLICITYFILELIST} ] ; then echo "Aucun fichier filelist : ${DUPLICITYFILELIST}" exit 1 fi export CLOUDFILES_USERNAME=${HUBICUSER} export CLOUDFILES_APIKEY=${HUBICPASSWORD} export CLOUDFILES_AUTHURL="hubic|${HUBICAPPID}|${HUBICAPPSECRET}|${HUBICAPPURLREDIRECT}" export PASSPHRASE # Backup ${DUPLICITY_BIN} --full-if-older-than ${FULLIFOLDERTHAN} / cf+http://default --include-globbing-filelist ${DUPLICITYFILELIST} --exclude '**' # Suppression des vieux backups ${DUPLICITY_BIN} remove-older-than ${RETENTION} cf+http://default --force # Rapport sur le backup if [ "$RAPPORT" != "0" ] && [ "$EMAIL" != "0" ] ; then ${DUPLICITY_BIN} collection-status cf+http://default | mail -s "$0 - collection-status" ${EMAIL} fi unset CLOUDFILES_USERNAME unset CLOUDFILES_APIKEY unset PASSPHRASE exit 0
A noter que mes bases de données sont dumpées à plat de façon indépendante du script de backup distant (par mysql_dump.sh)
Exemple de fichier filelist :
/etc /var/backups/mysql /var/chroot/bind9/etc/bind /var/lib/mysql /var/lib/awstats /var/lib/mailman /var/spool/cron /var/vmail - /var/www/mercereau.info/wp-content/cache/ - /var/www/default /var/www /home - /root/.cpan - /root/.cache - /root/.npm /root /opt
Attention : les fichiers et répertoires à exclure doivent apparaître avant l’inclusion d’un répertoire parent. En effet, duplicity s’arrête à la première règle qui matche un chemin donné pour déterminer s’il doit l’inclure ou l’exclure. (sources)
Il n’y a plus qu’a le lancer en tâche cron :
44 4 * * * /usr/local/bin/backup-to-hubic.sh