利用aligo实现Halo自动备份数据到阿里云盘

利用aligo实现Halo自动备份数据到阿里云盘

前言 之前一直没有备份数据的习惯,但是最近感觉服务器啥的不太稳定,被打关机时候也被办法及时拿到数据,于是就想着把数据备份一下。但是Halo的定时备份竟然是收费的。那没办法,只能自己写一个。 先想一下,备份到哪里最方便还不花钱?那必然是网盘。然后网上一搜,教程全都是百度云盘的。咱可没那个钱买会员啊,下

前言

之前一直没有备份数据的习惯,但是最近感觉服务器啥的不太稳定,被打关机时候也被办法及时拿到数据,于是就想着把数据备份一下。但是Halo的定时备份竟然是收费的。那没办法,只能自己写一个。

先想一下,备份到哪里最方便还不花钱?那必然是网盘。然后网上一搜,教程全都是百度云盘的。咱可没那个钱买会员啊,下载不得慢死。但是又想想,可能十年都不下一次,也可以接受。

但是,这玩意,很傻逼。我已经实名好所有信息了,还说没检索到,没检索到那你让我手动输入呗,哎! 不给!?

3f6744eeb69d290cc5b52a863a5dc946-oagd.png

那咱就不用它了,惯着他了。随后就想到了一个不限速的网盘——阿里网盘。

正文

首先,我们想要把备份上传阿里云盘,就要用到一个可玩性很高的python库:aligo

仓库地址:https://github.com/foyoux/aligo

这也是我们这个脚本的核心。
直接看代码

import base64
import time
import requests
import json
from datetime import datetime
from aligo import Aligo
# 网站地址
website = "http://localhost:8090"
# halo2备份文件夹路径
backup_halo_path = "/root/.jiewen/backups"
backup_api = website + "/apis/migration.halo.run/v1alpha1/backups"
check_api = website + "/apis/migration.halo.run/v1alpha1/backups?sort=metadata.creationTimestamp%2Cdesc"
# 要备份的阿里云盘文件夹ID
ali_folder = "650fcd6345b746c5d582467ab8a6ba34ec2c5a7a"
user = "admin"
password = "P@88w0rd"

ali = Aligo()
# 获取现在的时间 2023-09-24T13:14:18.650Z
now_time = datetime.now().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
print(now_time)
# 构建认证头部
auth_header = "Basic " + base64.b64encode((user + ":" + password).encode()).decode()
payload = json.dumps({
    "apiVersion": "migration.halo.run/v1alpha1",
    "kind": "Backup",
    "metadata": {
        "generateName": "backup-",
        "name": ""
    },
    "spec": {
        "expiresAt": now_time,
    }
})
headers = {
    'User-Agent': '',
    'Content-Type': 'application/json',
    'Authorization': "Basic " + base64.b64encode((user + ":" + password).encode()).decode(),
}
response = requests.request("POST", backup_api, headers=headers, data=payload)
print(response.text)
if response.status_code == 201:
    print("备份请求成功!")
    new_backup_name = ""
    while True:
        check_response = requests.request("GET", check_api, headers=headers)
        if check_response.status_code == 200:
            backup_data = json.loads(check_response.text)
            items = backup_data.get("items", [])
            if items[0]["status"]["phase"] == "SUCCEEDED":
                print("备份完成!")
                new_backup_name = items[0]["status"]["filename"]
                break
            if items[0]["status"]["phase"] == "RUNNING":
                print("正在备份!")
                time.sleep(10)

        else:
            print(f"查询备份请求失败!错误代码:{check_response.status_code}")
    ali.upload_file(backup_halo_path + "/" + new_backup_name,
                    parent_file_id=ali_folder)
    print("阿里云盘上传完成!")

else:
    print(f"备份请求失败!错误代码:{response.status_code}")

代码很简单,就是请求Halo备份的api然后利用aligo把备份的压缩包上传到阿里云盘。
这里提一下几个,要修改的参数

  • website你的网站地址,不要带结尾反斜杠
  • backup_halo_path 你Halo备份的目录
  • ali_folder 你要备份到的阿里云网盘目录ID(网页进入目录后有)
  • user 你Halo的账号
  • password 你Halo的密码

1c139576c76293f8ea6979f5029b81a9.png

到这里正文也就结束了,剩下的就是部署到你的服务器

部署到服务器

测试

安装好你的python环境,这里不多说。注意的是aligo需要3.7及以上版本。
然后pip 安装依赖,requestsaligo,我这里安装的时候说找不到,我就直接下whl包然后运行pip3 install *.whl安装了

a067575d3fb015dc71db2bf26c9959a0.png

然后执行测试下python3 main.py

5c49573f2b20a514b146941a88c04497.png
首次执行需要扫码登入,之后也注意下什么时候需要再次扫码登入。

设置定时任务

我这里用的是宝塔,你其他的啥都可以,无所谓。

22d9ecfa8ef30304f2b2618469066046.png
最后测试下就能到看到备份好到你的阿里云盘了。

1c139576c76293f8ea6979f5029b81a9-cvjh.png

遇到的一些坑

如果你也遇到ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+的情况,这时候有两个选择,升级openssl或者降级urllib。我先是升级了OpenSSL但是还是解决不了,但是降级urllib可以。

python3 -m pip install urllib3==1.26.6

然后,因为我的aligo包是安装在目录下面的,所以shell脚本可能找不到,所以这里需要再代码加入

import sys
import os
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(current_dir)