Stocker via rClone sur des Teamdrives d'un compte Gmail - Partie 3 : les scripts rClone
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.