Stocker via rClone sur des Teamdrives d'un compte Gmail - Partie 3 : les scripts rClone

rClone 29 nov. 2021

Comme toujours, je fais en sorte que l'accès aux fichiers hébergés sur le Cloud via rClone soient le plus simple pour Plex ou un explorateur de fichiers. Les stockages local et distant sont donc fusionnés via fuse (sudo apt-get install fuse) dans un dossier unique /unionfs
De cette manière, Plex par exemple, indexe uniquement le dossier /unionfs, que les fichiers soient encore présents localement ou déjà envoyé sur Google.
Et rClone transfère les fichiers au fil de l'eau, quelques minutes après leur ajout dans le dossier d'envoi.

Les SA (les .json) sont stockés dans /home/aerya/scripts/rclone/sakeys

root@NUC2:/home/aerya/scripts/rclone# ls -l sakeys/
total 36
-rw-r--r-- 1 root  root   432 nov.  28 00:39 comptesSA.txt
-rwxrwxrwx 1 aerya aerya 2333 nov.  28 00:25 xxx-04064fc65554.json
-rwxrwxrwx 1 aerya aerya 2333 nov.  28 00:25 xxx-130d0110624e.json
-rwxrwxrwx 1 aerya aerya 2333 nov.  28 00:25 xxx-63f1b84e986c.json

Mes scripts rClone sont dans /home/aerya/script/rclone, pensez à adapter les scripts qui suivent selon votre organisation.
Les scripts.sh seront lancés depuis ce chemin tandis que les .service sont à copier dans /etc/systemd/system (Ubutun/Debian).
Adaptez aussi le chemin des logs (/home/aerya/logs) et des points de montage :
- /mnt/TD/KevinCrypt : montage remote rClone chiffré
- /mnt/PRE : dossier local
- /mnt/unionfs : dossier de fusion de /mnt/PRE et /mnt/TD/KevinCrypt

Service de montage du remote chiffré KevinCrypt: (avec le cache de rClone) : KevinCrypt.service

[Unit]
Description=RClone Service
Wants=network-online.target
After=network-online.target
[Service]
Type=notify
Environment=RCLONE_CONFIG=/root/.config/rclone/rclone.conf
KillMode=none
RestartSec=5
ExecStart=/usr/bin/rclone mount KevinCrypt: /mnt/TD/KevinCrypt --allow-other --allow-non-empty --dir-cache-time 240h --log-level INFO --log-file /home/aerya/logs/mount.log --poll-interval 15s --umask 002 --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36" --drive-service-account-file=/home/aerya/scripts/rclone/sakeys/xxx-04064fc65554.json --cache-dir=/cache --vfs-cache-mode full --vfs-cache-max-size 50G --vfs-cache-max-age 240h --fast-list
ExecStop=/bin/fusermount -uz /mnt/TD/KevinCrypt
Restart=on-failure
[Install]
WantedBy=multi-user.target

--drive-service-account-file=/home/aerya/scripts/rclone/sakeys/xxx-04064fc65554.json est le fichier .json (SA) à utiliser pour se connecter et interagir avec le TeamDrive Kevin

A copier dans /etc/systemd/system et lancer avec

sudo systemctl start KevinCrypt.service
sudo systemctl enable KevinCrypt.service

On peut vérifier le montage avec sudo systemctl status KevinCrypt.service ou tout simplement df -H

root@NUC2:/home/aerya# df -H
KevinCrypt:            1,2P       0  1,2P   0% /mnt/TD/KevinCrypt

Service de fusion du remote chiffré KevinCrypt: et du dossier local /mnt/PRE : unionfs.service

[Unit]
Description=UnionFS Daemon
After=multi-user.target
[Service]
Type=simple
User=0
Group=0
ExecStartPre=/bin/sleep 10
ExecStart=/usr/bin/unionfs -o cow,allow_other,nonempty /mnt/PRE=RW:/mnt/TD/KevinCrypt=RO /mnt/unionfs
ExecStop=/bin/fusermount -uz /mnt/unionfs
TimeoutStopSec=20
KillMode=process
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

A copier dans /etc/systemd/system et lancer avec

sudo systemctl start unionfs.service
sudo systemctl enable unionfs.service

On peut vérifier le montage avec sudo systemctl status unionfs.service ou tout simplement df -H

root@NUC2:/home/aerya# df -H
unionfs                  1,2P    1,2P  215G 100% /mnt/unionfs

Script rClone de déplacement (on peut remplacer par copy) vers KevinCrypt: depuis le dossier local /mnt/PRE : rclonemove.sh
Avec utilisation d'un SA pour gérer l'accès à Google. Le rendre exécutable avec chmod +x rclonemove.sh

#!/bin/bash
LOG="/home/aerya/logs/rclone.log"
EXC1="/atrier/**"

if pidof -o %PPID -x "$0"; then
   exit 1
fi
sleep 30
while true
do
  echo "$(date "+%d.%m.%Y %T") RCLONE UPLOAD STARTED" | tee -a "$LOG"
