Vultr 免费自动备份

Backup vs Snapshot

Vultr 上的 Backup 和 Snapshot 都可以用来做 VPS 备份和恢复,主要区别在于 Backup 是收费的但是可以自动定时备份,而 Snapshot 目前免费但是需要手动触发。

既想免费又不想手动?这难不倒爱折腾的程序猿!可以定期调 Vultr 提供的 API 生成 VPS 的快照(Snapshot),同时删除较旧的历史快照。

启用 API

进入 Vultr 官网后登录,点击左侧导航栏上的 Account,再点击右侧的 API,然后点击「Enable API」按钮启用。

API 启用前

启用之后,会得到你的 API Key,切勿泄露。为了能够正常使用 API,需要在 Access Control 处添加 API 调用的源 IP。当然你也可以一键允许所有的 IPv4 和 IPv6 地址,从安全方面考虑,不是特别建议。

API 启用后

Snapshot 脚本

参考了下 R 酱之前的博文,按照我的需求修改了实现逻辑,根据填写的 VPS 的 SUBID 列表,自动调 API 生成 Snapshot,然后清理历史快照。

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
# coding:utf-8
import re
import time
import datetime
import requests

# -------------用户设置 开始-------------- #
# 填写 Vultr 的API KEY
API_KEY = ""
# 请填写服务器主 SUBID
SUBID_LIST = [1234567, 7654321]
# 备份头
BACKUP_TAG_PREFIX = "Auto-Backup"
# 最大备份数
MAX_NUM_OF_BACKUPS = 3
# -------------用户设置 结束-------------- #


# simple wrapper to access vultr api
def vultr(method="GET", action="", data=None):
api_endpoint = "https://api.vultr.com/v1/"
return requests.request(method, "{}{}".format(api_endpoint, action), headers={"API-Key": API_KEY}, data=data)


# Get base info
day = time.strftime("%Y-%m-%d", time.localtime())

# get snapshot list
snapshot_list_raw = vultr("GET", "snapshot/list").json()
snapshot_list = [v for k, v in snapshot_list_raw.items()] if len(snapshot_list_raw) > 0 else {}

# Get auto-backup snapshot list
for SUBID in SUBID_LIST:
backup_snapshot_list = list(filter(lambda x: re.search("{}-{}".format(BACKUP_TAG_PREFIX, SUBID),
x["description"]), snapshot_list))

# Remove old auto-backup-snapshot
if len(backup_snapshot_list) >= MAX_NUM_OF_BACKUPS:
to_remove_snapshot_list = sorted(
backup_snapshot_list,
key=lambda k: datetime.datetime.strptime(k["date_created"],"%Y-%m-%d %H:%M:%S"))[:1-MAX_NUM_OF_BACKUPS]

for s in to_remove_snapshot_list:
vultr("POST", "snapshot/destroy", {"SNAPSHOTID": s["SNAPSHOTID"]})
# create new auto-backup-snapshot
vultr("POST", "snapshot/create", {"SUBID": SUBID, "description": "{}-{}-{}".format(BACKUP_TAG_PREFIX, SUBID, day)})

使用方法

脚本运行需要 Python 环境(Python 2 或 Python 3),需要安装 requests 模块(可以通过 pip 安装)。

SUBID 的获取方式:在 Vultr 点击需要备份的 VPS,查看浏览器地址栏,会看到如 ?SUBID=1234567 的部分,则 1234567 为该 VPS 的 SUBID。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 安装 pip,如果已安装可以跳过
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py

# 安装 requests 模块
pip install requests

# 新建 snapshot.py 脚本文件,并复制粘贴脚本内容
# 修改 API_KEY,SUBID_LIST,MAX_NUM_OF_BACKUPS 等参数
# 保存退出
vi snapshot.py

# 执行脚本
python snapshot.py

# 配合 crontab 使用
# 每天凌晨 4 点触发脚本
# 0 4 * * * /usr/bin/python2.7 /your/path/to/snapshot.py
crontab -e

备份效果

一顿操作之后,第二天应该就可以看到备份效果,撸 Vultr 羊毛成就达成!

备份效果