rClone : outre-passer la limite d'upload de 750GB/24h

autorclone 28 oct. 2020

Voici comment créer des Service Accounts (SA) pour outre-passer la limite d’upload de 750GB/24h sur un TeamDrive (ShareDrive).

Attention, en abuser peut avoir des conséquences pour votre compte Workspace (comme ils ont fermé des milliers de comptes GSuite EDU et/ou vendus sur EBay fin 2019).

Je détaille mon tutoriel mais ne le fais pas en mode [NOOB] volontairement. C’est pas compliqué sauf si on débarque dans rClone et Linux ; si vous voulez vraiment abuser de Google, faut se relever un peu les manches :P

Le principe est simple :

  • On fait 3 Service Accounts
  • rClone (ou un fork comme gClone) utilise ces comptes pour uploader les données sur un TeamDrive
  • Chaque fois qu’un compte arrive à 750GB d’upload, la limite en 24h, rClone change de compte

Les SA sont des comptes e-mails auxquels ont donne un accès à un projet Google. On peut ensuite rattacher ces e-mails à un ou des TeamDrive.s pour qu’ils puissent en gérer le contenu, dans notre cas y envoyer des données.

Pour ce test je pars sur un CT Proxmox sous Ubuntu 20.04 et toujours rClone BETA.

Générer les SA

On peut créer des SA à la main via la console développeurs de Google (et leurs clés) mais passer par un script simplifie la chose ça fait geek !

On va se servir du script sa-gen et de gcloud. Avant d’utiliser sa-gen on a besoin de configurer gcloud avec les informations du compte Workspace qu’on voudra utiliser : gcloud auth login

Comme d’habitude, on colle l’URL dans un navigateur, on sélectionne son compte, on autorise et on vient remettre le code obtenu.

root@sagen:~# gcloud auth login
Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/ ... _account


Enter verification code: 4/...

You are now logged in as [[email protected]].

On doit ensuite configurer sa-gen, que j’ai enregistré sous sagen.sh. Voici un exemple :

KEYS_DIR=/home/aerya/satest
ORGANIZATION_ID="aaaaa"
GROUP_NAME="[email protected]"
PROJECT_BASE_NAME="upandclear"
FIRST_PROJECT_NUM=1
LAST_PROJECT_NUM=1
SA_EMAIL_BASE_NAME="satest"
FIRST_SA_NUM=1
NUM_SAS_PER_PROJECT=3
  • KEYS_DIR : l’endroit où on veut stocker nos SA
  • ORGANIZATION_ID : l’ID de notre organisation, qu’on a sur la console dév. de Google
  • PROJECT_BASE_NAME : le projet qu’on veut utiliser
  • SA_EMAIL_BASE_NAME : le base de l’e-mail qu’on veut utiliser
  • NUM_SAS_PER_PROJECT : le nom de SA qu’on veut créer par projet. Et c’est là qu’il ne faut pas abuser… Dans mon exemple je pourrai envoyer 3x750GB par 24h

Une fois qu’on a tout configuré on peut lancer le script : ./sagen.sh

root@sagen:~# ./sagen.sh 

Total SA json keys before running sa-gen = 0
Creating project = upandclear1
++ gcloud projects create upandclear1 --organization=aaaaa
Create in progress for [https://cloudresourcemanager.googleapis.com/v1/projects/upandclear1].
Waiting for [operations/cp.xxxx] to finish...done.                                                                                           
Enabling service [cloudapis.googleapis.com] on project [upandclear1]...
Operation "operations/acf.xxxx" finished successfully.
++ set +x
Enabling apis for project = upandclear1
++ gcloud config set project upandclear1
Updated property [core/project].
++ gcloud services enable drive.googleapis.com sheets.googleapis.com admin.googleapis.com cloudresourcemanager.googleapis.com servicemanagement.googleapis.com
Operation "operations/acf.xxx" finished successfully.
++ set +x
++ gcloud config set project upandclear1
Updated property [core/project].
++ set +x
Create service accounts for project = upandclear1
Creating service account number 1 in project = upandclear1 ==> satest1@upandclear1
++ gcloud iam service-accounts create satest1 --display-name=satest1
Created service account [satest1].
++ set +x
Creating service account number 2 in project = upandclear1 ==> satest@upandclear1
++ gcloud iam service-accounts create satest2 --display-name=satest
Created service account [satest2].
++ set +x

[...]

create json keys for upandclear1
Creating json key 1.json in project = upandclear1 for service account = satest1@upandclear1
++ gcloud iam service-accounts keys create /home/aerya/satest/1.json [email protected]
created key [xxx] of type [json] as [/home/aerya/satest/1.json] for [[email protected]]
++ set +x
[email protected],[email protected],USER,MEMBER
Creating json key 2.json in project = upandclear1 for service account = satest2@upandclear1
++ gcloud iam service-accounts keys create /home/aerya/satest/2.json [email protected]
created key [xxx] of type [json] as [/home/aerya/satest/2.json] for [[email protected]]
++ set +x
[email protected],[email protected],USER,MEMBER

[...]

Number of service accounts in members.csv = 3
Total SA json keys created for project upandclear1 = 3


Total SA json keys BEFORE running sa-gen = 0
Total SA json keys AFTER running sa-gen  = 3
Total SA jsons CREATED                   = 3

A la fin on a bien tous nos fichiers dans /home/aerya/satest

root@sagen:/home/aerya/satest# ls
1.json   4.json  6.json  8.json  allmembers.csv
-rw------- 1 root root 2312 Oct 23 08:58 1.json
-rw------- 1 root root 2312 Oct 23 08:58 2.json
-rw------- 1 root root 2312 Oct 23 08:58 3.json
-rw-r--r-- 1 root root 1611 Oct 23 08:58 allmembers.csv
-rw-r--r-- 1 root root 1671 Oct 23 08:58 members.csv
# oui... je suis en root... osef.

Et on a la récap. dans les fichiers .csv :

root@sagen:/home/aerya/satest# cat members.csv 
Group Email [Required],Member Email,Member Type,Member Role
[email protected],[email protected],USER,MEMBER
[email protected],[email protected],USER,MEMBER
[email protected],[email protected],USER,MEMBER

Autoriser les SA sur un TeamDrive

Là c’est la partie “coolups” du tutoriel : on copie les lignes d’un des .csv et on les colle dans les accès à un TeamDrive :)

