如何通过Cron任务自动将Google Workspace备份至本地服务器?
Google Drive 自动备份至本地服务器方案
一、使用rclone实现反向同步(推荐)
完全可以用rclone实现Google Drive到本地服务器的单向同步,这是最简便的方案,步骤如下:
确认Google Drive远程配置
如果你已经配置过本地到Drive的备份,说明rclone已经有了可用的Google Drive远程(通常命名为gdrive);如果没有,执行rclone config按照向导完成授权,Workspace用户可选择配置Team Drive。反向同步命令
使用sync命令将Drive指定目录同步到本地,确保本地备份与Drive源完全一致(会删除本地不存在于Drive的文件,若需保留本地额外文件,可改用copy命令):rclone sync gdrive:/目标文件夹路径 /本地服务器备份路径可选参数优化:
--log-file /var/log/rclone-drive-backup.log:记录同步日志,方便排查问题--bwlimit 10M:限制带宽,避免占用过多服务器资源--exclude "*.tmp":排除临时文件,减少无效备份
配置Cron自动执行
编辑当前用户的crontab(执行crontab -e),添加定时任务,例如每天凌晨2点执行同步:0 2 * * * /usr/bin/rclone sync gdrive:/ /home/backup/google-drive --log-file /var/log/rclone-backup.log注意:确保Cron执行用户能访问rclone配置文件,或在命令中指定配置文件路径
--config /home/your-user/.config/rclone/rclone.conf
二、Python脚本结合Google Drive API实现(备选)
如果因特殊需求无法使用rclone,可通过Python脚本调用Google Drive API实现备份,步骤如下:
准备API授权
- 在Google Cloud Console创建项目,启用Google Drive API
- 创建服务账号,下载密钥JSON文件
- 若备份Workspace团队盘,需给服务账号授予域范围授权,并在Drive中共享目标文件夹给该服务账号
核心实现思路
- 使用
google-api-python-client和oauth2client库连接Drive API - 遍历Drive中的文件/文件夹,对比本地备份文件的修改时间,仅下载新增或更新的文件
- 处理文件夹层级,保持本地与Drive的目录结构一致
- 使用
示例代码片段
from googleapiclient.discovery import build from googleapiclient.http import MediaIoBaseDownload from google.oauth2.service_account import Credentials import os import pandas as pd # 初始化API服务 creds = Credentials.from_service_account_file('service-account-key.json', scopes=['https://www.googleapis.com/auth/drive.readonly']) service = build('drive', 'v3', credentials=creds) def download_file(file_id, file_name, local_path): request = service.files().get_media(fileId=file_id) with open(os.path.join(local_path, file_name), 'wb') as fh: downloader = MediaIoBaseDownload(fh, request) done = False while done is False: status, done = downloader.next_chunk() # 遍历Drive根目录文件(需自行实现递归遍历子文件夹逻辑) results = service.files().list(pageSize=100, fields="nextPageToken, files(id, name, modifiedTime, mimeType)").execute() items = results.get('files', []) backup_root = '/backup/path' os.makedirs(backup_root, exist_ok=True) for item in items: # 跳过文件夹(需递归处理时可修改逻辑) if item['mimeType'] == 'application/vnd.google-apps.folder': continue local_file_path = os.path.join(backup_root, item['name']) # 对比修改时间,决定是否下载 if not os.path.exists(local_file_path) or os.path.getmtime(local_file_path) < pd.to_datetime(item['modifiedTime']).timestamp(): download_file(item['id'], item['name'], backup_root)配置Cron执行脚本
同样通过crontab添加定时任务,例如:0 3 * * * /usr/bin/python3 /path/to/backup-script.py >> /var/log/drive-backup-script.log 2>&1
三、为什么Customer Takeout不符合需求
Customer Takeout是批量导出工具,存在以下问题:
- 无法实现自定义频率的自动同步,只能手动触发或按Google设定的周期导出
- 导出文件为压缩包,无法直接使用,也不支持增量备份
- 导出过程依赖Google服务,若遭遇黑客攻击导致账号权限丢失,可能无法完成导出
内容的提问来源于stack exchange,提问作者grb
相关产品推荐
相关产品推荐

