前言
通过 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/#making-your-own-client-id )
然后会出现 权限 选择,如下:
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
这里需要获取授权码并输入:
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 终端粘贴。
然后,直接回车默认
Configure this as a Shared Drive (Team Drive)?
y) Yes
n) No (default)
y/n>
确认无误后输入 y 或者直接回车,接着会显示你选择的配置信息,确认无误后输入 y 保存配置。
备份脚本
备份脚本摘抄自,秋水逸冰 博客。原文链接:https://teddysun.com/469.html
- 下载该脚本并赋予执行权限
wget --no-check-certificate https://github.com/teddysun/across/raw/master/backup.sh
chmod +x backup.sh
- 修改并配置脚本
请使用 vim 或 nano 等工具来修改。
ENCRYPTFLG
(加密FLG,true 为加密,false 为不加密,默认是加密)
BACKUPPASS
(加密密码,重要,务必要修改)
LOCALDIR
(备份目录,可自己指定)
TEMPDIR
(备份目录的临时目录,可自己指定)
LOGFILE
(脚本运行产生的日志文件路径)
MYSQL_ROOT_PASSWORD
(MySQL/MariaDB/Percona 的 root 用户密码)
MYSQL_DATABASE_NAME
(指定 MySQL/MariaDB/Percona 的数据库名,留空则是备份所有数据库)
MYSQL_DATABASE_NAME
是一个数组变量,可以指定多个。举例如下:
MYSQL_DATABASE_NAME[0]="phpmyadmin"
MYSQL_DATABASE_NAME[1]="test"
BACKUP
(需要备份的指定目录或文件列表,留空就是不备份目录或文件)
BACKUP
是一个数组变量,可以指定多个。举例如下:
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 参数。
bash
,tar
,openssl
,安装命令如下:
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服务,那么下来就简单介绍下如何使用吧,网上教程还是比较多的:
- 配置文件存放位置:
配置文件是在如下目录中的
/var/spool/cron/crontabs/
- 使用方式
向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 的值。
最后,欢迎交流和提出意见。
如果是系统,那么会报错。
- 报错:
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")
- 先查看一下:
首先登录到容器内,查看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下
下面给出解决思路:
-
删除原有链接;
-
新建一个软链接指向/bin/bash,
脚本实现如下:
cd /bin && rm -f sh && ln -s /bin/bash sh
最后再执行脚本,能正常运行,问题解决,当然可以将其写入到容器构建中,做成新的镜像,以后使用该镜像创建出来的容器都不会再出现这类问题了。