On se rend sur son GDrive et on ajoute ou sélectionne le TeamDrive voulu.

Puis Manage Members et là on colle ligne par ligne nos nouveaux “membres” : [email protected], [email protected] etc

Sur le screen vous voyez une erreur, c’est parce qu’évidemment [email protected] n’existe pas, j’ai modifié tous les noms dans mes exemples ;)

Uploader avec les SA

J’ai cherché un truc simple pendant des semaines. Enfin… soyons franc… “un truc qui m’évite d’écrire un script moi-même”. Flemmard c’est un métier !

J’ai jeté mon dévolu sur un code en Python de Rhilip. C’est simple et efficace. Voici un exemple de configuration :

# ------------配置项开始------------------

# Account目录
sa_json_folder = r'/home/aerya/outils/safiles'  # 绝对目录,最后没有 '/',路径中不要有空格

# Rclone运行命令
# 1. 填你正在用/想要用的,这里写的是move,也可以是copy/sync ......
# 2. 建议加上 `--rc` ,不加也没事,后面脚本会自动加上的
# 3. 因为不起screen,如果你希望关注rclone运行的状态,请一定要用 `--log-file` 将rclone输出重定向到文件
cmd_rclone = 'rclone move -vP /home/aerya/mnt/move TDcrypt: --fast-list --transfers=10 --checkers=10 --stats 5s --log-file /home/aerya/outils/logs/rclone.log'

# 检查rclone间隔 (s)
check_after_start = 60  # 在拉起rclone进程后,休息xxs后才开始检查rclone状态,防止 rclone rc core/stats 报错退出
check_interval = 10  # 主进程每次进行rclone rc core/stats检查的间隔

# rclone帐号更换监测条件
switch_sa_level = 3  # 需要满足的规则条数,数字越大切换条件越严格,一定小于下面True(即启用)的数量,即 1 - 4(max)
switch_sa_rules = {
    'up_than_750': True,  # 当前帐号已经传过750G
    'error_user_rate_limit': True,  # Rclone 直接提示rate limit错误
    'zero_transferred_between_check_interval': True,  # 100次检查间隔期间rclone传输的量为0
    'all_transfers_in_zero': False,  # 当前所有transfers传输size均为0
}

# rclone帐号切换方法 (runtime or config)
# runtime 是修改启动rclone时附加的 `--drive-service-account-file` 参数
# config  是修改rclone的配置文件 `$HOME/.config/rclone/rclone.conf` ,此时你需要指定后面的rclone配置参数参数
switch_sa_way = 'runtime'

# rclone配置参数 (当且仅当 switch_sa_way 为 `config` 时使用,且需要修改)
rclone_config_path = '/root/.config/rclone/rclone.conf'  # Rclone 配置文件位置
rclone_dest_name = 'TDcrypt'  # Rclone目的地名称(与cmd_rclone中对应相同,并保证SA均已添加)

# 本脚本临时文件
instance_lock_path = r'/tmp/autorclone.lock'
instance_config_path = r'/tmp/autorclone.conf'

# 本脚本运行日志
script_log_file = r'/home/aerya/outils/logs/autorclone.log'
logging_datefmt = "%m/%d/%Y %I:%M:%S %p"
logging_format = "%(asctime)s - %(levelname)s - %(funcName)s - %(message)s"

# ------------配置项结束------------------

On le lance et la magie opère :)

cat pymove.service 

[Unit]
Description=Move Service Daemon
After=multi-user.target

[Service]
Type=simple
User=0
Group=0
ExecStart=/usr/bin/python3 /home/aerya/outils/scripts/move.py
TimeoutStopSec=20
KillMode=process
RemainAfterExit=yes
Restart=always

[Install]
WantedBy=multi-user.target
10/28/2020 11:40:41 AM - INFO - <module> - Transfer Status - Upload: 1453.5467641036958 GiB, Avg upspeed: 24.707490997679784 MiB/s, Transfered: 32.

Mots clés