自动 GPG 加密后备份 Ghost 博客到百度云

Hacks Mar 21, 2016

换到了这种不知名服务商,天知道会不会跑路。所以还是每天自动备份到百度云,以备不时之需。所以写了个脚本专门干这事。

虽然百度云坑爹,不过相比业界标杆 Dropbox,高达 2TB 的存储空间不可谓不划算。再加上在国内的高速,用来做备份的确很适合。非对称加密后上传到百度云,在安全方面也没有任何问题。讲真这么大的空间每日备份够我用几年了。

步骤:

安装 bypy,由于原作者表示目前不支持作为包导入,在 Python 中只能以 os.system方式执行了。

pip install bypy

配置 API:

bypy info

导入你的 GPG 公钥,设置为信任。具体步骤不再赘述。


写了一个小脚本,用 nohup 运行后自动每天加密后备份到百度云。上代码:

import os
import tarfile
import datetime
import time


def make_tarfile(output_filename, source_dir):
    with tarfile.open(output_filename, 'w:gz') as tar:
        tar.add(source_dir, arcname=os.path.basename(source_dir))


def backup(from_dir, to_file, gpg):
    make_tarfile(to_file, from_dir)
    to_file_encrypted = to_file + '.gpg'
    os.system('gpg -o %s -e -r %s %s' % (to_file_encrypted, gpg, to_file))
    os.system('bypy upload %s' % to_file_encrypted)


ghost_database = r'/var/www/ghost/content/data/ghost.db'
ghost_dir = r'/var/www/ghost/'
backup_dir = os.path.join(os.environ['HOME'], r'.backup/ghost/')
gpg_key='9239C789'
wait_time = 86400

while True:
    date = datetime.datetime.now().strftime('%Y-%m-%d')
    filename_database = os.path.join(backup_dir, '%s_database.tar.gz' % date)
    filename_full = os.path.join(backup_dir, '%s_full.tar.gz' % date)
    backup(ghost_database, filename_database, gpg_key)
    backup(ghost_dir, filename_full, gpg_key)
    time.sleep(wait_time)
    os.remove(filename_database)
    os.remove(filename_database + '.gpg')
    os.remove(filename_full)
    os.remove(filename_full + '.gpg')

把变量 ghost_database, ghost_dir, backup_dir, gpg_key 修改为自己的值。wait_time 默认是每隔 24 小时备份一次,有需要可以自行调整。


运行:

nohup python3 autoBackup.py &

It looks like this:


2016 年三月 30 日更新:

原有用 nohup 后台定时还是太落后,换到了计划任务 crontab。代码做了少许修改:

#!/usr/bin/python3
import os
import tarfile
import datetime
import time


def make_tarfile(output_filename, source_dir):
    with tarfile.open(output_filename, 'w:gz') as tar:
        tar.add(source_dir, arcname=os.path.basename(source_dir))


def backup(from_dir, to_file):
    make_tarfile(to_file, from_dir)
    to_file_encrypted = to_file + '.gpg'
    os.system('gpg -o %s -e -r 9239C789 %s' % (to_file_encrypted, to_file))
    os.system('/usr/local/bin/bypy upload %s' % to_file_encrypted)


ghost_database = r'/var/www/ghost/content/data/ghost.db'
ghost_dir = r'/var/www/ghost/'
backup_dir = os.path.join(os.environ['HOME'], r'.backup/ghost/')
date = datetime.datetime.now().strftime('%Y-%m-%d')
filename_database = os.path.join(backup_dir, '%s_database.tar.gz' % date)
filename_full = os.path.join(backup_dir, '%s_full.tar.gz' % date)
backup(ghost_database, filename_database)
backup(ghost_dir, filename_full)
time.sleep(1800)
os.remove(filename_database)
os.remove(filename_database + '.gpg')
os.remove(filename_full)
os.remove(filename_full + '.gpg')

编辑 crontab 配置文件,我的是这样的:

00 12 * * * /home/xia/autoBackup.py

意思是每天十二点自动执行 autoBackup.py。运行命令将其添加到 crontab

crontab youconfig

如果日后要编辑,运行 crontab -e 即可。

aLPHAtOAD

太年轻,太简单,有时候幼稚。