linux/系统运维/编程语言

vmocean纯ipv6的Apline系统下使用 Rclone 挂载 google drive 实现定时备份

daimafengzi · 11月24日 · 2022年 · · · · 本文共7450个字 · 预计阅读25分钟88次已读

前言

通过 Apline 搭建的docker环境建站虽然没有宝塔面板方便但是对系统环境影响最小,可是备份是个问题。如果用的是大厂云服务器可以通过设置定时系统快照任务来备份,但是轻量云却不支持设置定时快照(腾讯云),宝塔面板自带很多易用的备份插件,我常用的是 OneDrive 备份,于是想到可以通过 Rclone 在服务器上挂载 google drive,然后编写一个简易备份脚本配合 Cron 任务来实现定时备份

下载安装

Apline系统直接使用命令安装吧!

apk add rclone

初始化配置

安装完成后输入:

rclone config

可以看到:

No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
 
name> googledrive

输入 n 新建一个配置,name 为你的配置名称,可以自定义,这里我输入的是 googledrive
然后会出现挂载的服务类型,如下:

Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
 1 / 1Fichier
   \ (fichier)
 2 / Akamai NetStorage
   \ (netstorage)
 3 / Alias for an existing remote
   \ (alias)
 4 / Amazon Drive
   \ (amazon cloud drive)
 5 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Lyve Cloud, Minio, RackCorp, SeaweedFS, and Tencent COS
   \ (s3)
 6 / Backblaze B2
   \ (b2)
 7 / Better checksums for other remotes
   \ (hasher)
 8 / Box
   \ (box)
 9 / Cache a remote
   \ (cache)
10 / Citrix Sharefile
   \ (sharefile)
11 / Compress a remote
   \ (compress)
12 / Dropbox
   \ (dropbox)
13 / Encrypt/Decrypt a remote
   \ (crypt)
14 / Enterprise File Fabric
   \ (filefabric)
15 / FTP Connection
   \ (ftp)
16 / Google Cloud Storage (this is not Google Drive)
   \ (google cloud storage)
17 / Google Drive
   \ (drive)
18 / Google Photos
   \ (google photos)
19 / Hadoop distributed file system
   \ (hdfs)
20 / Hubic
   \ (hubic)
21 / In memory object storage system.
   \ (memory)
22 / Jottacloud
   \ (jottacloud)
23 / Koofr, Digi Storage and other Koofr-compatible storage providers
   \ (koofr)
24 / Local Disk
   \ (local)
25 / Mail.ru Cloud
   \ (mailru)
26 / Mega
   \ (mega)
27 / Microsoft Azure Blob Storage
   \ (azureblob)
28 / Microsoft OneDrive
   \ (onedrive)
29 / OpenDrive
   \ (opendrive)
30 / OpenStack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ (swift)
31 / Pcloud
   \ (pcloud)
32 / Put.io
   \ (putio)
33 / QingCloud Object Storage
   \ (qingstor)
34 / SSH/SFTP Connection
   \ (sftp)
35 / Sia Decentralized Cloud
   \ (sia)
36 / Storj Decentralized Cloud Storage
   \ (storj)
37 / Sugarsync
   \ (sugarsync)
38 / Transparently chunk/split large files
   \ (chunker)
39 / Union merges the contents of several upstream fs
   \ (union)
40 / Uptobox
   \ (uptobox)
41 / Webdav
   \ (webdav)
42 / Yandex Disk
   \ (yandex)
43 / Zoho
   \ (zoho)
44 / http Connection
   \ (http)
45 / premiumize.me
   \ (premiumizeme)
46 / seafile
   \ (seafile)
Storage> 17

输入你要挂载的网盘序号,我要挂载的 googledrive 是 17,

⚠️注意:序号不固定,请自行确认

client_id client_secret直接回车默认即可,(也可以自行创建,怎么创建我就不说了,有点麻烦。可以看官方文章:https://rclone.org/drive/ )

然后会出现 权限 选择,如下:

Option scope.
Scope that rclone should use when requesting access from drive.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
 1 / Full access all files, excluding Application Data Folder.
   \ (drive)
 2 / Read-only access to file metadata and file contents.
   \ (drive.readonly)
   / Access to files created by rclone only.
 3 | These are visible in the drive website.
   | File authorization is revoked when the user deauthorizes the app.
   \ (drive.file)
   / Allows read and write access to the Application Data folder.
 4 | This is not visible in the drive website.
   \ (drive.appfolder)
   / Allows read-only access to file metadata but
 5 | does not allow any access to read or download file content.
   \ (drive.metadata.readonly)
scope> 1

然后是选择是否进行高级配置,保持默认回车即可:

Edit advanced config?
y) Yes
n) No (default)

接着是自动配置选择,如下:

Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
 
y) Yes (default)
n) No

