Google operates at a scale of billions of users. At that scale, mistakes happen, and you can lose all your data.

Here are two ways to deal with it.

  1. Avoid giving out your “@gmail.com” email address publicly - use “@customdomain.com” which you control
  2. Keep a backup of your important data elsewhere, like Backblaze - it charges about USD 1 for storing 100GB for one year, which is sufficient for most normal users

How to back up Google Photos to Backblaze

  1. Download via Google Takeout - depending on the size, it will take up to a few hours for Google to create a takeout and put it in, say, ${HOME}/Downloads/google-photos/Takeout
  2. Create a new bucket on Backblaze - google-photos-backup-v1
  3. Create a new Backblaze key and save it in .env as AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
  4. Use restic for backup
  • One-time init: make initGooglePhotos # remember the password you configure here
  • Backup: make backupGooglePhotos # First time this is slow; future backups are incremental and fast

One can do it similarly for Gmail and Google Drive.

Here’s how my .env file looks:

Bash
1
2
3
# Ref: https://secure.backblaze.com/app_keys.htm
AWS_ACCESS_KEY_ID="<REDACTED>"
AWS_SECRET_ACCESS_KEY="<REDACTED>"

And the Makefile

Makefile
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
-include .env
export

RESTIC_PHOTOS_BACKUP_REPOSITORY="s3:s3.us-east-005.backblazeb2.com/<backupFolder1>"
RESTIC_EMAIL_BACKUP_REPOSITORY="s3:s3.us-east-005.backblazeb2.com/<backupFolder2>"
RESTIC_GOOGLE_DRIVE_BACKUP_REPOSITORY="s3:s3.us-east-005.backblazeb2.com/<backupFolder3>"

GOOGLE_PHOTOS_TAKEOUT_FOLDER="${HOME}/Downloads/google-photos/Takeout"
GMAIL_TAKEOUT_FOLDER="${HOME}/Downloads/gmail/Takeout"
GOOGLE_DRIVE_TAKEOUT_FOLDER="${HOME}/Downloads/google-drive/Takeout"

.SILENT: init-google-photos backup-google-photos init-gmail backup-gmail check

# This will interactively prompt for encryption password
initGooglePhotos:
	AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
	AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
	restic -r ${RESTIC_PHOTOS_BACKUP_REPOSITORY} init

backupGooglePhotos:
	AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
	AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
	restic -r ${RESTIC_PHOTOS_BACKUP_REPOSITORY} backup ${GOOGLE_PHOTOS_TAKEOUT_FOLDER}

initGmail:
	AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
	AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
	restic -r ${RESTIC_EMAIL_BACKUP_REPOSITORY} init

backupGmail:
	AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
	AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
	restic -r ${RESTIC_EMAIL_BACKUP_REPOSITORY} backup ${GMAIL_TAKEOUT_FOLDER}

initGoogleDrive:
	AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
	AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
	restic -r ${RESTIC_GOOGLE_DRIVE_BACKUP_REPOSITORY} init

backupGoogleDrive:
	AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
	AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
	restic -r ${RESTIC_GOOGLE_DRIVE_BACKUP_REPOSITORY} backup ${GOOGLE_DRIVE_TAKEOUT_FOLDER}

_checkGooglePhotos:
	AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
	AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
	RESTIC_REPOSITORY=${RESTIC_PHOTOS_BACKUP_REPOSITORY} \
	restic check


_checkGmail:
	AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
	AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
	RESTIC_REPOSITORY=${RESTIC_EMAIL_BACKUP_REPOSITORY} \
	restic check

_checkGoogleDrive:
	AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
	AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
	RESTIC_REPOSITORY=${RESTIC_GOOGLE_DRIVE_BACKUP_REPOSITORY} \
	restic check

check: _checkGooglePhotos _checkGmail _checkGoogleDrive