{"id":2929,"date":"2018-04-04T14:00:41","date_gmt":"2018-04-04T12:00:41","guid":{"rendered":"http:\/\/www.unicoda.com\/?p=2929"},"modified":"2019-04-05T23:25:58","modified_gmt":"2019-04-05T21:25:58","slug":"sauvegarde-distante-avec-duplicity","status":"publish","type":"post","link":"https:\/\/www.unicoda.com\/?p=2929","title":{"rendered":"Sauvegarde distante avec duplicity"},"content":{"rendered":"<p>Suite \u00e0 la migration de la majorit\u00e9 de mon nuage de services vers mon r\u00e9seau en passant \u00e0 l&rsquo;auto-h\u00e9bergement, la question de la sauvegarde des donn\u00e9es est devenue cruciale. C\u00f4t\u00e9 cahier des charges, les principaux crit\u00e8res retenus \u00e9taient les suivants :<\/p>\n<ul>\n<li>Sauvegarde externe g\u00e9ographiquement<\/li>\n<li>Automatique<\/li>\n<li>Chiffr\u00e9e<\/li>\n<\/ul>\n<p>Apr\u00e8s de nombreuses recherches, j&rsquo;ai d\u00e9cid\u00e9 d&rsquo;utiliser duplicity pour r\u00e9aliser la sauvegarde et le service hubiC d&rsquo;OVH pour le stockage des donn\u00e9es sauvegard\u00e9es. Voici donc la proc\u00e9dure utilis\u00e9e pour mettre en place une sauvegarde incr\u00e9mentale quotidienne, avec sauvegarde compl\u00e8te \u00e0 intervalle r\u00e9gulier.<\/p>\n<p>Pour commencer, il convient d&rsquo;installer les composants n\u00e9cessaires:<\/p>\n<pre>sudo aptitude install duplicity python-pip python-dev gcc\nsudo pip2 install pyrax<\/pre>\n<p>Ayant d\u00e9cid\u00e9 d&rsquo;envoyer les sauvegardes dans mon espace hubiC, et afin de permettre \u00e0 duplicity de communiquer avec hubiC, il faut au pr\u00e9alable autoriser l&rsquo;application dans l&rsquo;interface web du service. On va donc cr\u00e9er une nouvelle application, renseigner un nom, duplicity par exemple, et un domaine de redirection valant http:\/\/localhost\/. On note ensuite les param\u00e8tres \u00ab\u00a0Client ID\u00a0\u00bb et \u00ab\u00a0Client secret\u00a0\u00bb qui serviront pour param\u00e9trer la connexion \u00e0 hubiC sur la machine source.<\/p>\n<p>Le param\u00e9trage s&rsquo;effectue dans le fichier <code>~\/.hubic_credentials<\/code> :<\/p>\n<pre>[hubic]\nemail = your_email\npassword = your_password\nclient_id = api_client_id\nclient_secret = api_secret_key\nredirect_uri = http:\/\/localhost\/<\/pre>\n<p>On limite ensuite les droits li\u00e9s au fichier:<\/p>\n<pre>chown 600 ~\/.hubic_credentials<\/pre>\n<p>A ce stade, on peut faire un premier test afin de valider la configuration, par exemple, sauvegarder le r\u00e9pertoire test dans le conteneur test qui sera accessible \u00e0 l&rsquo;adresse suivante: <code>https:\/\/hubic.com\/home\/browser\/#test<\/code>.<\/p>\n<pre>duplicity test cf+hubic:\/\/test<\/pre>\n<p>Pour lister le contenu du r\u00e9pertoire distant, la commande d\u00e9di\u00e9e est:<\/p>\n<pre>duplicity list-current-files cf+hubic:\/\/test<\/pre>\n<p><!--more--><\/p>\n<p>Pour la gestion des op\u00e9rations de sauvegarde, j&rsquo;utilise un petit script sh, adaptation de celui de David Mercereau:<\/p>\n<pre>#!\/bin\/bash\n\n###################################\n## Backup sur HubiC avec duplicity\n# Script sous licence BEERWARE\n# Version 0.5.0 11\/2017\n# Adapt\u00e9 de :\n# http:\/\/david.mercereau.info\/backup-chiffre-avec-duplicity-sur-hubic\n###################################\n\nset -eu\n\n##### Param\u00e8tres\n\n# Nom du d\u00e9p\u00f4t\nCONTAINER=\"monContaineur\"\n# Liste \u00e0 sauvegarder (voir le man duplicity avec le filelist)\nDUPLICITYFILELIST=\"\/chemin\/vers\/backup.filelist\"\n# Passphrase pour le chiffrement\nPASSPHRASE=\"maSuperPassphrase\"\n# Fr\u00e9quence des sauvegardes compl\u00e8tes\nFULLIFOLDERTHAN=\"1W\"\n# R\u00e9tention des sauvegardes\nRETENTION=\"1M\"\n# Log d'erreur\nLOGERROR=\"\/chemin\/vers\/fichierDeLog.log\"\n# Bin de duplicity\nDUPLICITY_BIN=\"\/usr\/bin\/duplicity\"\n# Email pour les erreurs (0 pour d\u00e9sactiver)\nEMAIL=\"monMail@domaine.extension\"\n# Envoyer un rapport par email sur l'\u00e9tat des backup\nRAPPORT=0\n# Log d'erreur\nexec 2&gt; ${LOGERROR}\n\n##### D\u00e9but du script\n\nfunction cleanup {\n echo \"exit...\"\n unset PASSPHRASE\n grep -v \"has been deprecated\" ${LOGERROR} &gt; ${LOGERROR}.tmp\n mv ${LOGERROR}.tmp ${LOGERROR}\n if [ \"`stat --format %s ${LOGERROR}`\" != \"0\" ] &amp;&amp; [ \"$EMAIL\" != \"0\" ] ; then\n cat ${LOGERROR} | mail -s \"$0 - Error\" ${EMAIL}\n fi\n}\ntrap cleanup EXIT\n\n# Gentil avec le syst\u00e8me\nionice -c3 -p$ &amp;&gt;\/dev\/null\nrenice -n 19 -p $ &amp;&gt;\/dev\/null\n\nif ! [ -f ${DUPLICITYFILELIST} ] ; then\n echo \"Aucun fichier filelist : ${DUPLICITYFILELIST}\"\n exit 1\nfi\n\nexport PASSPHRASE\n\n# Backup\n${DUPLICITY_BIN} --full-if-older-than ${FULLIFOLDERTHAN} \/ cf+hubic:\/\/${CONTAINER} --include-filelist ${DUPLICITYFILELIST} --exclude '**'\n\n# Suppression des vieux backups\n${DUPLICITY_BIN} remove-older-than ${RETENTION} cf+hubic:\/\/${CONTAINER} --force\n\n# Rapport sur le backup\nif [ \"$RAPPORT\" != \"0\" ] &amp;&amp; [ \"$EMAIL\" != \"0\" ] ; then\n ${DUPLICITY_BIN} collection-status cf+hubic:\/\/${CONTAINER} | mailq -s \"$0 - collection-status\" ${EMAIL}\nfi\n\nunset PASSPHRASE\n\nexit 0<\/pre>\n<p>On n&rsquo;oublie pas d&rsquo;adapter les param\u00e8tres et de rendre le script ex\u00e9cutable:<\/p>\n<pre>chmod u+x backup-to-hubic.sh<\/pre>\n<p>On ajoute \u00e9galement un fichier <code>backup.filelist<\/code> qui contient l&rsquo;ensemble des chemins des dossiers \u00e0 sauvegarder. Le fichier est de la forme:<\/p>\n<pre>\/var\/backups\/mysql\n- \/var\/www\/mon-site\/dossier-a-ignorer\/cache\n\/var\/www\/mon-site<\/pre>\n<p>L&rsquo;\u00e9tat de la sauvegarde peut \u00eatre v\u00e9rifi\u00e9 avec la commande:<\/p>\n<pre>duplicity collection-status cf+hubic:\/\/test<\/pre>\n<p>Afin d&rsquo;ex\u00e9cuter le script \u00e0 intervalles r\u00e9gulier, on ajoute une ligne au cron (<code>crontab -e<\/code>):<\/p>\n<pre>0 0 * * * \/chemin\/vers\/backup-to-hubic.sh<\/pre>\n<p>A ce stade, les diff\u00e9rents dossiers list\u00e9s sont sauvegard\u00e9s vers hubiC de mani\u00e8re incr\u00e9mentale et chiffr\u00e9e. Des sauvegardes compl\u00e8tes sont effectu\u00e9es p\u00e9riodiquement et nettoy\u00e9es automatiquement \u00e0 l&rsquo;issue de la dur\u00e9e de conservation configur\u00e9e. Par ailleurs, on n&rsquo;oubliera pas de sauvegarder la passphrase utilis\u00e9e pour chiffrer les donn\u00e9es dans un gestionnaire de mots de passe, afin d&rsquo;\u00eatre en mesure de reconfigurer duplicity sur une autre machine et de r\u00e9cup\u00e9rer les fichiers en cas de crash complet de la machine source (ce que je ne souhaite \u00e0 personne).<\/p>\n<p>Pour finir voici la liste des articles utilis\u00e9s pour impl\u00e9menter cette solution de sauvegarde:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><a href=\"http:\/\/david.mercereau.info\/backup-chiffre-avec-duplicity-sur-hubic\/\" target=\"_blank\" rel=\"noopener noreferrer\"><em>Backup chiffr\u00e9 avec duplicity sur HubiC<\/em><\/a> de David Mercereau<\/li>\n<li><a href=\"http:\/\/tech-off.fr\/index.php?article11\/pluxml-sauvegardes-vers-hubic\" target=\"_blank\" rel=\"noopener noreferrer\">PluXML: Sauvegardes vers Hubic<\/a> sur Tech-Off&rsquo;s Blog<\/li>\n<li><a href=\"https:\/\/help.ubuntu.com\/community\/DuplicityBackupHowto\" target=\"_blank\" rel=\"noopener noreferrer\">DuplicityBackupHowto<\/a> sur la documentation Ubuntu<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Suite \u00e0 la migration de la majorit\u00e9 de mon nuage de services vers mon r\u00e9seau en passant \u00e0 l&rsquo;auto-h\u00e9bergement, la question de la sauvegarde des donn\u00e9es est devenue cruciale. C\u00f4t\u00e9 cahier des charges, les principaux crit\u00e8res retenus \u00e9taient les suivants : Sauvegarde externe g\u00e9ographiquement Automatique Chiffr\u00e9e Apr\u00e8s de nombreuses recherches, j&rsquo;ai d\u00e9cid\u00e9 d&rsquo;utiliser duplicity pour &hellip; <a href=\"https:\/\/www.unicoda.com\/?p=2929\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;Sauvegarde distante avec duplicity&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[337,316,31,415],"tags":[357,358,268],"class_list":["post-2929","post","type-post","status-publish","format-standard","hentry","category-auto-hebergement","category-configuration","category-installation","category-sauvegarde","tag-duplicity","tag-hubic","tag-sauvegarde"],"_links":{"self":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/2929","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2929"}],"version-history":[{"count":10,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/2929\/revisions"}],"predecessor-version":[{"id":3485,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/2929\/revisions\/3485"}],"wp:attachment":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}