[blockquote2 name=’洛维花’]因为你的服务器并没有图形化界面无法使用浏览器打开网页,这里需要选择 n,[/tip]

这里需要获取授权码并输入:

Option config_token.
For this to work, you will need rclone available on a machine that has
a web browser available.
For more help and alternate methods see: https://rclone.org/remote_setup/
Execute the following on the machine with the web browser (same rclone
version recommended):
        rclone authorize "drive" "eyJjbGllbnRfaWQ1iOiIyOTE1ODgwMjc5MzctdWUzbm52b2tmdnYzcHBqYjVpcjZhdmdibGlzMWEyZ3EuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJjbGllbnRfc2VjcmV0IjoiR09DU1BYLUtYUnRmLXpxOXNtX2FObEQ2sbjJDaHg2ZzZKR1oiLCJzY29wZSI6ImRyaXZlIn0"
Then paste the result.
Enter a value.
config_token> 

授权码需要在本地电脑上获取,访问 https://rclone.org/downloads/ 根据你的电脑系统版本下载对应的 Rclone,下载完成后解压,这边用的是mac系统,所以需要下载的是mac版本。
打开终端进入到下载的rclone目录。

cd downloads
cd rclone-v1.60.1-osx-amd64
./rclone authorize "drive" "eyJjbGllbnRfaWQ1iOiIyOTE1ODgwMjc5MzctdWUzbm52b2tmdnYzcHBqYjVpcjZhdmdibGlzMWEyZ3EuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJjbGllbnRfc2VjcmV0IjoiR09DU1BYLUtYUnRmLXpxOXNtX2FObEQ2sbjJDaHg2ZzZKR1oiLCJzY29wZSI6ImRyaXZlIn0"

浏览器应该会自动打开,如果浏览器没有打开可以根据提示复制地址访问。如果浏览器登录了 googledrive 的话会直接显示授权确认信息,如果没有登录的话会弹出登录页面,登录 googledrive 后也会显示授权确认信息。选择 接受 后在本地命令行会显示一串 JSON 格式的授权信息,复制授权信息包括首尾的 {},到 Linux 终端粘贴。
vmocean纯ipv6的Apline系统下使用 Rclone 挂载 google drive 实现定时备份

然后,直接回车默认

Configure this as a Shared Drive (Team Drive)?

y) Yes
n) No (default)
y/n> 

确认无误后输入 y 或者直接回车,接着会显示你选择的配置信息,确认无误后输入 y 保存配置。

备份脚本

vmocean纯ipv6的Apline系统下使用 Rclone 挂载 google drive 实现定时备份
备份脚本摘抄自,秋水逸冰 博客。原文链接:https://teddysun.com/469.html

  1. 下载该脚本并赋予执行权限
wget --no-check-certificate https://github.com/teddysun/across/raw/master/backup.sh
chmod +x backup.sh
  1. 修改并配置脚本

请使用 vim 或 nano 等工具来修改。

ENCRYPTFLG (加密FLG,true 为加密,false 为不加密,默认是加密)
BACKUPPASS (加密密码,重要,务必要修改)
LOCALDIR (备份目录,可自己指定)
TEMPDIR (备份目录的临时目录,可自己指定)
LOGFILE (脚本运行产生的日志文件路径)
MYSQL_ROOT_PASSWORD (MySQL/MariaDB/Percona 的 root 用户密码)
MYSQL_DATABASE_NAME (指定 MySQL/MariaDB/Percona 的数据库名,留空则是备份所有数据库)
[blockquote2 name=’洛维花’] ※ MYSQL_DATABASE_NAME 是一个数组变量,可以指定多个。举例如下:[/tip]

MYSQL_DATABASE_NAME[0]="phpmyadmin"
MYSQL_DATABASE_NAME[1]="test"

BACKUP (需要备份的指定目录或文件列表,留空就是不备份目录或文件)
[blockquote2 name=’洛维花’] ※ BACKUP 是一个数组变量,可以指定多个。举例如下:[/tip]

BACKUP[0]="/data/www/default/test.tgz"
BACKUP[1]="/data/www/default/test/"
BACKUP[2]="/data/www/default/test2/"

LOCALAGEDAILIES (指定多少天之后删除本地旧的备份文件,默认为 7 天)
DELETE_REMOTE_FILE_FLG (删除 Google Drive 或 FTP 上备份文件的 FLG,true 为删除,false 为不删除)
RCLONE_NAME (设置 rclone config 时设定的 remote 名称,务必要指定)
RCLONE_FOLDER (指定备份时设定的 remote 的目录名称,该目录名在 Google Drive 不存在时则会自行创建。默认为空,也就是根目录)
RCLONE_FLG (上传本地备份文件至 Google Drive 的 FLG,true 为上传,false 为不上传)

