{"id":1815,"date":"2015-09-08T23:55:49","date_gmt":"2015-09-08T21:55:49","guid":{"rendered":"https:\/\/www.fanjoe.be\/?p=1815"},"modified":"2019-06-04T02:25:06","modified_gmt":"2019-06-04T00:25:06","slug":"raspberry-pi-upload-dun-backup-vers-une-serveur-ftp-avec-la-commande-curl","status":"publish","type":"post","link":"https:\/\/www.fanjoe.be\/?p=1815","title":{"rendered":"Raspberry Pi : Upload d&rsquo;un backup vers un serveur FTP avec la commande cURL"},"content":{"rendered":"<h1>Introduction<\/h1>\n<p>Il y a quelques temps, j&rsquo;ai publi\u00e9 des articles qui d\u00e9crivaient la marche \u00e0 suivre pour effectuer un backup de la carte SD d&rsquo;un Raspberry Pi :<\/p>\n<ul>\n<li><a href=\"https:\/\/www.fanjoe.be\/?p=422\" target=\"_blank\" rel=\"bookmark noopener noreferrer\">Raspberry Pi : Automatisation du backup en local<\/a><\/li>\n<li><a href=\"https:\/\/www.fanjoe.be\/?p=1373\" target=\"_blank\" rel=\"bookmark noopener noreferrer\">Raspberry Pi : Script de backup de la carte SD<\/a><\/li>\n<\/ul>\n<p>Probl\u00e8me, en cas de cambriolage, d&rsquo;incendie ou de d\u00e9fauts \u00e9lectriques comme la foudre, on peut perdre le Pi et le HD contenant les backups.<\/p>\n<p>La solution d\u00e9crite ci-dessous va nous permettre d&rsquo;uploader la sauvegarde vers le cloud en FTP gr\u00e2ce \u00e0 la commande <a href=\"https:\/\/fr.wikipedia.org\/wiki\/CURL\" target=\"_blank\" rel=\"noopener noreferrer\">cURL<\/a>.<!--more--><\/p>\n<h1>Mise en \u0153uvre<\/h1>\n<h2>Upload<\/h2>\n<p>Nous allons utiliser la commande <code>CURL<\/code> pour envoyer le fichier <code>backup-YYYYmmdd-hhmm.gz<\/code> vers le serveur FTP.<\/p>\n<p>Dans notre exemple, nous utiliserons le serveur <code>ftp.netcourrier.com<\/code> sur lequel j&rsquo;ai un espace payant.<\/p>\n<pre>$ sudo curl -T \/media\/RPi-USB-Dsk\/Backups\/backup-YYYYmmdd-hhmm.gz ftp:\/\/ftp.netcourrier.com\/CheminVersBackup\/ --user <span style=\"color: #ff0000;\">Login<\/span>:<span style=\"color: #ff0000;\">Password<\/span> --disable-epsv<\/pre>\n<p>L&rsquo;option <code>-T<\/code> permet d&rsquo;uploader un fichier.<\/p>\n<p>On indique ensuite le chemin vers le fichier d&rsquo;origine.<\/p>\n<p>Puis, le chemin vers le dossier de destination.<\/p>\n<p>Le login et le mot de passe viennent apr\u00e8s <code>--user<\/code>. On peut \u00e9galement utiliser l&rsquo;abr\u00e9viation <code>-u <span style=\"color: #ff0000;\">Login<\/span>:<span style=\"color: #ff0000;\">Password<\/span><\/code> en d\u00e9but de commande.<\/p>\n<p><strong>Attention !<\/strong> : Si le login contient un <code>@<\/code> (Ex: une adresse mail comme login) on passera par un script dans lequel on d\u00e9finira des constantes :<\/p>\n<pre>log=login@netcourrier.com\npass=Password<\/pre>\n<p>Elles seront reprises comme ceci dans la commande du script :<\/p>\n<pre>curl -T \/media\/RPi-USB-Dsk\/Backups\/backup-YYYYmmdd-hhmm.gz ftp:\/\/ftp.netcourrier.com\/CheminVersBackup\/ --user <span style=\"color: #ff0000;\">$log<\/span>:<span style=\"color: #ff0000;\">$pass<\/span> --disable-epsv<\/pre>\n<p>L&rsquo;option <code>--disable-epsv<\/code><span class=\"notranslate\"> indique au serveur d&rsquo;entamer une session FTP passive plut\u00f4t qu&rsquo;active.<\/span><\/p>\n<h2>Suppression d&rsquo;un fichier<\/h2>\n<p>Pour supprimer un fichier la commande est similaire :<\/p>\n<pre>curl ftp:\/\/ftp.netcourrier.com\/Backups_RPi\/ -Q \"-DELE backup-$(date --date=\"21 days ago\" +%Y%m%d)-0330.gz\" --user $log:$pass --disable-epsv<\/pre>\n<p>L\u00e0, on va supprimer un backup \u00e2g\u00e9 de 3 semaines pour ne garder que les 3 plus r\u00e9cents sur le serveur.<\/p>\n<h2>Limiter la vitesse de transfert<\/h2>\n<p>Afin de ne pas monopoliser toute la bande passante montante, on peut limiter la vitesse de transfert avec cette option \u00e0 la fin de la commande :<\/p>\n<pre>--limit-rate &lt;speed&gt;<\/pre>\n<p>Par d\u00e9faut les valeurs <code>&lt;speed&gt;<\/code> sont donn\u00e9es en octets\/sec. Mais on peut d\u00e9finir le vitesse en ko\/sec ou mo\/sec avec <code>k<\/code> ou <code>m<\/code> :<\/p>\n<pre>--limit-rate 50k<\/pre>\n<p>Pour 50 ko\/sec.<\/p>\n<h1>Le script<\/h1>\n<p>Je vous sugg\u00e8re de reprendre le script r\u00e9alis\u00e9 dans <a href=\"https:\/\/www.fanjoe.be\/?p=1373\" target=\"_blank\" rel=\"noopener noreferrer\">cet article<\/a> et d&rsquo;y ajouter quelques lignes \u00e0 la fin.<\/p>\n<p>Pour rappel, on \u00e9dite le fichier comme ceci :<\/p>\n<pre>$ sudo nano \/home\/pi\/RPi-Backup.sh<\/pre>\n<pre><span style=\"color: #808080;\">#!\/bin\/sh\n\necho \"Ex\u00e9cution du script de Backup\"\necho \"=============================\"\necho \"$(date +%Y%m%d-%T)\"\necho\n\n# M\u00e9morisation de l'heure du d\u00e9but du backup\nhback=$(date +%H%M)\n\n# Arret des services\necho\necho \"$(date +%Y%m%d-%T) : Arret des services\"\necho\nsudo service minidlna stop\nsudo service transmission-daemon stop\nsudo service nginx stop\nsudo service mysql stop\nsudo service php5-fpm stop\nsudo service fr24feed stop\n\nsleep 3\n\n# Suppression des paquets p\u00e9rim\u00e9s\necho\necho \"$(date +%Y%m%d-%T) : Suppression des paquets p\u00e9rim\u00e9s\"\necho\nsudo apt-get autoclean\n\nsleep 3\n\n# Suppression du contenu de la corbeille de Root\necho\necho \"$(date +%Y%m%d-%T) : Suppression du contenu de la corbeille de Root\"\necho\nsudo rm -r -f -v \/root\/.local\/share\/Trash\/files\/*\n\n# Suppression du contenu de la corbeille de Pi\necho\necho \"$(date +%Y%m%d-%T) : Suppression du contenu de la corbeille de Pi\"\necho\nsudo rm -r -f -v \/home\/pi\/.local\/share\/Trash\/files\/*\n\nsleep 3\n\n# Suppression du contenu de UpDraft Plus\necho\necho \"$(date +%Y%m%d-%T) : Suppression du contenu de UpDraft Plus\"\necho\nsudo rm -r -f -v \/var\/www\/wordpress\/wp-content\/updraft\/*.gz\n\nsleep 3\n\n# Remplissage de l'espace libre par des z\u00e9ros\necho\necho \"$(date +%Y%m%d-%T) : Remplissage de l'espace libre par des z\u00e9ros\"\necho\n\nsudo sync\n\nsudo dd if=\/dev\/zero of=\/home\/pi\/Desktop\/zero.small.file bs=1024 count=102400\nsudo dd if=\/dev\/zero of=\/home\/pi\/Desktop\/zero.file bs=1024\n\nsudo sync\nsleep 30\nsudo sync\n\nsleep 3\n\n# Suppression des fichiers de z\u00e9ros\necho\necho \"$(date +%Y%m%d-%T) : Suppression des fichiers de z\u00e9ros\"\necho\n\nsudo rm -f -v \/home\/pi\/Desktop\/zero.small.file\nsudo rm -f -v \/home\/pi\/Desktop\/zero.file\n\nsleep 3\n\n# Ex\u00e9cution du backup\necho\necho \"$(date +%Y%m%d-%T) : Ex\u00e9cution du backup\"\necho\nsudo dd bs=4M if=\/dev\/mmcblk0 | gzip &gt; \/media\/RPi-USB-Dsk\/Backups\/backup-`date +%Y%m%d`-$hback.gz\n\nsleep 3\n\n# Suppression du backup d'il y a 26 semaine (182 jours ou 6 mois)\necho\necho \"$(date +%Y%m%d-%T) : Suppression du backup d'il y a 26 semaine (182 jours ou 6 mois)\"\necho\nsudo rm -f -v \/media\/RPi-USB-Dsk\/Backups\/backup-$(date --date=\"182 days ago\" +%Y%m%d)-0330.gz\n\nsleep 3\n\n# Reprise des services\necho\necho \"$(date +%Y%m%d-%T) : Reprise des services\"\necho\nsudo service php5-fpm start\nsudo service mysql start\nsudo service nginx start\nsudo service transmission-daemon start\nsudo service minidlna start\nsudo service fr24feed start\n\nsleep 3\n\n<\/span># Upload vers le serveur FTP\necho\necho \"$(date +%Y%m%d-%T) : Upload vers le serveur FTP\"\necho\nlog=login@netcourrier.com\npass=Password\nsudo curl -T \/media\/RPi-USB-Dsk\/Backups\/backup-`date +%Y%m%d`-$hback.gz ftp:\/\/ftp.netcourrier.com\/CheminVersBackup\/ --user $log:$pass --disable-epsv --limit-rate 50k\n\n# Suppression d'un ancien backup sur le serveur FTP\n# On garde juste les 3 derniers\necho\necho \"$(date +%Y%m%d-%T) : Suppression d'un ancien backup sur le serveur FTP\"\necho\nlog=login@netcourrier.com\npass=Password\nsudo curl ftp:\/\/ftp.netcourrier.com\/Backups_RPi\/ -Q \"-DELE backup-$(date --date=\"21 days ago\" +%Y%m%d)-0330.gz\" --user $log:$pass --disable-epsv --limit-rate 50k\n\n<span style=\"color: #808080;\">sleep 3\n\necho\necho \"$(date +%Y%m%d-%T) : Fin du script Backup.sh\" <\/span><\/pre>\n<p><strong>Attention !<\/strong> Le script est \u00e0 adapter en fonction de votre configuration comme d\u00e9crit sur <a href=\"https:\/\/www.fanjoe.be\/?p=1373\" target=\"_blank\" rel=\"noopener noreferrer\">cette page<\/a>.<\/p>\n<h1>Alternative<\/h1>\n<p>Si vous ne poss\u00e9dez pas d&rsquo;espace de stockage FTP dans le cloud et que vous ne voulez pas garder vos backups plus de 30 jours, <a href=\"http:\/\/dl.free.fr\/upload.html\" target=\"_blank\" rel=\"noopener noreferrer\">Free propose une altenative<\/a> int\u00e9ressante. Accessible \u00e0 tous. Sans inscription. M\u00eame si vous n&rsquo;\u00eates pas client chez eux.<\/p>\n<p>Il est possible d&rsquo;uploader des fichiers de 10Go max sur le serveur <a href=\"ftp:\/\/dl.free.fr\" target=\"_blank\" rel=\"noopener noreferrer\">ftp:\/\/dl.free.fr<\/a> .<\/p>\n<p>Login : Votre adresse email<br \/>\nPass : Au choix<\/p>\n<p>D\u00e8s que l&rsquo;upload sera termin\u00e9, Free vous enverra, \u00e0 l&rsquo;adresse mail indiqu\u00e9e, un lien vers votre fichier. Celui-ci sera effac\u00e9 apr\u00e8s 30 jours.<\/p>\n<p>On aura une ligne de ce genre dans le script du backup :<\/p>\n<pre>sudo curl -T \/media\/RPi-USB-Dsk\/Backups\/backup-`date +%Y%m%d`-$hback.gz ftp:\/\/dl.free.com\/ --user $log:$pass --limit-rate 50k<\/pre>\n<p><code>--disable-epsv<\/code> n&rsquo;est pas n\u00e9cessaire avec le FTP de Free.<\/p>\n<h1>Chiffrer le backup \u00e0 la vol\u00e9e<\/h1>\n<pre>log='mail@domain.tld'\npass='password'\nkey='UnMotDePasseRobustePourOpenSSL'\n\nopenssl enc -e -aes-256-cbc -pass pass:$key -in \/media\/RPi-USB-Dsk\/Backups\/backup-`date +%Y%m%d`-$hback.gz | curl -P - --insecure 'ftp:\/\/dl.free.fr:21\/backup-`date +%Y%m%d`-$hback.gz.aes' --user $log:$pass -T - --limit-rate 2m<\/pre>\n<p>Et pour le d\u00e9chiffrer sur Mac :<\/p>\n<pre>openssl enc -d -aes-256-cbc -in ~\/Downloads\/backup-20190603-0330.gz.aes -out ~\/Desktop\/backup-20190603-0330.gz -pass pass:UnMotDePasseRobustePourOpenSSL<\/pre>\n<h1>Ouvrir le port FTP dans le firewall<\/h1>\n<p>On trouvera la solution chez <a href=\"http:\/\/www.devops-blog.net\/iptables\/iptables-settings-for-outgoing-ftp\" target=\"_blank\" rel=\"noopener noreferrer\">devops-blog<\/a>.<\/p>\n<p>On \u00e9dite le firewall :<\/p>\n<pre>$ sudo nano \/etc\/init.d\/firewall<\/pre>\n<p>Et on y ajoute ces lignes :<\/p>\n<pre># FTP (21)\niptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT\niptables -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT\niptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Introduction <\/p>\n<p>Il y a quelques temps, j&rsquo;ai publi\u00e9 des articles qui d\u00e9crivaient la marche \u00e0 suivre pour effectuer un backup&#8230;<\/p>\n","protected":false},"author":1,"featured_media":1831,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[10,3,173,12],"tags":[21,202,203,205,204,22],"class_list":["post-1815","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-geek","category-informatique","category-linux","category-raspberrypi","tag-backup","tag-curl","tag-dl-free-fr","tag-ftp","tag-netcourrier","tag-raspberry-pi","end"],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2015\/09\/cURL-00.png","_links":{"self":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts\/1815","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1815"}],"version-history":[{"count":0,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts\/1815\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/media\/1831"}],"wp:attachment":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1815"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1815"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1815"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}