rclone move -c -v --exclude='**partial~' --exclude="**_HIDDEN~" --exclude=".unionfs/**" --exclude=".unionfs-fuse/**" --exclude="$EXC1" --min-age 1m --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36" --drive-service-account-file=/home/aerya/scripts/rclone/sakeys/xxx-04064fc65554.json --fast-list --drive-stop-on-upload-limit --transfers=10 --checkers=10 --stats 5s --log-file="$LOG" /mnt/PRE KevinCrypt:/
sleep 480
  echo "$(date "+%d.%m.%Y %T") RCLONE UPLOAD ENDED" | tee -a "$LOG"
done

EXC1="/atrier/**" est un dossier (/mnt/PRE/atrier) à exclure du déplacement vers Google
--min-age 1m indique à rClone de ne traiter que les fichiers sans accès depuis 1 minute (pour éviter le déplacement d'un fichier en cours de copie par exemple -même si ça fonctionne c'est pas optimal-)
--drive-service-account-file=/home/aerya/scripts/rclone/sakeys/xxx-04064fc65554.json est le fichier .json (SA) à utiliser pour se connecter et interagir avec le TeamDrive Kevin
--drive-stop-on-upload-limit force rClone a stopper tout déplacement de fichiers une fois la limite de 750GB atteinte. Sait-on jamais...

Service rclonemove qui lance le script du même  éponyme : rclonemove.service

[Unit]
Description=Move Service Daemon
After=multi-user.target
[Service]
Type=simple
User=0
Group=0
ExecStart=/bin/bash /home/aerya/scripts/rclone/rclonemove.sh
TimeoutStopSec=20
KillMode=process
RemainAfterExit=yes
Restart=always
[Install]
WantedBy=multi-user.target

A copier dans /etc/systemd/system et lancer avec

sudo systemctl start rclonemove.service
sudo systemctl enable rclonemove.service

Script de synchronisation, via rClone Sync, des TD : sync.sh

Le rendre exécutable avec chmod +x sync.sh

#!/bin/bash

rclone sync Kevin:/ Pierre:/ -v -P --drive-server-side-across-configs --drive-service-account-file=/home/aerya/scripts/rclone/sakeys/xxx-130d0110624e.json --log-file=/home/aerya/logs/syncPierre.log
rclone sync Kevin:/ Paul:/ -v -P --drive-server-side-across-configs --drive-service-account-file=/home/aerya/scripts/rclone/sakeys/xxx-63f1b84e986c.json --log-file=/home/aerya/logs/syncPaul.log

Un SA (.json) utilisé chaque TD et des logs séparés également.
Pour que la synchronisation se fasse sans passer par mon serveur j'utilise le flag --drive-server-side-across-configs

Les montage/fusion/déplacement étant automatisés, il ne reste qu'à faire de même avec la synchronisation entre les TD. Pour ça je passe par le cron pour le déclencher chaque nuit à 4h.

# rClone Sync
0 4 * * * /home/aerya/scripts/rclone/sync.sh

On pourrait aussi en faire un .service qui permettrait de le faire au fil de l'eau.

On peut vérifier que tout fonctionne en lançant la commande à la main ou en attendant le lendemain matin pour regarder les logs d'un des TD :

root@NUC2:/home/aerya/logs# tail -n 10 syncPaul.log
2021/11/29 04:11:02 INFO  : 580goa4p78noqhr622a5utthdlfd9ukckr748i6c5h064651qg6cpp16o3pucr29q6uf98/hvtjg79iuvv57741pbgisi77jgka2ccg7gsbme4i1sm9s79s3b3lujtb0j2cmo8je1foipfb7bc0lusseionbfpj8me4c9nhbjclfvg: Copied (server-side copy)
2021/11/29 04:11:02 INFO  : 580go4s71h6l15u9d4497bh5do/fl3hm9ij3qd9ukckr748i6c5h064651qg6cpp16o3pucr29q6uf98/sl3f2h8je87rugvogehrrgjljl1ip64tn5acu334fnao5hc4kfo3vjqs3u65lm917b9tevdho: Copied (server-side copy)
2021/11/29 04:11:03 INFO  : 580go4s71h6l15u9d4497bh5do/b999b642a6i5jj67hmnhfv082f3c3sfr7gqeg5nchtaiv6p86q0nasr1ids989rg2t3va: Copied (server-side copy)
2021/11/29 04:11:03 INFO  :
Transferred:       18.770 GiB / 18.770 GiB, 100%, 2.980 GiB/s, ETA 0s
Checks:               117 / 117, 100%
Transferred:            3 / 3, 100%
Elapsed time:         4.0s

Le fait que tout se passe au niveau l'infra de Google permet d'obtenir des vitesses confortables. J'ai la fibre mais ne peux quand même pas aller taper du 2GB/s ^_^

Prochain et dernier article pour les notifications Discord.

Mots clés