FTP_FLG (上传文件至 FTP 服务器的 FLG,true 为上传,false 为不上传)
FTP_HOST (连接的 FTP 域名或 IP 地址)
FTP_USER (连接的 FTP 的用户名)
FTP_PASS (连接的 FTP 的用户的密码)
FTP_DIR (连接的 FTP 的远程目录,比如: public_html)

一些注意事项的说明:

1)脚本需要用 root 用户来执行;
2)脚本需要用到 openssl 来加密,请事先安装好;
3)脚本默认备份所有的数据库(全量备份);
4)备份文件的解密命令如下:

openssl enc -aes256 -in [ENCRYPTED BACKUP] -out decrypted_backup.tgz -pass pass:[BACKUPPASS] -d -md sha1

5)备份文件解密后,解压命令如下:

tar -zxPf [DECRYPTION BACKUP FILE]

解释一下参数 -P:
tar 压缩文件默认都是相对路径的。加个 -P 是为了 tar 能以绝对路径压缩文件。因此,解压的时候也要带个 -P 参数。
[blockquote2 name=’洛维花’]因为疯子使用的系统是:Apline系统,所以需要安装:bashtaropenssl,安装命令如下:[/tip]

apk add bash
apk add tar
apk add openssl

3、运行脚本开始备份

./backup.sh

脚本默认会显示备份进度,并在最后统计出所需时间。
如果你想将脚本加入到 cron 自动运行的话,就不需要前台显示备份进度,只写日志就可以了。
这个时候你需要稍微改一下脚本中的 log 函数。

log() {
    echo "$(date "+%Y-%m-%d %H:%M:%S")" "$1"
    echo -e "$(date "+%Y-%m-%d %H:%M:%S")" "$1" >> ${LOGFILE}
}

改为:

log() {
    echo -e "$(date "+%Y-%m-%d %H:%M:%S")" "$1" >> ${LOGFILE}
}

Apline定时备份

关于如何使用 cron 自动备份,网上有一堆教程,这里以Apline 来举例说明。
首先alpine内嵌的是BusyBox,使用alpine的crontab实际就是使用BusyBox的crond服务,那么下来就简单介绍下如何使用吧,网上教程还是比较多的:

  1. 配置文件存放位置:
    配置文件是在如下目录中的
/var/spool/cron/crontabs/
  1. 使用方式
    向crontab的配置文件中添加配置
vi /var/spool/cron/crontabs/root
# 或者
crontab -e

# 填入如下内容,最后一行为我添加的任务

# do daily/weekly/monthly maintenance
# min   hour    day     month   weekday command
*/15    *       *       *       *       run-parts /etc/periodic/15min
0       *       *       *       *       run-parts /etc/periodic/hourly
0       2       *       *       *       run-parts /etc/periodic/daily
0       3       *       *       6       run-parts /etc/periodic/weekly
0       5       1       *       *       run-parts /etc/periodic/monthly
30      1       *       *       *       cd  /root/ && ./backup.sh

以上表示,每天凌晨 1 点 30 分,进入root目录执行一次 backup.sh 脚本。
注意:
一定要修改其中的 PATH 和 HOME 变量的值。
尤其是 HOME 变量,rclone 命令能否正确执行,是要依赖于其配置文件的。用 root 用户配置的话,其配置文件夹应该是 /root/.config/rclone ,所以要更改 HOME 的值。

最后,欢迎交流和提出意见。

如果是系统,那么会报错。

  1. 报错:
sh: 0: unknown operand
backup.sh: line 53: MYSQL_DATABASE_NAME[0]=: not found
backup.sh: line 59: BACKUP[0]=/qinglong: not found
backup.sh: line 120: syntax error: unexpected "(" (expecting "fi")
  1. 先查看一下:
    首先登录到容器内,查看sh的版本,(通常有ash、bash、sh等),
bash-4.3# ls -l /bin/*sh
lrwxrwxrwx 1 root root 12 Jun 17 2017 /bin/ash ->/bin/busybox
-rwxr-xr-x 1 root root 682128 Apr 20 2017 /bin/bash
lrwxrwxrwx 1 root root 12 Jun 17 2017 /bin/fdflush->/bin/busybox
lrwxrwxrwx 1 root root 12 Jun 17 2017 /bin/sh ->/bin/busybox

发现alpine中的sh使用的是bin/busybox(命令展示结果最后一行),因此需要将sh切换到/bin/bash下

下面给出解决思路:

  1. 删除原有链接;

  2. 新建一个软链接指向/bin/bash,
    脚本实现如下:

cd /bin && rm -f sh && ln -s /bin/bash sh

最后再执行脚本,能正常运行,问题解决,当然可以将其写入到容器构建中,做成新的镜像,以后使用该镜像创建出来的容器都不会再出现这类问题了。

0 条回应
| 耗时 0.445 秒 | 查询 56 次 | 内存 4.27 MB |
本站CDN由One degree CDN提供