Aller au contenu principal

Gérer vos données sur le cloud avec rclone

· 4 minutes de lecture
Stéphane ROBERT
Consultant DevOps

Rclone est un outil en ligne de commande permettant de gérer ses données dans le cloud qui peut être utilisé sur Linux, MacOS et Windows.

C'est un outil bien pratique pour par exemple déplacer des données d'un fournisseur de stockage vers un autre.

Rclone gère de très nombreux fournisseurs de stockage de données en ligne dont :

  • Amazon S3
  • DigitalOcean Spaces
  • DropBox
  • Google Cloud Storage
  • Google Drive
  • Google Photos
  • OVH Hubic (bientôt remplacé)
  • Scaleway

Et plein d'autres. La liste complète

Installation de Rclone

Si vous ne connaissez pas encore asdf, je vous renvoie à ce billet : asdf le maxi choco du Devops.

asdf plugin add rclone
asdf install rclone latest
asdf global rclone latest

Pour ceux qui ne veulent pas utiliser asdf :

curl https://rclone.org/install.sh | sudo bash

Utilisation d'un bucket S3 AWS

rclone propose de créer les fichiers de configuration de manière interactive avec la commande rclone config. Il vous posera pas mal de questions (en anglais) pour créer votre remote configuration.

Current remotes:

Name                 Type
====                 ====
google_drive         drive
mybackup             s3

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config

Vous remarquerez que j'ai déjà créé deux remotes sur mon poste de travail. Un utilisant un bucket S3 et un second mon Google Drive.

Pour des bucket S3 je vous conseille de créer un user spécifique et de limiter les droits d'accès à ce seul user. Récupérer son ID et sa clé secrète qu'il faudra renseigner.

Afficher le contenu d'un bucket

La commande rclone lsd <nom de la conf>: permet de lister les buckets existant.

rclone lsd mybackup:
          -1 2022-08-06 14:09:38        -1 srt-backup
          -1 2022-02-07 12:25:25        -1 terraform-stephrobert

Pour afficher le contenu d'un compartiment rclone ls <nom du remote>:<nom du compartiment> :

rclone ls mybackup:srt-backup
     6768 rclone-logo.svg

Pour créer un compartiment rclone ls <nom du remote>:<nom du bucket>:

rclone mkdir mybackup:test-srt2
rclone lsd mybackup:
          -1 2022-08-06 14:09:38        -1 srt-backup
          -1 2022-02-07 12:25:25        -1 terraform-stephrobert
          -1 2022-08-12 11:34:58        -1 test-srt2

Attention le nom doit être unique dans la région donc, mettez par exemple vos initiales.

Pour synchroniser un répertoire local et un compartiment rclone sync ~/Projets <nom du remote>:<nom du bucket> :

rclone sync ~/Projets mybackup:test-srt2
rclone ls mybackup:test-srt2
      566 personal/ansible-gendoc/.vscode/launch.json
        0 personal/ansible-gendoc/README.rst
       22 personal/ansible-gendoc/ansible_gendoc/__init__.py
      186 personal/ansible-gendoc/ansible_gendoc/__pycache__/__init__.cpython-310.pyc
     4142 personal/ansible-gendoc/ansible_gendoc/__pycache__/gendoc.cpython-310.pyc

Pour copier un fichier rclone copy /home/user/file.txt <nom du remote>:<nom du bucket> :

rclone copy ~/.ssh/config mybackup:test-srt2

Pour vider un bucket rlcone delete <nom du remote>:<nom du bucket> :

rclone delete mybackup:test-srt2 --rmdirs

Pour le détruire rlcone purge <nom du remote>:<nom du bucket> :

rclone purge mybackup:test-srt2
rclone lsd mybackup:
          -1 2022-08-06 14:09:38        -1 srt-backup
          -1 2022-02-07 12:25:25        -1 terraform-stephrobert

On peut également monter un bucket en local rclone mount <nom du remote>:<nom du bucket> <point de montage> :

rclone ls mybackup:srt-backup
     6768 rclone-logo.svg
rclone mount mybackup:srt-backup ~/cloud/ &&
ls ~/cloud
rclone-logo.svg

Pour le démonter il suffit de tout simplement tuer la commande rclone :

killall rclone

Monter un bucket S3 en arrière plan via un service

L'idée est que le point de montage se fasse au démarrage de la machine. Il faut créer un service :

sudo vi /etc/systemd/system/rclone.service

et y mettre ce contenu avec vos informations :

[Unit]
Description=Amazon S3
Requires=systemd-networkd.service
AssertPathIsDirectory=/media/S3
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/rclone mount \
        --config=/home/vagrant/.config/rclone/rclone.conf \
        --allow-other \
        --cache-tmp-upload-path=/tmp/rclone/upload \
        --cache-chunk-path=/tmp/rclone/chunks \
        --cache-workers=4 \
        --cache-writes \
        --cache-dir=/tmp/rclone/vfs \
        --cache-db-path=/tmp/rclone/db \
        --no-modtime \
        --drive-use-trash \
        --stats=0 \
        --checkers=8 \
        --dir-cache-time=60m \
        --allow-non-empty \
        --cache-info-age=60m mybackup:srt-backup /media/S3
ExecStop=/bin/fusermount -u /media/S3
Restart=always
RestartSec=10
TimeoutSec=45

[Install]
WantedBy=multi-user.target

Ensuite, il suffit d'activer le service et de le démarrer :

sudo systemctl enable rclone.service
sudo systemctl start rclone.service

Ca me donne une idée pour écrire ma première lambda. Si je dépose une image dans mon bucket elle sera convertie au format webp. Ca fera l'objet d'un prochain billet. Si vous avez d'autres idées ou cas d'usage laissez les en commentaires.