Gérer des fichiers dans DigitalOcean Spaces avec rclone en CLI
Utilisez le module S3 de rclone pour envoyer un répertoire vers un Space DigitalOcean privé,
lister ses objets et télécharger les fichiers en retour. Ce tutoriel vérifie les octets téléchargés
et montre ce que sync supprime dans un préfixe de démonstration dédié,
sans rendre le bucket public.
Préparer un Space privé
Vous avez besoin d’un Space Standard Storage existant et de son point de terminaison d’origine
régional, par exemple fra1.digitaloceanspaces.com. Utilisez une clé d’accès Spaces disposant
des droits de lecture, d’écriture et de suppression sur ce bucket. Un jeton d’API DigitalOcean
constitue un autre type d’informations d’accès. Le
guide des clés d’accès de DigitalOcean explique les clés limitées
à un bucket. Ne copiez pas une politique AWS IAM dans Spaces en supposant qu’elle accorde les
mêmes droits.
Les commandes ci-dessous ciblent Linux sur des processeurs Intel/AMD 64 bits, avec Bash, cURL, unzip et GNU coreutils installés. La version de rclone testée est la 1.75.2. Les noms de fichiers de cet exemple utilisent UTF-8, y compris celui d’un fichier binaire dans un sous-répertoire. Le fichier vide est intentionnel. Effectuez ce petit exercice séquentiel à l’écart d’une sauvegarde en cours ou d’un répertoire qu’un autre processus modifie.
Installer rclone dans un nouveau répertoire de travail
Collez ce bloc depuis un répertoire accessible en écriture. Il télécharge la
version précise de rclone, vérifie sa somme de contrôle SHA-256
publiée et installe l’exécutable localement. Il refuse de continuer si le répertoire
rclone-spaces existe déjà. Les parenthèses limitent les changements de répertoire
et les options du shell à un sous-shell.
(
set -eu
for tool in curl sha256sum unzip install mv mkdir; do
command -v "$tool" >/dev/null || { echo "Missing prerequisite: $tool" >&2; exit 1; }
done
mkdir rclone-spaces &&
cd rclone-spaces &&
curl -fsSLo rclone.zip https://downloads.rclone.org/v1.75.2/rclone-v1.75.2-linux-amd64.zip &&
curl -fsSLo SHA256SUMS https://downloads.rclone.org/v1.75.2/SHA256SUMS &&
mv rclone.zip rclone-v1.75.2-linux-amd64.zip &&
sha256sum --check --ignore-missing SHA256SUMS &&
unzip -q rclone-v1.75.2-linux-amd64.zip &&
install -m 755 rclone-v1.75.2-linux-amd64/rclone rclone &&
./rclone version
)
La version affichée doit commencer par rclone v1.75.2. Si le téléchargement ou
la vérification de l’archive échoue, arrêtez-vous là. Examinez le répertoire partiellement créé
rclone-spaces avant de le supprimer vous-même et de recommencer l’installation.
Le programme d’installation n’écrase pas un projet existant. Exécutez les commandes restantes depuis
ce nouveau répertoire.
Configurer l’accès distant à Spaces
Depuis rclone-spaces, créez un fichier de configuration privé et vide.
Cette commande refuse de continuer si le fichier existe déjà et ne modifie pas votre configuration
rclone habituelle :
(umask 077; set -C; : > spaces.conf)
Modifiez spaces.conf pour y placer les paramètres suivants, en remplaçant les
valeurs fictives des informations d’accès et le point de terminaison. Gardez ce fichier hors du
contrôle de version.
[spaces]
type = s3
provider = DigitalOcean
env_auth = false
access_key_id = YOUR_SPACES_ACCESS_KEY
secret_access_key = YOUR_SPACES_SECRET_KEY
endpoint = fra1.digitaloceanspaces.com
region =
location_constraint =
acl = private
no_check_bucket = true
list_version = 1
Les instructions du module DigitalOcean laissent
region et location_constraint vides : le point de terminaison
identifie la région. Utilisez le point de terminaison d’origine, sans nom de bucket ni nom d’hôte
CDN. Le paramétrage de
no_check_bucket permet d’ignorer les vérifications
d’existence et de création du bucket. Il suppose que le bucket existe déjà et n’accorde aucun droit
sur les objets. Cet exemple utilise explicitement
ListObjects version 1 pour lister les objets.
Envoyer, lister et télécharger une arborescence de fichiers
Enregistrez le contenu suivant sous le nom spaces-demo.sh dans le même répertoire
de travail. Passez le nom de votre bucket et un nouvel UUID lors de son exécution. Le script utilise
cet UUID pour isoler sa destination distante et refuse de continuer si le préfixe n’est pas vide
ou si les répertoires locaux upload/download existent déjà.
#!/usr/bin/env bash
set -euo pipefail
space=${1:?Supply a bucket name}
run_id=${2:?Supply a fresh UUID}
[[ "$space" =~ ^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$ ]] || { echo 'Invalid bucket name' >&2; exit 1; }
[[ "$run_id" =~ ^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ ]] || { echo 'Invalid UUID' >&2; exit 1; }
remote="spaces:$space/rclone-demo-$run_id"
[[ ! -e upload && ! -e download ]] || { echo 'Use a fresh local working directory' >&2; exit 1; }
existing=$(./rclone --config ./spaces.conf lsf "$remote" --recursive)
[[ -z "$existing" ]] || { echo 'Choose a new, empty demo prefix' >&2; exit 1; }
mkdir upload
mkdir download
mkdir upload/nested
printf 'Hello from rclone\n' > upload/hello.txt
printf '\000\001\177\200\377' > 'upload/nested/café 💾.bin'
: > upload/empty.txt
printf 'Remove this demo object during sync\n' > upload/obsolete.txt
./rclone --config ./spaces.conf copy ./upload "$remote"
./rclone --config ./spaces.conf lsjson "$remote" --recursive --files-only --s3-list-chunk 2
./rclone --config ./spaces.conf copy "$remote" ./download
./rclone --config ./spaces.conf check ./upload ./download --download
printf 'Verified the downloaded file tree. Remote prefix: %s\n' "$remote"
Exécutez-le avec le nom du bucket de votre Space. Linux fournit un nouvel UUID par l’intermédiaire du fichier utilisé ci-dessous :
bash spaces-demo.sh your-space "$(cat /proc/sys/kernel/random/uuid)"
La liste JSON doit contenir hello.txt, empty.txt,
obsolete.txt et nested/café 💾.bin. La taille des pages, limitée à
deux objets, permet de tester délibérément la pagination sur cette petite arborescence. Ce n’est pas
une recommandation pour optimiser le débit. copy transfère le contenu
d’un répertoire : les clés distantes n’incluent donc pas de répertoire
upload/ supplémentaire. Cette commande
préserve les fichiers présents uniquement à destination, mais elle
peut remplacer des fichiers modifiés portant les mêmes noms. Elle n’exclut donc pas l’écrasement.
La commande finale check --download lit les deux
arborescences locales et compare leur contenu. Un statut de transfert réussi ou une taille de fichier
identique ne suffit pas à effectuer cette vérification des octets. Si une commande échoue, le script
s’arrête. Les fichiers dont l’envoi est terminé peuvent rester dans le préfixe de démonstration,
et le téléchargement local peut être incomplet. Examinez ces résultats avant de réessayer. Pour une
nouvelle exécution, utilisez un nouveau répertoire de travail et un nouvel UUID plutôt que de
supprimer une destination que vous ne connaissez pas pour permettre au script de continuer.
Prévisualiser une synchronisation ciblée avant toute suppression
sync rend la destination identique à
la source, notamment en supprimant les fichiers présents uniquement à destination. L’opération est
unidirectionnelle et ne fusionne pas des modifications indépendantes. Inverser les arguments ferait
du répertoire local la destination et pourrait supprimer les fichiers présents uniquement en local.
Une fois le transfert réussi, copiez le préfixe distant affiché dans la commande ci-dessous.
Enregistrez le bloc sous le nom spaces-sync.sh. Il supprime uniquement le fichier
obsolete.txt de la démonstration locale, puis prévisualise une synchronisation
vers le même préfixe UUID. Examinez l’aperçu avant de confirmer la synchronisation réelle.
Ne remplacez pas ce préfixe par la racine du bucket ou par un préfixe partagé avec un autre processus
d’écriture.
#!/usr/bin/env bash
set -euo pipefail
remote=${1:?Supply the printed demo prefix}
[[ "$remote" =~ ^spaces:[a-z0-9][a-z0-9-]{1,61}[a-z0-9]/rclone-demo-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$ ]] || { echo 'Expected a demo prefix' >&2; exit 1; }
rm -f ./upload/obsolete.txt
./rclone --config ./spaces.conf sync ./upload "$remote" --dry-run
read -r -p 'Type sync to apply these destination changes: ' answer
[[ "$answer" == sync ]] || { echo 'Sync canceled'; exit 1; }
./rclone --config ./spaces.conf sync ./upload "$remote"
./rclone --config ./spaces.conf check ./upload "$remote" --download
bash spaces-sync.sh spaces:your-space/rclone-demo-REPLACE_WITH_THE_PRINTED_UUID
L’aperçu doit désigner obsolete.txt comme fichier à supprimer. Après confirmation,
le préfixe distant devrait contenir les trois autres fichiers, et la dernière vérification compare
leurs octets à ceux de upload. Votre répertoire d’origine
download contient toujours les quatre fichiers. Une simulation décrit l’état
observé ; elle ne verrouille pas la destination contre des modifications ultérieures. Empêchez tout
autre processus d’écrire dans ce préfixe. Les objets de démonstration restants demeurent dans votre
Space jusqu’à ce que vous les supprimiez.
Diagnostiquer l’échec d’une commande
Vérifiez le code de sortie de la commande et son diagnostic avant de poursuivre. Un refus d’accès
peut provenir d’une clé invalide ou de droits insuffisants sur le bucket ; il ne justifie pas de rendre
les fichiers publics. Vérifiez spaces.conf, le nom du bucket et le point de
terminaison d’origine sélectionnés. Pour ce tutoriel, lister un préfixe connu du bucket constitue
un meilleur test que de lister tous les buckets du compte.
Une copie qui échoue peut laisser en place certains fichiers transférés avec succès. Utilisez la
liste pour les identifier et répétez la vérification des octets après avoir terminé le transfert.
N’exécutez pas sync pour tenter de réparer un envoi incomplet. Si check
signale une différence, examinez le fichier nommé avant d’utiliser sa copie téléchargée.
Pour la planification, le filtrage ou le chiffrement côté client au-delà de cet exercice, consultez
la documentation de rclone. Ces fonctions nécessitent chacune leur
propre configuration. Les paramètres s3 ci-dessus n’appliquent ni le
chiffrement côté client ni la compression de rclone.
